diff --git a/programs/develop/libraries/TinyGL/asm_fork/export.inc b/programs/develop/libraries/TinyGL/asm_fork/export.inc index 5c774da132..2fede80849 100644 --- a/programs/develop/libraries/TinyGL/asm_fork/export.inc +++ b/programs/develop/libraries/TinyGL/asm_fork/export.inc @@ -165,6 +165,7 @@ E_LIB gluNewQuadric E_LIB gluDeleteQuadric E_LIB gluQuadricDrawStyle E_LIB gluQuadricOrientation +E_LIB gluQuadricTexture E_LIB gluSphere ; diff --git a/programs/develop/libraries/TinyGL/asm_fork/glu.asm b/programs/develop/libraries/TinyGL/asm_fork/glu.asm index 782d99297d..65db5e4e97 100644 --- a/programs/develop/libraries/TinyGL/asm_fork/glu.asm +++ b/programs/develop/libraries/TinyGL/asm_fork/glu.asm @@ -75,7 +75,7 @@ proc gluQuadricDrawStyle uses eax ebx, qobj:dword, drawStyle:dword mov dword[eax+offs_qobj_DrawStyle],ebx jmp @f .err_q: - ;quadric_error(qobj, GLU_INVALID_ENUM, "qluQuadricDrawStyle") + stdcall dbg_print,sz_gluQuadricDrawStyle,err_9 @@: ret endp @@ -98,7 +98,26 @@ proc gluQuadricOrientation uses eax ebx, qobj:dword, orientation:dword mov dword[eax+offs_qobj_Orientation],ebx jmp @f .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 endp @@ -179,7 +198,7 @@ pushad @@: cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag) je @f -;glTexCoord2f(0.5,0.0) + stdcall glTexCoord2f, 0.5,0.0 @@: sub esp,4 fld dword[nsign] @@ -320,7 +339,11 @@ align 4 @@: cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag) 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[z] @@ -368,7 +391,12 @@ align 4 @@: cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag) 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] fadd dword[d_s] fstp dword[s] @@ -404,7 +432,7 @@ align 4 @@: cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag) je @f -;glTexCoord2f(0.5,1.0) + stdcall glTexCoord2f, 0.5,1.0 mov dword[s],1.0 mov ebx,[d_t] mov [t],ebx @@ -463,7 +491,11 @@ align 4 @@: cmp dword[eax+offs_qobj_TextureFlag],0 ;if (qobj.TextureFlag) 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] fsub dword[d_s] fstp dword[s] diff --git a/programs/develop/libraries/TinyGL/asm_fork/kosgl.asm b/programs/develop/libraries/TinyGL/asm_fork/kosgl.asm index 6077992c98..6b9df7d79b 100644 --- a/programs/develop/libraries/TinyGL/asm_fork/kosgl.asm +++ b/programs/develop/libraries/TinyGL/asm_fork/kosgl.asm @@ -14,11 +14,11 @@ ends ;KOSGLContext kosglCreateContext(KOSGLContext shareList, int flags) ;{ ; TinyGLContext *ctx; -; + ; if (shareList != NULL) { ; gl_fatal_error("No sharing available in TinyGL"); ; } -; + ; ctx=gl_malloc(sizeof(TinyGLContext)); ; if (!ctx) ; return NULL; @@ -99,9 +99,9 @@ proc kosglMakeCurrent uses ebx ecx, win_x0:dword, win_y0:dword, win_x:dword, win xor eax,eax stdcall ZB_open, dword[win_x], dword[win_y], dword ZB_MODE_RGB24, eax,eax,eax,eax ;NULL,NULL,NULL - cmp eax,0 - jne @f - stdcall dbg_print,f_kosgl_1,err_0 + or eax,eax + jnz @f + stdcall dbg_print,sz_kosglMakeCurrent,err_0 xor eax,eax jmp .err_f @@: diff --git a/programs/develop/libraries/TinyGL/asm_fork/list.asm b/programs/develop/libraries/TinyGL/asm_fork/list.asm index b39b1e9e40..4dc7915bbc 100644 --- a/programs/develop/libraries/TinyGL/asm_fork/list.asm +++ b/programs/develop/libraries/TinyGL/asm_fork/list.asm @@ -263,9 +263,9 @@ proc glopCallList uses eax ebx ecx edx edi, context:dword, p:dword mov ebx,[p] stdcall find_list,edx,[ebx+4] - cmp eax,0 - jne @f - ;if (eax == NULL) gl_fatal_error("list %d not defined",[ebx+4]) + or eax,eax + jnz @f + ;gl_fatal_error("list %d not defined",[ebx+4]) @@: mov edi,[eax] ;edi = &GLList.first_op_buffer.ops diff --git a/programs/develop/libraries/TinyGL/asm_fork/misc.asm b/programs/develop/libraries/TinyGL/asm_fork/misc.asm index d6e8ab11df..bf0ae2239b 100644 --- a/programs/develop/libraries/TinyGL/asm_fork/misc.asm +++ b/programs/develop/libraries/TinyGL/asm_fork/misc.asm @@ -54,7 +54,7 @@ endl stdcall dword[edx+offs_cont_gl_resize_viewport], edx ;gl_resize_viewport(context,&xsize_req,&ysize_req) cmp eax,0 je @f - stdcall dbg_print,f_vp,err_4 + stdcall dbg_print,sz_glViewport,err_4 @@: mov ecx,[xsize_req] @@ -67,40 +67,8 @@ endl jg @f cmp dword[xsize],0 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 dword[edx+offs_cont_viewport+offs_vpor_xmin],ecx mov ecx,[ymin] diff --git a/programs/develop/libraries/TinyGL/asm_fork/texture.asm b/programs/develop/libraries/TinyGL/asm_fork/texture.asm index 12b4779f78..0c65d50bcc 100644 --- a/programs/develop/libraries/TinyGL/asm_fork/texture.asm +++ b/programs/develop/libraries/TinyGL/asm_fork/texture.asm @@ -9,7 +9,7 @@ proc find_texture uses ebx ecx, context:dword, h:dword mov eax,[h] and eax,0xff 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] - указатель на текстуру, получаемую через хеш таблицу mov ecx,[h] ; ecx - указатель на искомую текстуру @@ -27,29 +27,50 @@ proc find_texture uses ebx ecx, context:dword, h:dword ret endp -;static void free_texture(GLContext *c,int h) -;{ -; GLTexture *t,**ht; -; GLImage *im; -; int i; -; -; t=find_texture(c,h); -; if (t->prev==NULL) { -; ht=&c->shared_state.texture_hash_table -; [t->handle % TEXTURE_HASH_TABLE_SIZE]; -; *ht=t->next; -; } else { -; t->prev->next=t->next; -; } -; if (t->next!=NULL) t->next->prev=t->prev; -; -; for(i=0;iimages[i]; -; if (im->pixmap != NULL) gl_free(im->pixmap); -; } -; -; gl_free(t); -;} +align 4 +proc free_texture uses eax ebx ecx edx, context:dword, h:dword + mov edx,[context] + + stdcall find_texture,edx,[h] ;t=find_texture(context,h) + cmp dword[eax+offs_text_prev],0 ;if (t.prev==NULL) + jne .else + mov edx,[edx+offs_cont_shared_state+4] ;edx = &context.shared_state.texture_hash_table[0] + mov ebx,[eax+offs_text_handle] + and ebx,0xff + shl ebx,2 + add edx,ebx ;edx = &context.shared_state.texture_hash_table[t.handle % TEXTURE_HASH_TABLE_SIZE] + mov ebx,[eax+offs_text_next] + mov [edx],ebx ;*ht=t.next + jmp @f + .else: + mov ebx,[eax+offs_text_prev] + mov ecx,[eax+offs_text_next] + mov [ebx+offs_text_next],ecx ;t.prev.next=t.next + @@: + cmp dword[eax+offs_text_next],0 ;if (t.next!=NULL) + 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;ishared_state.texture_hash_table[i]; -; while (t!=NULL) { -; if (t->handle>max) max=t->handle; -; t=t->next; -; } -; -; } -; for(i=0;icurrent_texture) { -; glBindTexture(GL_TEXTURE_2D,0); -; } -; free_texture(c,textures[i]); -; } -; } -;} +align 4 +proc glGenTextures uses eax ebx ecx edx esi, n:dword, textures:dword +;edx - GLTexture *t + call gl_get_context + add eax,offs_cont_shared_state+4 ;offset texture_hash_table = 4 + + xor ebx,ebx ;max=0 + xor ecx,ecx ;i=0 + .cycle_0: ;for(i=0;imax) + jle @f + mov ebx,[edx+offs_text_handle] ;max=t.handle + @@: + mov edx,[edx+offs_text_next] ;t=t.next + jmp .cycle_1 + .cycle_1_end: + inc ecx + jmp .cycle_0 + .cycle_0_end: + + xor ecx,ecx ;i=0 + mov esi,[textures] + .cycle_2: ;for(i=0;i= 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] - stdcall find_texture, edx,dword[ebx+8] - cmp eax,0 ;NULL - jne @f - stdcall alloc_texture, edx,dword[ebx+8] + mov ebx,[ebx+8] ;ebx = p[2] + stdcall find_texture, edx,ebx + or eax,eax ;if(t==NULL) + jnz @f + stdcall alloc_texture, edx,ebx @@: mov [edx+offs_cont_current_texture],eax ret @@ -147,114 +206,170 @@ endp align 4 proc glopTexImage2D, context:dword, p:dword -;{ -; int target=p[1].i; -; int level=p[2].i; -; int components=p[3].i; -; int width=p[4].i; -; int height=p[5].i; -; int border=p[6].i; -; int format=p[7].i; -; int type=p[8].i; -; void *pixels=p[9].p; -; GLImage *im; -; unsigned char *pixels1; -; int do_free; -; -; if (!(target == GL_TEXTURE_2D && level == 0 && components == 3 && -; border == 0 && format == GL_RGB && -; type == GL_UNSIGNED_BYTE)) { -; gl_fatal_error("glTexImage2D: combinaison of parameters not handled"); -; } -; -; do_free=0; -; if (width != 256 || height != 256) { -; pixels1 = gl_malloc(256 * 256 * 3); -; /* no interpolation is done here to respect the original image aliasing ! */ -; gl_resizeImageNoInterpolate(pixels1,256,256,pixels,width,height); -; do_free=1; -; width=256; -; height=256; -; } else { -; pixels1=pixels; -; } -; -; im=&c->current_texture->images[level]; -; im->xsize=width; -; im->ysize=height; -; if (im->pixmap!=NULL) gl_free(im->pixmap); -;#if TGL_FEATURE_RENDER_BITS == 24 -; im->pixmap=gl_malloc(width*height*3); -; if(im->pixmap) { -; memcpy(im->pixmap,pixels1,width*height*3); -; } -;#elif TGL_FEATURE_RENDER_BITS == 32 -; im->pixmap=gl_malloc(width*height*4); -; if(im->pixmap) { -; gl_convertRGB_to_8A8R8G8B(im->pixmap,pixels1,width,height); -; } -;#elif TGL_FEATURE_RENDER_BITS == 16 -; im->pixmap=gl_malloc(width*height*2); -; if(im->pixmap) { -; gl_convertRGB_to_5R6G5B(im->pixmap,pixels1,width,height); -; } -;#else -;#error TODO -;#endif -; if (do_free) gl_free(pixels1); +locals + pixels1 dd ? + do_free dd ? +endl +pushad + mov edi,[p] + mov eax,[edi+4] ;target=p[1].i + mov ebx,[edi+8] ;level=p[2].i + mov ecx,[edi+12] ;components=p[3].i; + mov edx,[edi+16] ;width=p[4].i; + mov esi,[edi+20] ;height=p[5].i; + + cmp eax,GL_TEXTURE_2D ;if (param != GL_TEXTURE_2D) + jne .error + or ebx,ebx ;if (level != 0) + jnz .error + cmp ecx,3 ;if (components != 3) + jne .error + cmp dword[edi+24],0 ;if (border != 0) + jne .error + cmp dword[edi+28],GL_RGB ;if (format != GL_RGB) + jne .error + cmp dword[edi+32],GL_UNSIGNED_BYTE ;if (type != GL_UNSIGNED_BYTE) + jne .error + + jmp @f + .error: + stdcall dbg_print,sz_glTexImage2D,err_8 ;"glTexImage2D: combinaison of parameters not handled" + @@: + + mov dword[do_free],0 + cmp edx,256 + jne .else + cmp esi,256 + jne .else + mov eax,[edi+36] + mov [pixels1],eax ;pixels1=pixels + jmp @f + .else: ;if (width != 256 || height != 256) + stdcall gl_malloc, 256*256*3 + mov [pixels1],eax ;pixels1 = gl_malloc(256 * 256 * 3) + ; no interpolation is done here to respect the original image aliasing ! +;gl_resizeImageNoInterpolate(eax,256,256,[edi+36],edx,esi) + mov dword[do_free],1 + mov edx,256 + mov esi,256 + @@: + + mov ecx,[context] + mov ecx,[ecx+offs_cont_current_texture] + add ecx,offs_text_images + imul ebx,sizeof.GLTexture + add ecx,ebx ;ecx = &context.current_texture.images[level] + mov dword[ecx+offs_imag_xsize],edx ;im.xsize=width + 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 endp ; TODO: not all tests are done 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; -; int pname=p[2].i; -; int param=p[3].i; -; -; if (target != GL_TEXTURE_ENV) { -; error: -; gl_fatal_error("glTexParameter: unsupported option"); -; } -; -; if (pname != GL_TEXTURE_ENV_MODE) goto error; -; -; if (param != GL_DECAL) goto error; + cmp eax,GL_TEXTURE_ENV ;if (target != GL_TEXTURE_ENV) + jne .error + cmp ebx,GL_TEXTURE_ENV_MODE ;if (pname != GL_TEXTURE_ENV_MODE) + jne .error + cmp ecx,GL_DECAL ;if (param != GL_DECAL) + jne .error + + jmp @f + .error: + stdcall dbg_print,sz_glTexParameteri,err_6 + @@: ret endp ; TODO: not all tests are done 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; -; int pname=p[2].i; -; int param=p[3].i; -; -; if (target != GL_TEXTURE_2D) { -; error: -; gl_fatal_error("glTexParameter: unsupported option"); -; } -; -; switch(pname) { -; case GL_TEXTURE_WRAP_S: -; case GL_TEXTURE_WRAP_T: -; if (param != GL_REPEAT) goto error; -; break; -; } + cmp eax,GL_TEXTURE_2D ;if (target != GL_TEXTURE_2D) + jne .error + cmp ebx,GL_TEXTURE_WRAP_S + je @f + cmp ebx,GL_TEXTURE_WRAP_T + je @f + jmp .error + @@: + cmp ecx,GL_REPEAT ;if (param != GL_REPEAT) + jne .error + + jmp @f + .error: + stdcall dbg_print,sz_glTexParameteri,err_6 + @@: ret endp 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; -; int param=p[2].i; -; -; if (pname != GL_UNPACK_ALIGNMENT || -; param != 1) { -; gl_fatal_error("glPixelStore: unsupported option"); -; } + cmp eax,GL_UNPACK_ALIGNMENT ;if (pname != GL_UNPACK_ALIGNMENT) + jne .error + cmp ebx,1 ;if (param != 1) + jne .error + + jmp @f + .error: + stdcall dbg_print,sz_glPixelStorei,err_6 + @@: ret endp diff --git a/programs/develop/libraries/TinyGL/asm_fork/tinygl.asm b/programs/develop/libraries/TinyGL/asm_fork/tinygl.asm index 3bd33d1a84..2129668142 100644 --- a/programs/develop/libraries/TinyGL/asm_fork/tinygl.asm +++ b/programs/develop/libraries/TinyGL/asm_fork/tinygl.asm @@ -86,13 +86,12 @@ endp align 4 .str: mov ecx,0x0a ;задается система счисления изменяются регистры ebx,eax,ecx,edx входные параметры eax - число - ;преревод числа в ASCII строку взодные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной + ;преревод числа в ASCII строку входные данные ecx=система счисленя edi адрес куда записывать, будем строку, причем конец переменной cmp eax,ecx ;сравнить если в eax меньше чем в ecx то перейти на @@-1 т.е. на pop eax jb @f xor edx,edx ;очистить edx div ecx ;разделить - остаток в edx push edx ;положить в стек - ;dec edi ;смещение необходимое для записи с конца строки call .str ;перейти на саму себя т.е. вызвать саму себя и так до того момента пока в eax не станет меньше чем в ecx pop eax @@: ;cmp al,10 ;проверить не меньше ли значение в al чем 10 (для системы счисленя 10 данная команда - лишная)) @@ -131,22 +130,21 @@ glTexCoord3dv: ;(double *) glTexCoord4d: ;(double ,double ,double, double ) glTexCoord4fv: ;(float *) glTexCoord4dv: ;(double *) -glGenTextures: ;(int n, unsigned int *textures) -glDeleteTextures: ;(int n, const unsigned int *textures) glGetIntegerv: ;(int pname,int *params) glGetFloatv: ;(int pname, float *v) align 4 -f_kosgl_1 db 'kosglMakeCurrent',0 err_0 db 'Error while initializing Z buffer',13,10,0 f_zb_opn db ' ZB_open',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_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_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_zb db ' ZB_line',0 f_find_l db 'find_list',0 diff --git a/programs/develop/libraries/TinyGL/asm_fork/zgl.inc b/programs/develop/libraries/TinyGL/asm_fork/zgl.inc index 2ab3f0d673..afcb592989 100644 --- a/programs/develop/libraries/TinyGL/asm_fork/zgl.inc +++ b/programs/develop/libraries/TinyGL/asm_fork/zgl.inc @@ -31,9 +31,9 @@ SPECULAR_BUFFER_RESOLUTION equ 1024 MAX_MODELVIEW_STACK_DEPTH equ 32 MAX_PROJECTION_STACK_DEPTH equ 8 MAX_TEXTURE_STACK_DEPTH equ 8 -MAX_NAME_STACK_DEPTH equ 64 -MAX_TEXTURE_LEVELS equ 11 -MAX_LIGHTS equ 16 +MAX_NAME_STACK_DEPTH equ 64 +MAX_TEXTURE_LEVELS equ 11 +MAX_LIGHTS equ 16 VERTEX_HASH_SIZE equ 1031 @@ -172,6 +172,8 @@ struct GLImage ends offs_imag_pixmap equ 0 +offs_imag_xsize equ 4 +offs_imag_ysize equ 8 ; textures @@ -477,15 +479,6 @@ proc gl_clipcode uses ebx, x:dword, y:dword, z:dword, w1:dword fincstp 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 endp diff --git a/programs/develop/libraries/TinyGL/asm_fork/ztriangle.asm b/programs/develop/libraries/TinyGL/asm_fork/ztriangle.asm index 5fe7f53d51..8103b265f6 100644 --- a/programs/develop/libraries/TinyGL/asm_fork/ztriangle.asm +++ b/programs/develop/libraries/TinyGL/asm_fork/ztriangle.asm @@ -1,3 +1,9 @@ +; +; Макрос DRAW_LINE имеет параметр code, от которого зависит +; будет ли включен код или объявлены переменные. +; В версии на C++ параметра code нет, потому что там переменные +; можно ставить в любом месте функции, в asm версии такое не проходит. +; INTERP_Z equ 1 @@ -111,34 +117,42 @@ if TGL_FEATURE_RENDER_BITS <> 16 end if } -;;;DRAW_LINE_M equ 1 - macro DRAW_LINE code { local .cycle_0 local .cycle_1 if TGL_FEATURE_RENDER_BITS eq 16 if code eq 0 - pz dd ? ;uint* tmp dd ? ;uint - z dd ? ;uint - zz dd ? ;uint rgb dd ? ;uint drgbdx dd ? ;uint - n dd ? ;int end if if code eq 1 mov eax,[x2] sar eax,16 sub eax,[x1] mov [n],eax ;n = (x2 >> 16) - x1 -; pp=pp1+x1; -; pz=pz1+x1; -; z=z1; -; rgb=(r1 << 16) & 0xFFC00000; -; rgb|=(g1 >> 5) & 0x000007FF; -; rgb|=(b1 << 5) & 0x001FF000; -; drgbdx=_drgbdx; + mov edi,[pp1] + add edi,[x1] ;pp = pp1 + x1 + mov eax,[pz1] + add eax,[x1] + mov [pz],eax ;pz = pz1 + x1 + mov eax,[z1] + 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 .cycle_0: ;while (n>=3) cmp dword[n],3 @@ -148,7 +162,7 @@ align 4 PUT_PIXEL 2 PUT_PIXEL 3 add dword[pz],8 - add edi,4 + add edi,4*3 sub [n],4 jmp .cycle_0 .cycle_1: ;while (n>=0) @@ -156,7 +170,7 @@ align 4 jl .cycle_1_end PUT_PIXEL 0 add dword[pz],2 - inc edi + add edi,3 dec dword[n] jmp .cycle_1 .cycle_1_end: @@ -202,11 +216,16 @@ local .end_0 ;edi = pp mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение if TGL_FEATURE_RENDER_BITS eq 24 -; unsigned char *ptr; -; ptr = texture + (((t & 0x3FC00000) | s) >> 14) * 3; -; pp[3 * _a]= ptr[0]; -; pp[3 * _a + 1]= ptr[1]; -; pp[3 * _a + 2]= ptr[2]; + mov ebx,[t] + and ebx,0x3fc00000 + or ebx,[s] + shr ebx,14 + 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 ; pp[_a]=texture[((t & 0x3FC00000) | s) >> 14]; end if @@ -242,11 +261,17 @@ macro DRAW_INIT mov eax,[zb] mov eax,[eax+offs_zbuf_current_texture] mov [texture],eax + mov dword[esp-4],NB_INTERP + fild dword[esp-4] fild dword[dzdx] - fstp dword[fdzdx] -; fndzdx=NB_INTERP * fdzdx; -; ndszdx=NB_INTERP * dszdx; -; ndtzdx=NB_INTERP * dtzdx; + fst dword[fdzdx] ;fdzdx = (float)dzdx + fmul st0,st1 + fstp dword[fndzdx] ;fndzdx = NB_INTERP * fdzdx + 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 @@ -261,11 +286,18 @@ local .end_0 ;edi = pp mov word[ebx+2*_a],ax ;пишем в буфер глубины новое значение if TGL_FEATURE_RENDER_BITS eq 24 -; unsigned char *ptr; -; ptr = texture + (((t & 0x3FC00000) | (s & 0x003FC000)) >> 14) * 3; -; pp[3 * _a]= ptr[0]; -; pp[3 * _a + 1]= ptr[1]; -; pp[3 * _a + 2]= ptr[2]; + mov ebx,[t] + and ebx,0x3fc00000 + mov eax,[s] + and eax,0x003fc000 + 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 ; pp[_a]=*(PIXEL *)((char *)texture+ ; (((t & 0x3FC00000) | (s & 0x003FC000)) >> (17 - PSZSH))); @@ -285,69 +317,109 @@ macro DRAW_LINE code { if TGL_FEATURE_RENDER_BITS eq 24 if code eq 0 - pz dd ? ;uint * s dd ? ;uint t dd ? ;uint - z dd ? ;uint - zz dd ? ;uint n1 dd ? ;int - длинна горизонтальной линии в пикселях dsdx dd ? ;int dtdx dd ? ;int - s_z dd ? ;float - t_z dd ? ;float fz dd ? ;float zinv dd ? ;float end if if code eq 1 -; n1=(x2>>16)-x1; -; fz=(float)z1; -; zinv=1.0 / fz; -; pp=(pp1 + x1 * PSZB); -; pz=pz1+x1; -; z=z1; -; sz=sz1; -; tz=tz1; -; while (n1>=(NB_INTERP-1)) { -; { -; float ss,tt; -; ss=(sz * zinv); -; tt=(tz * zinv); -; s=(int) ss; -; t=(int) tt; -; dsdx= (int)( (dszdx - ss*fdzdx)*zinv ); -; dtdx= (int)( (dtzdx - tt*fdzdx)*zinv ); -; fz+=fndzdx; -; 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); -; pz+=NB_INTERP; -; pp=(pp + NB_INTERP * PSZB); -; n1-=NB_INTERP; -; sz+=ndszdx; -; tz+=ndtzdx; -; } -; { -; float ss,tt; -; ss=(sz * zinv); -; tt=(tz * zinv); -; s=(int) ss; -; t=(int) tt; -; dsdx= (int)( (dszdx - ss*fdzdx)*zinv ); -; dtdx= (int)( (dtzdx - tt*fdzdx)*zinv ); -; } -; while (n1>=0) { -;;; PUT_PIXEL 0 -; pz+=1; -; pp=(PIXEL *)((char *)pp + PSZB); + mov eax,[x2] + sar eax,16 + sub eax,[x1] + mov [n1],eax ;n1 = (x2 >> 16) - x1 +fld1 + fild dword[z1] + fst dword[fz] ;fz = (float)z1 + ;fld1 + fdivp + fstp dword[zinv] ;zinv = 1.0 / fz + mov edi,[x1] + imul edi,PSZB + add edi,[pp1] ;pp = (pp1 + x1 * PSZB) + mov eax,[pz1] + add eax,[x1] + mov [pz],eax ;pz = pz1 + x1 + mov eax,[z1] + mov [z],eax ;z = z1 + mov eax,[sz1] + mov [s_z],eax ;sz = sz1 + mov eax,[tz1] + mov [t_z],eax ;tz = tz1 +align 4 + .cycle_2: ;while (n1>=(NB_INTERP-1)) + cmp dword[n1],NB_INTERP-1 + jl .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 ) +fld1 + fld dword[fz] + fadd dword[fndzdx] + fst dword[fz] ;fz += fndzdx + ;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] -; } + jmp .cycle_3 + .cycle_3_end: end if end if } diff --git a/programs/develop/libraries/TinyGL/asm_fork/ztriangle.inc b/programs/develop/libraries/TinyGL/asm_fork/ztriangle.inc index f8c224268c..672e3dd95a 100644 --- a/programs/develop/libraries/TinyGL/asm_fork/ztriangle.inc +++ b/programs/develop/libraries/TinyGL/asm_fork/ztriangle.inc @@ -20,7 +20,6 @@ ; цвет испорченных пикселей. Цвет получаеться наиболее близким к указанному ; пользователем. - t dd ? ;ZBufferPoint* pr1 dd ? ;ZBufferPoint* pr2 dd ? ;ZBufferPoint* l1 dd ? ;ZBufferPoint* @@ -53,6 +52,10 @@ x2 dd ? ;int dx2dy2 dd ? ;int + pz dd ? ;unsigned short * + z dd ? ;uint + zz dd ? ;uint + if INTERP_Z eq 1 z1 dd ? ;int dzdx dd ? ;int @@ -100,18 +103,10 @@ if INTERP_STZ eq 1 dtzdy dd ? ;float dtzdl_min dd ? ;float dtzdl_max dd ? ;float + s_z dd ? ;float + t_z dd ? ;float end if - - -if DRAW_LINE_M eq 1 - DRAW_LINE 0 ;переменные делаются в макросе -else 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 or1 dd ? ;uint og1 dd ? ;uint @@ -121,19 +116,14 @@ if INTERP_ST eq 1 s dd ? ;uint t dd ? ;uint end if -if INTERP_STZ eq 1 - s_z dd ? ;float - t_z dd ? ;float -end if + +if DRAW_LINE_M eq 1 + DRAW_LINE 0 ;переменные делаются в макросе end if endl pushad -if DEBUG ;(1) -stdcall dbg_print,f_fill_tr,m_1 -end if - ; we sort the vertex with increasing y mov ebx,[p0] mov ecx,[p1]