0,0 → 1,623 |
do_sinus: |
.x equ [ebp-8] |
.y equ [ebp-12] |
.new_y equ [ebp-16] |
.temp equ [ebp-20] |
push ebp |
mov ebp,esp |
sub esp,64 |
mov dword .x,0 |
mov dword .y,0 |
mov esi,[screen_ptr] |
mov edi,[Zbuffer_ptr] |
push edi |
; clear Zbuffer temporally used as image buffer |
movzx ecx,word[size_x_var] |
movzx eax,word[size_y_var] |
imul ecx,eax ;SIZE_X*SIZE_Y |
xor eax,eax |
cld |
rep stosd |
pop edi |
fninit |
.again: |
fild dword .x |
fmul [sin_frq] |
fistp dword .temp |
mov eax, .temp |
|
and eax, 0x000000ff |
|
|
fld dword [sin_tab+eax*4] |
fimul dword [sin_amplitude] |
fiadd dword .y |
fistp dword .new_y |
|
mov eax,.new_y |
or eax,eax |
jl .skip |
movzx ebx,word[size_y_var] |
cmp eax,ebx ;SIZE_Y |
jg .skip |
movzx edx,word[size_x_var] |
mul edx |
; shl eax,9 |
add eax,dword .x |
|
lea ebx,[eax*3] |
cmp [dr_flag],12 ; 32 bit col cause |
jl @f |
add ebx,eax |
@@: |
mov eax,[esi] |
mov [edi+ebx],eax |
.skip: |
add esi,3 |
cmp [dr_flag],12 |
jl @f |
inc esi |
@@: |
inc dword .x |
movzx edx,word[size_x_var] |
cmp dword .x,edx ;SIZE_X |
jl .again |
mov dword .x,0 |
inc dword .y |
movzx edx,word[size_y_var] |
cmp dword .y,edx ;SIZE_Y |
jl .again |
|
; copy from temporary buffer -> Zbuffer to screen |
mov esi,[Zbuffer_ptr] |
mov edi,[screen_ptr] |
movzx ecx,word[size_x_var] |
movzx eax,word[size_y_var] |
imul ecx,eax |
cmp [dr_flag],12 |
jge @f |
lea ecx,[ecx*3] |
shr ecx,2 |
; mov ecx,SIZE_X*SIZE_Y*3/4 |
@@: |
cld |
rep movsd |
|
|
mov esp,ebp |
pop ebp |
ret |
|
|
draw_dots: |
mov esi,[points_translated_ptr] |
mov 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_var] ;SIZE_Y |
jge @f |
cmp bx,[size_x_var] ;SIZE_X |
jge @f |
movzx edx,word[size_x_var] ;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: ; sse2 version only |
if Ext >= SSE2 |
movzx ecx,[bumps_deep_flag] |
inc ecx |
call blur_screen ;blur n times |
|
mov eax,[size_y_var] ;load both x, y |
mov ebx,eax |
shr ebx,16 |
cwde |
mul ebx |
mov ecx,eax |
sub ecx,ebx |
sub ecx,ebx |
mov esi,[screen_ptr] |
mov edi,[Zbuffer_ptr] |
cmp [dr_flag],12 |
jge @f |
lea ebx,[ebx*3] |
jmp .f |
@@: |
shl ebx,2 |
.f: |
mov edx,esi |
add esi,ebx |
lea ebx,[ebx+esi] |
pxor xmm0,xmm0 |
push eax |
.emb: |
cmp [dr_flag],12 |
jge @f |
movlps xmm1,[esi+3] |
movhps xmm1,[esi+6] |
movlps xmm2,[esi-3] |
movhps xmm2,[esi] |
movlps xmm3,[ebx] |
movhps xmm3,[ebx+3] |
movlps xmm4,[edx] |
movhps xmm4,[edx+3] |
jmp .ff |
@@: |
movlps xmm1,[esi+4] |
movhps xmm1,[esi+8] |
movlps xmm2,[esi-4] |
movhps xmm2,[esi] |
movlps xmm3,[ebx] |
movhps xmm3,[ebx+4] |
movlps xmm4,[edx] |
movhps xmm4,[edx+4] |
.ff: |
punpcklbw xmm1,xmm0 |
punpcklbw xmm2,xmm0 |
punpcklbw xmm3,xmm0 |
punpcklbw xmm4,xmm0 |
psubsw xmm1,xmm2 |
paddw xmm1,[emboss_bias] |
psubsw xmm3,xmm4 |
paddw xmm3,[emboss_bias] |
pmulhw xmm1,xmm3 |
movaps xmm7,xmm1 |
movaps xmm6,xmm1 |
psrlq xmm7,2*8 |
psrlq xmm6,4*8 |
pmaxsw xmm1,xmm7 |
pmaxsw xmm1,xmm6 |
|
if 0 |
movaps xmm7,xmm3 |
movaps xmm6,xmm3 |
psrlq xmm7,2*8 |
psrlq xmm6,4*8 |
pmaxsw xmm3,xmm7 |
pmaxsw xmm3,xmm6 |
end if |
pmaxsw xmm1,xmm3 |
|
movd eax,xmm1 |
movzx eax,al |
; cmp [dr_flag],12 |
; je @f |
lea eax,[eax*3+envmap_cub] |
; jmp .fff |
;@@: |
|
mov eax,[eax] |
mov [edi],eax ;xmm1 |
psrldq xmm1,8 |
movd eax,xmm1 |
movzx eax,al |
lea eax,[eax*3+envmap_cub] |
mov eax,[eax] |
mov [edi+4],eax |
|
cmp [dr_flag],12 |
jl @f |
add esi,2 |
add ebx,2 |
add edx,2 |
@@: |
|
add edi,8 |
add esi,6 |
add ebx,6 |
add edx,6 |
sub ecx,2 |
jnc .emb |
|
|
pop ecx ;,eax |
mov edi,[screen_ptr] |
mov esi,[Zbuffer_ptr] |
cmp [dr_flag],12 |
jge .e |
@@: |
movsd |
dec edi |
loop @b |
.e: |
rep movsd |
|
end if |
|
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 eax,4 |
mov ebx,4+4 |
mov [triangles_count_var],160*3 ;164*3 ;140 |
|
mov ecx,80*3 ;68 |
@@: |
stosd ;---- |
mov [edi],ebx ; | |
add edi,4 ; | |
inc eax ; | |
stosd ; |repeat 4 times |
|
mov [edi],ebx ; | |
inc ebx |
add edi,4 |
stosd ; | |
mov [edi],ebx ; | |
add edi,4 ;---- |
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 eax,5 |
mov ebx,5+5 |
mov [triangles_count_var],200 ;204 |
|
mov ecx,100 |
@@: |
stosd ;---- |
mov [edi],ebx ; | |
add edi,4 ; | |
inc eax ; | |
stosd ; |repeat |
|
mov [edi],ebx ; | |
inc ebx |
add edi,4 |
stosd ; | |
mov [edi],ebx ; | |
add edi,4 ;---- |
loop @b |
|
mov eax,5 |
mov ebx,[points_count_var] |
sub ebx,2 |
mov dl,2 |
.nx: |
mov ecx,5 |
add [triangles_count_var],ecx |
@@: |
stosd |
add eax,5 |
stosd |
mov dword[edi],ebx |
add edi,4 |
loop @b |
|
cmp dl,1 |
je @f |
|
inc ebx |
jmp .lab |
@@: |
dec ebx |
.lab: |
mov ecx,5 |
add [triangles_count_var],ecx |
@@: |
stosd |
add eax,5 |
stosd |
mov dword[edi],ebx |
add edi,4 |
loop @b |
|
dec dl |
or dl,dl |
jnz .nx |
|
sub eax,25 |
stosd |
sub eax,50 |
stosd |
mov dword[edi],ebx |
add edi,4 |
|
stosd |
add eax,50 |
stosd |
inc ebx |
mov dword[edi],ebx |
add edi,4 |
add [triangles_count_var],2 |
|
mov dword[edi],-1 ; < - end mark |
mov [culling_flag],0 |
|
mov esp,ebp |
pop ebp |
|
ret |
|
|
|
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |