mirror of
https://github.com/KolibriOS/kolibrios.git
synced 2024-12-11 17:44:09 +03:00
110 lines
2.5 KiB
NASM
110 lines
2.5 KiB
NASM
|
x3d equ 0
|
||
|
y3d equ 2
|
||
|
z3d equ 4
|
||
|
vec_x equ 0
|
||
|
vec_y equ 4
|
||
|
vec_z equ 8
|
||
|
; 3d point - triple integer word coordinate
|
||
|
; vector - triple float dword coordinate
|
||
|
;----------------------in: --------------------------------
|
||
|
;------------------------ esi - pointer to 1st 3d point ---
|
||
|
;------------------------ edi - pointer to 2nd 3d point ---
|
||
|
;------------------------ ebx - pointer to result vector --
|
||
|
;---------------------- out : none ------------------------
|
||
|
make_vector:
|
||
|
fninit
|
||
|
fild word[edi+x3d] ;edi+x3d
|
||
|
fisub word[esi+x3d] ;esi+x3d
|
||
|
fstp dword[ebx+vec_x]
|
||
|
|
||
|
fild word[edi+y3d]
|
||
|
fisub word[esi+y3d]
|
||
|
fstp dword[ebx+vec_y]
|
||
|
|
||
|
fild word[edi+z3d]
|
||
|
fisub word[esi+z3d]
|
||
|
fstp dword[ebx+vec_z]
|
||
|
|
||
|
ret
|
||
|
;---------------------- in: -------------------------------
|
||
|
;--------------------------- esi - pointer to 1st vector --
|
||
|
;--------------------------- edi - pointer to 2nd vector --
|
||
|
;--------------------------- ebx - pointer to result vector
|
||
|
;---------------------- out : none
|
||
|
cross_product:
|
||
|
fninit
|
||
|
fld dword [esi+vec_y]
|
||
|
fmul dword [edi+vec_z]
|
||
|
fld dword [esi+vec_z]
|
||
|
fmul dword [edi+vec_y]
|
||
|
fsubp ;st1 ,st
|
||
|
fstp dword [ebx+vec_x]
|
||
|
|
||
|
fld dword [esi+vec_z]
|
||
|
fmul dword [edi+vec_x]
|
||
|
fld dword [esi+vec_x]
|
||
|
fmul dword [edi+vec_z]
|
||
|
fsubp ;st1 ,st
|
||
|
fstp dword [ebx+vec_y]
|
||
|
|
||
|
fld dword [esi+vec_x]
|
||
|
fmul dword [edi+vec_y]
|
||
|
fld dword [esi+vec_y]
|
||
|
fmul dword [edi+vec_x]
|
||
|
fsubp ;st1 ,st
|
||
|
fstp dword [ebx+vec_z]
|
||
|
ret
|
||
|
;----------------------- in: ------------------------------
|
||
|
;---------------------------- edi - pointer to vector -----
|
||
|
;----------------------- out : none
|
||
|
normalize_vector:
|
||
|
fninit
|
||
|
fld dword [edi+vec_x]
|
||
|
fmul st, st
|
||
|
fld dword [edi+vec_y]
|
||
|
fmul st, st
|
||
|
fld dword [edi+vec_z]
|
||
|
fmul st, st
|
||
|
faddp st1, st
|
||
|
faddp st1, st
|
||
|
fsqrt
|
||
|
|
||
|
ftst
|
||
|
fstsw ax
|
||
|
sahf
|
||
|
jnz @f
|
||
|
|
||
|
fst dword [edi+vec_x]
|
||
|
fst dword [edi+vec_y]
|
||
|
fstp dword [edi+vec_z]
|
||
|
ret
|
||
|
@@:
|
||
|
fld st
|
||
|
fld st
|
||
|
fdivr dword [edi+vec_x]
|
||
|
fstp dword [edi+vec_x]
|
||
|
fdivr dword [edi+vec_y]
|
||
|
fstp dword [edi+vec_y]
|
||
|
fdivr dword [edi+vec_z]
|
||
|
fstp dword [edi+vec_z]
|
||
|
ret
|
||
|
;------------------in: -------------------------
|
||
|
;------------------ esi - pointer to 1st vector
|
||
|
;------------------ edi - pointer to 2nd vector
|
||
|
;------------------out: ------------------------
|
||
|
;------------------ st0 - dot-product
|
||
|
dot_product:
|
||
|
fninit
|
||
|
fld dword [esi+vec_x]
|
||
|
fmul dword [edi+vec_x]
|
||
|
fld dword [esi+vec_y]
|
||
|
fmul dword [edi+vec_y]
|
||
|
fld dword [esi+vec_z]
|
||
|
fmul dword [edi+vec_z]
|
||
|
faddp
|
||
|
faddp
|
||
|
ret
|
||
|
|
||
|
|
||
|
|