forked from KolibriOS/kolibrios
prepare texture functions (need to be finalized)
git-svn-id: svn://kolibrios.org@6108 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
81924b284f
commit
c64bf3d60e
@ -165,6 +165,7 @@ E_LIB gluNewQuadric
|
|||||||
E_LIB gluDeleteQuadric
|
E_LIB gluDeleteQuadric
|
||||||
E_LIB gluQuadricDrawStyle
|
E_LIB gluQuadricDrawStyle
|
||||||
E_LIB gluQuadricOrientation
|
E_LIB gluQuadricOrientation
|
||||||
|
E_LIB gluQuadricTexture
|
||||||
E_LIB gluSphere
|
E_LIB gluSphere
|
||||||
|
|
||||||
;
|
;
|
||||||
|
@ -75,7 +75,7 @@ proc gluQuadricDrawStyle uses eax ebx, qobj:dword, drawStyle:dword
|
|||||||
mov dword[eax+offs_qobj_DrawStyle],ebx
|
mov dword[eax+offs_qobj_DrawStyle],ebx
|
||||||
jmp @f
|
jmp @f
|
||||||
.err_q:
|
.err_q:
|
||||||
;quadric_error(qobj, GLU_INVALID_ENUM, "qluQuadricDrawStyle")
|
stdcall dbg_print,sz_gluQuadricDrawStyle,err_9
|
||||||
@@:
|
@@:
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
@ -98,7 +98,26 @@ proc gluQuadricOrientation uses eax ebx, qobj:dword, orientation:dword
|
|||||||
mov dword[eax+offs_qobj_Orientation],ebx
|
mov dword[eax+offs_qobj_Orientation],ebx
|
||||||
jmp @f
|
jmp @f
|
||||||
.err_q:
|
.err_q:
|
||||||
;quadric_error(qobj, GLU_INVALID_ENUM, "qluQuadricOrientation")
|
stdcall dbg_print,sz_gluQuadricOrientation,err_9
|
||||||
|
@@:
|
||||||
|
ret
|
||||||
|
endp
|
||||||
|
|
||||||
|
align 4
|
||||||
|
proc gluQuadricTexture uses eax ebx, qobj:dword, texture:dword
|
||||||
|
mov eax,[qobj]
|
||||||
|
or eax,eax
|
||||||
|
jz .err_q
|
||||||
|
mov ebx,[texture]
|
||||||
|
cmp ebx,GL_TRUE
|
||||||
|
je @f
|
||||||
|
cmp ebx,GL_FALSE
|
||||||
|
je @f
|
||||||
|
@@:
|
||||||
|
mov dword[eax+offs_qobj_TextureFlag],ebx
|
||||||
|
jmp @f
|
||||||
|
.err_q:
|
||||||
|
stdcall dbg_print,sz_gluQuadricTexture,err_9
|
||||||
@@:
|
@@:
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
@ -179,7 +198,7 @@ pushad
|
|||||||
@@:
|
@@:
|
||||||
cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
|
cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
|
||||||
je @f
|
je @f
|
||||||
;glTexCoord2f(0.5,0.0)
|
stdcall glTexCoord2f, 0.5,0.0
|
||||||
@@:
|
@@:
|
||||||
sub esp,4
|
sub esp,4
|
||||||
fld dword[nsign]
|
fld dword[nsign]
|
||||||
@ -320,7 +339,11 @@ align 4
|
|||||||
@@:
|
@@:
|
||||||
cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
|
cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
|
||||||
je @f
|
je @f
|
||||||
;glTexCoord2f(s,1-t)
|
fld1
|
||||||
|
fsub dword[t]
|
||||||
|
fstp dword[esp-4]
|
||||||
|
sub esp,4
|
||||||
|
stdcall glTexCoord2f, [s] ;,1-t
|
||||||
@@:
|
@@:
|
||||||
fld dword[radius]
|
fld dword[radius]
|
||||||
fld dword[z]
|
fld dword[z]
|
||||||
@ -368,7 +391,12 @@ align 4
|
|||||||
@@:
|
@@:
|
||||||
cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
|
cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
|
||||||
je @f
|
je @f
|
||||||
;glTexCoord2f(s,1-(t-dt))
|
fld1
|
||||||
|
fsub dword[t]
|
||||||
|
fadd dword[d_t]
|
||||||
|
fstp dword[esp-4]
|
||||||
|
sub esp,4
|
||||||
|
stdcall glTexCoord2f, [s] ;,1-(t-dt)
|
||||||
fld dword[s]
|
fld dword[s]
|
||||||
fadd dword[d_s]
|
fadd dword[d_s]
|
||||||
fstp dword[s]
|
fstp dword[s]
|
||||||
@ -404,7 +432,7 @@ align 4
|
|||||||
@@:
|
@@:
|
||||||
cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
|
cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
|
||||||
je @f
|
je @f
|
||||||
;glTexCoord2f(0.5,1.0)
|
stdcall glTexCoord2f, 0.5,1.0
|
||||||
mov dword[s],1.0
|
mov dword[s],1.0
|
||||||
mov ebx,[d_t]
|
mov ebx,[d_t]
|
||||||
mov [t],ebx
|
mov [t],ebx
|
||||||
@ -463,7 +491,11 @@ align 4
|
|||||||
@@:
|
@@:
|
||||||
cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
|
cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag)
|
||||||
je @f
|
je @f
|
||||||
;glTexCoord2f(s,1-t)
|
fld1
|
||||||
|
fsub dword[t]
|
||||||
|
fstp dword[esp-4]
|
||||||
|
sub esp,4
|
||||||
|
stdcall glTexCoord2f, [s] ;,1-t
|
||||||
fld dword[s]
|
fld dword[s]
|
||||||
fsub dword[d_s]
|
fsub dword[d_s]
|
||||||
fstp dword[s]
|
fstp dword[s]
|
||||||
|
@ -14,11 +14,11 @@ ends
|
|||||||
;KOSGLContext kosglCreateContext(KOSGLContext shareList, int flags)
|
;KOSGLContext kosglCreateContext(KOSGLContext shareList, int flags)
|
||||||
;{
|
;{
|
||||||
; TinyGLContext *ctx;
|
; TinyGLContext *ctx;
|
||||||
;
|
|
||||||
; if (shareList != NULL) {
|
; if (shareList != NULL) {
|
||||||
; gl_fatal_error("No sharing available in TinyGL");
|
; gl_fatal_error("No sharing available in TinyGL");
|
||||||
; }
|
; }
|
||||||
;
|
|
||||||
; ctx=gl_malloc(sizeof(TinyGLContext));
|
; ctx=gl_malloc(sizeof(TinyGLContext));
|
||||||
; if (!ctx)
|
; if (!ctx)
|
||||||
; return NULL;
|
; return NULL;
|
||||||
@ -99,9 +99,9 @@ proc kosglMakeCurrent uses ebx ecx, win_x0:dword, win_y0:dword, win_x:dword, win
|
|||||||
xor eax,eax
|
xor eax,eax
|
||||||
stdcall ZB_open, dword[win_x], dword[win_y], dword ZB_MODE_RGB24, eax,eax,eax,eax ;NULL,NULL,NULL
|
stdcall ZB_open, dword[win_x], dword[win_y], dword ZB_MODE_RGB24, eax,eax,eax,eax ;NULL,NULL,NULL
|
||||||
|
|
||||||
cmp eax,0
|
or eax,eax
|
||||||
jne @f
|
jnz @f
|
||||||
stdcall dbg_print,f_kosgl_1,err_0
|
stdcall dbg_print,sz_kosglMakeCurrent,err_0
|
||||||
xor eax,eax
|
xor eax,eax
|
||||||
jmp .err_f
|
jmp .err_f
|
||||||
@@:
|
@@:
|
||||||
|
@ -263,9 +263,9 @@ proc glopCallList uses eax ebx ecx edx edi, context:dword, p:dword
|
|||||||
mov ebx,[p]
|
mov ebx,[p]
|
||||||
|
|
||||||
stdcall find_list,edx,[ebx+4]
|
stdcall find_list,edx,[ebx+4]
|
||||||
cmp eax,0
|
or eax,eax
|
||||||
jne @f
|
jnz @f
|
||||||
;if (eax == NULL) gl_fatal_error("list %d not defined",[ebx+4])
|
;gl_fatal_error("list %d not defined",[ebx+4])
|
||||||
@@:
|
@@:
|
||||||
mov edi,[eax] ;edi = &GLList.first_op_buffer.ops
|
mov edi,[eax] ;edi = &GLList.first_op_buffer.ops
|
||||||
|
|
||||||
|
@ -54,7 +54,7 @@ endl
|
|||||||
stdcall dword[edx+offs_cont_gl_resize_viewport], edx ;gl_resize_viewport(context,&xsize_req,&ysize_req)
|
stdcall dword[edx+offs_cont_gl_resize_viewport], edx ;gl_resize_viewport(context,&xsize_req,&ysize_req)
|
||||||
cmp eax,0
|
cmp eax,0
|
||||||
je @f
|
je @f
|
||||||
stdcall dbg_print,f_vp,err_4
|
stdcall dbg_print,sz_glViewport,err_4
|
||||||
@@:
|
@@:
|
||||||
|
|
||||||
mov ecx,[xsize_req]
|
mov ecx,[xsize_req]
|
||||||
@ -67,40 +67,8 @@ endl
|
|||||||
jg @f
|
jg @f
|
||||||
cmp dword[xsize],0
|
cmp dword[xsize],0
|
||||||
jg @f
|
jg @f
|
||||||
stdcall dbg_print,f_vp,err_5
|
stdcall dbg_print,sz_glViewport,err_5
|
||||||
@@:
|
@@:
|
||||||
if DEBUG ;glopViewport
|
|
||||||
push edi
|
|
||||||
mov ecx,80
|
|
||||||
mov eax,[xmin]
|
|
||||||
lea edi,[buf_param]
|
|
||||||
stdcall convert_int_to_str,ecx
|
|
||||||
stdcall str_n_cat,edi,txt_zp_sp,2
|
|
||||||
stdcall str_len,edi
|
|
||||||
add edi,eax
|
|
||||||
sub ecx,eax
|
|
||||||
|
|
||||||
mov eax,[ymin]
|
|
||||||
stdcall convert_int_to_str,ecx
|
|
||||||
stdcall str_n_cat,edi,txt_zp_sp,2
|
|
||||||
stdcall str_len,edi
|
|
||||||
add edi,eax
|
|
||||||
sub ecx,eax
|
|
||||||
|
|
||||||
mov eax,[xsize]
|
|
||||||
stdcall convert_int_to_str,ecx
|
|
||||||
stdcall str_n_cat,edi,txt_zp_sp,2
|
|
||||||
stdcall str_len,edi
|
|
||||||
add edi,eax
|
|
||||||
sub ecx,eax
|
|
||||||
|
|
||||||
mov eax,[ysize]
|
|
||||||
stdcall convert_int_to_str,ecx
|
|
||||||
|
|
||||||
stdcall str_n_cat,edi,txt_nl,2
|
|
||||||
stdcall dbg_print,f_vp,buf_param
|
|
||||||
pop edi
|
|
||||||
end if
|
|
||||||
mov ecx,[xmin]
|
mov ecx,[xmin]
|
||||||
mov dword[edx+offs_cont_viewport+offs_vpor_xmin],ecx
|
mov dword[edx+offs_cont_viewport+offs_vpor_xmin],ecx
|
||||||
mov ecx,[ymin]
|
mov ecx,[ymin]
|
||||||
|
@ -9,7 +9,7 @@ proc find_texture uses ebx ecx, context:dword, h:dword
|
|||||||
mov eax,[h]
|
mov eax,[h]
|
||||||
and eax,0xff
|
and eax,0xff
|
||||||
shl eax,2
|
shl eax,2
|
||||||
add eax,[ebx] ;eax = &context.shared_state.texture_hash_table[h % TEXTURE_HASH_TABLE_SIZE]
|
add eax,ebx ;eax = &context.shared_state.texture_hash_table[h % TEXTURE_HASH_TABLE_SIZE]
|
||||||
|
|
||||||
; [eax] - указатель на текстуру, получаемую через хеш таблицу
|
; [eax] - указатель на текстуру, получаемую через хеш таблицу
|
||||||
mov ecx,[h] ; ecx - указатель на искомую текстуру
|
mov ecx,[h] ; ecx - указатель на искомую текстуру
|
||||||
@ -27,29 +27,50 @@ proc find_texture uses ebx ecx, context:dword, h:dword
|
|||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
;static void free_texture(GLContext *c,int h)
|
align 4
|
||||||
;{
|
proc free_texture uses eax ebx ecx edx, context:dword, h:dword
|
||||||
; GLTexture *t,**ht;
|
mov edx,[context]
|
||||||
; GLImage *im;
|
|
||||||
; int i;
|
stdcall find_texture,edx,[h] ;t=find_texture(context,h)
|
||||||
;
|
cmp dword[eax+offs_text_prev],0 ;if (t.prev==NULL)
|
||||||
; t=find_texture(c,h);
|
jne .else
|
||||||
; if (t->prev==NULL) {
|
mov edx,[edx+offs_cont_shared_state+4] ;edx = &context.shared_state.texture_hash_table[0]
|
||||||
; ht=&c->shared_state.texture_hash_table
|
mov ebx,[eax+offs_text_handle]
|
||||||
; [t->handle % TEXTURE_HASH_TABLE_SIZE];
|
and ebx,0xff
|
||||||
; *ht=t->next;
|
shl ebx,2
|
||||||
; } else {
|
add edx,ebx ;edx = &context.shared_state.texture_hash_table[t.handle % TEXTURE_HASH_TABLE_SIZE]
|
||||||
; t->prev->next=t->next;
|
mov ebx,[eax+offs_text_next]
|
||||||
; }
|
mov [edx],ebx ;*ht=t.next
|
||||||
; if (t->next!=NULL) t->next->prev=t->prev;
|
jmp @f
|
||||||
;
|
.else:
|
||||||
; for(i=0;i<MAX_TEXTURE_LEVELS;i++) {
|
mov ebx,[eax+offs_text_prev]
|
||||||
; im=&t->images[i];
|
mov ecx,[eax+offs_text_next]
|
||||||
; if (im->pixmap != NULL) gl_free(im->pixmap);
|
mov [ebx+offs_text_next],ecx ;t.prev.next=t.next
|
||||||
; }
|
@@:
|
||||||
;
|
cmp dword[eax+offs_text_next],0 ;if (t.next!=NULL)
|
||||||
; gl_free(t);
|
je @f
|
||||||
;}
|
mov ebx,[eax+offs_text_next]
|
||||||
|
mov ecx,[eax+offs_text_prev]
|
||||||
|
mov [ebx+offs_text_prev],ecx ;t.next.prev=t.prev
|
||||||
|
@@:
|
||||||
|
|
||||||
|
xor ebx,ebx
|
||||||
|
mov ecx,[eax+offs_text_images] ;im=&t.images[0]
|
||||||
|
.cycle_0: ;for(i=0;i<MAX_TEXTURE_LEVELS;i++)
|
||||||
|
cmp ebx,MAX_TEXTURE_LEVELS
|
||||||
|
jge .cycle_0_end
|
||||||
|
cmp dword[ecx+offs_imag_pixmap],0 ;if (im.pixmap != NULL)
|
||||||
|
je @f
|
||||||
|
stdcall gl_free,[ecx+offs_imag_pixmap]
|
||||||
|
@@:
|
||||||
|
add ecx,sizeof.GLImage
|
||||||
|
inc ebx
|
||||||
|
jmp .cycle_0
|
||||||
|
.cycle_0_end:
|
||||||
|
|
||||||
|
stdcall gl_free,eax
|
||||||
|
ret
|
||||||
|
endp
|
||||||
|
|
||||||
;output:
|
;output:
|
||||||
; eax - указатель на память
|
; eax - указатель на память
|
||||||
@ -63,7 +84,7 @@ proc alloc_texture uses ebx ecx, context:dword, h:dword
|
|||||||
mov ecx,[h]
|
mov ecx,[h]
|
||||||
and ecx,0xff
|
and ecx,0xff
|
||||||
shl ecx,2
|
shl ecx,2
|
||||||
add ecx,[ebx] ;ecx = &context.shared_state.texture_hash_table[h % TEXTURE_HASH_TABLE_SIZE]
|
add ecx,ebx ;ecx = &context.shared_state.texture_hash_table[h % TEXTURE_HASH_TABLE_SIZE]
|
||||||
|
|
||||||
mov ebx,[ecx]
|
mov ebx,[ecx]
|
||||||
mov [eax+offs_text_next],ebx
|
mov [eax+offs_text_next],ebx
|
||||||
@ -90,56 +111,94 @@ proc glInitTextures uses eax edx, context:dword
|
|||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
;void glGenTextures(int n, unsigned int *textures)
|
align 4
|
||||||
;{
|
proc glGenTextures uses eax ebx ecx edx esi, n:dword, textures:dword
|
||||||
; GLContext *c=gl_get_context();
|
;edx - GLTexture *t
|
||||||
; int max,i;
|
call gl_get_context
|
||||||
; GLTexture *t;
|
add eax,offs_cont_shared_state+4 ;offset texture_hash_table = 4
|
||||||
;
|
|
||||||
; max=0;
|
xor ebx,ebx ;max=0
|
||||||
; for(i=0;i<TEXTURE_HASH_TABLE_SIZE;i++) {
|
xor ecx,ecx ;i=0
|
||||||
; t=c->shared_state.texture_hash_table[i];
|
.cycle_0: ;for(i=0;i<TEXTURE_HASH_TABLE_SIZE;i++)
|
||||||
; while (t!=NULL) {
|
cmp ecx,TEXTURE_HASH_TABLE_SIZE
|
||||||
; if (t->handle>max) max=t->handle;
|
jge .cycle_0_end
|
||||||
; t=t->next;
|
mov esi,ecx
|
||||||
; }
|
shl esi,2
|
||||||
;
|
add esi,[eax]
|
||||||
; }
|
mov edx,dword[esi] ;t=context.shared_state.texture_hash_table[i]
|
||||||
; for(i=0;i<n;i++) {
|
.cycle_1: ;while (t!=NULL)
|
||||||
; textures[i]=max+i+1;
|
or edx,edx
|
||||||
; }
|
jz .cycle_1_end
|
||||||
;}
|
cmp [edx+offs_text_handle],ebx ;if (t.handle>max)
|
||||||
;
|
jle @f
|
||||||
;
|
mov ebx,[edx+offs_text_handle] ;max=t.handle
|
||||||
;void glDeleteTextures(int n, const unsigned int *textures)
|
@@:
|
||||||
;{
|
mov edx,[edx+offs_text_next] ;t=t.next
|
||||||
; GLContext *c=gl_get_context();
|
jmp .cycle_1
|
||||||
; int i;
|
.cycle_1_end:
|
||||||
; GLTexture *t;
|
inc ecx
|
||||||
;
|
jmp .cycle_0
|
||||||
; for(i=0;i<n;i++) {
|
.cycle_0_end:
|
||||||
; t=find_texture(c,textures[i]);
|
|
||||||
; if (t!=NULL && t!=0) {
|
xor ecx,ecx ;i=0
|
||||||
; if (t==c->current_texture) {
|
mov esi,[textures]
|
||||||
; glBindTexture(GL_TEXTURE_2D,0);
|
.cycle_2: ;for(i=0;i<n;i++)
|
||||||
; }
|
cmp ecx,[n]
|
||||||
; free_texture(c,textures[i]);
|
jge .cycle_2_end
|
||||||
; }
|
inc ebx
|
||||||
; }
|
mov [esi],ebx ;textures[i]=max+i+1
|
||||||
;}
|
add esi,4
|
||||||
|
inc ecx
|
||||||
|
jmp .cycle_2
|
||||||
|
.cycle_2_end:
|
||||||
|
ret
|
||||||
|
endp
|
||||||
|
|
||||||
|
align 4
|
||||||
|
proc glDeleteTextures uses eax ebx ecx edx, n:dword, textures:dword
|
||||||
|
call gl_get_context
|
||||||
|
mov edx,eax
|
||||||
|
mov ecx,[textures]
|
||||||
|
|
||||||
|
xor ebx,ebx
|
||||||
|
.cycle_0: ;for(i=0;i<n;i++)
|
||||||
|
cmp ebx,[n]
|
||||||
|
jge .cycle_0_end
|
||||||
|
stdcall find_texture,edx,[ecx] ;t=find_texture(context,textures[i])
|
||||||
|
or eax,eax ;if (t!=0)
|
||||||
|
jz @f
|
||||||
|
cmp eax,[edx+offs_cont_current_texture] ;if (t==context.current_texture)
|
||||||
|
jne .end_1
|
||||||
|
stdcall glBindTexture,GL_TEXTURE_2D,0
|
||||||
|
.end_1:
|
||||||
|
stdcall free_texture, edx,[ecx]
|
||||||
|
@@:
|
||||||
|
add ecx,4
|
||||||
|
inc ebx
|
||||||
|
jmp .cycle_0
|
||||||
|
.cycle_0_end:
|
||||||
|
ret
|
||||||
|
endp
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc glopBindTexture uses eax ebx edx, context:dword, p:dword
|
proc glopBindTexture uses eax ebx edx, context:dword, p:dword
|
||||||
mov ebx,[p]
|
mov ebx,[p]
|
||||||
mov edx,[context]
|
mov edx,[context]
|
||||||
|
|
||||||
; assert(p[1].i == GL_TEXTURE_2D && texture >= 0);
|
cmp dword[ebx+4],GL_TEXTURE_2D
|
||||||
|
je @f
|
||||||
|
;jne .error
|
||||||
|
;cmp dword[ebx+8],0
|
||||||
|
;jge @f
|
||||||
|
.error:
|
||||||
|
stdcall dbg_print,sz_glBindTexture,err_7
|
||||||
|
@@:
|
||||||
|
|
||||||
;[ebx+8] = p[2]
|
mov ebx,[ebx+8] ;ebx = p[2]
|
||||||
stdcall find_texture, edx,dword[ebx+8]
|
stdcall find_texture, edx,ebx
|
||||||
cmp eax,0 ;NULL
|
or eax,eax ;if(t==NULL)
|
||||||
jne @f
|
jnz @f
|
||||||
stdcall alloc_texture, edx,dword[ebx+8]
|
stdcall alloc_texture, edx,ebx
|
||||||
@@:
|
@@:
|
||||||
mov [edx+offs_cont_current_texture],eax
|
mov [edx+offs_cont_current_texture],eax
|
||||||
ret
|
ret
|
||||||
@ -147,114 +206,170 @@ endp
|
|||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc glopTexImage2D, context:dword, p:dword
|
proc glopTexImage2D, context:dword, p:dword
|
||||||
;{
|
locals
|
||||||
; int target=p[1].i;
|
pixels1 dd ?
|
||||||
; int level=p[2].i;
|
do_free dd ?
|
||||||
; int components=p[3].i;
|
endl
|
||||||
; int width=p[4].i;
|
pushad
|
||||||
; int height=p[5].i;
|
mov edi,[p]
|
||||||
; int border=p[6].i;
|
mov eax,[edi+4] ;target=p[1].i
|
||||||
; int format=p[7].i;
|
mov ebx,[edi+8] ;level=p[2].i
|
||||||
; int type=p[8].i;
|
mov ecx,[edi+12] ;components=p[3].i;
|
||||||
; void *pixels=p[9].p;
|
mov edx,[edi+16] ;width=p[4].i;
|
||||||
; GLImage *im;
|
mov esi,[edi+20] ;height=p[5].i;
|
||||||
; unsigned char *pixels1;
|
|
||||||
; int do_free;
|
cmp eax,GL_TEXTURE_2D ;if (param != GL_TEXTURE_2D)
|
||||||
;
|
jne .error
|
||||||
; if (!(target == GL_TEXTURE_2D && level == 0 && components == 3 &&
|
or ebx,ebx ;if (level != 0)
|
||||||
; border == 0 && format == GL_RGB &&
|
jnz .error
|
||||||
; type == GL_UNSIGNED_BYTE)) {
|
cmp ecx,3 ;if (components != 3)
|
||||||
; gl_fatal_error("glTexImage2D: combinaison of parameters not handled");
|
jne .error
|
||||||
; }
|
cmp dword[edi+24],0 ;if (border != 0)
|
||||||
;
|
jne .error
|
||||||
; do_free=0;
|
cmp dword[edi+28],GL_RGB ;if (format != GL_RGB)
|
||||||
; if (width != 256 || height != 256) {
|
jne .error
|
||||||
; pixels1 = gl_malloc(256 * 256 * 3);
|
cmp dword[edi+32],GL_UNSIGNED_BYTE ;if (type != GL_UNSIGNED_BYTE)
|
||||||
; /* no interpolation is done here to respect the original image aliasing ! */
|
jne .error
|
||||||
; gl_resizeImageNoInterpolate(pixels1,256,256,pixels,width,height);
|
|
||||||
; do_free=1;
|
jmp @f
|
||||||
; width=256;
|
.error:
|
||||||
; height=256;
|
stdcall dbg_print,sz_glTexImage2D,err_8 ;"glTexImage2D: combinaison of parameters not handled"
|
||||||
; } else {
|
@@:
|
||||||
; pixels1=pixels;
|
|
||||||
; }
|
mov dword[do_free],0
|
||||||
;
|
cmp edx,256
|
||||||
; im=&c->current_texture->images[level];
|
jne .else
|
||||||
; im->xsize=width;
|
cmp esi,256
|
||||||
; im->ysize=height;
|
jne .else
|
||||||
; if (im->pixmap!=NULL) gl_free(im->pixmap);
|
mov eax,[edi+36]
|
||||||
;#if TGL_FEATURE_RENDER_BITS == 24
|
mov [pixels1],eax ;pixels1=pixels
|
||||||
; im->pixmap=gl_malloc(width*height*3);
|
jmp @f
|
||||||
; if(im->pixmap) {
|
.else: ;if (width != 256 || height != 256)
|
||||||
; memcpy(im->pixmap,pixels1,width*height*3);
|
stdcall gl_malloc, 256*256*3
|
||||||
; }
|
mov [pixels1],eax ;pixels1 = gl_malloc(256 * 256 * 3)
|
||||||
;#elif TGL_FEATURE_RENDER_BITS == 32
|
; no interpolation is done here to respect the original image aliasing !
|
||||||
; im->pixmap=gl_malloc(width*height*4);
|
;gl_resizeImageNoInterpolate(eax,256,256,[edi+36],edx,esi)
|
||||||
; if(im->pixmap) {
|
mov dword[do_free],1
|
||||||
; gl_convertRGB_to_8A8R8G8B(im->pixmap,pixels1,width,height);
|
mov edx,256
|
||||||
; }
|
mov esi,256
|
||||||
;#elif TGL_FEATURE_RENDER_BITS == 16
|
@@:
|
||||||
; im->pixmap=gl_malloc(width*height*2);
|
|
||||||
; if(im->pixmap) {
|
mov ecx,[context]
|
||||||
; gl_convertRGB_to_5R6G5B(im->pixmap,pixels1,width,height);
|
mov ecx,[ecx+offs_cont_current_texture]
|
||||||
; }
|
add ecx,offs_text_images
|
||||||
;#else
|
imul ebx,sizeof.GLTexture
|
||||||
;#error TODO
|
add ecx,ebx ;ecx = &context.current_texture.images[level]
|
||||||
;#endif
|
mov dword[ecx+offs_imag_xsize],edx ;im.xsize=width
|
||||||
; if (do_free) gl_free(pixels1);
|
mov dword[ecx+offs_imag_ysize],esi ;im.ysize=height
|
||||||
|
cmp dword[ecx+offs_imag_pixmap],0 ;if (im.pixmap!=NULL)
|
||||||
|
je @f
|
||||||
|
stdcall gl_free, [ecx+offs_imag_pixmap]
|
||||||
|
@@:
|
||||||
|
if TGL_FEATURE_RENDER_BITS eq 24
|
||||||
|
imul edx,esi
|
||||||
|
imul edx,3
|
||||||
|
stdcall gl_malloc,edx
|
||||||
|
mov [ecx+offs_imag_pixmap],eax ;im.pixmap = gl_malloc(width*height*3)
|
||||||
|
or eax,eax ;if(im.pixmap)
|
||||||
|
jz @f
|
||||||
|
mov edi,eax
|
||||||
|
mov esi,[pixels1]
|
||||||
|
mov ecx,edx
|
||||||
|
rep movsb ;memcpy(im.pixmap,pixels1,width*height*3)
|
||||||
|
@@:
|
||||||
|
end if
|
||||||
|
if TGL_FEATURE_RENDER_BITS eq 32
|
||||||
|
mov ebx,edx
|
||||||
|
imul edx,esi
|
||||||
|
shl edx,2
|
||||||
|
stdcall gl_malloc,edx
|
||||||
|
mov [ecx+offs_imag_pixmap],eax ;im.pixmap = gl_malloc(width*height*4)
|
||||||
|
or eax,eax ;if(im.pixmap)
|
||||||
|
jz @f
|
||||||
|
;gl_convertRGB_to_8A8R8G8B(eax,[pixels1],ebx,esi)
|
||||||
|
@@:
|
||||||
|
end if
|
||||||
|
if TGL_FEATURE_RENDER_BITS eq 16
|
||||||
|
mov ebx,edx
|
||||||
|
imul edx,esi
|
||||||
|
shl edx,1
|
||||||
|
stdcall gl_malloc,edx
|
||||||
|
mov [ecx+offs_imag_pixmap],eax ;im.pixmap = gl_malloc(width*height*2)
|
||||||
|
or eax,eax ;if(im.pixmap)
|
||||||
|
jz @f
|
||||||
|
;gl_convertRGB_to_5R6G5B(eax,[pixels1],ebx,esi)
|
||||||
|
@@:
|
||||||
|
end if
|
||||||
|
cmp dword[do_free],0 ;if (do_free)
|
||||||
|
je @f
|
||||||
|
stdcall gl_free, [pixels1]
|
||||||
|
@@:
|
||||||
|
popad
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
; TODO: not all tests are done
|
; TODO: not all tests are done
|
||||||
align 4
|
align 4
|
||||||
proc glopTexEnv, context:dword, p:dword
|
proc glopTexEnv uses eax ebx ecx, context:dword, p:dword
|
||||||
|
mov ecx,[p]
|
||||||
|
mov eax,[ecx+4] ;target=p[1].i
|
||||||
|
mov ebx,[ecx+8] ;pname=p[2].i
|
||||||
|
mov ecx,[ecx+12] ;param=p[3].i
|
||||||
|
|
||||||
; int target=p[1].i;
|
cmp eax,GL_TEXTURE_ENV ;if (target != GL_TEXTURE_ENV)
|
||||||
; int pname=p[2].i;
|
jne .error
|
||||||
; int param=p[3].i;
|
cmp ebx,GL_TEXTURE_ENV_MODE ;if (pname != GL_TEXTURE_ENV_MODE)
|
||||||
;
|
jne .error
|
||||||
; if (target != GL_TEXTURE_ENV) {
|
cmp ecx,GL_DECAL ;if (param != GL_DECAL)
|
||||||
; error:
|
jne .error
|
||||||
; gl_fatal_error("glTexParameter: unsupported option");
|
|
||||||
; }
|
jmp @f
|
||||||
;
|
.error:
|
||||||
; if (pname != GL_TEXTURE_ENV_MODE) goto error;
|
stdcall dbg_print,sz_glTexParameteri,err_6
|
||||||
;
|
@@:
|
||||||
; if (param != GL_DECAL) goto error;
|
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
; TODO: not all tests are done
|
; TODO: not all tests are done
|
||||||
align 4
|
align 4
|
||||||
proc glopTexParameter, context:dword, p:dword
|
proc glopTexParameter uses eax ebx ecx, context:dword, p:dword
|
||||||
|
mov ecx,[p]
|
||||||
|
mov eax,[ecx+4] ;target=p[1].i
|
||||||
|
mov ebx,[ecx+8] ;pname=p[2].i
|
||||||
|
mov ecx,[ecx+12] ;param=p[3].i
|
||||||
|
|
||||||
; int target=p[1].i;
|
cmp eax,GL_TEXTURE_2D ;if (target != GL_TEXTURE_2D)
|
||||||
; int pname=p[2].i;
|
jne .error
|
||||||
; int param=p[3].i;
|
cmp ebx,GL_TEXTURE_WRAP_S
|
||||||
;
|
je @f
|
||||||
; if (target != GL_TEXTURE_2D) {
|
cmp ebx,GL_TEXTURE_WRAP_T
|
||||||
; error:
|
je @f
|
||||||
; gl_fatal_error("glTexParameter: unsupported option");
|
jmp .error
|
||||||
; }
|
@@:
|
||||||
;
|
cmp ecx,GL_REPEAT ;if (param != GL_REPEAT)
|
||||||
; switch(pname) {
|
jne .error
|
||||||
; case GL_TEXTURE_WRAP_S:
|
|
||||||
; case GL_TEXTURE_WRAP_T:
|
jmp @f
|
||||||
; if (param != GL_REPEAT) goto error;
|
.error:
|
||||||
; break;
|
stdcall dbg_print,sz_glTexParameteri,err_6
|
||||||
; }
|
@@:
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc glopPixelStore, context:dword, p:dword
|
proc glopPixelStore uses eax ebx, context:dword, p:dword
|
||||||
|
mov ebx,[p]
|
||||||
|
mov eax,[ebx+4] ;pname=p[1].i
|
||||||
|
mov ebx,[ebx+8] ;param=p[2].i
|
||||||
|
|
||||||
; int pname=p[1].i;
|
cmp eax,GL_UNPACK_ALIGNMENT ;if (pname != GL_UNPACK_ALIGNMENT)
|
||||||
; int param=p[2].i;
|
jne .error
|
||||||
;
|
cmp ebx,1 ;if (param != 1)
|
||||||
; if (pname != GL_UNPACK_ALIGNMENT ||
|
jne .error
|
||||||
; param != 1) {
|
|
||||||
; gl_fatal_error("glPixelStore: unsupported option");
|
jmp @f
|
||||||
; }
|
.error:
|
||||||
|
stdcall dbg_print,sz_glPixelStorei,err_6
|
||||||
|
@@:
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
@ -86,13 +86,12 @@ endp
|
|||||||
align 4
|
align 4
|
||||||
.str:
|
.str:
|
||||||
mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число
|
mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число
|
||||||
;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной
|
;преревод числа в ASCII строку входные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной
|
||||||
cmp eax,ecx ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
|
cmp eax,ecx ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax
|
||||||
jb @f
|
jb @f
|
||||||
xor edx,edx ;очистить edx
|
xor edx,edx ;очистить edx
|
||||||
div ecx ;разделить - остаток в edx
|
div ecx ;разделить - остаток в edx
|
||||||
push edx ;положить в стек
|
push edx ;положить в стек
|
||||||
;dec edi ;смещение необходимое для записи с конца строки
|
|
||||||
call .str ;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
|
call .str ;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx
|
||||||
pop eax
|
pop eax
|
||||||
@@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная))
|
@@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная))
|
||||||
@ -131,22 +130,21 @@ glTexCoord3dv: ;(double *)
|
|||||||
glTexCoord4d: ;(double ,double ,double, double )
|
glTexCoord4d: ;(double ,double ,double, double )
|
||||||
glTexCoord4fv: ;(float *)
|
glTexCoord4fv: ;(float *)
|
||||||
glTexCoord4dv: ;(double *)
|
glTexCoord4dv: ;(double *)
|
||||||
glGenTextures: ;(int n, unsigned int *textures)
|
|
||||||
glDeleteTextures: ;(int n, const unsigned int *textures)
|
|
||||||
glGetIntegerv: ;(int pname,int *params)
|
glGetIntegerv: ;(int pname,int *params)
|
||||||
glGetFloatv: ;(int pname, float *v)
|
glGetFloatv: ;(int pname, float *v)
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
f_kosgl_1 db 'kosglMakeCurrent',0
|
|
||||||
err_0 db 'Error while initializing Z buffer',13,10,0
|
err_0 db 'Error while initializing Z buffer',13,10,0
|
||||||
f_zb_opn db ' ZB_open',0
|
f_zb_opn db ' ZB_open',0
|
||||||
err_1 db 'gl_malloc(sizeof.ZBuffer)==0',13,10,0
|
err_1 db 'gl_malloc(sizeof.ZBuffer)==0',13,10,0
|
||||||
err_2 db 'gl_malloc(xsize*ysize*4)==0',13,10,0
|
err_2 db 'gl_malloc(xsize*ysize*4)==0',13,10,0
|
||||||
err_3 db 'bit mode not correct',13,10,0
|
err_3 db 'bit mode not correct',13,10,0
|
||||||
f_vp db ' glViewport',0
|
|
||||||
err_4 db 'error while resizing display',13,10,0
|
err_4 db 'error while resizing display',13,10,0
|
||||||
err_5 db 'size too small',13,10,0
|
err_5 db 'size too small',13,10,0
|
||||||
f_clipcode db ' gl_clipcode',0
|
err_6 db 'unsupported option',13,10,0
|
||||||
|
err_7 db 'assert(target == GL_TEXTURE_2D && texture >= 0)',13,10,0
|
||||||
|
err_8 db 'combinaison of parameters not handled',13,10,0
|
||||||
|
err_9 db 'GL_INVALID_ENUM',13,10,0
|
||||||
f_zbz db ' ZB_line_z',0
|
f_zbz db ' ZB_line_z',0
|
||||||
f_zb db ' ZB_line',0
|
f_zb db ' ZB_line',0
|
||||||
f_find_l db 'find_list',0
|
f_find_l db 'find_list',0
|
||||||
|
@ -31,9 +31,9 @@ SPECULAR_BUFFER_RESOLUTION equ 1024
|
|||||||
MAX_MODELVIEW_STACK_DEPTH equ 32
|
MAX_MODELVIEW_STACK_DEPTH equ 32
|
||||||
MAX_PROJECTION_STACK_DEPTH equ 8
|
MAX_PROJECTION_STACK_DEPTH equ 8
|
||||||
MAX_TEXTURE_STACK_DEPTH equ 8
|
MAX_TEXTURE_STACK_DEPTH equ 8
|
||||||
MAX_NAME_STACK_DEPTH equ 64
|
MAX_NAME_STACK_DEPTH equ 64
|
||||||
MAX_TEXTURE_LEVELS equ 11
|
MAX_TEXTURE_LEVELS equ 11
|
||||||
MAX_LIGHTS equ 16
|
MAX_LIGHTS equ 16
|
||||||
|
|
||||||
VERTEX_HASH_SIZE equ 1031
|
VERTEX_HASH_SIZE equ 1031
|
||||||
|
|
||||||
@ -172,6 +172,8 @@ struct GLImage
|
|||||||
ends
|
ends
|
||||||
|
|
||||||
offs_imag_pixmap equ 0
|
offs_imag_pixmap equ 0
|
||||||
|
offs_imag_xsize equ 4
|
||||||
|
offs_imag_ysize equ 8
|
||||||
|
|
||||||
; textures
|
; textures
|
||||||
|
|
||||||
@ -477,15 +479,6 @@ proc gl_clipcode uses ebx, x:dword, y:dword, z:dword, w1:dword
|
|||||||
fincstp
|
fincstp
|
||||||
|
|
||||||
mov eax,ebx
|
mov eax,ebx
|
||||||
if DEBUG ;gl_clipcode
|
|
||||||
push edi
|
|
||||||
mov ecx,80
|
|
||||||
lea edi,[buf_param]
|
|
||||||
stdcall convert_int_to_str,ecx
|
|
||||||
stdcall str_n_cat,edi,txt_nl,2
|
|
||||||
stdcall dbg_print,f_clipcode,buf_param
|
|
||||||
pop edi
|
|
||||||
end if
|
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
|
@ -1,3 +1,9 @@
|
|||||||
|
;
|
||||||
|
; Макрос DRAW_LINE имеет параметр code, от которого зависит
|
||||||
|
; будет ли включен код или объявлены переменные.
|
||||||
|
; В версии на C++ параметра code нет, потому что там переменные
|
||||||
|
; можно ставить в любом месте функции, в asm версии такое не проходит.
|
||||||
|
;
|
||||||
|
|
||||||
INTERP_Z equ 1
|
INTERP_Z equ 1
|
||||||
|
|
||||||
@ -111,34 +117,42 @@ if TGL_FEATURE_RENDER_BITS <> 16
|
|||||||
end if
|
end if
|
||||||
}
|
}
|
||||||
|
|
||||||
;;;DRAW_LINE_M equ 1
|
|
||||||
|
|
||||||
macro DRAW_LINE code
|
macro DRAW_LINE code
|
||||||
{
|
{
|
||||||
local .cycle_0
|
local .cycle_0
|
||||||
local .cycle_1
|
local .cycle_1
|
||||||
if TGL_FEATURE_RENDER_BITS eq 16
|
if TGL_FEATURE_RENDER_BITS eq 16
|
||||||
if code eq 0
|
if code eq 0
|
||||||
pz dd ? ;uint*
|
|
||||||
tmp dd ? ;uint
|
tmp dd ? ;uint
|
||||||
z dd ? ;uint
|
|
||||||
zz dd ? ;uint
|
|
||||||
rgb dd ? ;uint
|
rgb dd ? ;uint
|
||||||
drgbdx dd ? ;uint
|
drgbdx dd ? ;uint
|
||||||
n dd ? ;int
|
|
||||||
end if
|
end if
|
||||||
if code eq 1
|
if code eq 1
|
||||||
mov eax,[x2]
|
mov eax,[x2]
|
||||||
sar eax,16
|
sar eax,16
|
||||||
sub eax,[x1]
|
sub eax,[x1]
|
||||||
mov [n],eax ;n = (x2 >> 16) - x1
|
mov [n],eax ;n = (x2 >> 16) - x1
|
||||||
; pp=pp1+x1;
|
mov edi,[pp1]
|
||||||
; pz=pz1+x1;
|
add edi,[x1] ;pp = pp1 + x1
|
||||||
; z=z1;
|
mov eax,[pz1]
|
||||||
; rgb=(r1 << 16) & 0xFFC00000;
|
add eax,[x1]
|
||||||
; rgb|=(g1 >> 5) & 0x000007FF;
|
mov [pz],eax ;pz = pz1 + x1
|
||||||
; rgb|=(b1 << 5) & 0x001FF000;
|
mov eax,[z1]
|
||||||
; drgbdx=_drgbdx;
|
mov [z],eax ;z = z1
|
||||||
|
mov eax,[r1]
|
||||||
|
shl eax,16
|
||||||
|
and eax,0xFFC00000
|
||||||
|
mov [rgb],eax ;rgb = (r1 << 16) & 0xFFC00000
|
||||||
|
mov eax,[g1]
|
||||||
|
shr eax,5
|
||||||
|
and eax,0x000007FF
|
||||||
|
or [rgb],eax ;rgb |= (g1 >> 5) & 0x000007FF
|
||||||
|
mov eax,[b1]
|
||||||
|
shl eax,5
|
||||||
|
and eax,0x001FF000
|
||||||
|
or [rgb],eax ;rgb |= (b1 << 5) & 0x001FF000
|
||||||
|
mov eax,[_drgbdx]
|
||||||
|
mov [drgbdx],eax ;drgbdx = _drgbdx
|
||||||
align 4
|
align 4
|
||||||
.cycle_0: ;while (n>=3)
|
.cycle_0: ;while (n>=3)
|
||||||
cmp dword[n],3
|
cmp dword[n],3
|
||||||
@ -148,7 +162,7 @@ align 4
|
|||||||
PUT_PIXEL 2
|
PUT_PIXEL 2
|
||||||
PUT_PIXEL 3
|
PUT_PIXEL 3
|
||||||
add dword[pz],8
|
add dword[pz],8
|
||||||
add edi,4
|
add edi,4*3
|
||||||
sub [n],4
|
sub [n],4
|
||||||
jmp .cycle_0
|
jmp .cycle_0
|
||||||
.cycle_1: ;while (n>=0)
|
.cycle_1: ;while (n>=0)
|
||||||
@ -156,7 +170,7 @@ align 4
|
|||||||
jl .cycle_1_end
|
jl .cycle_1_end
|
||||||
PUT_PIXEL 0
|
PUT_PIXEL 0
|
||||||
add dword[pz],2
|
add dword[pz],2
|
||||||
inc edi
|
add edi,3
|
||||||
dec dword[n]
|
dec dword[n]
|
||||||
jmp .cycle_1
|
jmp .cycle_1
|
||||||
.cycle_1_end:
|
.cycle_1_end:
|
||||||
@ -202,11 +216,16 @@ local .end_0
|
|||||||
;edi = pp
|
;edi = pp
|
||||||
mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение
|
mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение
|
||||||
if TGL_FEATURE_RENDER_BITS eq 24
|
if TGL_FEATURE_RENDER_BITS eq 24
|
||||||
; unsigned char *ptr;
|
mov ebx,[t]
|
||||||
; ptr = texture + (((t & 0x3FC00000) | s) >> 14) * 3;
|
and ebx,0x3fc00000
|
||||||
; pp[3 * _a]= ptr[0];
|
or ebx,[s]
|
||||||
; pp[3 * _a + 1]= ptr[1];
|
shr ebx,14
|
||||||
; pp[3 * _a + 2]= ptr[2];
|
imul ebx,3
|
||||||
|
add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | s) >> 14) * 3
|
||||||
|
mov ax,word[ebx]
|
||||||
|
mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1]
|
||||||
|
mov al,byte[ebx+2]
|
||||||
|
mov byte[edi+3*_a +2],al ;pp[3 * _a + 2]= ptr[2]
|
||||||
else
|
else
|
||||||
; pp[_a]=texture[((t & 0x3FC00000) | s) >> 14];
|
; pp[_a]=texture[((t & 0x3FC00000) | s) >> 14];
|
||||||
end if
|
end if
|
||||||
@ -242,11 +261,17 @@ macro DRAW_INIT
|
|||||||
mov eax,[zb]
|
mov eax,[zb]
|
||||||
mov eax,[eax+offs_zbuf_current_texture]
|
mov eax,[eax+offs_zbuf_current_texture]
|
||||||
mov [texture],eax
|
mov [texture],eax
|
||||||
|
mov dword[esp-4],NB_INTERP
|
||||||
|
fild dword[esp-4]
|
||||||
fild dword[dzdx]
|
fild dword[dzdx]
|
||||||
fstp dword[fdzdx]
|
fst dword[fdzdx] ;fdzdx = (float)dzdx
|
||||||
; fndzdx=NB_INTERP * fdzdx;
|
fmul st0,st1
|
||||||
; ndszdx=NB_INTERP * dszdx;
|
fstp dword[fndzdx] ;fndzdx = NB_INTERP * fdzdx
|
||||||
; ndtzdx=NB_INTERP * dtzdx;
|
fld dword[fdzdx]
|
||||||
|
fmul st0,st1
|
||||||
|
fstp dword[ndszdx] ;ndszdx = NB_INTERP * dszdx
|
||||||
|
fmul dword[dtzdx]
|
||||||
|
fstp dword[ndtzdx] ;ndtzdx = NB_INTERP * dtzdx
|
||||||
}
|
}
|
||||||
|
|
||||||
macro PUT_PIXEL _a
|
macro PUT_PIXEL _a
|
||||||
@ -261,11 +286,18 @@ local .end_0
|
|||||||
;edi = pp
|
;edi = pp
|
||||||
mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение
|
mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение
|
||||||
if TGL_FEATURE_RENDER_BITS eq 24
|
if TGL_FEATURE_RENDER_BITS eq 24
|
||||||
; unsigned char *ptr;
|
mov ebx,[t]
|
||||||
; ptr = texture + (((t & 0x3FC00000) | (s & 0x003FC000)) >> 14) * 3;
|
and ebx,0x3fc00000
|
||||||
; pp[3 * _a]= ptr[0];
|
mov eax,[s]
|
||||||
; pp[3 * _a + 1]= ptr[1];
|
and eax,0x003fc000
|
||||||
; pp[3 * _a + 2]= ptr[2];
|
or ebx,eax
|
||||||
|
shr ebx,14
|
||||||
|
imul ebx,3
|
||||||
|
add ebx,[texture] ;ptr = texture + (((t & 0x3fc00000) | (s & 0x003FC000)) >> 14) * 3
|
||||||
|
mov ax,word[ebx]
|
||||||
|
mov word[edi+3*_a],ax ;pp[3 * _a]= ptr[0,1]
|
||||||
|
mov al,byte[ebx+2]
|
||||||
|
mov byte[edi+3*_a +2],al ;pp[3 * _a + 2]= ptr[2]
|
||||||
else
|
else
|
||||||
; pp[_a]=*(PIXEL *)((char *)texture+
|
; pp[_a]=*(PIXEL *)((char *)texture+
|
||||||
; (((t & 0x3FC00000) | (s & 0x003FC000)) >> (17 - PSZSH)));
|
; (((t & 0x3FC00000) | (s & 0x003FC000)) >> (17 - PSZSH)));
|
||||||
@ -285,69 +317,109 @@ macro DRAW_LINE code
|
|||||||
{
|
{
|
||||||
if TGL_FEATURE_RENDER_BITS eq 24
|
if TGL_FEATURE_RENDER_BITS eq 24
|
||||||
if code eq 0
|
if code eq 0
|
||||||
pz dd ? ;uint *
|
|
||||||
s dd ? ;uint
|
s dd ? ;uint
|
||||||
t dd ? ;uint
|
t dd ? ;uint
|
||||||
z dd ? ;uint
|
|
||||||
zz dd ? ;uint
|
|
||||||
n1 dd ? ;int - длинна горизонтальной линии в пикселях
|
n1 dd ? ;int - длинна горизонтальной линии в пикселях
|
||||||
dsdx dd ? ;int
|
dsdx dd ? ;int
|
||||||
dtdx dd ? ;int
|
dtdx dd ? ;int
|
||||||
s_z dd ? ;float
|
|
||||||
t_z dd ? ;float
|
|
||||||
fz dd ? ;float
|
fz dd ? ;float
|
||||||
zinv dd ? ;float
|
zinv dd ? ;float
|
||||||
end if
|
end if
|
||||||
if code eq 1
|
if code eq 1
|
||||||
; n1=(x2>>16)-x1;
|
mov eax,[x2]
|
||||||
; fz=(float)z1;
|
sar eax,16
|
||||||
; zinv=1.0 / fz;
|
sub eax,[x1]
|
||||||
; pp=(pp1 + x1 * PSZB);
|
mov [n1],eax ;n1 = (x2 >> 16) - x1
|
||||||
; pz=pz1+x1;
|
fld1
|
||||||
; z=z1;
|
fild dword[z1]
|
||||||
; sz=sz1;
|
fst dword[fz] ;fz = (float)z1
|
||||||
; tz=tz1;
|
;fld1
|
||||||
; while (n1>=(NB_INTERP-1)) {
|
fdivp
|
||||||
; {
|
fstp dword[zinv] ;zinv = 1.0 / fz
|
||||||
; float ss,tt;
|
mov edi,[x1]
|
||||||
; ss=(sz * zinv);
|
imul edi,PSZB
|
||||||
; tt=(tz * zinv);
|
add edi,[pp1] ;pp = (pp1 + x1 * PSZB)
|
||||||
; s=(int) ss;
|
mov eax,[pz1]
|
||||||
; t=(int) tt;
|
add eax,[x1]
|
||||||
; dsdx= (int)( (dszdx - ss*fdzdx)*zinv );
|
mov [pz],eax ;pz = pz1 + x1
|
||||||
; dtdx= (int)( (dtzdx - tt*fdzdx)*zinv );
|
mov eax,[z1]
|
||||||
; fz+=fndzdx;
|
mov [z],eax ;z = z1
|
||||||
; zinv=1.0 / fz;
|
mov eax,[sz1]
|
||||||
; }
|
mov [s_z],eax ;sz = sz1
|
||||||
; PUT_PIXEL(0);
|
mov eax,[tz1]
|
||||||
; PUT_PIXEL(1);
|
mov [t_z],eax ;tz = tz1
|
||||||
; PUT_PIXEL(2);
|
align 4
|
||||||
; PUT_PIXEL(3);
|
.cycle_2: ;while (n1>=(NB_INTERP-1))
|
||||||
; PUT_PIXEL(4);
|
cmp dword[n1],NB_INTERP-1
|
||||||
; PUT_PIXEL(5);
|
jl .cycle_2_end
|
||||||
; PUT_PIXEL(6);
|
fld dword[zinv]
|
||||||
; PUT_PIXEL(7);
|
fld st0
|
||||||
; pz+=NB_INTERP;
|
fmul dword[s_z] ;ss = (sz * zinv)
|
||||||
; pp=(pp + NB_INTERP * PSZB);
|
fist dword[s] ;s = (int) ss
|
||||||
; n1-=NB_INTERP;
|
fmul dword[fdzdx]
|
||||||
; sz+=ndszdx;
|
fchs
|
||||||
; tz+=ndtzdx;
|
fadd dword[dszdx]
|
||||||
; }
|
fmul dword[zinv]
|
||||||
; {
|
fistp dword[dsdx] ;dsdx = (int)( (dszdx - ss*fdzdx)*zinv )
|
||||||
; float ss,tt;
|
fmul dword[t_z] ;tt = (tz * zinv)
|
||||||
; ss=(sz * zinv);
|
fist dword[t] ;t = (int) tt
|
||||||
; tt=(tz * zinv);
|
fmul dword[fdzdx]
|
||||||
; s=(int) ss;
|
fchs
|
||||||
; t=(int) tt;
|
fadd dword[dtzdx]
|
||||||
; dsdx= (int)( (dszdx - ss*fdzdx)*zinv );
|
fmul dword[zinv]
|
||||||
; dtdx= (int)( (dtzdx - tt*fdzdx)*zinv );
|
fistp dword[dtdx] ;dtdx = (int)( (dtzdx - tt*fdzdx)*zinv )
|
||||||
; }
|
fld1
|
||||||
; while (n1>=0) {
|
fld dword[fz]
|
||||||
;;; PUT_PIXEL 0
|
fadd dword[fndzdx]
|
||||||
; pz+=1;
|
fst dword[fz] ;fz += fndzdx
|
||||||
; pp=(PIXEL *)((char *)pp + PSZB);
|
;fld1
|
||||||
|
fdivp
|
||||||
|
fstp dword[zinv] ;zinv = 1.0 / fz
|
||||||
|
PUT_PIXEL 0
|
||||||
|
PUT_PIXEL 1
|
||||||
|
PUT_PIXEL 2
|
||||||
|
PUT_PIXEL 3
|
||||||
|
PUT_PIXEL 4
|
||||||
|
PUT_PIXEL 5
|
||||||
|
PUT_PIXEL 6
|
||||||
|
PUT_PIXEL 7
|
||||||
|
add dword[pz],2*NB_INTERP ;pz += NB_INTERP
|
||||||
|
add edi,NB_INTERP*PSZB ;pp += NB_INTERP * PSZB
|
||||||
|
sub dword[n1],NB_INTERP ;n1 -= NB_INTERP
|
||||||
|
fld dword[ndszdx]
|
||||||
|
fadd dword[s_z]
|
||||||
|
fstp dword[s_z] ;s_z += ndszdx
|
||||||
|
fld dword[ndtzdx]
|
||||||
|
fadd dword[t_z]
|
||||||
|
fstp dword[t_z] ;tz += ndtzdx
|
||||||
|
jmp .cycle_2
|
||||||
|
.cycle_2_end:
|
||||||
|
fld dword[zinv]
|
||||||
|
fld st0
|
||||||
|
fmul dword[s_z] ;ss = (sz * zinv)
|
||||||
|
fist dword[s] ;s = (int) ss
|
||||||
|
fmul dword[fdzdx]
|
||||||
|
fchs
|
||||||
|
fadd dword[dszdx]
|
||||||
|
fmul dword[zinv]
|
||||||
|
fistp dword[dsdx] ;dsdx = (int)( (dszdx - ss*fdzdx)*zinv )
|
||||||
|
fmul dword[t_z] ;tt = (tz * zinv)
|
||||||
|
fist dword[t] ;t = (int) tt
|
||||||
|
fmul dword[fdzdx]
|
||||||
|
fchs
|
||||||
|
fadd dword[dtzdx]
|
||||||
|
fmul dword[zinv]
|
||||||
|
fistp dword[dtdx] ;dtdx = (int)( (dtzdx - tt*fdzdx)*zinv )
|
||||||
|
align 4
|
||||||
|
.cycle_3: ;while (n1>=0)
|
||||||
|
cmp dword[n1],0
|
||||||
|
jl .cycle_3_end
|
||||||
|
PUT_PIXEL 0
|
||||||
|
add dword[pz],2 ;pz += 1
|
||||||
|
add edi,PSZB ;pp += PSZB
|
||||||
dec dword[n1]
|
dec dword[n1]
|
||||||
; }
|
jmp .cycle_3
|
||||||
|
.cycle_3_end:
|
||||||
end if
|
end if
|
||||||
end if
|
end if
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,6 @@
|
|||||||
; цвет испорченных пикселей. Цвет получаеться наиболее близким к указанному
|
; цвет испорченных пикселей. Цвет получаеться наиболее близким к указанному
|
||||||
; пользователем.
|
; пользователем.
|
||||||
|
|
||||||
t dd ? ;ZBufferPoint*
|
|
||||||
pr1 dd ? ;ZBufferPoint*
|
pr1 dd ? ;ZBufferPoint*
|
||||||
pr2 dd ? ;ZBufferPoint*
|
pr2 dd ? ;ZBufferPoint*
|
||||||
l1 dd ? ;ZBufferPoint*
|
l1 dd ? ;ZBufferPoint*
|
||||||
@ -53,6 +52,10 @@
|
|||||||
x2 dd ? ;int
|
x2 dd ? ;int
|
||||||
dx2dy2 dd ? ;int
|
dx2dy2 dd ? ;int
|
||||||
|
|
||||||
|
pz dd ? ;unsigned short *
|
||||||
|
z dd ? ;uint
|
||||||
|
zz dd ? ;uint
|
||||||
|
|
||||||
if INTERP_Z eq 1
|
if INTERP_Z eq 1
|
||||||
z1 dd ? ;int
|
z1 dd ? ;int
|
||||||
dzdx dd ? ;int
|
dzdx dd ? ;int
|
||||||
@ -100,18 +103,10 @@ if INTERP_STZ eq 1
|
|||||||
dtzdy dd ? ;float
|
dtzdy dd ? ;float
|
||||||
dtzdl_min dd ? ;float
|
dtzdl_min dd ? ;float
|
||||||
dtzdl_max dd ? ;float
|
dtzdl_max dd ? ;float
|
||||||
|
s_z dd ? ;float
|
||||||
|
t_z dd ? ;float
|
||||||
end if
|
end if
|
||||||
|
|
||||||
|
|
||||||
if DRAW_LINE_M eq 1
|
|
||||||
DRAW_LINE 0 ;переменные делаются в макросе
|
|
||||||
else
|
|
||||||
n dd ? ;int - длинна горизонтальной линии в пикселях
|
n dd ? ;int - длинна горизонтальной линии в пикселях
|
||||||
if INTERP_Z eq 1
|
|
||||||
pz dd ? ;unsigned short *
|
|
||||||
z dd ? ;uint
|
|
||||||
zz dd ? ;uint
|
|
||||||
end if
|
|
||||||
if INTERP_RGB eq 1
|
if INTERP_RGB eq 1
|
||||||
or1 dd ? ;uint
|
or1 dd ? ;uint
|
||||||
og1 dd ? ;uint
|
og1 dd ? ;uint
|
||||||
@ -121,19 +116,14 @@ if INTERP_ST eq 1
|
|||||||
s dd ? ;uint
|
s dd ? ;uint
|
||||||
t dd ? ;uint
|
t dd ? ;uint
|
||||||
end if
|
end if
|
||||||
if INTERP_STZ eq 1
|
|
||||||
s_z dd ? ;float
|
if DRAW_LINE_M eq 1
|
||||||
t_z dd ? ;float
|
DRAW_LINE 0 ;переменные делаются в макросе
|
||||||
end if
|
|
||||||
end if
|
end if
|
||||||
|
|
||||||
endl
|
endl
|
||||||
pushad
|
pushad
|
||||||
|
|
||||||
if DEBUG ;(1)
|
|
||||||
stdcall dbg_print,f_fill_tr,m_1
|
|
||||||
end if
|
|
||||||
|
|
||||||
; we sort the vertex with increasing y
|
; we sort the vertex with increasing y
|
||||||
mov ebx,[p0]
|
mov ebx,[p0]
|
||||||
mov ecx,[p1]
|
mov ecx,[p1]
|
||||||
|
Loading…
Reference in New Issue
Block a user