Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 5414 → Rev 5415

/programs/develop/libraries/TinyGL/asm_fork/matrix.asm
187,7 → 187,7
endp
 
align 4
proc glopRotate uses eax ebx ecx, context:dword, p:dword
proc glopRotate uses eax ebx ecx edx, context:dword, p:dword
locals
u0 dd ?
u1 dd ?
209,73 → 209,86
fst dword[angle] ;angle = p[1].f * M_PI / 180.0
;st0 = angle
 
fldz
fild dword[ebx+8]
fstp dword[u0]
fild dword[ebx+12]
fstp dword[u1]
fild dword[ebx+16]
fst dword[u2]
 
; simple case detection
xor ebx,ebx
fcomp st1 ;u2 ... 0
xor edx,edx
fld dword[ebx+16]
ftst
fstsw ax
sahf
je @f
inc ebx
inc edx
@@:
fcom dword[u1] ;0 ... u1
fstp dword[u2]
fld dword[ebx+12]
ftst
fstsw ax
sahf
je @f
or ebx,2
or edx,2
@@:
fcom dword[u0] ;0 ... u0
fstp dword[u1]
fld dword[ebx+8]
ftst
fstsw ax
sahf
je @f
or ebx,4
or edx,4
@@:
;st0 = 0, st1 = angle
fstp dword[u0]
 
;st0 = angle
;ebx = ((u0 != 0)<<2) | ((u1 != 0)<<1) | (u2 != 0)
cmp ebx,0
je .end_f ;если нет поворотов выход из функции
cmp ebx,4
or edx,edx
jz .end_f ;если нет поворотов выход из функции
cmp edx,4
jne @f
fcomp dword[u0] ;0 ... u0
fld dword[u0]
ftst
fstsw ax
ffree st0
fincstp
sahf
jae .u0ch
fchs
fstp dword[angle] ;if (u0 < 0) angle *= -1
fchs ;if (u0 < 0) angle *= -1
.u0ch:
stdcall gl_M4_Rotate, ecx,[angle],0
push dword 0
fstp dword[esp-4]
sub esp,4
stdcall gl_M4_Rotate, ecx
jmp .end_sw
@@:
cmp ebx,2
cmp edx,2
jne @f
fcomp dword[u1] ;0 ... u1
fld dword[u1]
ftst
fstsw ax
ffree st0
fincstp
sahf
jae .u1ch
fchs
fstp dword[angle] ;if (u1 < 0) angle *= -1
fchs ;if (u1 < 0) angle *= -1
.u1ch:
stdcall gl_M4_Rotate, ecx,[angle],1
push dword 1
fstp dword[esp-4]
sub esp,4
stdcall gl_M4_Rotate, ecx
jmp .end_sw
@@:
cmp ebx,1
cmp edx,1
jne @f
fcomp dword[u2] ;0 ... u2
fld dword[u2]
ftst
fstsw ax
ffree st0
fincstp
sahf
jae .u2ch
fchs
fstp dword[angle] ;if (u2 < 0) angle *= -1
fchs ;if (u2 < 0) angle *= -1
.u2ch:
stdcall gl_M4_Rotate, ecx,[angle],2
push dword 2
fstp dword[esp-4]
sub esp,4
stdcall gl_M4_Rotate, ecx
jmp .end_sw
@@: ;default:
if DEBUG ;glopRotete
287,19 → 300,20
fmul st0,st0
fld dword[u1]
fmul st0,st0
faddp
fld dword[u2]
fmul st0,st0
fadd st0,st1
fadd st0,st2
faddp
; fst dword[len] ;len = u0*u0+u1*u1+u2*u2
fcom st1
ftst
fstsw ax
sahf
je .end_f ;if (len == 0.0f) return
je .f2 ;if (len == 0.0f) return
fsqrt
fld1
fdiv st0,st1
; fst dword[len] ;len = 1.0f / sqrt(len)
fxch
fdivp ;len = 1.0f / sqrt(len)
; fst dword[len]
fld dword[u0]
fmul st0,st1
fstp dword[u0] ;u0 *= len
309,11 → 323,11
fld dword[u2]
fmul st0,st1
fstp dword[u2] ;u2 *= len
;st0 = len, st1=..., st2=..., st3 = 0, st4 = angle
;st0 = len, st1 = angle
ffree st0
fincstp
 
; store cos and sin values
finit
fld dword[angle]
fcos
fst dword[cost] ;cost=cos(angle)
fld dword[angle]
332,15 → 346,91
mov [ecx+3*16+12],ebx ;m[3][3]
 
; do the math
; m.m[0][0]=u[0]*u[0]+cost*(1-u[0]*u[0]);
; m.m[1][0]=u[0]*u[1]*(1-cost)-u[2]*sint;
; m.m[2][0]=u[2]*u[0]*(1-cost)+u[1]*sint;
; m.m[0][1]=u[0]*u[1]*(1-cost)+u[2]*sint;
; m.m[1][1]=u[1]*u[1]+cost*(1-u[1]*u[1]);
; m.m[2][1]=u[1]*u[2]*(1-cost)-u[0]*sint;
; m.m[0][2]=u[2]*u[0]*(1-cost)-u[1]*sint;
; m.m[1][2]=u[1]*u[2]*(1-cost)+u[0]*sint;
; m.m[2][2]=u[2]*u[2]+cost*(1-u[2]*u[2]);
fld dword[u0]
fmul st0,st0
fld1
fsub st0,st1
fmul st0,st3 ;st0 = cost*(1-u0^2)
faddp
fstp dword[ecx] ;m[0][0] = u0*u0+cost*(1-u0*u0)
 
fld1
fsub st0,st2 ;st0 = 1-cost
 
fld st0
fmul dword[u0]
fmul dword[u1]
fld dword[u2]
fmul st0,st3 ;st0 = u2*sint
fchs
faddp
fstp dword[ecx+16] ;m[1][0] = u0*u1*(1-cost)-u2*sint
 
fld st0
fmul dword[u0]
fmul dword[u2]
fld dword[u1]
fmul st0,st3 ;st0 = u1*sint
faddp
fstp dword[ecx+32] ;m.m[2][0]=u[2]*u[0]*(1-cost)+u[1]*sint
 
fld st0
fmul dword[u0]
fmul dword[u1]
fld dword[u2]
fmul st0,st3 ;st0 = u2*sint
faddp
fstp dword[ecx+4] ;m.m[0][1]=u[0]*u[1]*(1-cost)+u[2]*sint
 
fld dword[u1]
fmul st0,st0
fld1
fsub st0,st1
fmul st0,st4 ;st0 = cost*(1-u1^2)
faddp
fstp dword[ecx+20] ;m.m[1][1]=u[1]*u[1]+cost*(1-u[1]*u[1])
 
fld st0
fmul dword[u1]
fmul dword[u2]
fld dword[u0]
fmul st0,st3 ;st0 = u0*sint
fchs
faddp
fstp dword[ecx+36] ;m.m[2][1]=u[1]*u[2]*(1-cost)-u[0]*sint
 
fld st0
fmul dword[u0]
fmul dword[u2]
fld dword[u1]
fmul st0,st3 ;st0 = u1*sint
fchs
faddp
fstp dword[ecx+8] ;m.m[0][2]=u[2]*u[0]*(1-cost)-u[1]*sint
 
fld st0
fmul dword[u1]
fmul dword[u2]
fld dword[u0]
fmul st0,st3 ;st0 = u0*sint
faddp
fstp dword[ecx+24] ;m.m[1][2]=u[1]*u[2]*(1-cost)+u[0]*sint
 
ffree st0 ;1-cost
fincstp
 
fld dword[u2]
fmul st0,st0
fld1
fsub st0,st1
fmul st0,st3 ;st0 = cost*(1-u2^2)
faddp
fstp dword[ecx+40] ;m[2][2] = u2*u2+cost*(1-u2*u2)
 
ffree st0 ;sint
fincstp
ffree st0 ;cost
fincstp
.end_sw:
 
mov eax,[context]
352,6 → 442,12
stdcall gl_print_matrix,ecx,4
end if
gl_matrix_update eax,ebx
jmp .end_f
.f2:
ffree st0 ;len
fincstp
ffree st0 ;angle
fincstp
.end_f:
ret
endp
382,6 → 478,12
fstp dword[ebx+8];m[2] *= z
add ebx,16
loop @b
ffree st0
fincstp
ffree st0
fincstp
ffree st0
fincstp
 
if DEBUG ;glopScale
pushad
/programs/develop/libraries/TinyGL/asm_fork/zmath.asm
530,18 → 530,17
endl
mov eax,[u]
inc eax
mov dword [v],eax
cmp dword [v],2
cmp eax,2
jle @f
mov dword [v],0
xor eax,eax
@@:
mov eax,[v]
mov [v],eax
inc eax
mov dword [w],eax
cmp dword [w],2
cmp eax,2
jle @f
mov dword [w],0
xor eax,eax
@@:
mov [w],eax
fld dword [t]
fsin
fstp dword [s]