From b331153fdd82cef4a905a6b5b4222c0ef3ec7b47 Mon Sep 17 00:00:00 2001 From: Yogev Ezra Date: Sat, 29 Jan 2011 15:06:54 +0000 Subject: [PATCH] Add '3DSheart' demo source; force compilation from source; remove pre-compiled binary from SVN. git-svn-id: svn://kolibrios.org@1781 a494cfbc-eb01-0410-851d-a64ba20cac60 --- data/eng/3d/3dsheart | Bin 18362 -> 0 bytes data/eng/Makefile | 3 +- data/rus/3d/3dsheart | Bin 18362 -> 0 bytes data/rus/Makefile | 3 +- programs/demos/3dsheart/trunk/3DSheart.ASM | 1984 ++++++++++++++++++++ 5 files changed, 1988 insertions(+), 2 deletions(-) delete mode 100644 data/eng/3d/3dsheart delete mode 100644 data/rus/3d/3dsheart create mode 100644 programs/demos/3dsheart/trunk/3DSheart.ASM diff --git a/data/eng/3d/3dsheart b/data/eng/3d/3dsheart deleted file mode 100644 index 451432efc9a3c6d931a58311fab3077479ecdd3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18362 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 V+}-#He!2sNjc`x9mia(jwg5gRqI&=U diff --git a/data/eng/Makefile b/data/eng/Makefile index 52767dd9c1..9bdfe75184 100644 --- a/data/eng/Makefile +++ b/data/eng/Makefile @@ -82,6 +82,7 @@ FASM_PROGRAMS:=\ 3d/view3ds:3D/VIEW3DS:$(PROGS)/demos/3DS/VIEW3DS.ASM \ 3d/3dspiral:3D/3DSPIRAL:$(PROGS)/demos/3dspiral/trunk/3dspiral.asm \ 3d/flatwav:3D/FLATWAV:$(PROGS)/demos/flatwav/trunk/FLATWAV.ASM \ + 3d/3dsheart:3D/3DSHEART:$(PROGS)/demos/3dsheart/trunk/3DSheart.ASM \ demos/bcdclk:DEMOS/BCDCLK:$(PROGS)/demos/bcdclk/bcdclk/bcdclk.asm \ demos/circle:DEMOS/CIRCLE:$(PROGS)/develop/examples/circle/trunk/circle.asm \ demos/colorref:DEMOS/COLORREF:$(PROGS)/demos/colorref/trunk/colorref.asm \ @@ -216,7 +217,7 @@ OTHER_FILES:=asciivju:ASCIIVJU autorun.dat:AUTORUN.DAT \ panel.dat:PANEL.DAT setup.dat:SETUP.DAT \ shell:SHELL spanel:SPANEL table:TABLE test:TEST \ vmode:VMODE \ - 3d/3dsheart:3D/3DSHEART 3d/cubeline:3D/CUBELINE \ + 3d/cubeline:3D/CUBELINE \ 3d/gears:3D/GEARS 3d/house.3ds:3D/HOUSE.3DS \ demos/ak47.lif:DEMOS/AK47.LIF \ demos/barge.lif:DEMOS/BARGE.LIF demos/life2:DEMOS/LIFE2 \ diff --git a/data/rus/3d/3dsheart b/data/rus/3d/3dsheart deleted file mode 100644 index 451432efc9a3c6d931a58311fab3077479ecdd3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18362 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 V+}-#He!2sNjc`x9mia(jwg5gRqI&=U diff --git a/data/rus/Makefile b/data/rus/Makefile index 5bd2f6f7b8..a7cacce54c 100644 --- a/data/rus/Makefile +++ b/data/rus/Makefile @@ -82,6 +82,7 @@ FASM_PROGRAMS:=\ 3d/view3ds:3D/VIEW3DS:$(PROGS)/demos/3DS/VIEW3DS.ASM \ 3d/3dspiral:3D/3DSPIRAL:$(PROGS)/demos/3dspiral/trunk/3dspiral.asm \ 3d/flatwav:3D/FLATWAV:$(PROGS)/demos/flatwav/trunk/FLATWAV.ASM \ + 3d/3dsheart:3D/3DSHEART:$(PROGS)/demos/3dsheart/trunk/3DSheart.ASM \ demos/bcdclk:DEMOS/BCDCLK:$(PROGS)/demos/bcdclk/bcdclk/bcdclk.asm \ demos/circle:DEMOS/CIRCLE:$(PROGS)/develop/examples/circle/trunk/circle.asm \ demos/colorref:DEMOS/COLORREF:$(PROGS)/demos/colorref/trunk/colorref.asm \ @@ -216,7 +217,7 @@ OTHER_FILES:=asciivju:ASCIIVJU autorun.dat:AUTORUN.DAT \ panel.dat:PANEL.DAT pipetka:PIPETKA setup.dat:SETUP.DAT \ shell:SHELL spanel:SPANEL table:TABLE test:TEST \ vmode:VMODE \ - 3d/3dsheart:3D/3DSHEART 3d/cubeline:3D/CUBELINE \ + 3d/cubeline:3D/CUBELINE \ 3d/gears:3D/GEARS 3d/house.3ds:3D/HOUSE.3DS \ demos/ak47.lif:DEMOS/AK47.LIF \ demos/barge.lif:DEMOS/BARGE.LIF demos/life2:DEMOS/LIFE2 \ diff --git a/programs/demos/3dsheart/trunk/3DSheart.ASM b/programs/demos/3dsheart/trunk/3DSheart.ASM new file mode 100644 index 0000000000..d6c8402932 --- /dev/null +++ b/programs/demos/3dsheart/trunk/3DSheart.ASM @@ -0,0 +1,1984 @@ +; +; application : Deus Caritas Est - app shows three models shading +; compiler : FASM 1.65.13 +; system : KolibriOS/MenuetOS +; author : macgub +; email : macgub3@wp.pl +; web : www.menuet.xt.pl +; Fell free to use this intro in your own distribution of KolibriOS/MenuetOS. +; Special greetings to all MenuetOS maniax in the world. +; I hope because my intros Christian Belive will be near to each of You. + + +; Some adjustments made by Madis Kalme +; madis.kalme@mail.ee +; I tried optimizing it a bit, but don't know if it was successful. The objects +; can be: +; 1) Read from a file (*.3DS standard) +; 2) Written in manually (at the end of the code) +SIZE_X equ 250 +SIZE_Y equ 250 +TIMEOUT equ 4 +ROUND equ 10 +TEX_X equ 512 ; texture width +TEX_Y equ 512 ; height +TEX_SHIFT equ 9 ; texture widith shifting +TEX equ SHIFTING ; TEX={SHIFTING | FLUENTLY} +FLUENTLY = 0 +SHIFTING = 1 +;CATMULL_SHIFT equ 8 +NON = 0 +MMX = 1 + +Ext = MMX ;Ext={ NON | MMX} + +use32 + org 0x0 + db 'MENUET01' ; 8 byte id + dd 0x01 ; header version + dd START ; start of code + dd I_END ; size of image + dd I_END ; memory for app + dd I_END ; esp + dd 0x0 , 0x0 ; I_Param , I_Icon + +START: ; start of execution + cld + ; call alloc_buffer_mem + call read_from_file + call init_triangles_normals + call init_point_normals + call init_envmap + call draw_window + + +still: + mov eax,23 ; wait here for event with timeout + mov ebx,TIMEOUT + cmp [speed_flag],1 + jne .skip + mov eax,11 + .skip: + int 0x40 + + cmp eax,1 ; redraw request ? + je red + cmp eax,2 ; key in buffer ? + je key + cmp eax,3 ; button in buffer ? + je button + + jmp noclose + + red: ; redraw + call draw_window + jmp noclose + + key: ; key + mov eax,2 ; just read it and ignore + int 0x40 + jmp noclose + + button: ; button + mov eax,17 ; get id + int 0x40 + + cmp ah,1 ; button id=1 ? + jne .ch_another + + mov eax,-1 ; close this program + int 0x40 + .ch_another: + cmp ah,2 + jne .ch_another1 + inc [r_flag] + cmp [r_flag],3 + jne noclose + mov [r_flag],0 + .ch_another1: + cmp ah,3 + jne .ch_another2 + inc [dr_flag] + cmp [dr_flag],3 + jne noclose + mov [dr_flag],0 + .ch_another2: + cmp ah,4 ; toggle speed + jne @f + inc [speed_flag] + cmp [speed_flag],2 + jne noclose + mov [speed_flag],0 + @@: + cmp ah,5 + jne @f ;scale- + mov [scale],0.7 + fninit + fld [sscale] + fmul [scale] + fstp [sscale] + call read_from_file + mov ax,[vect_x] ;-- last change + mov bx,[vect_y] + mov cx,[vect_z] + call add_vector +; call do_scale + @@: + cmp ah,6 + jne @f ; scale+ + mov [scale],1.3 + fninit + fld [sscale] + fmul [scale] + fstp [sscale] + call read_from_file + mov ax,[vect_x] + mov bx,[vect_y] + mov cx,[vect_z] + call add_vector + call init_triangles_normals + call init_point_normals + @@: + cmp ah,7 + jne @f + xor ax,ax ;add vector to object and rotary point + mov bx,-10 + xor cx,cx + call add_vector + sub [vect_y],10 + sub [yo],10 + @@: + cmp ah,8 + jne @f + xor ax,ax + xor bx,bx + mov cx,10 + call add_vector + add [vect_z],10 + add [zo],10 + @@: + cmp ah,9 + jne @f + mov ax,-10 + xor bx,bx + xor cx,cx + call add_vector + sub [vect_x],10 + sub [xo],10 + @@: + cmp ah,10 + jne @f + mov ax,10 + xor bx,bx + xor cx,cx + call add_vector + add [vect_x],10 + add [xo],10 + @@: + cmp ah,11 + jne @f + xor ax,ax + xor bx,bx + mov cx,-10 + call add_vector + sub [vect_z],10 + sub [zo],10 + @@: + cmp ah,12 + jne @f + xor ax,ax + mov bx,10 + xor cx,cx + call add_vector + add [vect_y],10 + add [yo],10 + @@: + cmp ah,13 ; change main color - + jne @f ; - lead color setting + cmp [max_color_r],245 + jge @f + add [max_color_r],10 + call init_envmap + @@: + cmp ah,14 + jne @f + cmp [max_color_g],245 + jge @f + add [max_color_g],10 + call init_envmap + @@: + cmp ah,15 + jne @f + cmp [max_color_b],245 + jge @f + add [max_color_b],10 + call init_envmap + @@: + cmp ah,16 ; change main color + jne @f + cmp [max_color_r],10 + jle @f + sub [max_color_r],10 + call init_envmap + @@: + cmp ah,17 + jne @f + cmp [max_color_g],10 + jle @f + sub [max_color_g],10 + call init_envmap + @@: + cmp ah,18 + jne @f + cmp [max_color_b],10 + jle @f + sub [max_color_b],10 + call init_envmap + @@: + cmp ah,19 + jne @f + inc [catmull_flag] + cmp [catmull_flag],2 + jne @f + mov [catmull_flag],0 + @@: + noclose: + + call calculate_angle ; calculates sinus and cosinus + call copy_point_normals + ; copy normals and rotate the copy using sin/cosbeta - best way + call rotate_point_normals + call calculate_colors + call copy_points + call rotate_points + call translate_perspective_points; translate from 3d to 2d + call clrscr ; clear the screen + cmp [dr_flag],2 + je @f + cmp [catmull_flag],1 ;if env_mapping sort faces + je @f + @@: + call sort_triangles + @@: + call fill_Z_buffer + + RDTSC + push eax + call draw_triangles ; draw all triangles from the list + + RDTSC + sub eax,[esp] + sub eax,41 + ; lea esi,[debug_points] + ; lea edi,[debug_points+6] + ; lea ebx,[debug_vector1] + ; call make_vector + ; fninit + ; fld [sinbeta_one] + ; fimul [debug_dwd] + ; fistp [debug_dd] + ; movzx eax,[debug_dd] + + + mov ecx,10 + .dc: + xor edx,edx + mov edi,10 + div edi + add dl,30h + mov [STRdata+ecx-1],dl + loop .dc + pop eax +macro show +{ + mov eax,7 ; put image + mov ebx,screen + mov ecx,SIZE_X shl 16 + SIZE_Y + mov edx,5 shl 16 + 20 + int 0x40 +} + show + mov eax,4 ; function 4 : write text to window + mov ebx,5*65536+23 ; [x start] *65536 + [y start] + mov ecx,-1 + mov edx,STRdata ; pointer to text beginning + mov esi,10 ; text length + int 40h + + + + jmp still + +;-------------------------------------------------------------------------------- +;-------------------------PROCEDURES--------------------------------------------- +;-------------------------------------------------------------------------------- +include "../../3DS/TEX3.INC" +include "../../3DS/FLAT_CAT.INC" +include "../../3DS/GRD_CAT.INC" +include "../../3DS/3DMATH.INC" +include "../../3DS/GRD3.INC" +include "../../3DS/FLAT3.INC" + + +;alloc_buffer_mem: +; mov eax,68 +; mov ebx,5 +; mov ecx,SIZE_X*SIZE_Y*3 +; int 0x40 +; mov [screen],eax +;ret +init_envmap: + +.temp equ word [ebp-2] + push ebp + mov ebp,esp + sub esp,2 + mov edi,envmap + fninit + + mov dx,-256 + .ie_ver: + mov cx,-256 + .ie_hor: + mov .temp,cx + fild .temp + fmul st,st0 + mov .temp,dx + fild .temp + fmul st,st0 + faddp + fsqrt + mov .temp,254 + fisubr .temp + fmul [env_const] + fistp .temp + mov ax,.temp + + or ax,ax + jge .ie_ok1 + xor ax,ax + jmp .ie_ok2 + .ie_ok1: + cmp ax,254 + jle .ie_ok2 + mov ax,254 + .ie_ok2: + push dx + mov bx,ax + mul [max_color_b] + shr ax,8 + stosb + mov ax,bx + mul [max_color_g] + shr ax,8 + stosb + mov ax,bx + mul [max_color_r] + shr ax,8 + stosb + pop dx + + inc cx + cmp cx,256 + jne .ie_hor + + inc dx + cmp dx,256 + jne .ie_ver + + mov esp,ebp + pop ebp +macro debug +{ + mov edi,envmap + mov ecx,512*512*3/4 + mov eax,0xffffffff + rep stosd +} +ret +calculate_colors: + fninit + xor ebx,ebx + movzx ecx,[points_count_var] + lea ecx,[ecx*3] + add ecx,ecx + .cc_again: + mov esi,light_vector + lea edi,[point_normals_rotated+ebx*2] + call dot_product + fcom [dot_min] + fstsw ax + sahf + ja .cc_ok1 + ffree st + mov dword[points_color+ebx],0 + mov word[points_color+ebx+4],0 + add ebx,6 + cmp ebx,ecx + jne .cc_again + jmp .cc_done + .cc_ok1: + fcom [dot_max] + fstsw ax + sahf + jb .cc_ok2 + ffree st + mov dword[points_color+ebx],0 ; clear r,g,b + mov word[points_color+ebx+4],0 + add ebx,6 + cmp ebx,ecx + jne .cc_again + jmp .cc_done + .cc_ok2: + fld st + fld st + fimul [max_color_r] + fistp word[points_color+ebx] ;each color as word + fimul [max_color_g] + fistp word[points_color+ebx+2] + fimul [max_color_b] + fistp word[points_color+ebx+4] + add ebx,6 + cmp ebx,ecx + jne .cc_again + .cc_done: +ret +copy_point_normals: + movzx ecx,[points_count_var] + shl ecx,2 + inc ecx + mov esi,point_normals + mov edi,point_normals_rotated + rep movsd +ret +rotate_point_normals: + movzx ecx,[points_count_var] + mov ebx,point_normals_rotated + fninit ; for now only rotate around Z axle + .again_r: + cmp [r_flag],1 + je .z_rot + cmp [r_flag],2 + je .x_rot + + .y_rot: + fld dword[ebx] ; x + fld [sinbeta] + fmul dword[ebx+8] ; z * sinbeta + fchs + fld [cosbeta] + fmul dword[ebx] ; x * cosbeta + faddp + fstp dword[ebx] ; new x + fmul [sinbeta] ; old x * sinbeta + fld [cosbeta] + fmul dword[ebx+8] ; z * cosbeta + faddp + fstp dword[ebx+8] ; new z + add ebx,12 + loop .y_rot + jmp .end_rot + .z_rot: + fld dword[ebx] ;x + fld [sinbeta] + fmul dword[ebx+4] ;y + fld [cosbeta] + fmul dword[ebx] ;x + faddp + fstp dword[ebx] ;new x + fmul [sinbeta] ; sinbeta * old x + fchs + fld [cosbeta] + fmul dword[ebx+4] ; cosbeta * y + faddp + fstp dword[ebx+4] ; new y + add ebx,12 + loop .z_rot + jmp .end_rot + .x_rot: + fld dword[ebx+4] ;y + fld [sinbeta] + fmul dword[ebx+8] ;z + fld [cosbeta] + fmul dword[ebx+4] ;y + faddp + fstp dword[ebx+4] ; new y + fmul [sinbeta] ; sinbeta * old y + fchs + fld [cosbeta] + fmul dword[ebx+8] + faddp + fstp dword[ebx+8] + add ebx,12 + loop .x_rot + .end_rot: +ret +init_triangles_normals: + mov ebx,triangles_normals + mov ebp,triangles + @@: + push ebx + mov ebx,vectors + movzx esi,word[ebp] ; first point index + lea esi,[esi*3] + lea esi,[points+esi*2] ; esi - pointer to 1st 3d point + movzx edi,word[ebp+2] ; second point index + lea edi,[edi*3] + lea edi,[points+edi*2] ; edi - pointer to 2nd 3d point + call make_vector + add ebx,12 + mov esi,edi + movzx edi,word[ebp+4] ; third point index + lea edi,[edi*3] + lea edi,[points+edi*2] + call make_vector + mov edi,ebx ; edi - pointer to 2nd vector + mov esi,ebx + sub esi,12 ; esi - pointer to 1st vector + pop ebx + call cross_product + mov edi,ebx + call normalize_vector + add ebp,6 + add ebx,12 + cmp dword[ebp],-1 + jne @b +ret + +init_point_normals: +.x equ dword [ebp-4] +.y equ dword [ebp-8] +.z equ dword [ebp-12] +.point_number equ word [ebp-26] +.hit_faces equ word [ebp-28] + + fninit + mov ebp,esp + sub esp,28 + mov edi,point_normals + mov .point_number,0 + .ipn_loop: + mov .hit_faces,0 + mov .x,0 + mov .y,0 + mov .z,0 + mov esi,triangles + xor ecx,ecx ; ecx - triangle number + .ipn_check_face: + xor ebx,ebx ; ebx - 'position' in one triangle + .ipn_check_vertex: + movzx eax,word[esi+ebx] ; eax - point_number + cmp ax,.point_number + jne .ipn_next_vertex + push esi + mov esi,ecx + lea esi,[esi*3] + lea esi,[triangles_normals+esi*4] + ; shl esi,2 + ; add esi,triangles_normals + + fld .x + fadd dword[esi+vec_x] + fstp .x + fld .y + fadd dword[esi+vec_y] + fstp .y + fld .z + fadd dword[esi+vec_z] + fstp .z + pop esi + inc .hit_faces + jmp .ipn_next_face + .ipn_next_vertex: + add ebx,2 + cmp ebx,6 + jne .ipn_check_vertex + .ipn_next_face: + add esi,6 + inc ecx + cmp cx,[triangles_count_var] + jne .ipn_check_face + + fld .x + fidiv .hit_faces + fstp dword[edi+vec_x] + fld .y + fidiv .hit_faces + fstp dword[edi+vec_y] + fld .z + fidiv .hit_faces + fstp dword[edi+vec_z] + call normalize_vector + add edi,12 ;type vector 3d + inc .point_number + mov dx,.point_number + cmp dx,[points_count_var] + jne .ipn_loop + + mov esp,ebp +ret + +add_vector: + mov ebp,points + @@: + add word[ebp],ax + add word[ebp+2],bx + add word[ebp+4],cx + add ebp,6 + cmp dword[ebp],-1 + jne @b +ret +;do_scale: +; fninit +; mov ebp,points +; .next_sc: +; fld1 +; fsub [scale] +; fld st +; fimul [xo] +; fld [scale] +; fimul word[ebp] ;x +; faddp +; fistp word[ebp] +; fld st +; fimul [yo] +; fld [scale] +; fimul word[ebp+2] +; faddp +; fistp word[ebp+2] +; fimul [zo] +; fld [scale] +; fimul word[ebp+4] +; faddp +; fistp word[ebp+4] +; add ebp,6 +; cmp dword[ebp],-1 +; jne .next_sc +;ret +sort_triangles: + mov esi,triangles + mov edi,triangles_with_z + mov ebp,points_rotated + + make_triangle_with_z: ;makes list with triangles and z position + movzx eax,word[esi] + lea eax,[eax*3] + movzx ecx,word[ebp+eax*2+4] + + movzx eax,word[esi+2] + lea eax,[eax*3] + add cx,word[ebp+eax*2+4] + + movzx eax,word[esi+4] + lea eax,[eax*3] + add cx,word[ebp+eax*2+4] + + mov ax,cx + ; cwd + ; idiv word[i3] + movsd ; store vertex coordinates + movsw + stosw ; middle vertex coordinate 'z' in triangles_with_z list + cmp dword[esi],-1 + jne make_triangle_with_z + movsd ; copy end mark + mov eax,4 + lea edx,[edi-8-trizdd] + mov [high],edx + call quicksort + mov eax,4 + mov edx,[high] + call insertsort + jmp end_sort + + quicksort: + mov ecx,edx + sub ecx,eax + cmp ecx,32 + jc .exit + lea ecx,[eax+edx] + shr ecx,4 + lea ecx,[ecx*8-4]; i + mov ebx,[trizdd+eax]; trizdd[l] + mov esi,[trizdd+ecx]; trizdd[i] + mov edi,[trizdd+edx]; trizdd[h] + cmp ebx,esi + jg @f ; direction NB! you need to negate these to invert the order + if Ext=NON + mov [trizdd+eax],esi + mov [trizdd+ecx],ebx + mov ebx,[trizdd+eax-4] + mov esi,[trizdd+ecx-4] + mov [trizdd+eax-4],esi + mov [trizdd+ecx-4],ebx + mov ebx,[trizdd+eax] + mov esi,[trizdd+ecx] + else + movq mm0,[trizdq+eax-4] + movq mm1,[trizdq+ecx-4] + movq [trizdq+ecx-4],mm0 + movq [trizdq+eax-4],mm1 + xchg ebx,esi + end if + @@: + cmp ebx,edi + jg @f ; direction + if Ext=NON + mov [trizdd+eax],edi + mov [trizdd+edx],ebx + mov ebx,[trizdd+eax-4] + mov edi,[trizdd+edx-4] + mov [trizdd+eax-4],edi + mov [trizdd+edx-4],ebx + mov ebx,[trizdd+eax] + mov edi,[trizdd+edx] + else + movq mm0,[trizdq+eax-4] + movq mm1,[trizdq+edx-4] + movq [trizdq+edx-4],mm0 + movq [trizdq+eax-4],mm1 + xchg ebx,edi + end if + @@: + cmp esi,edi + jg @f ; direction + if Ext=NON + mov [trizdd+ecx],edi + mov [trizdd+edx],esi + mov esi,[trizdd+ecx-4] + mov edi,[trizdd+edx-4] + mov [trizdd+ecx-4],edi + mov [trizdd+edx-4],esi + else + movq mm0,[trizdq+ecx-4] + movq mm1,[trizdq+edx-4] + movq [trizdq+edx-4],mm0 + movq [trizdq+ecx-4],mm1 +; xchg ebx,esi + end if + @@: + mov ebp,eax ; direction + add ebp,8 ; j + if Ext=NON + mov esi,[trizdd+ebp] + mov edi,[trizdd+ecx] + mov [trizdd+ebp],edi + mov [trizdd+ecx],esi + mov esi,[trizdd+ebp-4] + mov edi,[trizdd+ecx-4] + mov [trizdd+ecx-4],esi + mov [trizdd+ebp-4],edi + else + movq mm0,[trizdq+ebp-4] + movq mm1,[trizdq+ecx-4] + movq [trizdq+ecx-4],mm0 + movq [trizdq+ebp-4],mm1 + end if + mov ecx,edx ; i; direction + mov ebx,[trizdd+ebp]; trizdd[j] + .loop: + sub ecx,8 ; direction + cmp [trizdd+ecx],ebx + jl .loop ; direction + @@: + add ebp,8 ; direction + cmp [trizdd+ebp],ebx + jg @b ; direction + cmp ebp,ecx + jge @f ; direction + if Ext=NON + mov esi,[trizdd+ecx] + mov edi,[trizdd+ebp] + mov [trizdd+ebp],esi + mov [trizdd+ecx],edi + mov edi,[trizdd+ecx-4] + mov esi,[trizdd+ebp-4] + mov [trizdd+ebp-4],edi + mov [trizdd+ecx-4],esi + else + movq mm0,[trizdq+ecx-4] + movq mm1,[trizdq+ebp-4] + movq [trizdq+ebp-4],mm0 + movq [trizdq+ecx-4],mm1 + end if + jmp .loop + @@: + if Ext=NON + mov esi,[trizdd+ecx] + mov edi,[trizdd+eax+8] + mov [trizdd+eax+8],esi + mov [trizdd+ecx],edi + mov edi,[trizdd+ecx-4] + mov esi,[trizdd+eax+4] + mov [trizdd+eax+4],edi + mov [trizdd+ecx-4],esi + else + movq mm0,[trizdq+ecx-4] + movq mm1,[trizdq+eax+4]; dir + movq [trizdq+eax+4],mm0; dir + movq [trizdq+ecx-4],mm1 + end if + add ecx,8 + push ecx edx + mov edx,ebp + call quicksort + pop edx eax + call quicksort + .exit: + ret + insertsort: + mov esi,eax + .start: + add esi,8 + cmp esi,edx + ja .exit + mov ebx,[trizdd+esi] + if Ext=NON + mov ecx,[trizdd+esi-4] + else + movq mm1,[trizdq+esi-4] + end if + mov edi,esi + @@: + cmp edi,eax + jna @f + cmp [trizdd+edi-8],ebx + jg @f ; direction + if Ext=NON + mov ebp,[trizdd+edi-8] + mov [trizdd+edi],ebp + mov ebp,[trizdd+edi-12] + mov [trizdd+edi-4],ebp + else + movq mm0,[trizdq+edi-12] + movq [trizdq+edi-4],mm0 + end if + sub edi,8 + jmp @b + @@: + if Ext=NON + mov [trizdd+edi],ebx + mov [trizdd+edi-4],ecx + else + movq [trizdq+edi-4],mm1 + end if + jmp .start + .exit: + ret + end_sort: + ; translate triangles_with_z to sorted_triangles + mov esi,triangles_with_z + ; mov edi,sorted_triangles + mov edi,triangles + again_copy: + if Ext=NON + movsd + movsw + add esi,2 + else + movq mm0,[esi] + movq [edi],mm0 + add esi,8 + add edi,6 + end if + cmp dword[esi],-1 + jne again_copy +; if Ext=MMX +; emms +; end if + movsd ; copy end mark too +ret + +clrscr: + mov edi,screen + mov ecx,SIZE_X*SIZE_Y*3/4 + xor eax,eax + if Ext=NON + rep stosd + else + pxor mm0,mm0 + @@: + movq [edi+00],mm0 + movq [edi+08],mm0 + movq [edi+16],mm0 + movq [edi+24],mm0 + add edi,32 + sub ecx,8 + jnc @b + end if +ret + +calculate_angle: + fninit +; fldpi +; fidiv [i180] + fld [piD180] + fimul [angle_counter] + fsincos + fstp [sinbeta] + fstp [cosbeta] + inc [angle_counter] + cmp [angle_counter],360 + jne end_calc_angle + mov [angle_counter],0 + end_calc_angle: +ret + +rotate_points: + fninit + mov ebx,points_rotated + again_r: + cmp [r_flag],1 + je .z_rot + cmp [r_flag],2 + je .x_rot + .y_rot: + mov eax,[ebx+2] ;z + mov ax,word[ebx] ;x + sub eax,dword[xo] + mov dword[xsub],eax + fld [sinbeta] + fimul [zsub] + fchs + fld [cosbeta] + fimul [xsub] + faddp + fiadd [xo] + fistp word[ebx] ;x + fld [sinbeta] + fimul [xsub] + fld [cosbeta] + fimul [zsub] + faddp + fiadd [zo] + fistp word[ebx+4] ;z + jmp .end_rot + .z_rot: + mov ax,word[ebx] + sub ax,word[xo] ;need optimization + mov [xsub],ax + mov ax,word[ebx+2] + sub ax,word[yo] + mov [ysub],ax + fld [sinbeta] + fimul [ysub] + fld [cosbeta] + fimul [xsub] + faddp + fiadd [xo] + fistp word[ebx] + fld [cosbeta] + fimul [ysub] + fld [sinbeta] + fimul [xsub] + fchs + faddp + fiadd [yo] + fistp word[ebx+2] + jmp .end_rot + .x_rot: + mov ax,word[ebx+2] + sub ax,[yo] + mov [ysub],ax + mov ax,word[ebx+4] + sub ax,word[zo] + mov [zsub],ax + fld [sinbeta] + fimul [zsub] + fld [cosbeta] + fimul [ysub] + faddp + fiadd [yo] + fistp word[ebx+2];y + fld [cosbeta] + fimul [zsub] + fld [sinbeta] + fimul [ysub] + fchs + faddp + fiadd [zo] + fistp word[ebx+4] + .end_rot: + add ebx,6 + cmp dword[ebx],-1 + jne again_r +ret + +draw_triangles: + mov esi,triangles + .again_dts: + mov ebp,points_rotated + if Ext=NON + movzx eax,word[esi] + mov [point_index1],ax + lea eax,[eax*3] + add eax,eax + push ebp + add ebp,eax + mov eax,[ebp] + mov dword[xx1],eax + mov eax,[ebp+4] + mov [zz1],ax + pop ebp + + + movzx eax,word[esi+2] + mov [point_index2],ax + lea eax,[eax*3] + add eax,eax + push ebp + add ebp,eax + mov eax,[ebp] + mov dword[xx2],eax + mov eax,[ebp+4] + mov [zz2],ax + pop ebp + + + movzx eax,word[esi+4] ; xyz3 = [ebp+[esi+4]*6] + mov [point_index3],ax + lea eax,[eax*3] + add eax,eax + ; push ebp + add ebp,eax + mov eax,[ebp] + mov dword[xx3],eax + mov eax,[ebp+4] + mov [zz3],ax + else + mov eax,dword[esi] ; don't know MMX + mov dword[point_index1],eax + ; shr eax,16 + ; mov [point_index2],ax + mov ax,word[esi+4] + mov [point_index3],ax + movq mm0,[esi] + pmullw mm0,qword[const6] + movd eax,mm0 + psrlq mm0,16 + movd ebx,mm0 + psrlq mm0,16 + movd ecx,mm0 + and eax,0FFFFh + and ebx,0FFFFh + and ecx,0FFFFh + movq mm0,[ebp+eax] + movq mm1,[ebp+ebx] + movq mm2,[ebp+ecx] + movq qword[xx1],mm0 + movq qword[xx2],mm1 + movq qword[xx3],mm2 +; emms + end if + push esi + ; culling + fninit + mov esi,point_index1 + mov ecx,3 + @@: + movzx eax,word[esi] + lea eax,[eax*3] + shl eax,2 + lea eax,[eax+point_normals_rotated] + fld dword[eax+8] + ftst + fstsw ax + sahf + jb @f + ffree st + loop @b + jmp .end_draw + @@: + ffree st ;is visable + + cmp [dr_flag],0 ; draw type flag + je .flat_draw + cmp [dr_flag],2 + je .env_mapping + + movzx edi,[point_index3] + lea edi,[edi*3] + lea edi,[points_color+edi*2] + cmp [catmull_flag],0 + je @f + push [zz3] + @@: + push word[edi] + push word[edi+2] + push word[edi+4] + movzx edi,[point_index2] + lea edi,[edi*3] + lea edi,[points_color+edi*2] + cmp [catmull_flag],0 + je @f + push [zz2] + @@: + push word[edi] + push word[edi+2] + push word[edi+4] + movzx edi,[point_index1] + lea edi,[edi*3] + lea edi,[points_color+edi*2] + cmp [catmull_flag],0 + je @f + push [zz1] + @@: + push word[edi] + push word[edi+2] + push word[edi+4] + + ; movzx edi,[point_index3] ;gouraud shading according to light vector + ; lea edi,[edi*3] + ; lea edi,[4*edi+point_normals_rotated] ; edi - normal + ; mov esi,light_vector + ; call dot_product + ; fabs + ; fimul [max_color_r] + ; fistp [temp_col] + ; and [temp_col],0x00ff + ; push [temp_col] + ; push [temp_col] + ; push [temp_col] + + ; movzx edi,[point_index2] + ; lea edi,[edi*3] + ; lea edi,[4*edi+point_normals_rotated] ; edi - normal + ; mov esi,light_vector + ; call dot_product + ; fabs + ; fimul [max_color_r] + ; fistp [temp_col] + ; and [temp_col],0x00ff + ; push [temp_col] + ; push [temp_col] + ; push [temp_col] + + ; movzx edi,[point_index1] + ; lea edi,[edi*3] + ; lea edi,[4*edi+point_normals_rotated] ; edi - normal + ; mov esi,light_vector + ; call dot_product + ; fabs + ; fimul [max_color_r] + ; fistp [temp_col] + ; and [temp_col],0x00ff + ; push [temp_col] + ; push [temp_col] + ; push [temp_col] + +; xor edx,edx ; draw acording to position +; mov ax,[zz3] +; add ax,128 +; neg al +; and ax,0x00ff +; push ax +; neg al +; push ax +; mov dx,[yy3] +; and dx,0x00ff +; push dx +; mov ax,[zz2] +; add ax,128 +; neg al +; and ax,0x00ff +; push ax +; neg al +; push ax +; mov dx,[yy2] +; and dx,0x00ff +; push dx +; mov ax,[zz1] +; add ax,128 +; neg al +; and ax,0x00ff +; push ax +; neg al +; push ax +; mov dx,[yy1] +; and dx,0x00ff +; push dx + mov eax,dword[xx1] + ror eax,16 + mov ebx,dword[xx2] + ror ebx,16 + mov ecx,dword[xx3] + ror ecx,16 + lea edi,[screen] + cmp [catmull_flag],0 + je @f + lea esi,[Z_buffer] + call gouraud_triangle_z + jmp .end_draw + @@: + call gouraud_triangle + jmp .end_draw + .flat_draw: + + movzx edi,[point_index3] + lea edi,[edi*3] + lea edi,[points_color+edi*2] + movzx eax,word[edi] + movzx ebx,word[edi+2] + movzx ecx,word[edi+4] + movzx edi,[point_index2] + lea edi,[edi*3] + lea edi,[points_color+edi*2] + add ax,word[edi] + add bx,word[edi+2] + add cx,word[edi+4] + movzx edi,[point_index1] + lea edi,[edi*3] + lea edi,[points_color+edi*2] + add ax,word[edi] + add bx,word[edi+2] + add cx,word[edi+4] + cwd + idiv [i3] + mov di,ax + shl edi,16 + mov ax,bx + cwd + idiv [i3] + mov di,ax + shl di,8 + mov ax,cx + cwd + idiv [i3] + mov edx,edi + mov dl,al + and edx,0x00ffffff + + + ; mov ax,[zz1] ; z position depend draw + ; add ax,[zz2] + ; add ax,[zz3] + ; cwd + ; idiv [i3] ; = -((a+b+c)/3+130) + ; add ax,130 + ; neg al + ; xor edx,edx + ; mov ah,al ;set color according to z position + ; shl eax,8 + ; mov edx,eax + + mov eax,dword[xx1] + ror eax,16 + mov ebx,dword[xx2] + ror ebx,16 + mov ecx,dword[xx3] + ror ecx,16 + ; mov edi,screen + lea edi,[screen] + cmp [catmull_flag],0 + je @f + lea esi,[Z_buffer] + push word[zz3] + push word[zz2] + push word[zz1] + call flat_triangle_z + jmp .end_draw + @@: + call draw_triangle + jmp .end_draw + .env_mapping: + ; fninit + mov esi,point_index1 + sub esp,12 + mov edi,esp + mov ecx,3 + @@: + movzx eax,word[esi] + lea eax,[eax*3] + shl eax,2 + add eax,point_normals_rotated + ; texture x=(rotated point normal -> x * 255)+255 + fld dword[eax] + fimul [correct_tex] + fiadd [correct_tex] + fistp word[edi] + ; texture y=(rotated point normal -> y * 255)+255 + fld dword[eax+4] + fimul [correct_tex] + fiadd [correct_tex] + fistp word[edi+2] + + add edi,4 + add esi,2 + loop @b + + mov eax,dword[xx1] + ror eax,16 + mov ebx,dword[xx2] + ror ebx,16 + mov ecx,dword[xx3] + ror ecx,16 + mov edi,screen + mov esi,envmap + call tex_triangle + + .end_draw: + pop esi + add esi,6 + cmp dword[esi],-1 + jne .again_dts +ret +translate_points: +; fninit +; mov ebx,points_rotated +; again_trans: +; fild word[ebx+4] ;z1 +; fmul [sq] +; fld st +; fiadd word[ebx] ;x1 +; fistp word[ebx] +; fchs +; fiadd word[ebx+2] ;y1 +; fistp word[ebx+2] ;y1 + +; add ebx,6 +; cmp dword[ebx],-1 +; jne again_trans +;ret +translate_perspective_points: ;translate points from 3d to 2d using + fninit ;perspective equations + mov ebx,points_rotated + .again_trans: + fild word[ebx] + fisub [xobs] + fimul [zobs] + fild word[ebx+4] + fisub [zobs] + fdivp + fiadd [xobs] + fistp word[ebx] + fild word[ebx+2] + fisub [yobs] + fimul [zobs] + fild word[ebx+4] + fisub [zobs] + fdivp + fchs + fiadd [yobs] + fistp word[ebx+2] + add ebx,6 + cmp dword[ebx],-1 + jne .again_trans +ret + + +copy_points: + mov esi,points + mov edi,points_rotated + mov ecx,points_count*3+2 + rep movsw +ret + + + +read_from_file: + mov edi,triangles + xor ebx,ebx + xor ebp,ebp + mov esi,SourceFile + cmp [esi],word 4D4Dh + jne .exit ;Must be legal .3DS file + cmp dword[esi+2],EndFile-SourceFile + jne .exit ;This must tell the length + add esi,6 + @@: + cmp [esi],word 3D3Dh + je @f + add esi,[esi+2] + jmp @b + @@: + add esi,6 + .find4k: + cmp [esi],word 4000h + je @f + add esi,[esi+2] + cmp esi,EndFile + jc .find4k + jmp .exit + @@: + add esi,6 + @@: + cmp [esi],byte 0 + je @f + inc esi + jmp @b + @@: + inc esi + @@: + cmp [esi],word 4100h + je @f + add esi,[esi+2] + jmp @b + @@: + add esi,6 + @@: + cmp [esi],word 4110h + je @f + add esi,[esi+2] + jmp @b + @@: + movzx ecx,word[esi+6] + mov [points_count_var],cx + mov edx,ecx + add esi,8 + @@: + fld dword[esi+4] + fmul [sscale] + fadd [xoffset] + fld dword[esi+8] + fchs + fmul [sscale] + fadd [yoffset] + fld dword[esi+0] + fchs + fmul [sscale] + fistp word[points+ebx+4] + fistp word[points+ebx+2] + fistp word[points+ebx+0] + add ebx,6 + add esi,12 + dec ecx + jnz @b + @@: + mov dword[points+ebx],-1 + @@: + cmp [esi],word 4120h + je @f + add esi,[esi+2] + jmp @b + @@: + movzx ecx,word[esi+6] + mov [triangles_count_var],cx + add esi,8 + ;mov edi,triangles + @@: + movsd + movsw + add word[edi-6],bp + add word[edi-4],bp + add word[edi-2],bp + add esi,2 + dec ecx + jnz @b + add ebp,edx + jmp .find4k + + .exit: + mov dword[edi],-1 +ret + + +; ********************************************* +; ******* WINDOW DEFINITIONS AND DRAW ******** +; ********************************************* + draw_window: + mov eax,12 ; function 12:tell os about windowdraw + mov ebx,1 ; 1, start of draw + int 0x40 + + ; DRAW WINDOW + mov eax,0 ; function 0 : define and draw window + mov ebx,100*65536+SIZE_X+80 ; [x start] *65536 + [x size] + mov ecx,100*65536+SIZE_Y+30 ; [y start] *65536 + [y size] + mov edx,0x02000000 ; color of work area RRGGBB,8->color gl + mov esi,0x805080d0 ; color of grab bar RRGGBB,8->color gl + mov edi,0x005080d0 ; color of frames RRGGBB + int 0x40 + + ; WINDOW LABEL + mov eax,4 ; function 4 : write text to window + mov ebx,8*65536+8 ; [x start] *65536 + [y start] + mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) + mov edx,labelt ; pointer to text beginning + mov esi,labellen-labelt ; text length + int 0x40 + + ; CLOSE BUTTON + mov eax,8 ; function 8 : define and draw button + mov ebx,(SIZE_X+80-19)*65536+12 ; [x start] *65536 + [x size] + mov ecx,5*65536+12 ; [y start] *65536 + [y size] + mov edx,1 ; button id + mov esi,0x6688dd ; button color RRGGBB + int 0x40 + + ; ROTARY BUTTON + mov eax,8 ; function 8 : define and draw button + mov ebx,(SIZE_X+10)*65536+62 ; [x start] *65536 + [x size] + mov ecx,25*65536+12 ; [y start] *65536 + [y size] + mov edx,2 ; button id + mov esi,0x6688dd ; button color RRGGBB + int 0x40 + ; ROTARY LABEL + mov eax,4 ; function 4 : write text to window + mov ebx,(SIZE_X+12)*65536+28 ; [x start] *65536 + [y start] + mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) + mov edx,labelrot ; pointer to text beginning + mov esi,labelrotend-labelrot ; text length + int 0x40 + + ; DRAW MODE BUTTON + mov eax,8 ; function 8 : define and draw button + mov ebx,(SIZE_X+10)*65536+62 ; [x start] *65536 + [x size] + mov ecx,(25+15)*65536+12 ; [y start] *65536 + [y size] + mov edx,3 ; button id + mov esi,0x6688dd ; button color RRGGBB + int 0x40 + ; DRAW MODE LABEL + mov eax,4 ; function 4 : write text to window + mov ebx,(SIZE_X+12)*65536+28+15 ; [x start] *65536 + [y start] + mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) + mov edx,labeldrmod ; pointer to text beginning + mov esi,labeldrmodend-labeldrmod ; text length + int 0x40 + + ; SPEED BUTTON + mov eax,8 ; function 8 : define and draw button + mov ebx,(SIZE_X+10)*65536+62 ; [x start] *65536 + [x size] + mov ecx,(25+15*2)*65536+12 ; [y start] *65536 + [y size] + mov edx,4 ; button id + mov esi,0x6688dd ; button color RRGGBB + int 0x40 + ; SPEED MODE LABEL + mov eax,4 ; function 4 : write text to window + mov ebx,(SIZE_X+12)*65536+(28+15*2) ; [x start] *65536 + [y start] + mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) + mov edx,labelspeedmod ; pointer to text beginning + mov esi,labelspeedmodend-labelspeedmod ; text length + int 0x40 + + ; SCALE- BUTTON + mov eax,8 ; function 8 : define and draw button + mov ebx,(SIZE_X+10)*65536+62 ; [x start] *65536 + [x size] + mov ecx,(25+15*3)*65536+12 ; [y start] *65536 + [y size] + mov edx,5 ; button id + mov esi,0x6688dd ; button color RRGGBB + int 0x40 + ; SCALE- MODE LABEL + mov eax,4 ; function 4 : write text to window + mov ebx,(SIZE_X+12)*65536+(28+15*3) ; [x start] *65536 + [y start] + mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) + mov edx,labelzoomout ; pointer to text beginning + mov esi,labelzoomoutend-labelzoomout ; text length + int 0x40 + + ; SCALE+ BUTTON + mov eax,8 ; function 8 : define and draw button + mov ebx,(SIZE_X+10)*65536+62 ; [x start] *65536 + [x size] + mov ecx,(25+15*4)*65536+12 ; [y start] *65536 + [y size] + mov edx,6 ; button id + mov esi,0x6688dd ; button color RRGGBB + int 0x40 + ; SCALE+ MODE LABEL + mov eax,4 ; function 4 : write text to window + mov ebx,(SIZE_X+12)*65536+(28+15*4) ; [x start] *65536 + [y start] + mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) + mov edx,labelzoomin ; pointer to text beginning + mov esi,labelzoominend-labelzoomin ; text length + int 0x40 + ; ADD VECTOR LABEL + mov eax,4 ; function 4 : write text to window + mov ebx,(SIZE_X+12)*65536+(28+15*5) ; [x start] *65536 + [y start] + mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) + mov edx,labelvector ; pointer to text beginning + mov esi,labelvectorend-labelvector ; text length + int 0x40 + ; VECTOR Y- BUTTON + mov eax,8 ; function 8 : define and draw button + mov ebx,(SIZE_X+10+20)*65536+62-42 ; [x start] *65536 + [x size] + mov ecx,(25+15*6)*65536+12 ; [y start] *65536 + [y size] + mov edx,7 ; button id + mov esi,0x6688dd ; button color RRGGBB + int 0x40 + ;VECTOR Y- LABEL + mov eax,4 ; function 4 : write text to window + mov ebx,(SIZE_X+12+20)*65536+(28+15*6) ; [x start] *65536 + [y start] + mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) + mov edx,labelyminus ; pointer to text beginning + mov esi,labelyminusend-labelyminus ; text length + int 0x40 + ; VECTOR Z+ BUTTON + mov eax,8 ; function 8 : define and draw button + mov ebx,(SIZE_X+10+41)*65536+62-41 ; [x start] *65536 + [x size] + mov ecx,(25+15*6)*65536+12 ; [y start] *65536 + [y size] + mov edx,8 ; button id + mov esi,0x6688dd ; button color RRGGBB + int 0x40 + ;VECTOR Z+ LABEL + mov eax,4 ; function 4 : write text to window + mov ebx,(SIZE_X+12+41)*65536+(28+15*6) ; [x start] *65536 + [y start] + mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) + mov edx,labelzplus ; pointer to text beginning + mov esi,labelzplusend-labelzplus ; text length + int 0x40 + ; VECTOR x- BUTTON + mov eax,8 ; function 8 : define and draw button + mov ebx,(SIZE_X+10)*65536+62-41 ; [x start] *65536 + [x size] + mov ecx,(25+15*7)*65536+12 ; [y start] *65536 + [y size] + mov edx,9 ; button id + mov esi,0x6688dd ; button color RRGGBB + int 0x40 + ;VECTOR x- LABEL + mov eax,4 ; function 4 : write text to window + mov ebx,(SIZE_X+12)*65536+(28+15*7) ; [x start] *65536 + [y start] + mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) + mov edx,labelxminus ; pointer to text beginning + mov esi,labelxminusend-labelxminus ; text length + int 0x40 + ; VECTOR x+ BUTTON + mov eax,8 ; function 8 : define and draw button + mov ebx,(SIZE_X+10+41)*65536+62-41 ; [x start] *65536 + [x size] + mov ecx,(25+15*7)*65536+12 ; [y start] *65536 + [y size] + mov edx,10 ; button id + mov esi,0x6688dd ; button color RRGGBB + int 0x40 + ;VECTOR x+ LABEL + mov eax,4 ; function 4 : write text to window + mov ebx,(SIZE_X+12+41)*65536+(28+15*7) ; [x start] *65536 + [y start] + mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) + mov edx,labelxplus ; pointer to text beginning + mov esi,labelxplusend-labelxplus ; text length + int 0x40 + ; VECTOR z- BUTTON + mov eax,8 ; function 8 : define and draw button + mov ebx,(SIZE_X+10)*65536+62-41 ; [x start] *65536 + [x size] + mov ecx,(25+15*8)*65536+12 ; [y start] *65536 + [y size] + mov edx,11 ; button id + mov esi,0x6688dd ; button color RRGGBB + int 0x40 + ;VECTOR z- LABEL + mov eax,4 ; function 4 : write text to window + mov ebx,(SIZE_X+12)*65536+(28+15*8) ; [x start] *65536 + [y start] + mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) + mov edx,labelzminus ; pointer to text beginning + mov esi,labelzminusend-labelzminus ; text length + int 0x40 + ;VECTOR Y+ BUTTON + mov eax,8 ; function 8 : define and draw button + mov ebx,(SIZE_X+10+20)*65536+62-42 ; [x start] *65536 + [x size] + mov ecx,(25+15*8)*65536+12 ; [y start] *65536 + [y size] + mov edx,12 ; button id + mov esi,0x6688dd ; button color RRGGBB + int 0x40 + ;VECTOR Y+ LABEL + mov eax,4 ; function 4 : write text to window + mov ebx,(SIZE_X+12+20)*65536+(28+15*8) ; [x start] *65536 + [y start] + mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) + mov edx,labelyplus ; pointer to text beginning + mov esi,labelyplusend-labelyplus ; text length + int 0x40 + ; LEAD COLOR LABEL + mov eax,4 ; function 4 : write text to window + mov ebx,(SIZE_X+12)*65536+(28+15*9) ; [x start] *65536 + [y start] + mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) + mov edx,labelmaincolor ; pointer to text beginning + mov esi,labelmaincolorend-labelmaincolor ; text length + int 0x40 + + ;RED+ BUTTON + mov eax,8 ; function 8 : define and draw button + mov ebx,(SIZE_X+10)*65536+62-41 ; [x start] *65536 + [x size] + mov ecx,(25+15*10)*65536+12 ; [y start] *65536 + [y size] + mov edx,13 ; button id + mov esi,0x6688dd ; button color RRGGBB + int 0x40 + ;RED+ LABEL + mov eax,4 ; function 4 : write text to window + mov ebx,(SIZE_X+12)*65536+(28+15*10) ; [x start] *65536 + [y start] + mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) + mov edx,labelredplus ; pointer to text beginning + mov esi,labelredplusend-labelredplus ; text length + int 0x40 + ;GREEN+ BUTTON + mov eax,8 ; function 8 : define and draw button + mov ebx,(SIZE_X+10+20)*65536+62-42 ; [x start] *65536 + [x size] + mov ecx,(25+15*10)*65536+12 ; [y start] *65536 + [y size] + mov edx,14 ; button id + mov esi,0x6688dd ; button color RRGGBB + int 0x40 + ;GREEN+ LABEL + mov eax,4 ; function 4 : write text to window + mov ebx,(SIZE_X+12+20)*65536+(28+15*10) ; [x start] *65536 + [y start] + mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) + mov edx,labelgreenplus ; pointer to text beginning + mov esi,labelgreenplusend-labelgreenplus ; text length + int 0x40 + ;BLUE+ BUTTON + mov eax,8 ; function 8 : define and draw button + mov ebx,(SIZE_X+10+41)*65536+62-41 ; [x start] *65536 + [x size] + mov ecx,(25+15*10)*65536+12 ; [y start] *65536 + [y size] + mov edx,15 ; button id + mov esi,0x6688dd ; button color RRGGBB + int 0x40 + ;BLUE+ LABEL + mov eax,4 ; function 4 : write text to window + mov ebx,(SIZE_X+12+41)*65536+(28+15*10) ; [x start] *65536 + [y start] + mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) + mov edx,labelblueplus ; pointer to text beginning + mov esi,labelblueplusend-labelblueplus ; text length + int 0x40 + ;RED- BUTTON + mov eax,8 ; function 8 : define and draw button + mov ebx,(SIZE_X+10)*65536+62-41 ; [x start] *65536 + [x size] + mov ecx,(25+15*11)*65536+12 ; [y start] *65536 + [y size] + mov edx,16 ; button id + mov esi,0x6688dd ; button color RRGGBB + int 0x40 + ;RED- LABEL + mov eax,4 ; function 4 : write text to window + mov ebx,(SIZE_X+12)*65536+(28+15*11) ; [x start] *65536 + [y start] + mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) + mov edx,labelredminus ; pointer to text beginning + mov esi,labelredminusend-labelredminus ; text length + int 0x40 + ;GREEN- BUTTON + mov eax,8 ; function 8 : define and draw button + mov ebx,(SIZE_X+10+20)*65536+62-42 ; [x start] *65536 + [x size] + mov ecx,(25+15*11)*65536+12 ; [y start] *65536 + [y size] + mov edx,17 ; button id + mov esi,0x6688dd ; button color RRGGBB + int 0x40 + ;GREEN- LABEL + mov eax,4 ; function 4 : write text to window + mov ebx,(SIZE_X+12+20)*65536+(28+15*11) ; [x start] *65536 + [y start] + mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) + mov edx,labelgreenminus ; pointer to text beginning + mov esi,labelgreenminusend-labelgreenminus ; text length + int 0x40 + ;BLUE- BUTTON + mov eax,8 ; function 8 : define and draw button + mov ebx,(SIZE_X+10+41)*65536+62-41 ; [x start] *65536 + [x size] + mov ecx,(25+15*11)*65536+12 ; [y start] *65536 + [y size] + mov edx,18 ; button id + mov esi,0x6688dd ; button color RRGGBB + int 0x40 + ;BLUE- LABEL + mov eax,4 ; function 4 : write text to window + mov ebx,(SIZE_X+12+41)*65536+(28+15*11) ; [x start] *65536 + [y start] + mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) + mov edx,labelblueminus ; pointer to text beginning + mov esi,labelblueminusend-labelblueminus ; text length + int 0x40 + ; Catmull LABEL + mov eax,4 ; function 4 : write text to window + mov ebx,(SIZE_X+12)*65536+(28+15*12) ; [x start] *65536 + [y start] + mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) + mov edx,labelcatmullmod ; pointer to text beginning + mov esi,labelcatmullmodend-labelcatmullmod ; text length + int 0x40 + ; on/off BUTTON + mov eax,8 ; function 8 : define and draw button + mov ebx,(SIZE_X+10)*65536+62 ; [x start] *65536 + [x size] + mov ecx,(25+15*13)*65536+12 ; [y start] *65536 + [y size] + mov edx,19 ; button id + mov esi,0x6688dd ; button color RRGGBB + int 0x40 + ; on/off LABEL + mov eax,4 ; function 4 : write text to window + mov ebx,(SIZE_X+12)*65536+(28+15*13) ; [x start] *65536 + [y start] + mov ecx,0x20ddeeff ; font 1 & color ( 0xF0RRGGBB ) + mov edx,labelonoff ; pointer to text beginning + mov esi,labelonoffend-labelonoff ; text length + int 0x40 + + + mov eax,12 ; function 12:tell os about windowdraw + mov ebx,2 ; 2, end of draw + int 0x40 + + ret + + + ; DATA AREA + i3 dw 3 + light_vector dd 0.0,0.0,-1.0 + ; debug_vector dd 0.0,2.0,2.0 ;--debug + ; debug_vector1 dd 0.0,0.0,0.0 + ; debug_points dw 1,1,1,3,4,20 + ; debug_dd dw ? + ; debug_dwd dd 65535 + ; debug_counter dw 0 + dot_max dd 1.0 + dot_min dd 0.0 + env_const dd 1.2 + correct_tex dw 255 + max_color_r dw 255 + max_color_g dw 25 + max_color_b dw 35 + xobs dw SIZE_X / 2 ;200 ;observer + yobs dw SIZE_Y / 2 ;200 ;coordinates + zobs dw -500 + + + angle_counter dw 0 + piD180 dd 0.017453292519943295769236907684886 + ; sq dd 0.70710678118654752440084436210485 + const6 dw 6,6,6,6 + xo dw 130;87 + zo dw 0 + yo dw 100 + xoffset dd 130.0 + yoffset dd 150.0 + sscale dd 6.0 ; real scale + vect_x dw 0 + vect_y dw 0 + vect_z dw 0 + + + r_flag db 0 + dr_flag db 2 + speed_flag db 0 + catmull_flag db 0 + SourceFile file '../../3DS/HRT.3DS' + EndFile: + labelrot: + db 'rot. mode' + labelrotend: + labeldrmod: + db 'shd. mode' + labeldrmodend: + labelspeedmod: + db 'spd. mode' + labelspeedmodend: + labelzoomout: + db 'zoom out' + labelzoomoutend: + labelzoomin: + db 'zoom in' + labelzoominend: + labelvector: + db 'add vector' + labelvectorend: + labelyminus: + db 'y -' + labelyminusend: + labelzplus: + db 'z +' + labelzplusend: + labelxminus: + db 'x -' + labelxminusend: + labelxplus: + db 'x +' + labelxplusend: + labelzminus: + db 'z -' + labelzminusend: + labelyplus: + db 'y +' + labelyplusend: + labelmaincolor: + db 'main color' + labelmaincolorend: + labelredplus: + db 'r +' + labelredplusend: + labelgreenplus: + db 'g +' + labelgreenplusend: + labelblueplus: + db 'b +' + labelblueplusend: + labelredminus: + db 'r -' + labelredminusend: + labelgreenminus: + db 'g -' + labelgreenminusend: + labelblueminus: + db 'b -' + labelblueminusend: + labelcatmullmod: + db 'catmull' + labelcatmullmodend: + labelonoff: + db 'on/off' + labelonoffend: + labelt: + db 'DEUS CARITAS EST' + if Ext=MMX + db ' (MMX)' + end if + labellen: + STRdata db '-1 ' +align 8 + @col dd ? + @y1 dw ? + @x1 dw ?;+8 + @y2 dw ? + @x2 dw ? + @y3 dw ? + @x3 dw ?;+16 + + @dx12 dd ? + @dx13 dd ?;+24 + @dx23 dd ? + + sinbeta dd ?;+32 + cosbeta dd ? + + xsub dw ? + zsub dw ?;+40 + ysub dw ? + + xx1 dw ? + yy1 dw ? + zz1 dw ?;+48 + xx2 dw ? + yy2 dw ? + zz2 dw ? + xx3 dw ?;+56 + yy3 dw ? + zz3 dw ? + scale dd ? ; help scale variable + ;screen dd ? ;pointer to screen buffer + triangles_count_var dw ? + points_count_var dw ? + + + point_index1 dw ? ;-\ + point_index2 dw ? ; } don't change order + point_index3 dw ? ;-/ + temp_col dw ? + high dd ? +align 8 + buffer dq ? + + err dd ? + drr dd ? + xx dd ? + yy dd ? + xst dd ? + yst dd ? +align 16 + points: + rw (EndFile-SourceFile)/12*3 + points_count = ($-points)/6 + triangles: + rw (EndFile-SourceFile)/12*3 + triangles_count = ($-triangles)/6 + +align 16 + points_rotated rw points_count*3 + 2 +align 16 + label trizdd dword + label trizdq qword + triangles_with_z rw triangles_count*4 + 2 ; triangles triple dw + z position +align 16 + triangles_normals rb triangles_count * 12 ; + point_normals rb points_count * 12 ;one 3dvector - triple float dword x,y,z +align 16 + point_normals_rotated rb points_count * 12 +align 16 + vectors rb 24 + points_color rb 6*points_count ; each color as word +; sorted_triangles rw triangles_count*3 + 2 +;align 16 + screen rb SIZE_X * SIZE_Y * 3 ; screen buffer + Z_buffer rb SIZE_X * SIZE_Y * 4 + envmap rb 512*512*3 + memStack rb 1000 ;memory area for stack + I_END: \ No newline at end of file