draw_dots: mov esi,[points_translated_ptr] movzx ecx,[points_count_var] .drw: @@: lodsd add esi,2 ; skip z movzx ebx,ax shr eax,16 ; bx = x , ax = y or ax,ax jl @f or bx,bx jl @f cmp ax,SIZE_Y jge @f cmp bx,SIZE_X jge @f mov edx,SIZE_X ; SIZE_X not only power of 2 -> 256,512,... mul edx add eax,ebx mov edi,[screen_ptr] lea eax,[eax*3] add edi,eax xor eax,eax not eax stosd @@: loop .drw ret do_emboss: ; emboss - after drawing all, ; transfer screen buffer into bump map ; and draw two bump triangles ; ************************************* mov esi,screen mov edi,bumpmap2 mov ecx,TEXTURE_SIZE/3 cld if Ext=NON xor eax,eax xor bh,bh xor dh,dh @@: lodsb movzx bx,al lodsb movzx dx,al lodsb add ax,bx add ax,dx ; cwd ; div [i3] ;; push ax ;; pop bx ;; shr bx,3 ;; shr ax,2 ;; add ax,bx lea eax,[eax*5] shr ax,4 stosb loop @b else emms pxor mm1,mm1 mov ebx,0x0000ffff @@: movd mm0,[esi] punpcklbw mm0,mm1 movq mm2,mm0 psrlq mm2,16 movq mm3,mm0 psrlq mm3,32 paddw mm0,mm2 paddw mm0,mm3 movd eax,mm0 and eax,ebx lea eax,[eax*5] shr ax,4 stosb add esi,3 loop @b end if push ebp push dword 0 ; env coords push word 0 push word SIZE_X push word SIZE_Y push dword 0 push dword 0 ; bump coords push word SIZE_X push word SIZE_Y push word 0 mov eax,SIZE_Y mov ebx,SIZE_X*65536+0 xor ecx,ecx mov edx,bumpmap2 mov esi,envmap mov edi,screen call bump_triangle push dword SIZE_X shl 16 + SIZE_Y ; env coords push word 0 push word SIZE_X push word SIZE_Y push word 0 push dword SIZE_X shl 16 + SIZE_Y ; bump coords push word 0 push word SIZE_X push word SIZE_Y push word 0 mov eax,SIZE_Y mov ebx,SIZE_X * 65536+0 mov ecx,SIZE_X shl 16 + SIZE_Y mov edx,bumpmap2 mov esi,envmap mov edi,screen call bump_triangle pop ebp ret ;********************************EMBOSS DONE******************************* generate_object2: ; torus ;in ax - figure number 2=torus, 3=loop, 4=loop ;locals ; counter dw ? ; sin dd ? ; cos dd ? ;endl .counter equ word[ebp-2] .sin equ dword[ebp-6] .cos equ dword[ebp-10] .sin2 equ dword[ebp-14] .cos2 equ dword[ebp-18] .piD180m3 equ dword[ebp-22] .cD2 equ word[ebp-24] push ebp mov ebp,esp sub esp,24 push ax fninit mov edi,[points_ptr] xor eax,eax ; init seed -> 4 3d points mov dword[edi],-1.0 ; x add edi,4 stosd ; y stosd ; z mov dword[edi],-0.9 ; x1 mov dword[edi+4],0.1 ; y1 add edi,8 stosd ; z1 mov dword[edi],-0.8 add edi,4 stosd stosd mov dword[edi],-0.9 ; x3 mov dword[edi+4],-0.1 ; y3 add edi,8 stosd ; z3 mov [points_count_var],4 fld [piD180] fidiv [i3] fstp .piD180m3 mov .cD2,5 pop ax mov ecx,1 mov edx,9 .next: ; calc angle and rotate seed 4 points mov .counter,cx mov ebx,[points_ptr] fld .piD180m3 fimul .counter fld st fsincos fstp .sin fstp .cos fadd st,st0 fsincos fstp .sin2 fstp .cos2 .rotor: ; next 4 ; rotary y fld dword[ebx] ; x fld .sin fmul dword[ebx+8] ; z * sinbeta fchs fld .cos fmul dword[ebx] ; x * cosbeta faddp fstp dword[edi] ; new x fmul .sin ; old x * sinbeta fld .cos fmul dword[ebx+8] ; z * cosbeta faddp dec dx or dx,dx jnz @f ; mov .counter,dx fld st fidiv [i3] faddp @@: fstp dword[edi+8] ; new z fld dword[ebx+4] or dx,dx jnz @f ; fld1 ; faddp ; fld st fadd st,st0 fadd st,st0 ; fxch ; fimul [i3] ; fsin ; faddp mov dx,9 @@: fstp dword[edi+4] ; rotary x cmp al,3 jl .end_rot fld dword[edi+4] ;y fld .sin2 fmul dword[edi+8] ;z fld .cos2 fmul dword[edi+4] ;y faddp fstp dword[edi+4] ; new y fmul .sin2 ; sinbeta * old y fchs fld .cos2 fmul dword[edi+8] faddp fstp dword[edi+8] ; rotary z cmp al,4 jl .end_rot fld dword[edi] ;x fld .sin fmul dword[edi+4] ;y fld .cos fmul dword[edi] ;x faddp fstp dword[edi] ;new x fmul .sin ; sinbeta * old x fchs fld .cos fmul dword[edi+4] ; cosbeta * y faddp fstp dword[edi+4] ; new y .end_rot: add edi,12 add ebx,12 mov esi,[points_ptr] add esi,12*4 cmp ebx,esi jl .rotor add [points_count_var],4 add cx,18 cmp cx,(18*21*3)+1 jle .next mov edi,[triangles_ptr] mov ax,4 mov bx,4+4 mov [triangles_count_var],164*3 ;140 mov cx,80*3 ;68 @@: stosw ;---- mov [edi],bx ; | add edi,2 ; | inc ax ; | stosw ; |repeat 4 times mov [edi],bx ; | inc bx add edi,2 stosw ; | mov [edi],bx ; | add edi,2 ;---- loop @b mov dword[edi],-1 ; < - end mark mov [culling_flag],0 mov esp,ebp pop ebp ret generate_object3: ; heart ;locals ; counter dw ? ; sin dd ? ; cos dd ? ;endl .counter equ word[ebp-2] .sin equ dword[ebp-6] .cos equ dword[ebp-10] .sin2 equ dword[ebp-14] .cos2 equ dword[ebp-18] .piD180m3 equ dword[ebp-22] .cD2 equ word[ebp-24] push ebp mov ebp,esp sub esp,24 fninit mov edi,[points_ptr] xor eax,eax ; init seed -> eight 3d points mov dword[edi],2.0 add edi,4 stosd stosd mov dword[edi],2.0 mov dword[edi+4],-0.5 add edi,8 stosd mov dword[edi],1.5 mov dword[edi+4],-1.5 add edi,8 stosd mov dword[edi],1.0 mov dword[edi+4],-2.0 add edi,8 stosd stosd mov dword[edi],-2.5 add edi,4 stosd mov [points_count_var],5 mov ecx,1 .next: ; calc angle and rotate seed 4 points mov .counter,cx mov ebx,[points_ptr] fld [piD180] fimul .counter fsincos fstp .sin fstp .cos .rotor: ; next 4 ; rotary y fld dword[ebx] ; x fld .sin fmul dword[ebx+8] ; z * sinbeta fchs fld .cos fmul dword[ebx] ; x * cosbeta faddp fidiv [i3] fstp dword[edi] ; new x fmul .sin ; old x * sinbeta fld .cos fmul dword[ebx+8] ; z * cosbeta faddp fstp dword[edi+8] ; new z fld dword[ebx+4] ;y fstp dword[edi+4] .end_rot: add edi,12 add ebx,12 mov esi,[points_ptr] add esi,12*5 cmp ebx,esi ;real_points + (12*5) jl .rotor add [points_count_var],5 add cx,18 cmp cx,(18*21)+1 jle .next ;last points xor eax,eax mov dword[edi],0.22 mov dword[edi+4],0.77 mov dword[edi+8],1.25 add edi,12 mov dword[edi],0.22 mov dword[edi+4],0.77 mov dword[edi+8],-1.25 add edi,12 stosd add [points_count_var],2 ; init triangles list mov edi,[triangles_ptr] mov ax,5 mov bx,5+5 mov [triangles_count_var],204 mov cx,100 @@: stosw ;---- mov [edi],bx ; | add edi,2 ; | inc ax ; | stosw ; |repeat mov [edi],bx ; | inc bx add edi,2 stosw ; | mov [edi],bx ; | add edi,2 ;---- loop @b mov ax,5 mov bx,[points_count_var] sub bx,2 mov dl,2 .nx: mov cx,5 add [triangles_count_var],cx @@: stosw add ax,5 stosw mov word[edi],bx add edi,2 loop @b cmp dl,1 je @f inc bx jmp .lab @@: dec bx .lab: mov cx,5 add [triangles_count_var],cx @@: stosw add ax,5 stosw mov word[edi],bx add edi,2 loop @b dec dl or dl,dl jnz .nx sub ax,25 stosw sub ax,50 stosw mov word[edi],bx add edi,2 stosw add ax,50 stosw inc bx mov word[edi],bx add edi,2 add [triangles_count_var],2 mov dword[edi],-1 ; < - end mark mov [culling_flag],0 mov esp,ebp pop ebp ret