1737 lines
46 KiB
NASM
1737 lines
46 KiB
NASM
.386p
|
|
jumps
|
|
|
|
.model SMALL, SYSCALL
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; █▄ ▄█ █▀▀▀█ █▀▀█ █ █▀▀▀▀ ▀▀█▀▀
|
|
; ██▀ █ ██ █ ██▀▀█ ▄▄ █ ██▀▀ ██
|
|
; ▀▀ ▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
|
|
include p_define.ash
|
|
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
.data
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
|
|
; extern M_TRIGO
|
|
|
|
extrn NoLanguage CameraXr:DWORD
|
|
extrn NoLanguage CameraYr:DWORD
|
|
extrn NoLanguage CameraZr:DWORD
|
|
extrn NoLanguage X0:DWORD
|
|
extrn NoLanguage Y0:DWORD
|
|
extrn NoLanguage Z0:DWORD
|
|
extrn NoLanguage XCentre:DWORD
|
|
extrn NoLanguage YCentre:DWORD
|
|
|
|
extrn NoLanguage lAlpha:DWORD
|
|
extrn NoLanguage lBeta:DWORD
|
|
extrn NoLanguage lGamma:DWORD
|
|
|
|
extrn NoLanguage NormalXLight:DWORD
|
|
extrn NoLanguage NormalYLight:DWORD
|
|
extrn NoLanguage NormalZLight:DWORD
|
|
|
|
extrn NoLanguage LMatriceWorld:DWORD
|
|
|
|
; extrn NoLanguage IsoScale:WORD
|
|
extrn NoLanguage TypeProj:WORD
|
|
|
|
extrn NoLanguage KFactor:DWORD
|
|
extrn NoLanguage LFactorX:DWORD
|
|
extrn NoLanguage LFactorY:DWORD
|
|
|
|
extrn NoLanguage LMat00:DWORD
|
|
extrn NoLanguage LMat01:DWORD
|
|
extrn NoLanguage LMat02:DWORD
|
|
extrn NoLanguage LMat10:DWORD
|
|
extrn NoLanguage LMat11:DWORD
|
|
extrn NoLanguage LMat12:DWORD
|
|
extrn NoLanguage LMat20:DWORD
|
|
extrn NoLanguage LMat21:DWORD
|
|
extrn NoLanguage LMat22:DWORD
|
|
|
|
extrn NoLanguage TabMat:DWORD
|
|
|
|
extrn NoLanguage compteur:WORD
|
|
|
|
; extern LIB_GRAF
|
|
|
|
extrn NoLanguage NbPolyPoints:WORD
|
|
extrn NoLanguage TabPoly:WORD
|
|
extrn NoLanguage TypePoly:WORD
|
|
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
public NoLanguage FlagLight
|
|
|
|
public NoLanguage List_Point
|
|
public NoLanguage NbPoints
|
|
|
|
public NoLanguage List_Anim_Point
|
|
public NoLanguage List_Entity
|
|
public NoLanguage List_Tri
|
|
|
|
public NoLanguage ScreenXmin
|
|
public NoLanguage ScreenYmin
|
|
public NoLanguage ScreenXmax
|
|
public NoLanguage ScreenYmax
|
|
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
|
|
List_Point dw (500*3) dup(00) ; Xp Yp Zrot
|
|
|
|
List_Normal dw 500 dup(00) ; surement plus
|
|
|
|
List_Anim_Point dw (500*3) dup(00) ; Xr Yr Zr
|
|
|
|
List_Entity dw 5000 dup(00) ; TAILLE à determinée
|
|
|
|
List_Tri dw (500*8) dup(00) ; entites
|
|
|
|
ScreenXmin dw 00
|
|
ScreenYmin dw 00
|
|
ScreenXmax dw 00
|
|
ScreenYmax dw 00
|
|
|
|
NbPoints dw 00
|
|
TotalEntite dw 00
|
|
|
|
ZMax dw 00
|
|
|
|
NbGroupes dw 00
|
|
|
|
Infos dw 00
|
|
|
|
Count1 dw 00
|
|
|
|
FlagLight dw 01
|
|
|
|
ALIGN 4
|
|
|
|
PointeurListTri dd 00
|
|
StartDI dd 00
|
|
NextDI dd 00
|
|
|
|
ListGroupe dd 00
|
|
|
|
StartInfos dd 00
|
|
OffsetDefPoint dd 00
|
|
OffsetListNormal dd 00
|
|
|
|
Save1 dd 00
|
|
Save2 dd 00
|
|
Save3 dd 00
|
|
Ptr1 dd 00
|
|
Ptr2 dd 00
|
|
|
|
PosXWr dd 00 ; pos World rotée de l'objet à afficher
|
|
PosYWr dd 00
|
|
PosZWr dd 00
|
|
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
|
|
TabJump_2 dd aff_E_LIGNE
|
|
dd aff_E_POLY
|
|
dd aff_E_SPHERE
|
|
|
|
; dd aff_E_POINT
|
|
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
.code
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
|
|
|
|
public NoLanguage PatchObjet
|
|
public NoLanguage AffObjetIso
|
|
|
|
|
|
extrn NoLanguage ComputePoly_A:PROC
|
|
; extrn NoLanguage ComputePoly:PROC
|
|
extrn NoLanguage ComputeSphere_A:PROC
|
|
extrn NoLanguage FillVertic_A:PROC
|
|
extrn NoLanguage Line_A:PROC
|
|
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
|
|
extrn NoLanguage RotMatW:near
|
|
extrn NoLanguage RotMatIndex2:near
|
|
extrn NoLanguage WorldRot:near
|
|
extrn NoLanguage LongWorldRot:near
|
|
extrn NoLanguage Rot:near
|
|
; extrn NoLanguage Proj:near
|
|
extrn NoLanguage Proj_3D:near
|
|
extrn NoLanguage Proj_ISO:near
|
|
extrn NoLanguage RotList:near
|
|
; extrn NoLanguage RotList16:near
|
|
extrn NoLanguage TransRotList:near
|
|
; extrn NoLanguage RotListNormal:near
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; █▀▀▀█ █▀▀▀▀ █▀▀▀▀ █▀▀▀█ █▀▀█ █ █▀▀▀▀ ▀▀█▀▀
|
|
; ██▀▀█ ██▀▀ ██▀▀ ██ █ ██▀▀█ ▄▄ █ ██▀▀ ██
|
|
; ▀▀ ▀ ▀▀ ▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ISO
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
|
|
|
|
PatchObjet proc uses esi ebx ebp,\
|
|
ptrobj:DWORD
|
|
|
|
mov esi, ptrobj
|
|
|
|
test word ptr[esi], INFO_ANIM
|
|
jz exit
|
|
|
|
movzx eax, word ptr[esi+14] ; nb bytes to skip
|
|
lea esi, [esi+eax+16] ; saute zone info
|
|
|
|
movzx eax, word ptr[esi] ; nb points
|
|
add esi, 2
|
|
|
|
lea eax, [eax+eax*2] ; *3
|
|
lea esi, [esi+eax*2] ; *6, esi saute defpoint
|
|
|
|
mov cx, [esi]
|
|
add esi, 2
|
|
|
|
dec cx ; - groupe 0
|
|
jz exit
|
|
|
|
mov bp, 36
|
|
mov bx, 38
|
|
|
|
ag0: add esi, 38 ; size d'un groupe
|
|
mov ax, [esi+6] ; orggroupe * 38
|
|
mul bp
|
|
div bx ; orggroupe * 36
|
|
mov [esi+6], ax
|
|
dec cx
|
|
jnz ag0
|
|
exit:
|
|
ret
|
|
|
|
PatchObjet endp
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
|
|
AffObjetIso proc uses esi edi ebx ebp,\
|
|
xwr:DWORD, ywr:DWORD, zwr:DWORD,\
|
|
palpha:DWORD, pbeta:DWORD, pgamma:DWORD,\
|
|
ptrobj:DWORD
|
|
|
|
mov eax, palpha
|
|
mov [lAlpha], eax
|
|
mov eax, pbeta
|
|
mov [lBeta], eax
|
|
mov eax, pgamma
|
|
mov [lGamma], eax
|
|
|
|
mov ax, 32767
|
|
mov [ScreenXmin], ax
|
|
mov [ScreenYmin], ax
|
|
neg ax
|
|
mov [ScreenXmax], ax
|
|
mov [ScreenYmax], ax
|
|
|
|
;*--------------------------------------------------------------------------
|
|
;* rotation world org obj
|
|
|
|
cmp word ptr[TypeProj], TYPE_3D
|
|
jnz iso0
|
|
|
|
mov eax, xwr ; X World rot
|
|
mov ebx, ywr ; Y World
|
|
mov ecx, zwr ; Z World
|
|
|
|
mov [Save1], ebp
|
|
call LongWorldRot
|
|
mov ebp, [Save1]
|
|
|
|
mov eax, [X0]
|
|
sub eax, [CameraXr]
|
|
mov [PosXWr], eax
|
|
|
|
mov eax, [Y0]
|
|
sub eax, [CameraYr]
|
|
mov [PosYWr], eax
|
|
|
|
mov eax, [Z0]
|
|
sub eax, [CameraZr]
|
|
mov [PosZWr], eax
|
|
|
|
jmp iso1
|
|
|
|
iso0:
|
|
mov eax, xwr ; X World rot
|
|
mov [PosXWr], eax
|
|
mov eax, ywr ; Y World rot
|
|
mov [PosYWr], eax
|
|
mov eax, zwr ; Z World rot
|
|
mov [PosZWr], eax
|
|
|
|
iso1:
|
|
;*--------------------------------------------------------------------------
|
|
;* recup infos
|
|
|
|
mov [TotalEntite], 0
|
|
mov [PointeurListTri], offset List_Tri
|
|
|
|
mov esi, ptrobj
|
|
|
|
mov bx, [esi] ; infos
|
|
mov [Infos], bx
|
|
|
|
movzx eax, word ptr[esi+14] ; nb bytes to skip
|
|
lea esi, [esi+eax+16] ; saute zone info
|
|
|
|
;*--------------------------------------------------------------------------*
|
|
;* rotation nuage/normal face/normal point
|
|
|
|
|
|
test bx, INFO_ANIM
|
|
jnz AnimNuage
|
|
jmp RotateNuage
|
|
|
|
; test bx, INFO_ANIM
|
|
; jz normalrotate
|
|
|
|
; call AnimNuage ; Objet Animé
|
|
; call ComputeAnimNormal
|
|
; jmp short finnuage
|
|
;normalrotate:
|
|
; call RotateNuage ; Objet Normal
|
|
; call ComputeStaticNormal
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; █▀▀▀█ █▀▀▀█ █ █ ▄▀ █▀▀▀▀ █▀▀▀█ ██▄ █ █▀▀▀▀ ██▀▀▀
|
|
; ██▀▀▀ ██ █ ██ ██▀ ██ ▀█ ██ █ ██▀██ ██▀▀ ▀▀▀▀█
|
|
; ▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀▀▀▀
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
|
|
finnuage::
|
|
mov edi, offset List_Entity
|
|
|
|
mov cx, word ptr[esi] ; nb polys
|
|
add esi, 2
|
|
or cx, cx
|
|
jz lignes
|
|
|
|
mov [Count1], cx
|
|
b_poly:
|
|
mov [StartDI], edi ; memo pointeur List_Coor
|
|
|
|
mov ecx, [esi] ; matiere poly + nb point poly
|
|
; (+ coul1/coul2)
|
|
add esi, 2
|
|
|
|
cmp cl, 9 ; >= MAT_GOURAUD
|
|
jae polygouraud
|
|
|
|
cmp cl, 7 ; >= MAT_FLAT
|
|
jae polyflat
|
|
|
|
;-----------------------------------------------------------------------------
|
|
; MAT_TRISTE->MAT_TRAME
|
|
|
|
mov [edi], ecx ; stock type + nbp
|
|
; stock coul1/coul2
|
|
add esi, 2
|
|
add edi, 4
|
|
|
|
mov bp, -32000 ; ZMax
|
|
|
|
mov [Ptr1], edi ; memo start poly somm
|
|
|
|
xor eax, eax
|
|
EVEN
|
|
p0: lodsw ; index point sur List_Point
|
|
mov edx, [eax+offset List_Point]; index déjà *SIZE_LIST_POINT
|
|
mov dword ptr[edi+2], edx ; Xscr & Yscr dans List_Coor
|
|
add edi, 6
|
|
|
|
mov dx, word ptr[eax+offset List_Point+4]; Zrot
|
|
cmp dx, bp ; ZMin
|
|
jle nozmax
|
|
mov bp, dx
|
|
nozmax:
|
|
dec ch
|
|
jnz p0
|
|
|
|
jmp testpoly
|
|
|
|
;-----------------------------------------------------------------------------
|
|
; MAT_FLAT
|
|
polyflat: sub cl, 7
|
|
mov [edi], cx ; stock mat translaté + nbp
|
|
|
|
mov bp, [esi] ; coul1/coul2
|
|
|
|
xor eax, eax
|
|
|
|
; 1st coul = normal face
|
|
mov ax, [esi+2]
|
|
add esi, 4
|
|
add bp, word ptr[ List_Normal + eax*2 ]
|
|
mov word ptr[edi+2], bp ; stock coul + intensity
|
|
add edi, 4
|
|
|
|
mov [ptr1], edi ; memo start poly somm
|
|
|
|
mov bp, -32000 ; ZMax
|
|
|
|
EVEN
|
|
p0f: lodsw ; index point sur List_Point
|
|
mov edx, [eax+offset List_Point]; index déjà *SIZE_LIST_POINT
|
|
mov dword ptr[edi+2], edx ; Xscr & Yscr dans List_Coor
|
|
add edi, 6
|
|
|
|
mov dx, word ptr[eax+offset List_Point+4]; Zrot
|
|
cmp dx, bp ; ZMin
|
|
jle nozmaxf
|
|
mov bp, dx
|
|
nozmaxf:
|
|
dec ch
|
|
jnz p0f
|
|
|
|
jmp testpoly
|
|
|
|
comment @
|
|
|
|
skippoly: mov esi, ebx
|
|
dec ecx
|
|
shl ecx, 1
|
|
add esi, ecx ; skip points restant
|
|
mov edi, [Ptr1]
|
|
jmp badpoly
|
|
|
|
skippolyg: mov esi, ebx
|
|
dec ecx
|
|
shl ecx, 2
|
|
add esi, ecx ; skip points restant
|
|
mov edi, [Ptr1]
|
|
jmp badpoly
|
|
|
|
@
|
|
|
|
comment @
|
|
|
|
;-----------------------------------------------------------------------------
|
|
; gouraud --> MAT_TRISTE->MAT_TRAME
|
|
|
|
|
|
nolight2: xor cl, cl
|
|
mov [edi], cx ; stock type + nbp
|
|
add edi, 2 ; stock nbp
|
|
|
|
movsw ; stock coul1/coul2
|
|
|
|
mov bp, 32000 ; ZMax
|
|
|
|
mov [ptr1], edi ; memo start poly somm
|
|
|
|
EVEN
|
|
p0l: add esi, 2 ; oublie normal
|
|
|
|
lodsw ; index point sur List_Point
|
|
movzx ebx, ax ; index déjà *SIZE_LIST_POINT
|
|
add ebx, offset List_Point
|
|
|
|
xchg ebx, esi
|
|
lodsd
|
|
mov dword ptr[edi+2], eax ; Xscr & Yscr dans List_Coor
|
|
add edi, 6
|
|
|
|
lodsw ; Zrot
|
|
; iso or ax, ax
|
|
; js skippoly ; <0 ?
|
|
|
|
cmp ax, bp ; ZMin
|
|
jge nozmaxl
|
|
mov bp, ax
|
|
nozmaxl:
|
|
mov esi, ebx
|
|
dec ch
|
|
jnz p0l
|
|
|
|
jmp testpoly
|
|
|
|
@
|
|
|
|
;-----------------------------------------------------------------------------
|
|
; MAT_GOURAUD
|
|
|
|
|
|
polygouraud: ;cmp [FlagLight], 0
|
|
;jz nolight2
|
|
|
|
sub cl, 2 ; attention voir reanim
|
|
mov [edi], ecx ; stock type translated + nbp
|
|
; + stock coul1/coul2
|
|
add esi, 2
|
|
add edi, 4
|
|
|
|
shr ecx, 8 ; cl = nbp, ch = coul1
|
|
|
|
mov bp, -32000 ; ZMax
|
|
|
|
mov [Ptr1], edi ; memo start poly somm
|
|
|
|
xor eax, eax
|
|
EVEN
|
|
p0g:
|
|
mov ax, [esi] ; normal point
|
|
mov dx, word ptr[List_Normal+eax*2]
|
|
add dl, ch
|
|
mov word ptr[edi], dx ; stock intensity point
|
|
|
|
mov ax, [esi+2] ; index point sur List_Point
|
|
add esi, 4
|
|
mov edx, [eax+offset List_Point]; index déjà *SIZE_LIST_POINT
|
|
mov dword ptr[edi+2], edx ; Xscr & Yscr dans List_Coor
|
|
add edi, 6
|
|
|
|
mov dx, word ptr[eax+offset List_Point+4]; Zrot
|
|
|
|
; voir pour "depthcueing" vers sombre
|
|
|
|
cmp dx, bp ; ZMin
|
|
jle nozmaxg
|
|
mov bp, dx
|
|
nozmaxg:
|
|
dec cl
|
|
jnz p0g
|
|
|
|
;-----------------------------------------------------------------------------
|
|
testpoly: mov [NextDI], edi ; memo pointeur List_Coor
|
|
|
|
mov edi, [Ptr1] ; pointeur list sommets
|
|
|
|
mov [ZMax], bp
|
|
|
|
mov ax, [edi+4]
|
|
mov bx, [edi+8]
|
|
sub ax, [edi+16]
|
|
sub bx, [edi+2]
|
|
imul bx
|
|
mov bp,ax
|
|
mov bx,dx
|
|
mov ax, [edi+2]
|
|
mov cx, [edi+10]
|
|
sub ax, [edi+14]
|
|
sub cx, [edi+4]
|
|
imul cx
|
|
|
|
sub ax, bp ; oublie face si bx:bp < dx:ax
|
|
sbb dx, bx
|
|
jnl badpoly
|
|
|
|
okpoly:
|
|
inc [TotalEntite]
|
|
mov edi, [PointeurListTri]
|
|
mov ax, [ZMax]
|
|
mov word ptr[edi], ax
|
|
mov word ptr[edi+2], E_POLY
|
|
mov eax, [StartDI]
|
|
mov dword ptr[edi+4], eax
|
|
add edi, 8
|
|
mov [PointeurListTri], edi
|
|
|
|
;-----------------------------------------------------------------------------
|
|
|
|
mov edi, [NextDI]
|
|
nextpoly: dec word ptr[Count1]
|
|
jnz b_poly
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; █ █ █▀▀▀▀ ██▄ █ █▀▀▀▀ ██▀▀▀
|
|
; ██ ██ ██ ▀█ ██▀██ ██▀▀ ▀▀▀▀█
|
|
; ▀▀▀▀▀ ▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀▀▀▀
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
|
|
lignes: mov cx, [esi] ; nb lignes
|
|
add esi, 2
|
|
or cx, cx
|
|
jz spheres
|
|
|
|
add [TotalEntite], cx
|
|
|
|
mov edx, [PointeurListTri]
|
|
|
|
xor ebx, ebx
|
|
|
|
b_line: mov eax, [esi] ; stock matiere/coul
|
|
mov [edi], eax ; coul2 / even
|
|
|
|
|
|
mov bx, [esi+4] ; index point 1 sur List_Point
|
|
|
|
mov eax, [ebx+offset List_Point+00]
|
|
mov dword ptr[edi+4], eax ; X1scr vers List_Coor
|
|
; Y1scr
|
|
mov bp, word ptr[ebx+offset List_Point+04]; Zrot ZMin/Max
|
|
|
|
|
|
mov bx, [esi+6] ; index point 2 sur List_Point
|
|
add esi, 8
|
|
|
|
mov eax, [ebx+offset List_Point+00]
|
|
mov dword ptr[edi+8], eax ; X2scr vers List_Coor
|
|
; Y2scr
|
|
|
|
cmp word ptr[ebx+offset List_Point+04], bp; ZMin ZMax
|
|
jl zok0
|
|
mov bp, word ptr[ebx+offset List_Point+04]
|
|
zok0:
|
|
mov word ptr[edx], bp
|
|
mov word ptr[edx+2], E_LIGNE
|
|
mov dword ptr[edx+4], edi
|
|
add edx, 8
|
|
add edi, 12
|
|
|
|
dec cx
|
|
jnz b_line
|
|
|
|
mov [PointeurListTri], edx
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; ██▀▀▀ █▀▀▀█ █ █ █▀▀▀▀ █▀▀▀█ █▀▀▀▀ ██▀▀▀
|
|
; ▀▀▀▀█ ██▀▀▀ ██▀▀█ ██▀▀ ██▀█▀ ██▀▀ ▀▀▀▀█
|
|
; ▀▀▀▀▀ ▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀▀▀▀
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
|
|
spheres: mov cx, [esi] ; nb spheres
|
|
add esi, 2
|
|
or cx, cx
|
|
jz tri
|
|
|
|
add [TotalEntite], cx
|
|
|
|
mov edx, [PointeurListTri]
|
|
|
|
b_sphere: mov eax, [esi] ; stock matiere/coul
|
|
mov ebx, [esi+4] ; rayon & index point 1 sur List_Point
|
|
mov [edi], eax ; coul2 / even
|
|
mov [edi+4], bx ; rayon
|
|
add esi, 8
|
|
|
|
shr ebx, 16 ; index point 1 sur List_Point
|
|
mov eax, [ebx+offset List_Point+00] ; X1scr vers List_Coor
|
|
mov dword ptr[edi+6], eax ; Y1scr
|
|
mov ax, word ptr[ebx+offset List_Point+04] ; Zrot ZMin/Max
|
|
mov word ptr[edi+10], ax
|
|
|
|
mov word ptr[edx], ax
|
|
mov word ptr[edx+2], E_SPHERE
|
|
mov dword ptr[edx+4], edi
|
|
add edi, 12
|
|
add edx, 8
|
|
|
|
dec cx
|
|
jnz b_sphere
|
|
|
|
mov [PointeurListTri], edx
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; ▀▀█▀▀ █▀▀▀█ █ █▀▀▀▀ ██▄ █ ▀▀█▀▀ █ ▀▀█▀▀ █ ▄▀
|
|
; ██ ██▀█▀ ██ ██▀▀ ██▀██ ██ ██ ██ ██▀
|
|
; ▀▀ ▀▀ ▀ ▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀ ▀▀ ▀▀ ▀▀
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; tri les faces dans la table Listtri (ordre Z et offset sur list coors
|
|
; premachees.
|
|
|
|
tri: movzx ecx, word ptr[TotalEntite]
|
|
dec ecx
|
|
jle fintri
|
|
|
|
mov esi, offset List_Tri
|
|
lea ebp, [esi+ecx*8]
|
|
|
|
SergeSort:: ; esi bas
|
|
; ebp haut
|
|
; cx nbr d'elements
|
|
|
|
; ax pivot
|
|
; edi pospivot
|
|
; ebx h
|
|
|
|
push 0 ; flag de fin de pile !
|
|
|
|
jmp nocalccx
|
|
|
|
plusgrand: mov ebx, edi
|
|
mov eax, [edi]
|
|
jmp short cont
|
|
|
|
permut: ; cx nb entite - 1
|
|
; esi start list sizeof 8 byte
|
|
|
|
mov bp, cx
|
|
|
|
tt0: mov eax, [esi] ; lit Z
|
|
|
|
lea edi, [esi+8]
|
|
xor ebx, ebx
|
|
|
|
tt1: cmp [edi], ax
|
|
jg plusgrand
|
|
cont: add edi, 8
|
|
dec cx
|
|
jnz tt1
|
|
|
|
or ebx, ebx
|
|
jz short noexchg
|
|
|
|
xchg [esi], eax ; permutte
|
|
mov [ebx], eax
|
|
mov eax, [esi+04]
|
|
xchg [ebx+04], eax
|
|
mov [esi+04], eax
|
|
|
|
noexchg: add esi, 8
|
|
dec bp
|
|
mov cx, bp
|
|
jnz tt0
|
|
|
|
pop ebp
|
|
or ebp, ebp
|
|
jnz short dopop
|
|
jmp fintri
|
|
|
|
permut2: mov eax, [esi]
|
|
mov ebx, [ebp]
|
|
|
|
cmp ax, bx
|
|
jge short skipswap
|
|
|
|
mov [esi], ebx
|
|
mov [ebp], eax
|
|
mov eax, [esi+04]
|
|
xchg [ebp+04], eax
|
|
mov [esi+04], eax
|
|
skipswap:
|
|
pop ebp
|
|
or ebp, ebp
|
|
jz short fintri
|
|
|
|
dopop: pop esi
|
|
nopop:
|
|
mov ecx, ebp
|
|
sub ecx, esi
|
|
shr ecx, 3
|
|
nocalccx:
|
|
cmp cx, 1 ; select permut2 ?
|
|
je short permut2
|
|
|
|
cmp cx, 7 ; select permut ou qsort
|
|
jbe short permut
|
|
|
|
mov edi, esi ; pospivot = bas
|
|
|
|
mov eax, [esi] ; pivot = [pospivot] = [bas]
|
|
|
|
add esi, 8 ; bas++
|
|
|
|
mov ebx, ebp ; h = haut
|
|
|
|
w1: cmp word ptr[esi], ax
|
|
jl short w2
|
|
add esi, 8 ; si [bas] >= pivot
|
|
dec cx
|
|
jnz w1
|
|
|
|
jmp short w4
|
|
|
|
w2: cmp word ptr[ebx], ax
|
|
jg short w3
|
|
sub ebx, 8 ; si [h] <= pivot
|
|
dec cx
|
|
jnz w2
|
|
|
|
jmp short w4
|
|
|
|
w3: mov edx, [esi] ; xchg [bas],[h]
|
|
xchg edx, [ebx]
|
|
mov [esi], edx
|
|
mov edx, [esi+4]
|
|
xchg edx, [ebx+4]
|
|
mov [esi+4], edx
|
|
|
|
jmp short w1
|
|
w4:
|
|
xchg esi, ebx ; idem que esi-=8 et ebx+=8
|
|
|
|
xchg [esi], eax ; xchg [pospivot],[bas]
|
|
mov [edi], eax
|
|
mov edx, [edi+4]
|
|
xchg edx, [esi+4]
|
|
mov [edi+4], edx
|
|
|
|
cmp ebx, ebp
|
|
jae short nopush
|
|
|
|
push ebx ; h
|
|
push ebp ; haut
|
|
nopush:
|
|
sub esi, 8
|
|
cmp edi, esi
|
|
jae short norecur
|
|
|
|
mov ebp, esi
|
|
mov esi, edi
|
|
jmp nopop
|
|
norecur:
|
|
pop ebp
|
|
or ebp, ebp
|
|
jnz dopop
|
|
fintri:
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; █▀▀▀▄ █ ██▀▀▀ █▀▀▀█ █ █▀▀▀█ █ ▄▀
|
|
; ██ █ ██ ▀▀▀▀█ ██▀▀▀ ██ ██▀▀█ ██▀
|
|
; ▀▀▀▀ ▀▀ ▀▀▀▀▀ ▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; affichage des entités
|
|
|
|
mov esi,offset List_Tri
|
|
|
|
mov cx, [TotalEntite]
|
|
or cx, cx
|
|
jz badfinafobj_1
|
|
|
|
mov [Count1], cx
|
|
mov [Ptr1], esi
|
|
|
|
ade0: movzx ebx, word ptr[esi+2] ; type entité
|
|
mov esi, [esi+4] ; offset List_Coor
|
|
add [Ptr1], 8
|
|
|
|
jmp [ TabJump_2 + ebx*4 ] ; jmp à aff de l'entité
|
|
|
|
nextaff:: mov esi, [Ptr1]
|
|
dec word ptr[Count1]
|
|
jnz ade0
|
|
|
|
goodfinobj: xor eax, eax ; OK affiché au moins 1 entité
|
|
ret
|
|
|
|
;*--------------------------------------------------------------------------*/
|
|
|
|
badfinafobj_1: ; 1 si pas d'entite to aff
|
|
mov ax,-1
|
|
mov [ScreenXmax], ax
|
|
mov [ScreenYmax], ax
|
|
mov [ScreenXmin], ax
|
|
mov [ScreenYmin], ax
|
|
mov eax, 1
|
|
ret
|
|
|
|
;*--------------------------------------------------------------------------*/
|
|
|
|
badpoly: mov edi, [StartDI]
|
|
jmp nextpoly
|
|
|
|
AffObjetIso endp
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; █▀▀▀▀ ██▄ █ ▀▀█▀▀ █ ▀▀█▀▀ █ ▄▀
|
|
; ██▀▀ ██▀██ ██ ██ ██ ██▀
|
|
; ▀▀▀▀▀ ▀▀ ▀ ▀▀ ▀▀ ▀▀ ▀▀
|
|
;
|
|
; █▀▀▀▄ █ ██▀▀▀ █▀▀▀█ █ █▀▀▀█ █ ▄▀
|
|
; ██ █ ██ ▀▀▀▀█ ██▀▀▀ ██ ██▀▀█ ██▀
|
|
; ▀▀▀▀ ▀▀ ▀▀▀▀▀ ▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
aff_E_POLY::
|
|
xor ecx, ecx
|
|
mov ebx, ecx
|
|
|
|
lodsd
|
|
mov bl, al ; type
|
|
mov cl, ah ; nb points
|
|
shr eax, 16 ; coul1/coul2
|
|
|
|
mov [TypePoly], bx
|
|
mov [NbPolyPoints], cx
|
|
|
|
lea ecx, [ecx+ecx*2] ; *3 word
|
|
mov edi, offset TabPoly
|
|
shr ecx, 1
|
|
jnc dod
|
|
movsw
|
|
dod: rep movsd
|
|
|
|
|
|
mov di, ax ; coul pour fillv
|
|
|
|
call ComputePoly_A
|
|
or ax, ax
|
|
jz nextaff
|
|
|
|
mov cx, bx ; type
|
|
call FillVertic_A
|
|
|
|
jmp nextaff
|
|
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
aff_E_LIGNE::
|
|
mov ax, [esi]
|
|
xchg al, ah
|
|
mov bp, ax
|
|
|
|
mov ebx, [esi+4]
|
|
movsx eax, bx ; x0
|
|
sar ebx, 16 ; y0
|
|
mov edx, [esi+8]
|
|
movsx ecx, dx ; x1
|
|
sar edx, 16 ; y1
|
|
|
|
call Line_A
|
|
|
|
jmp nextaff
|
|
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
aff_E_SPHERE::
|
|
movzx eax, byte ptr[esi] ; type
|
|
mov [save1], eax ; mov [TypePoly], ax
|
|
|
|
mov ax, [esi+1] ; coul1/coul2
|
|
mov [save2], eax
|
|
|
|
mov ecx, [esi+4]
|
|
movzx ebp, cx ; rayon
|
|
shr ecx, 16 ; x
|
|
movzx edi, word ptr[esi+8] ; y
|
|
|
|
cmp word ptr[TypeProj], TYPE_3D
|
|
jnz isosph
|
|
|
|
mov ax, bp ; rayon
|
|
imul word ptr[LFactorX]
|
|
mov bp, word ptr[esi+10] ; Z
|
|
add bp, word ptr[KFactor]
|
|
idiv bp
|
|
movzx ebp, ax
|
|
jmp short affsph
|
|
|
|
; mov ax, 34 ; racine sx²+sy²
|
|
; imul bp
|
|
; idiv word ptr[IsoScale]
|
|
; movzx ebp, ax
|
|
isosph: imul ebp, 34 ; racine sx²+sy²
|
|
sar ebp, 9 ; /512 IsoScale
|
|
|
|
; ecx x
|
|
; edi y -> esi pour computesphere
|
|
; ebp rayon sur ecran
|
|
|
|
; reajuste coordonnée box
|
|
|
|
affsph: mov ax, cx ; x + rayon
|
|
add ax, bp
|
|
cmp ax, [ScreenXmax]
|
|
jle nosxa
|
|
mov [ScreenXmax], ax
|
|
nosxa: mov ax, cx ; x - rayon
|
|
sub ax, bp
|
|
cmp ax, [ScreenXmin]
|
|
jge nosxi
|
|
mov [ScreenXmin], ax
|
|
nosxi: mov ax, di
|
|
add ax, bp ; y + rayon
|
|
cmp ax, [ScreenYmax]
|
|
jle nosya
|
|
mov [ScreenYmax], ax
|
|
nosya: mov ax, di ; y - rayon
|
|
sub ax, bp
|
|
cmp ax, [ScreenYmin]
|
|
jge nosyi
|
|
mov [ScreenYmin], ax
|
|
nosyi:
|
|
|
|
mov esi, edi
|
|
call ComputeSphere_A
|
|
|
|
or eax, eax
|
|
jz nextaff
|
|
|
|
mov edi, [save2] ; coul
|
|
mov ecx, [save1] ; type
|
|
|
|
call FillVertic_A
|
|
|
|
no_sphere: jmp nextaff
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; sous programmes
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; █▀▀▀█ ██▄ █ █ █▄ ▄█ █▀▀▀█ █▀▀▀█ ▀▀█▀▀
|
|
; ██▀▀█ ██▀██ ██ ██▀ █ ██▀█▀ ██ █ ██
|
|
; ▀▀ ▀ ▀▀ ▀ ▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
|
|
RotateGroupe proc near
|
|
|
|
mov [lAlpha], ebx
|
|
mov [lBeta], ecx
|
|
mov [lGamma], edx
|
|
|
|
movzx eax, word ptr[esi] ; Start point deja *6
|
|
mov [Save2], eax
|
|
movzx eax, word ptr[esi+2] ; nb points
|
|
mov [Save3], eax
|
|
|
|
movzx ebp, word ptr[esi+6] ; orggroupe deja * 36
|
|
cmp bp, -1
|
|
jne pasgroupe0
|
|
|
|
mov ebp, offset LMatriceWorld
|
|
|
|
mov [X0], 0 ; XYZ0 ChgRepere
|
|
mov [Y0], 0
|
|
mov [Z0], 0
|
|
|
|
jmp short groupe0
|
|
|
|
pasgroupe0: add ebp, offset TabMat ; EBP Matrice du groupe org
|
|
|
|
movzx edx, word ptr[esi+04] ; Org Point index deja *6
|
|
mov eax, dword ptr[List_Anim_Point+edx] ; X0 & Y0
|
|
movsx edi, ax
|
|
sar eax, 16
|
|
mov [X0], edi
|
|
mov [Y0], eax
|
|
movsx eax, word ptr[List_Anim_Point+edx+4] ; Z0
|
|
mov [Z0], eax ; XYZ0 ChgRepere
|
|
groupe0:
|
|
mov eax, [Ptr1] ; Mgroup
|
|
|
|
call RotMatIndex2 ; rot de Mtempo vers Mrot & Mgroup
|
|
|
|
mov ecx, [Save2]
|
|
|
|
mov esi, [OffsetDefPoint]
|
|
add esi, ecx ; si sur Def_Point + Start
|
|
|
|
lea edi, [List_Anim_Point + ecx]; di sur List_Point + Start
|
|
|
|
mov ecx, [Save3]
|
|
|
|
jmp RotList
|
|
|
|
RotateGroupe endp
|
|
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
|
|
TranslateGroupe proc near
|
|
|
|
mov [lAlpha], ebx ; attention !
|
|
mov [lBeta], ecx ; ici step de translation
|
|
mov [lGamma], edx
|
|
|
|
mov edx, esi ; save group en cours
|
|
|
|
movzx esi, word ptr[esi+6] ; orggroupe deja * 38
|
|
cmp si, -1
|
|
jne pasgroupe0
|
|
|
|
mov [X0], 0
|
|
mov [Y0], 0
|
|
mov [Z0], 0 ; ChgRepere
|
|
|
|
mov esi, offset LMatriceWorld
|
|
|
|
jmp short groupe0
|
|
|
|
pasgroupe0: add esi, offset TabMat ; Mgroup org
|
|
|
|
movzx ecx, word ptr[edx+4] ; Org Point index deja *6
|
|
mov eax, dword ptr[List_Anim_Point+ecx] ; X0 & Y0
|
|
movsx edi, ax
|
|
sar eax, 16
|
|
mov [X0], edi
|
|
mov [Y0], eax
|
|
movsx eax, word ptr[List_Anim_Point + ecx + 4]; Z0
|
|
mov [Z0], eax ; XYZ0 ChgRepere
|
|
|
|
groupe0: mov eax, [Ptr1]
|
|
|
|
mov edi, eax
|
|
mov ecx, 9
|
|
rep movsd
|
|
|
|
mov ecx, [edx]
|
|
movzx edx, cx ; Start point deja *6
|
|
|
|
mov esi, [OffsetDefPoint]
|
|
add esi, edx ; si sur List_Point + Start
|
|
|
|
lea edi, [List_Anim_Point + edx]
|
|
|
|
shr ecx, 16 ; nb points
|
|
|
|
jmp TransRotList
|
|
|
|
TranslateGroupe endp
|
|
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
|
|
ifdef Poubelle
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
|
|
ZoomGroupe proc near
|
|
|
|
; bx zoomX cx zoomY dx zoomZ
|
|
|
|
inc bh ; ZoomX + 256
|
|
inc ch ; ZoomY + 256
|
|
inc dh ; ZoomZ + 256
|
|
mov bp, dx ; bp zoomZ
|
|
|
|
mov di, [si+0] ; Start point deja *6
|
|
mov dx, [si+2] ; nb points
|
|
|
|
mov si, offset List_Anim_Point
|
|
add si, di ; si sur List_Point + Start
|
|
|
|
push ds
|
|
|
|
mov di, es
|
|
mov ds, di ; ds sur dgroup
|
|
EVEN
|
|
rg0: push dx ; beurk
|
|
|
|
mov ax, [si] ; Delta X
|
|
imul bx
|
|
mov al, ah ; /256
|
|
mov ah, dl
|
|
mov [si], ax
|
|
inc si
|
|
inc si
|
|
|
|
mov ax, [si] ; Delta Y
|
|
imul cx
|
|
mov al, ah ; /256
|
|
mov ah, dl
|
|
mov [si], ax
|
|
inc si
|
|
inc si
|
|
|
|
mov ax, [si] ; Delta Z
|
|
imul bp
|
|
mov al, ah ; /256
|
|
mov ah, dl
|
|
mov [si], ax
|
|
inc si
|
|
inc si
|
|
|
|
pop dx
|
|
dec dx
|
|
jnz rg0
|
|
|
|
pop ds
|
|
ret
|
|
|
|
ZoomGroupe endp
|
|
|
|
endif
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; █▀▀▀█ ██▄ █ █ █▄ ▄█ ██▄ █ █ █ █▀▀▀█ █▀▀▀▀ █▀▀▀▀
|
|
; ██▀▀█ ██▀██ ██ ██▀ █ ██▀██ ██ █ ██▀▀█ ██ ▀█ ██▀▀
|
|
; ▀▀ ▀ ▀▀ ▀ ▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀▀▀▀
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
|
|
AnimNuage proc near
|
|
|
|
movzx eax, word ptr[esi] ; nb points
|
|
add esi, 2
|
|
mov [NbPoints], ax
|
|
|
|
mov [OffsetDefPoint], esi
|
|
lea eax, [eax+eax*2] ; *3
|
|
lea esi, [esi+eax*2] ; *6, esi saute defpoint
|
|
|
|
lodsw
|
|
mov [NbGroupes], ax
|
|
|
|
mov [ListGroupe], esi ; memo start list groupe
|
|
|
|
;*--------------------------------------------------------------------------*/
|
|
; rotations du groupe 0
|
|
|
|
mov ebx, [lAlpha] ; SI sur groupe 0
|
|
mov ecx, [lBeta] ; init aux valeurs de rot locale
|
|
mov edx, [lGamma]
|
|
|
|
mov [Ptr1], offset TabMat
|
|
|
|
mov [Save1], esi
|
|
|
|
call RotateGroupe
|
|
|
|
mov esi, [Save1]
|
|
add esi, 38 ; size d'un groupe
|
|
mov [Save1], esi
|
|
|
|
;*--------------------------------------------------------------------------*/
|
|
; rotations/translations/zooms des groupes
|
|
|
|
mov cx, [NbGroupes]
|
|
dec cx ; - groupe 0
|
|
jz ag0f
|
|
|
|
mov [Count1], cx
|
|
|
|
mov [Ptr1], offset TabMat + 36
|
|
|
|
ag0: mov ebx, [esi+8]
|
|
mov ax, bx ; type anim groupe
|
|
sar ebx, 16 ; Alpha ou stepX
|
|
mov edx, [esi+12]
|
|
movsx ecx, dx ; Beta ou stepY
|
|
sar edx, 16 ; Gamma ou stepZ
|
|
|
|
cmp ax, TYPE_ROTATE
|
|
jz rotateg
|
|
cmp ax, TYPE_TRANSLATE
|
|
jnz nolocalrot
|
|
|
|
; jz translateg
|
|
; cmp ax, TYPE_ZOOM
|
|
; jnz nolocalrot
|
|
|
|
;zoomg: call ZoomGroupe
|
|
; jmp short nolocalrot
|
|
|
|
translateg: call TranslateGroupe
|
|
jmp short nolocalrot
|
|
|
|
rotateg: call RotateGroupe
|
|
|
|
nolocalrot: add [Ptr1], 36 ; next matrix
|
|
|
|
mov esi, [Save1]
|
|
add esi, 38 ; size d'un groupe
|
|
mov [Save1], esi
|
|
|
|
dec word ptr[Count1]
|
|
jnz ag0
|
|
|
|
ag0f:
|
|
|
|
;*--------------------------------------------------------------------------*/
|
|
; projette liste
|
|
|
|
project: mov cx, [NbPoints]
|
|
mov [Count1], cx
|
|
|
|
mov esi, offset List_Anim_Point
|
|
mov edi, offset List_Point
|
|
|
|
cmp word ptr[TypeProj], TYPE_3D
|
|
jz boucleproj3d
|
|
|
|
|
|
|
|
boucleproj: movsx eax, word ptr[esi] ; eax X rot
|
|
add eax, [PosXWr]
|
|
|
|
movsx ebx, word ptr[esi+2] ; ebx Y rot
|
|
add ebx, [PosYWr]
|
|
|
|
movsx ebp, word ptr[esi+4]
|
|
add ebp, [PosZWr]
|
|
neg ebp ; Z rot, bp = Zrot tri
|
|
|
|
add esi, 6
|
|
|
|
projiso: lea ecx, [ebp+eax] ; x + zrot
|
|
lea ecx, [ecx*8] ; *8
|
|
lea ecx, [ecx+ecx*2] ; *24
|
|
|
|
sar ecx, 9 ; /512 IsoScale
|
|
|
|
add cx, word ptr[XCentre]
|
|
mov word ptr[edi], cx ; stock Xp
|
|
|
|
cmp cx, [ScreenXmin]
|
|
jl sxmin
|
|
nosxmin: cmp cx, [ScreenXmax]
|
|
jg sxmax
|
|
nosxmax:
|
|
mov ecx, eax
|
|
sub eax, ebp ; x - zrot
|
|
sub ebp, ecx ; Zrot - X pour bon tri
|
|
|
|
lea eax, [eax*4] ; *4
|
|
lea eax, [eax+eax*2] ; *12
|
|
; eax = (x-zrot) * 12
|
|
|
|
; essai de correction tri par influence du y
|
|
sub bp, bx
|
|
|
|
lea ecx, [ebx+ebx] ; *2
|
|
shl ebx, 5 ; 32
|
|
sub ecx, ebx ; - y*30
|
|
|
|
add eax, ecx ; + (x-zrot) * 12
|
|
|
|
; mov edx, eax
|
|
; sar edx, 16
|
|
; idiv word ptr[IsoScale]
|
|
|
|
sar eax, 9 ; /512 IsoScale
|
|
|
|
add ax, word ptr[YCentre]
|
|
mov word ptr[edi+2], ax ; stock Yp
|
|
|
|
cmp ax, [ScreenYmin]
|
|
jl symin
|
|
nosymin: cmp ax, [ScreenYmax]
|
|
jg symax
|
|
nosymax:
|
|
|
|
mov word ptr[edi+4], bp ; stock Zrot pour tri
|
|
add edi, 6
|
|
|
|
;--------------------------------------------
|
|
|
|
pl0: dec word ptr[Count1]
|
|
jnz boucleproj
|
|
|
|
|
|
mov esi, [Save1]
|
|
mov eax, -1
|
|
jmp ComputeAnimNormal
|
|
; ret
|
|
|
|
;*--------------------------------------------------------------------------*
|
|
;*--------------------------------------------------------------------------*
|
|
;*--------------------------------------------------------------------------*
|
|
|
|
|
|
sxmin: mov [ScreenXmin], cx
|
|
jmp nosxmin
|
|
sxmax: mov [ScreenXmax], cx
|
|
jmp nosxmax
|
|
symin: mov [ScreenYmin], ax
|
|
jmp nosymin
|
|
symax: mov [ScreenYmax], ax
|
|
jmp nosymax
|
|
|
|
sxmin3d: mov [ScreenXmin], ax
|
|
jmp nosxmin3d
|
|
sxmax3d: mov [ScreenXmax], ax
|
|
jmp nosxmax3d
|
|
symin3d: mov [ScreenYmin], ax
|
|
jmp nosymin3d
|
|
symax3d: mov [ScreenYmax], ax
|
|
jmp nosymax3d
|
|
|
|
overflow: mov ebp, 7FFFFFFFh ; max value
|
|
jmp fixed
|
|
|
|
overX: shr eax, 16
|
|
or ax, 7FFFh
|
|
jmp fixedX
|
|
|
|
overY: shr eax, 16
|
|
or ax, 7FFFh
|
|
jmp fixedY
|
|
|
|
overZ: shr ebp, 16
|
|
or bp, 7FFFh
|
|
jmp fixedZ
|
|
|
|
|
|
boucleproj3D: movsx eax, word ptr[esi] ; eax X rot
|
|
add eax, [PosXWr]
|
|
|
|
movsx ebx, word ptr[esi+2] ; ebx Y rot
|
|
add ebx, [PosYWr]
|
|
|
|
movsx ebp, word ptr[esi+4] ; Z rot, bp = Zrot tri
|
|
add ebp, [PosZWr]
|
|
neg ebp
|
|
|
|
add esi, 6
|
|
|
|
add ebp, [KFactor]
|
|
jle overflow
|
|
|
|
fixed: imul [LFactorX] ; X
|
|
idiv ebp
|
|
add eax, [XCentre]
|
|
|
|
cmp eax, 0FFFFh
|
|
ja overX
|
|
fixedX:
|
|
mov word ptr[edi], ax ; stock Xp
|
|
|
|
cmp ax, [ScreenXmin]
|
|
jl sxmin3d
|
|
nosxmin3d: cmp ax, [ScreenXmax]
|
|
jg sxmax3d
|
|
nosxmax3d:
|
|
|
|
mov eax, ebx
|
|
neg eax
|
|
imul [LFactorY] ; -Y
|
|
idiv ebp
|
|
add eax, [YCentre]
|
|
|
|
cmp eax, 0FFFFh
|
|
ja overY
|
|
fixedY:
|
|
mov word ptr[edi+2], ax ; stock Yp
|
|
|
|
cmp ax, [ScreenYmin]
|
|
jl symin3d
|
|
nosymin3d: cmp ax, [ScreenYmax]
|
|
jg symax3d
|
|
nosymax3d:
|
|
cmp ebp, 0FFFFh
|
|
ja overZ
|
|
fixedZ:
|
|
mov word ptr[edi+4], bp ; stock Zrot pour tri
|
|
add edi, 6
|
|
|
|
;--------------------------------------------
|
|
|
|
pl03d: dec word ptr[Count1]
|
|
jnz boucleproj3d
|
|
|
|
;*--------------------------------------------------------------------------*
|
|
|
|
mov esi, [Save1]
|
|
|
|
finanim:
|
|
; mov eax, -1
|
|
; ret
|
|
|
|
;AnimNuage endp
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; ██▄ █ █▀▀▀█ █▀▀▀█ █▄ ▄█ █▀▀▀█ █ ██▀▀▀
|
|
; ██▀██ ██ █ ██▀█▀ ██▀ █ ██▀▀█ ██ ▀▀▀▀█
|
|
; ▀▀ ▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀ ▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀▀▀▀
|
|
;*══════════════════════════════════════════════════════════════════════════*/
|
|
;*──────────────────────────────────────────────────────────────────────────*/
|
|
|
|
;ComputeAnimNormal proc near
|
|
|
|
ComputeAnimNormal:
|
|
|
|
lodsw ; nbobj normal faces/points
|
|
or ax, ax
|
|
jz nonp
|
|
|
|
mov edi, offset List_Normal
|
|
mov [Ptr1], edi
|
|
|
|
mov eax, offset TabMat
|
|
mov [Ptr2], eax
|
|
|
|
mov cx, [NbGroupes]
|
|
mov word ptr[Count1], cx
|
|
|
|
mov ebx, [ListGroupe]
|
|
add ebx, 18 ; sur NbNormal
|
|
mov [Save1], ebx
|
|
|
|
bouclegroup: mov cx, [ebx]
|
|
or cx, cx
|
|
jz nextgroup
|
|
|
|
mov [compteur], cx
|
|
|
|
; copy Mgroup vers Mrot & Premultiply par Normallight
|
|
|
|
mov ecx, [NormalXlight]
|
|
mov edx, [eax+LT00]
|
|
mov ebx, [eax+LT01]
|
|
mov ebp, [eax+LT02]
|
|
imul edx, ecx
|
|
imul ebx, ecx
|
|
imul ebp, ecx
|
|
mov [LMat00], edx
|
|
mov [LMat01], ebx
|
|
mov [LMat02], ebp
|
|
|
|
mov ecx, [NormalYlight]
|
|
mov edx, [eax+LT10]
|
|
mov ebx, [eax+LT11]
|
|
mov ebp, [eax+LT12]
|
|
imul edx, ecx
|
|
imul ebx, ecx
|
|
imul ebp, ecx
|
|
mov [LMat10], edx
|
|
mov [LMat11], ebx
|
|
mov [LMat12], ebp
|
|
|
|
mov ecx, [NormalZlight]
|
|
mov edx, [eax+LT20]
|
|
mov ebx, [eax+LT21]
|
|
mov ebp, [eax+LT22]
|
|
imul edx, ecx
|
|
imul ebx, ecx
|
|
imul ebp, ecx
|
|
mov [LMat20], edx
|
|
mov [LMat21], ebx
|
|
mov [LMat22], ebp
|
|
|
|
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
|
bouclerot:
|
|
mov ebx, [esi]
|
|
movsx ebp, bx
|
|
sar ebx, 16
|
|
movsx ecx, word ptr[esi+4]
|
|
|
|
mov eax, [ LMat00 ]
|
|
mov edx, [ LMat01 ]
|
|
imul eax, ebp
|
|
imul edx, ebx
|
|
add eax, edx
|
|
mov edx, [ LMat02 ]
|
|
imul edx, ecx
|
|
add eax, edx
|
|
|
|
mov edi, [ LMat10 ]
|
|
mov edx, [ LMat11 ]
|
|
imul edi, ebp
|
|
imul edx, ebx
|
|
add eax, edi
|
|
mov edi, [ LMat12 ]
|
|
imul edi, ecx
|
|
add eax, edx
|
|
add eax, edi
|
|
|
|
xor di, di ; 0 intensity for now
|
|
|
|
imul ebp, [ LMat20 ]
|
|
imul ebx, [ LMat21 ]
|
|
add eax, ebp
|
|
imul ecx, [ LMat22 ]
|
|
add eax, ebx
|
|
add eax, ecx
|
|
|
|
js nointensity ; saut si negatif
|
|
|
|
sar eax, 14
|
|
cwd
|
|
idiv word ptr[esi+6] ; prenormalized range
|
|
mov di, ax
|
|
|
|
nointensity: mov eax, [Ptr1]
|
|
mov word ptr[eax], di ; stock intensity
|
|
add eax, 2
|
|
mov [Ptr1], eax
|
|
|
|
add esi, 8
|
|
|
|
dec word ptr[compteur]
|
|
jnz bouclerot
|
|
|
|
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
|
|
|
nextgroup:
|
|
mov ebx, [Save1]
|
|
mov eax, [Ptr2]
|
|
add ebx, 38
|
|
add eax, 36
|
|
mov [Save1], ebx
|
|
mov [Ptr2], eax
|
|
|
|
dec word ptr[Count1]
|
|
jnz bouclegroup
|
|
nonp:
|
|
jmp FinNuage
|
|
; ret
|
|
|
|
;ComputeAnimNormal endp
|
|
|
|
AnimNuage endp
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; █▀▀▀█ █▀▀▀█ ▀▀█▀▀ █▀▀▀█ ▀▀█▀▀ █▀▀▀▀ ██▄ █ █ █ █▀▀▀█ █▀▀▀▀ █▀▀▀▀
|
|
; ██▀█▀ ██ █ ██ ██▀▀█ ██ ██▀▀ ██▀██ ██ █ ██▀▀█ ██ ▀█ ██▀▀
|
|
; ▀▀ ▀ ▀▀▀▀▀ ▀▀ ▀▀ ▀ ▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀▀▀▀
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
|
|
RotateNuage proc near
|
|
|
|
mov [Save1], esi
|
|
call RotMatW ; Rotate MWorld vers Mrot
|
|
mov esi, [Save1]
|
|
|
|
; rotationS nuage de points
|
|
|
|
mov cx, word ptr[esi] ; nbobj points
|
|
add esi, 2
|
|
mov [NbPoints], cx
|
|
|
|
mov edi,offset List_Point
|
|
|
|
mov [Count1], cx
|
|
mov [Ptr1], edi
|
|
|
|
bouclerot2:
|
|
|
|
; rotation totale de l'objet
|
|
|
|
mov ax, [esi] ; AX X reel
|
|
mov bx, [esi+2] ; BX Y reel
|
|
mov cx, [esi+4] ; CX Z reel
|
|
add esi, 6
|
|
|
|
call Rot ; voir pour Coor rotées
|
|
; en LONG * 2^15
|
|
|
|
; change repere (pos camera reelle & pos objet reelle)
|
|
|
|
mov ax, word ptr[X0]
|
|
sub ax, word ptr[PosXWr]
|
|
|
|
mov bx, word ptr[Y0]
|
|
sub bx, word ptr[PosYWr]
|
|
|
|
mov bp, word ptr[Z0]
|
|
add bp, word ptr[PosZWr]
|
|
neg bp
|
|
|
|
; projection point
|
|
|
|
; passer les param en long !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
mov word ptr[Save2], bp
|
|
call Proj_ISO
|
|
mov bp, word ptr[Save2]
|
|
|
|
mov edi, [Ptr1]
|
|
|
|
mov word ptr[edi], ax ; stock Xp
|
|
|
|
cmp ax,[ScreenXmin]
|
|
jge nosxmin
|
|
mov [ScreenXmin],ax
|
|
nosxmin: cmp ax,[ScreenXmax]
|
|
jle nosxmax
|
|
mov [ScreenXmax],ax
|
|
nosxmax:
|
|
mov word ptr[edi+2], bx ; stock Yp
|
|
|
|
cmp bx,[ScreenYmin]
|
|
jge nosymin
|
|
mov [ScreenYmin],bx
|
|
nosymin: cmp bx,[ScreenYmax]
|
|
jle nosymax
|
|
mov [ScreenYmax],bx
|
|
nosymax:
|
|
mov word ptr[edi+4], bp ; stock Zrot
|
|
|
|
add dword ptr[Ptr1], 6
|
|
|
|
rn0: dec word ptr[Count1]
|
|
jnz bouclerot2
|
|
|
|
; jmp ComputeStaticNormal
|
|
; ret
|
|
|
|
;RotateNuage endp
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; ██▄ █ █▀▀▀█ █▀▀▀█ █▄ ▄█ █▀▀▀█ █ ██▀▀▀
|
|
; ██▀██ ██ █ ██▀█▀ ██▀ █ ██▀▀█ ██ ▀▀▀▀█
|
|
; ▀▀ ▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀ ▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀▀▀▀
|
|
;*══════════════════════════════════════════════════════════════════════════*/
|
|
;*──────────────────────────────────────────────────────────────────────────*/
|
|
|
|
;ComputeStaticNormal proc near
|
|
|
|
mov cx, [esi] ; nbobj normal faces/points
|
|
add esi, 2
|
|
or cx, cx
|
|
jz nonp
|
|
|
|
mov edi, offset List_Normal
|
|
|
|
mov [Count1], cx
|
|
mov [Ptr1], edi
|
|
|
|
bouclerot: mov ax, [esi] ; AX X
|
|
mov bx, [esi+2] ; BX Y
|
|
mov cx, [esi+4] ; CX Z
|
|
mov dx, [esi+6] ; DX prenormalized range
|
|
add esi, 8
|
|
|
|
call Rot ; DX inchangé
|
|
|
|
mov bp, dx
|
|
|
|
mov ax, word ptr[X0]
|
|
|
|
imul word ptr[NormalXLight]
|
|
mov cx, ax
|
|
mov bx, dx
|
|
|
|
mov ax, word ptr[Y0]
|
|
imul word ptr[NormalYLight]
|
|
add cx, ax
|
|
adc bx, dx
|
|
|
|
mov ax, word ptr[Z0]
|
|
imul word ptr[NormalZLight]
|
|
add ax, cx
|
|
adc dx, bx ; intensity
|
|
|
|
mov edi, [Ptr1]
|
|
|
|
or dx,dx
|
|
js nointensity ; saut si negatif
|
|
|
|
idiv bp
|
|
|
|
mov word ptr[edi], ax
|
|
add edi, 2
|
|
mov [Ptr1], edi ; stock intensity
|
|
|
|
dec word ptr[Count1]
|
|
jnz bouclerot
|
|
nonp:
|
|
jmp FinNuage
|
|
; ret
|
|
|
|
nointensity: mov word ptr[edi], 0
|
|
add edi, 2
|
|
mov [Ptr1], edi ; stock intensity
|
|
|
|
dec word ptr[Count1]
|
|
jnz bouclerot
|
|
|
|
jmp FinNuage
|
|
; ret
|
|
|
|
;ComputeStaticNormal endp
|
|
|
|
RotateNuage endp
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*/
|
|
;*──────────────────────────────────────────────────────────────────────────*/
|
|
|
|
END
|