1750 lines
44 KiB
NASM
1750 lines
44 KiB
NASM
.386p
|
|
jumps
|
|
|
|
.model SMALL, C
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; █▄ ▄█ █▀▀▀█ █▀▀█ █ █▀▀▀▀ ▀▀█▀▀
|
|
; ██▀ █ ██ █ ██▀▀█ ▄▄ █ ██▀▀ ██
|
|
; ▀▀ ▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
|
|
include p_define.ash
|
|
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
.data
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
|
|
; extern M_TRIGO
|
|
|
|
extrn NoLanguage CameraXr:WORD
|
|
extrn NoLanguage CameraYr:WORD
|
|
extrn NoLanguage CameraZr:WORD
|
|
extrn NoLanguage X0:WORD
|
|
extrn NoLanguage Y0:WORD
|
|
extrn NoLanguage Z0:WORD
|
|
extrn NoLanguage XCentre:WORD
|
|
extrn NoLanguage YCentre:WORD
|
|
|
|
extrn NoLanguage lAlpha:WORD
|
|
extrn NoLanguage lBeta:WORD
|
|
extrn NoLanguage lGamma:WORD
|
|
|
|
extrn NoLanguage NormalXLight:WORD
|
|
extrn NoLanguage NormalYLight:WORD
|
|
extrn NoLanguage NormalZLight:WORD
|
|
|
|
extrn NoLanguage MatriceTempo:WORD
|
|
extrn NoLanguage MatriceWorld:WORD
|
|
extrn NoLanguage MatriceRot:WORD
|
|
|
|
extrn NoLanguage IsoScale:WORD
|
|
extrn NoLanguage TypeProj:WORD
|
|
|
|
|
|
extrn NoLanguage Mat00:WORD
|
|
extrn NoLanguage Mat01:WORD
|
|
extrn NoLanguage Mat02:WORD
|
|
extrn NoLanguage Mat10:WORD
|
|
extrn NoLanguage Mat11:WORD
|
|
extrn NoLanguage Mat12:WORD
|
|
extrn NoLanguage Mat20:WORD
|
|
extrn NoLanguage Mat21:WORD
|
|
extrn NoLanguage Mat22:WORD
|
|
|
|
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
|
|
|
|
PosXWr dw 00 ; pos World rotée de l'objet à afficher
|
|
PosYWr dw 00
|
|
PosZWr dw 00
|
|
|
|
ScreenXmin dw 00
|
|
ScreenYmin dw 00
|
|
ScreenXmax dw 00
|
|
ScreenYmax dw 00
|
|
|
|
NbPoints dw 00
|
|
TotalEntite dw 00
|
|
|
|
PointeurListTri dd 00
|
|
StartDI dd 00
|
|
NextDI dd 00
|
|
|
|
ZMax dw 00
|
|
|
|
NbGroupes dw 00
|
|
ListGroupe dd 00
|
|
|
|
Infos dw 00
|
|
StartInfos dd 00
|
|
OffsetDefPoint dd 00
|
|
OffsetListNormal dd 00
|
|
|
|
FlagLight dw 01
|
|
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
|
|
TabJump_2 dd aff_E_LIGNE
|
|
dd aff_E_POLY
|
|
dd aff_E_SPHERE
|
|
|
|
; dd aff_E_POINT
|
|
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
.code
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
|
|
|
|
public NoLanguage AffObjet
|
|
|
|
|
|
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 RotMat:near
|
|
extrn NoLanguage WorldRot:near
|
|
extrn NoLanguage Rot:near
|
|
extrn NoLanguage Proj:near
|
|
extrn NoLanguage RotList:near
|
|
extrn NoLanguage TransRotList:near
|
|
extrn NoLanguage RotListNormal:near
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; █▀▀▀█ █▀▀▀▀ █▀▀▀▀ █▀▀▀█ █▀▀█ █ █▀▀▀▀ ▀▀█▀▀
|
|
; ██▀▀█ ██▀▀ ██▀▀ ██ █ ██▀▀█ ▄▄ █ ██▀▀ ██
|
|
; ▀▀ ▀ ▀▀ ▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
|
|
|
|
AffObjet 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], ax
|
|
mov eax, pbeta
|
|
mov [lBeta], ax
|
|
mov eax, pgamma
|
|
mov [lGamma], ax
|
|
|
|
mov ax, 32767
|
|
mov [ScreenXmin], ax
|
|
mov [ScreenYmin], ax
|
|
neg ax
|
|
mov [ScreenXmax], ax
|
|
mov [ScreenYmax], ax
|
|
|
|
;*--------------------------------------------------------------------------
|
|
;* rotation world org obj
|
|
|
|
mov eax, xwr ; X World rot
|
|
mov ebx, ywr ; Y World
|
|
mov ecx, zwr ; Z World
|
|
|
|
push ebp
|
|
call WorldRot
|
|
pop ebp
|
|
|
|
mov ax, [CameraXr]
|
|
sub ax, [X0]
|
|
mov [PosXWr], ax
|
|
|
|
mov ax, [CameraYr]
|
|
sub ax, [Y0]
|
|
mov [PosYWr], ax
|
|
|
|
mov ax, [CameraZr]
|
|
sub ax, [Z0]
|
|
; iso or ax, ax
|
|
; jle finafobjshort ; objet Z <= 0
|
|
mov [PosZWr], ax
|
|
|
|
;*--------------------------------------------------------------------------
|
|
;* recup infos
|
|
|
|
mov [TotalEntite], 0
|
|
mov [PointeurListTri], offset List_Tri
|
|
|
|
mov esi, ptrobj
|
|
|
|
lodsw ; infos
|
|
mov bx, ax
|
|
mov [Infos], ax
|
|
|
|
add esi, 12 ; saute ZV
|
|
|
|
lodsw ; nb bytes to skip
|
|
movzx eax, ax
|
|
add esi, eax ; saute zone info
|
|
|
|
;*--------------------------------------------------------------------------*
|
|
;* rotation nuage/normal face/normal point
|
|
|
|
test bx, INFO_ANIM
|
|
jz normalrotate
|
|
|
|
call AnimNuage ; Objet Animé
|
|
call ComputeAnimNormal
|
|
jmp short finnuage
|
|
|
|
normalrotate: call RotateNuage ; Objet Normal
|
|
call ComputeStaticNormal
|
|
jmp short finnuage
|
|
|
|
finafobjshort: jmp badfinafobj_2
|
|
|
|
finnuage:
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; █▀▀▀█ █▀▀▀█ █ █ ▄▀ █▀▀▀▀ █▀▀▀█ ██▄ █ █▀▀▀▀ ██▀▀▀
|
|
; ██▀▀▀ ██ █ ██ ██▀ ██ ▀█ ██ █ ██▀██ ██▀▀ ▀▀▀▀█
|
|
; ▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀▀▀▀
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
|
|
mov edi, offset List_Entity
|
|
|
|
lodsw ; nb polys
|
|
movzx ecx, ax
|
|
jecxz short_lignes
|
|
|
|
b_poly: push ecx
|
|
|
|
mov [StartDI], edi ; memo pointeur List_Coor
|
|
|
|
lodsb ; matiere poly
|
|
|
|
cmp al, 9 ; >= MAT_GOURAUD
|
|
jae polygouraud
|
|
|
|
cmp al, 7 ; >= MAT_FLAT
|
|
jae polyflat
|
|
|
|
;-----------------------------------------------------------------------------
|
|
; MAT_TRISTE->MAT_TRAME
|
|
|
|
mov byte ptr[edi], al ; stock type
|
|
|
|
lodsb ; nb point poly
|
|
mov byte ptr[edi+1], al ; stock nbp
|
|
add edi, 2
|
|
xor ah, ah
|
|
mov cx, ax
|
|
|
|
movsw ; stock coul1/coul2
|
|
|
|
mov bp, 32000 ; ZMax
|
|
|
|
push edi ; memo start poly somm
|
|
|
|
EVEN
|
|
p0: lodsw ; index point sur List_Point
|
|
movzx ebx, ax ; index déjà *SIZE_LIST_POINT
|
|
add ebx, offset List_Point
|
|
|
|
xchg ebx, esi
|
|
lodsw
|
|
mov word ptr[edi+2], ax ; Xscr
|
|
|
|
lodsw
|
|
mov word ptr[edi+4], ax ; Yscr dans List_Coor
|
|
add edi, 6
|
|
|
|
lodsw ; Zrot
|
|
; iso or ax, ax
|
|
; js skippoly ; <0 ?
|
|
|
|
cmp ax, bp ; ZMin
|
|
jge nozmax
|
|
mov bp, ax
|
|
nozmax:
|
|
mov esi, ebx
|
|
dec ecx
|
|
jnz p0
|
|
|
|
jmp testpoly
|
|
|
|
short_lignes: jmp lignes
|
|
|
|
;-----------------------------------------------------------------------------
|
|
; MAT_GOURAUD
|
|
|
|
|
|
polygouraud: ;cmp [FlagLight], 0
|
|
;jz nolight2
|
|
|
|
dec al
|
|
dec al ; attention voir reanim
|
|
mov byte ptr[edi], al ; stock type translated
|
|
|
|
lodsb ; nb point poly
|
|
mov byte ptr[edi+1], al ; stock nbp
|
|
xor ah, ah
|
|
movzx ecx, ax
|
|
|
|
lodsw
|
|
mov word ptr[edi+2], ax ; stock coul1/coul2
|
|
add edi, 4
|
|
mov dx, ax
|
|
|
|
mov bp, -32000 ; ZMax
|
|
|
|
push edi ; memo start poly somm
|
|
|
|
EVEN
|
|
p0g:
|
|
lodsw ; normal point
|
|
movzx eax, ax
|
|
mov ax, word ptr[List_Normal + eax * 2]
|
|
add al, dl
|
|
mov word ptr[edi+0], ax ; stock intensity point
|
|
|
|
lodsw ; index point sur List_Point
|
|
movzx ebx, ax ; index déjà *SIZE_LIST_POINT
|
|
add ebx, offset List_Point
|
|
|
|
xchg ebx, esi
|
|
lodsw
|
|
mov word ptr[edi+2], ax ; Xscr
|
|
lodsw
|
|
mov word ptr[edi+4], ax ; Yscr dans List_Coor
|
|
add edi, 6
|
|
|
|
lodsw ; Zrot
|
|
|
|
; voir pour "depthcueing" vers sombre
|
|
|
|
; iso or ax, ax
|
|
; js skippolyg
|
|
|
|
cmp ax, bp ; ZMin
|
|
jle nozmaxg
|
|
mov bp, ax
|
|
nozmaxg:
|
|
mov esi, ebx
|
|
dec ecx
|
|
jnz p0g
|
|
|
|
jmp testpoly
|
|
|
|
;-----------------------------------------------------------------------------
|
|
; gouraud --> MAT_TRISTE->MAT_TRAME
|
|
|
|
|
|
nolight2: xor al,al
|
|
mov byte ptr[edi], al ; stock type
|
|
|
|
lodsb ; nb point poly
|
|
mov byte ptr[edi+1], al ; stock nbp
|
|
add edi, 2
|
|
xor ah, ah
|
|
mov cx, ax
|
|
|
|
movsw ; stock coul1/coul2
|
|
|
|
mov bp, 32000 ; ZMax
|
|
|
|
push edi ; memo start poly somm
|
|
|
|
EVEN
|
|
p0l: lodsw ; 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
|
|
lodsw
|
|
mov word ptr[edi+2], ax ; Xscr
|
|
|
|
lodsw
|
|
mov word ptr[edi+4], ax ; 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 ecx
|
|
jnz p0l
|
|
|
|
jmp testpoly
|
|
|
|
;-----------------------------------------------------------------------------
|
|
; MAT_FLAT
|
|
polyflat: sub al, 7
|
|
mov byte ptr[edi], al ; stock mat translaté
|
|
|
|
lodsb ; nb point poly
|
|
mov byte ptr[edi+1], al ; stock nbp
|
|
xor ah, ah
|
|
movzx ecx, ax
|
|
|
|
lodsw
|
|
mov bp, ax ; coul1/coul2
|
|
|
|
; 1st coul = normal face
|
|
lodsw
|
|
movzx eax, ax
|
|
add bp, word ptr[ List_Normal + eax*2 ]
|
|
mov ax, bp
|
|
mov word ptr[edi+2], ax ; stock coul + intensity
|
|
add edi, 4
|
|
|
|
push edi ; memo start poly somm
|
|
|
|
mov bp, -32000 ; ZMax
|
|
|
|
EVEN
|
|
p0f: lodsw ; index point sur List_Point
|
|
movzx ebx, ax ; index déjà *SIZE_LIST_POINT
|
|
add ebx, offset List_Point
|
|
|
|
xchg ebx, esi
|
|
lodsw
|
|
mov word ptr[edi+2], ax ; Xscr
|
|
|
|
lodsw
|
|
mov word ptr[edi+4], ax ; Yscr dans List_Coor
|
|
add edi, 6
|
|
|
|
lodsw ; Zrot
|
|
; iso or ax, ax
|
|
; js skippoly
|
|
|
|
cmp ax, bp ; ZMin
|
|
jle nozmaxf
|
|
mov bp, ax
|
|
nozmaxf:
|
|
mov esi, ebx
|
|
dec ecx
|
|
jnz p0f
|
|
|
|
jmp testpoly
|
|
|
|
skippoly: mov esi, ebx
|
|
dec ecx
|
|
shl ecx, 1
|
|
add esi, ecx ; skip points restant
|
|
pop edi
|
|
jmp badpoly
|
|
|
|
skippolyg: mov esi, ebx
|
|
dec ecx
|
|
shl ecx, 2
|
|
add esi, ecx ; skip points restant
|
|
pop edi
|
|
jmp short badpoly
|
|
|
|
;-----------------------------------------------------------------------------
|
|
testpoly: mov [NextDI], edi ; memo pointeur List_Coor
|
|
|
|
pop edi ; pointeur list sommets
|
|
|
|
mov [ZMax], bp
|
|
|
|
mov bx, [edi+8]
|
|
sub bx, [edi+2]
|
|
mov ax, [edi+4]
|
|
sub ax, [edi+16]
|
|
imul bx
|
|
mov bp,ax
|
|
mov bx,dx
|
|
mov cx, [edi+10]
|
|
sub cx, [edi+4]
|
|
mov ax, [edi+2]
|
|
sub ax, [edi+14]
|
|
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 ax, E_POLY
|
|
mov word ptr[edi+2], ax
|
|
mov eax, [StartDI]
|
|
mov dword ptr[edi+4], eax
|
|
add edi, 8
|
|
mov [PointeurListTri], edi
|
|
|
|
;-----------------------------------------------------------------------------
|
|
|
|
mov edi, [NextDI]
|
|
nextpoly: pop ecx
|
|
dec ecx
|
|
jz lignes
|
|
jmp b_poly
|
|
|
|
badpoly: mov edi, [StartDI]
|
|
jmp nextpoly
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; █ █ █▀▀▀▀ ██▄ █ █▀▀▀▀ ██▀▀▀
|
|
; ██ ██ ██ ▀█ ██▀██ ██▀▀ ▀▀▀▀█
|
|
; ▀▀▀▀▀ ▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀▀▀▀
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
|
|
lignes: lodsw ; nb lignes
|
|
movzx ecx, ax
|
|
jecxz spheres
|
|
|
|
b_line: mov [StartDI], edi ; memo pointeur List_Coor
|
|
|
|
movsd ; stock matiere/coul
|
|
; coul2 / even
|
|
|
|
lodsw ; index point 1 sur List_Point
|
|
movzx ebx, ax ; index déjà *SIZE_LIST_POINT
|
|
add ebx, offset List_Point
|
|
|
|
mov eax, [ebx+00]
|
|
mov dword ptr[edi], eax ; X1scr vers List_Coor
|
|
; Y1scr
|
|
mov dx, [ebx+04] ; Zrot ZMin/Max
|
|
|
|
lodsw ; index point 2 sur List_Point
|
|
movzx ebx, ax ; index déjà *SIZE_LIST_POINT
|
|
add ebx, offset List_Point
|
|
|
|
mov eax, [ebx+00]
|
|
mov dword ptr[edi+4], eax ; X2scr vers List_Coor
|
|
add edi, 8
|
|
; Y2scr
|
|
mov bp, [ebx+04] ; Zrot ZMin/Max
|
|
|
|
mov [NextDI], edi
|
|
|
|
cmp dx, bp ; ZMin ZMax
|
|
jl zok0
|
|
xchg dx, bp ; DX < BP
|
|
zok0:
|
|
; iso or dx, dx ; ZMin
|
|
; jle badline
|
|
|
|
okline: inc [TotalEntite]
|
|
mov edi, [PointeurListTri]
|
|
mov ax, bp
|
|
mov word ptr[edi], ax
|
|
mov ax, E_LIGNE
|
|
mov word ptr[edi+2], ax
|
|
mov eax, [StartDI]
|
|
mov dword ptr[edi+4], eax
|
|
add edi, 8
|
|
mov [PointeurListTri], edi
|
|
|
|
mov edi, [NextDI]
|
|
dec ecx
|
|
jnz b_line
|
|
jmp short spheres
|
|
|
|
badline: mov edi, [StartDI]
|
|
loope b_line
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; ██▀▀▀ █▀▀▀█ █ █ █▀▀▀▀ █▀▀▀█ █▀▀▀▀ ██▀▀▀
|
|
; ▀▀▀▀█ ██▀▀▀ ██▀▀█ ██▀▀ ██▀█▀ ██▀▀ ▀▀▀▀█
|
|
; ▀▀▀▀▀ ▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀▀▀▀
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
|
|
spheres: lodsw ; nb spheres
|
|
movzx ecx, ax
|
|
jecxz tri
|
|
|
|
b_sphere: mov [StartDI], edi ; memo pointeur List_Coor
|
|
movsd ; stock matiere/coul
|
|
; coul2 / even
|
|
movsw ; rayon
|
|
lodsw ; index point 1 sur List_Point
|
|
movzx ebx, ax ; index déjà *SIZE_LIST_POINT
|
|
add ebx, offset List_Point
|
|
|
|
mov eax, [ebx+00] ; X1scr vers List_Coor
|
|
mov dword ptr[edi], eax ; Y1scr
|
|
mov ax, [ebx+04] ; Zrot ZMin/Max
|
|
mov word ptr[edi+4], ax
|
|
add edi, 6
|
|
|
|
mov [NextDI], edi
|
|
|
|
; iso or ax, ax ; ZMin
|
|
; jle badsphere
|
|
|
|
oksphere: inc [TotalEntite]
|
|
mov edi, [PointeurListTri]
|
|
mov word ptr[edi], ax
|
|
mov ax, E_SPHERE
|
|
mov word ptr[edi+2], ax
|
|
mov eax, [StartDI]
|
|
mov dword ptr[edi+4], eax
|
|
add edi, 8
|
|
mov [PointeurListTri], edi
|
|
|
|
mov edi, [NextDI]
|
|
dec ecx
|
|
jnz b_sphere
|
|
jmp short tri
|
|
|
|
badsphere: mov edi, [StartDI]
|
|
dec ecx
|
|
jnz b_sphere
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; ▀▀█▀▀ █▀▀▀█ █ █▀▀▀▀ ██▄ █ ▀▀█▀▀ █ ▀▀█▀▀ █ ▄▀
|
|
; ██ ██▀█▀ ██ ██▀▀ ██▀██ ██ ██ ██ ██▀
|
|
; ▀▀ ▀▀ ▀ ▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀ ▀▀ ▀▀ ▀▀
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; tri les faces dans la table Listtri (ordre Z et offset sur list coors
|
|
; premachees.
|
|
|
|
tri: movzx ecx, word ptr[TotalEntite]
|
|
dec ecx
|
|
jz fintri
|
|
|
|
mov esi, offset List_Tri
|
|
lea ebp, List_Tri + ecx*8
|
|
|
|
SergeSort:: ; esi bas
|
|
; ebp haut
|
|
; ecx 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: ; ecx nb entite - 1
|
|
; esi start list sizeof 8 byte
|
|
|
|
tt0: mov ebp, ecx
|
|
mov eax, [esi] ; lit Z
|
|
|
|
mov edi, esi
|
|
add edi, 8
|
|
xor ebx, ebx
|
|
|
|
tt1: cmp [edi], ax
|
|
jg plusgrand
|
|
cont: add edi, 8
|
|
dec ecx
|
|
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
|
|
mov ecx, ebp
|
|
dec ecx
|
|
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 ecx, 1 ; select permut2 ?
|
|
je short permut2
|
|
|
|
cmp ecx, 7 ; select permut ou qsort
|
|
jbe short permut
|
|
|
|
mov edi, esi ; pospivot = bas
|
|
|
|
mov eax, [edi] ; 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 ecx
|
|
jnz w1
|
|
|
|
jmp short w4
|
|
|
|
w2: cmp word ptr[ebx], ax
|
|
jg short w3
|
|
sub ebx, 8 ; si [h] <= pivot
|
|
dec ecx
|
|
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
|
|
|
|
movzx ecx, [TotalEntite]
|
|
jcxz badfinafobj_1
|
|
|
|
ade0: push ecx
|
|
inc esi
|
|
inc esi ; saute Z max
|
|
|
|
lodsw ; type entité
|
|
movzx ebx, ax
|
|
lodsd ; offset List_Coor
|
|
push esi
|
|
mov esi, eax
|
|
|
|
jmp [ TabJump_2 + ebx*4 ] ; jmp à aff de l'entité
|
|
|
|
nextaff: pop esi
|
|
pop ecx
|
|
dec ecx
|
|
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
|
|
|
|
badfinafobj_2: mov ax, -1
|
|
mov [ScreenXmax], ax
|
|
mov [ScreenYmax], ax
|
|
mov [ScreenXmin], ax
|
|
mov [ScreenYmin], ax
|
|
|
|
mov eax, 2 ; 2 si objet clippé en Z <= 0
|
|
ret
|
|
|
|
AffObjet endp
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; █▀▀▀▀ ██▄ █ ▀▀█▀▀ █ ▀▀█▀▀ █ ▄▀
|
|
; ██▀▀ ██▀██ ██ ██ ██ ██▀
|
|
; ▀▀▀▀▀ ▀▀ ▀ ▀▀ ▀▀ ▀▀ ▀▀
|
|
;
|
|
; █▀▀▀▄ █ ██▀▀▀ █▀▀▀█ █ █▀▀▀█ █ ▄▀
|
|
; ██ █ ██ ▀▀▀▀█ ██▀▀▀ ██ ██▀▀█ ██▀
|
|
; ▀▀▀▀ ▀▀ ▀▀▀▀▀ ▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
aff_E_POLY::
|
|
lodsb ; type (ATTENTION GOURAUD)
|
|
xor ah, ah
|
|
mov bx, ax
|
|
mov [TypePoly], ax
|
|
|
|
lodsb ; nb points
|
|
movzx ecx, ax
|
|
mov [NbPolyPoints], ax
|
|
|
|
lodsw ; coul1/coul2
|
|
mov dx, ax
|
|
|
|
mov edi, ecx
|
|
shl ecx, 1
|
|
add ecx, edi ; *3 word
|
|
mov edi, offset TabPoly
|
|
rep movsw ; à changer
|
|
|
|
mov si, bx ; type
|
|
mov di, dx ; coul
|
|
|
|
call ComputePoly
|
|
or ax, ax
|
|
jz no_poly
|
|
|
|
mov cx, si ; type
|
|
call FillVertic_A
|
|
|
|
no_poly: jmp nextaff
|
|
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
aff_E_LIGNE::
|
|
lodsw
|
|
xchg al, ah
|
|
mov bp, ax
|
|
inc esi
|
|
inc esi
|
|
|
|
lodsw ; x0
|
|
movsx edx, ax
|
|
lodsw ; y0
|
|
movsx ebx, ax
|
|
lodsw ; x1
|
|
movsx ecx, ax
|
|
lodsw ; y1
|
|
movsx eax, ax
|
|
xchg eax, edx
|
|
|
|
call Line_A
|
|
|
|
jmp nextaff
|
|
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
aff_E_SPHERE::
|
|
xor eax, eax
|
|
lodsb ; type
|
|
push eax ; mov [TypePoly], ax
|
|
|
|
lodsw ; coul1/coul2
|
|
push eax
|
|
|
|
inc esi ; even
|
|
|
|
lodsw ; rayon
|
|
movzx ebp, ax
|
|
lodsw ; x
|
|
movzx ecx, ax
|
|
lodsw ; y
|
|
movzx edi, ax
|
|
lodsw ; Zr
|
|
|
|
; iso xchg eax, ebp
|
|
; imul word ptr[LFactorX]
|
|
; add bp, [KFactor]
|
|
; idiv bp
|
|
; movzx ebp, ax pfeu
|
|
|
|
mov ax, 34 ; racine sx²+sy²
|
|
imul bp
|
|
idiv word ptr[IsoScale]
|
|
movzx ebp, ax
|
|
|
|
; ecx x
|
|
; edi y -> esi pour computesphere
|
|
; ebp rayon sur ecran
|
|
|
|
; reajuste coordonnée box
|
|
|
|
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
|
|
|
|
pop edi ; coul
|
|
pop ecx ; type
|
|
|
|
or eax, eax
|
|
jz no_sphere
|
|
|
|
call FillVertic_A
|
|
|
|
no_sphere: jmp nextaff
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; sous programmes
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; █▀▀▀█ ██▄ █ █ █▄ ▄█ █▀▀▀█ █▀▀▀█ ▀▀█▀▀
|
|
; ██▀▀█ ██▀██ ██ ██▀ █ ██▀█▀ ██ █ ██
|
|
; ▀▀ ▀ ▀▀ ▀ ▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
|
|
RotateGroupe proc near
|
|
|
|
mov [lAlpha], bx
|
|
mov [lBeta], cx
|
|
mov [lGamma], dx
|
|
|
|
push esi ; save group en cours
|
|
|
|
|
|
movzx ebx, word ptr[esi+6] ; orggroupe deja * 38
|
|
cmp bx, -1
|
|
jnz pasgroupe0
|
|
|
|
mov esi, offset MatriceWorld
|
|
mov edi, offset MatriceTempo
|
|
mov ecx, 4
|
|
rep movsd
|
|
movsw
|
|
|
|
mov dword ptr[X0], ecx ; XYZ0 ChgRepere
|
|
mov [Z0], cx
|
|
|
|
jmp short groupe0
|
|
|
|
pasgroupe0:
|
|
|
|
|
|
movzx eax, word ptr[esi+04] ; Org Point index deja *6
|
|
lea edi, List_Anim_Point + eax ; di sur List_Anim_Point + Org
|
|
mov eax, dword ptr[edi] ; X0 et Y0
|
|
mov dword ptr[X0], eax
|
|
mov ax, [edi+4] ; Z0
|
|
mov [Z0], ax ; XYZ0 ChgRepere
|
|
|
|
add ebx, 20
|
|
mov esi, [ListGroupe]
|
|
add esi, ebx ; Matrice du groupe org
|
|
mov edi, offset MatriceTempo
|
|
mov ecx, 4
|
|
rep movsd
|
|
movsw ; copy Mgroup org vers Mtempo
|
|
|
|
groupe0: call RotMat ; rot de Mtempo vers Mrot
|
|
|
|
pop edi ;
|
|
add edi, 20 ; Mgroup en cours
|
|
mov esi, offset MatriceRot
|
|
mov ecx, 4
|
|
rep movsd ; copy de Mrot vers Mgroup
|
|
movsw
|
|
mov esi, edi
|
|
sub esi, 38 ; group en cours
|
|
|
|
movzx eax, word ptr[esi+0] ; Start point deja *6
|
|
movzx ecx, word ptr[esi+2] ; nb points
|
|
|
|
mov esi, [OffsetDefPoint]
|
|
add esi, eax ; si sur Def_Point + Start
|
|
|
|
lea edi, List_Anim_Point + eax ; di sur List_Point + Start
|
|
|
|
call RotList
|
|
|
|
ret
|
|
|
|
RotateGroupe endp
|
|
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
|
|
TranslateGroupe proc near
|
|
|
|
mov [lAlpha], bx ; attention !
|
|
mov [lBeta], cx ; ici step de translation
|
|
mov [lGamma], dx
|
|
|
|
mov edi, esi ; save group en cours
|
|
|
|
movzx ebx, word ptr[esi+6] ; orggroupe deja * 38
|
|
cmp bx, -1
|
|
jnz pasgroupe0
|
|
|
|
add edi, 20 ; Mgroup en cours
|
|
mov esi, offset MatriceWorld
|
|
mov ecx, 4
|
|
rep movsd
|
|
movsw
|
|
|
|
mov dword ptr[X0], ecx
|
|
mov [Z0], cx ; ChgRepere
|
|
|
|
jmp short groupe0
|
|
|
|
pasgroupe0:
|
|
|
|
movzx ecx, word ptr[esi+4] ; Org Point index deja *6
|
|
mov eax, dword ptr[List_Anim_Point + ecx ] ; X0 et Y0
|
|
mov dword ptr[X0], eax
|
|
mov ax, word ptr[List_Anim_Point + ecx + 4 ]; Z0
|
|
mov [Z0], ax ; ChgRepere
|
|
|
|
mov esi, [ListGroupe]
|
|
add ebx, 20
|
|
add esi, ebx ; Mgroup org
|
|
add edi, 20 ; Mgroup en cours
|
|
mov ecx, 4
|
|
rep movsd ; copy de Mgroup org vers Mgroup
|
|
movsw
|
|
|
|
groupe0: mov esi, edi
|
|
sub esi, 38 ; group en cours
|
|
|
|
movzx eax, word ptr[esi+0] ; Start point deja *6
|
|
mov dx, [esi+2] ; nb points
|
|
|
|
mov edi, offset MatriceRot
|
|
add esi, 20
|
|
mov ecx, 4
|
|
rep movsd ; Mgroup vers Mrot
|
|
movsw
|
|
|
|
mov esi, [OffsetDefPoint]
|
|
add esi, eax ; si sur List_Point + Start
|
|
|
|
lea edi, List_Anim_Point + eax
|
|
|
|
movzx ecx, dx
|
|
call TransRotList
|
|
|
|
ret
|
|
|
|
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
|
|
|
|
lodsw ; nb points
|
|
movsx eax, ax
|
|
mov [NbPoints], ax
|
|
|
|
mov [OffsetDefPoint], esi
|
|
mov ecx, eax
|
|
shl ecx, 1 ; *2
|
|
add ecx, eax ; *3
|
|
shl ecx, 1 ; *6
|
|
add esi, ecx ; esi saute defpoint
|
|
|
|
lodsw ; Nb groupes anims
|
|
mov [NbGroupes], ax
|
|
movzx ecx, ax
|
|
|
|
mov [ListGroupe], esi ; memo start list groupe
|
|
|
|
;*--------------------------------------------------------------------------*/
|
|
; rotations du groupe 0
|
|
|
|
mov bx, [lAlpha] ; SI sur groupe 0
|
|
mov cx, [lBeta] ; init aux valeurs de rot locale
|
|
mov dx, [lGamma]
|
|
|
|
push esi
|
|
call RotateGroupe
|
|
pop esi
|
|
add esi, 38 ; size d'un groupe
|
|
|
|
;*--------------------------------------------------------------------------*/
|
|
; rotations/translations/zooms des groupes
|
|
|
|
movzx ecx, [NbGroupes]
|
|
dec ecx ; - groupe 0
|
|
jcxz ag0f
|
|
|
|
ag0: push ecx
|
|
push esi
|
|
|
|
mov bx, [esi+10] ; Alpha ou stepX
|
|
mov cx, [esi+12] ; Beta ou stepY
|
|
mov dx, [esi+14] ; Gamma ou stepZ
|
|
|
|
mov ax, [esi+8] ; type anim groupe
|
|
|
|
cmp ax, TYPE_ROTATE
|
|
jz rotateg
|
|
cmp ax, TYPE_TRANSLATE
|
|
jz translateg
|
|
cmp ax, TYPE_ZOOM
|
|
jnz nolocalrot
|
|
|
|
zoomg: ;call ZoomGroupe
|
|
jmp short nolocalrot
|
|
|
|
translateg: call TranslateGroupe
|
|
jmp short nolocalrot
|
|
|
|
rotateg: call RotateGroupe
|
|
|
|
nolocalrot: pop esi
|
|
add esi, 38 ; size d'un groupe
|
|
pop ecx
|
|
dec ecx
|
|
jnz ag0
|
|
|
|
ag0f:
|
|
;*--------------------------------------------------------------------------*/
|
|
; projette liste
|
|
|
|
push esi
|
|
|
|
project: movzx ecx, [NbPoints]
|
|
|
|
mov esi, offset List_Anim_Point
|
|
mov edi, offset List_Point
|
|
|
|
boucleproj: push ecx
|
|
|
|
lodsw ; eax X rot
|
|
sub ax, [PosXWr]
|
|
movsx ecx, ax
|
|
|
|
lodsw ; ebx Y rot
|
|
sub ax, [PosYWr]
|
|
movsx ebx, ax
|
|
|
|
lodsw ; ecx Z rot
|
|
movsx eax, ax ; ou cwde ?
|
|
xchg eax, ecx
|
|
movsx ebp, [PosZWr]
|
|
sub ebp, ecx ; bp = Zrot tri
|
|
|
|
;--------------------------------------------
|
|
; cmp word ptr[TypeProj], PROJ_ISO
|
|
; jz projiso
|
|
|
|
; iso js nopoint ; si Z0 < 0 clip
|
|
; cmp ax, cx ; si X0 > Z0 clip
|
|
; jg nopoint
|
|
; cmp bx, cx ; si Y0 > Z0 clip
|
|
; jg nopoint
|
|
|
|
; neg cx
|
|
; cmp ax, cx
|
|
; jl nopoint
|
|
; cmp bx, cx
|
|
; jl nopoint
|
|
; neg cx
|
|
|
|
|
|
projiso: mov ecx, eax ; save x
|
|
|
|
add eax, ebp ; x + zrot
|
|
|
|
sal eax, 3 ; *8
|
|
mov edx, eax
|
|
sal eax, 1 ; *16
|
|
add eax, edx ; *24
|
|
|
|
mov edx, eax
|
|
sar edx, 16 ;
|
|
idiv word ptr[IsoScale] ; (x+zrot)/IsoScale
|
|
|
|
add ax, [XCentre]
|
|
mov word ptr[edi], ax
|
|
add edi, 2 ; stock Xp
|
|
|
|
cmp ax, [ScreenXmin]
|
|
jl sxmin
|
|
nosxmin: cmp ax, [ScreenXmax]
|
|
jg sxmax
|
|
nosxmax:
|
|
mov eax, ecx ; restore x
|
|
sub eax, ebp ; x - zrot
|
|
sub ebp, ecx ; Zrot - X pour bon tri
|
|
|
|
sal eax, 2 ; *4
|
|
mov edx, eax
|
|
sal eax, 1 ; *8
|
|
add eax, edx ; *12
|
|
|
|
mov ecx, eax ; ecx = (x-zrot) * 12
|
|
|
|
sal ebx, 1 ; *2
|
|
mov eax, ebx ; = 2
|
|
sal eax, 4 ; *32
|
|
sub eax, ebx
|
|
|
|
sub eax, ecx ; - (x-zrot) * 12
|
|
|
|
mov edx, eax
|
|
sar edx, 16
|
|
idiv word ptr[IsoScale]
|
|
|
|
neg ax
|
|
add ax, [YCentre]
|
|
mov word ptr[edi], ax
|
|
add edi, 2 ; stock Yp
|
|
|
|
cmp ax, [ScreenYmin]
|
|
jl symin
|
|
nosymin: cmp ax, [ScreenYmax]
|
|
jg symax
|
|
nosymax:
|
|
|
|
mov ax, bp
|
|
mov word ptr[edi], ax
|
|
add edi, 2 ; stock Zrot pour tri
|
|
|
|
;--------------------------------------------
|
|
|
|
pl0: pop ecx
|
|
dec ecx
|
|
jnz boucleproj
|
|
|
|
pop esi
|
|
|
|
;*--------------------------------------------------------------------------*
|
|
|
|
finanim: mov eax, -1
|
|
ret
|
|
|
|
sxmin: mov [ScreenXmin], ax
|
|
jmp nosxmin
|
|
sxmax: mov [ScreenXmax],ax
|
|
jmp nosxmax
|
|
symin: mov [ScreenYmin], ax
|
|
jmp nosymin
|
|
symax: mov [ScreenYmax],ax
|
|
jmp nosymax
|
|
|
|
nopoint: xor eax, eax
|
|
mov word ptr[edi], ax
|
|
mov word ptr[edi+2], ax
|
|
mov ax, -1
|
|
mov word ptr[edi+6], ax
|
|
add edi, 8
|
|
jmp pl0
|
|
|
|
AnimNuage endp
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; █▀▀▀█ █▀▀▀█ ▀▀█▀▀ █▀▀▀█ ▀▀█▀▀ █▀▀▀▀ ██▄ █ █ █ █▀▀▀█ █▀▀▀▀ █▀▀▀▀
|
|
; ██▀█▀ ██ █ ██ ██▀▀█ ██ ██▀▀ ██▀██ ██ █ ██▀▀█ ██ ▀█ ██▀▀
|
|
; ▀▀ ▀ ▀▀▀▀▀ ▀▀ ▀▀ ▀ ▀▀ ▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀▀▀▀
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
;*──────────────────────────────────────────────────────────────────────────*
|
|
|
|
RotateNuage proc near
|
|
|
|
push esi
|
|
|
|
call RotMatW ; Rotate MWorld vers Mrot
|
|
|
|
pop esi
|
|
|
|
; rotationS nuage de points
|
|
|
|
lodsw ; nbobj points
|
|
mov [NbPoints], ax
|
|
movzx ecx, ax
|
|
|
|
mov edi,offset List_Point
|
|
|
|
bouclerot: push ecx
|
|
push edi
|
|
|
|
; rotation totale de l'objet
|
|
|
|
lodsw
|
|
mov cx, ax ; AX X reel
|
|
lodsw
|
|
mov bx, ax ; BX Y reel
|
|
lodsw
|
|
xchg ax, cx ; CX Z reel
|
|
|
|
call Rot ; voir pour Coor rotées
|
|
; en LONG * 2^15
|
|
pop edi
|
|
|
|
; change repere (pos camera reelle & pos objet reelle)
|
|
|
|
mov ax, [X0]
|
|
sub ax, [PosXWr]
|
|
|
|
mov bx, [Y0]
|
|
sub bx, [PosYWr]
|
|
|
|
mov cx, [PosZWr]
|
|
sub cx, [Z0]
|
|
mov bp, cx
|
|
|
|
js nopoint ; si Z0 < 0 clip
|
|
cmp ax, cx ; si X0 > Z0 clip
|
|
jg nopoint
|
|
cmp bx, cx ; si Y0 > Z0 clip
|
|
jg nopoint
|
|
neg cx
|
|
cmp ax, cx
|
|
jl nopoint
|
|
cmp bx, cx
|
|
jl nopoint
|
|
neg cx
|
|
|
|
; projection point
|
|
|
|
call Proj
|
|
|
|
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 ax,bx
|
|
mov word ptr[edi+2], ax ; stock Yp
|
|
|
|
cmp ax,[ScreenYmin]
|
|
jge nosymin
|
|
mov [ScreenYmin],ax
|
|
nosymin: cmp ax,[ScreenYmax]
|
|
jle nosymax
|
|
mov [ScreenYmax],ax
|
|
nosymax:
|
|
mov ax,cx
|
|
mov word ptr[edi+4], ax ; stock Zrot
|
|
add edi, 6
|
|
|
|
rn0: pop ecx
|
|
dec ecx
|
|
jnz bouclerot
|
|
|
|
ret
|
|
|
|
nopoint: xor ax, ax
|
|
mov word ptr[edi], ax
|
|
mov word ptr[edi+2], ax
|
|
mov ax, -1
|
|
mov word ptr[edi+4], ax
|
|
add edi, 6
|
|
jmp rn0
|
|
|
|
RotateNuage endp
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*
|
|
; ██▄ █ █▀▀▀█ █▀▀▀█ █▄ ▄█ █▀▀▀█ █ ██▀▀▀
|
|
; ██▀██ ██ █ ██▀█▀ ██▀ █ ██▀▀█ ██ ▀▀▀▀█
|
|
; ▀▀ ▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀ ▀ ▀▀ ▀ ▀▀▀▀▀ ▀▀▀▀▀
|
|
;*══════════════════════════════════════════════════════════════════════════*/
|
|
;*──────────────────────────────────────────────────────────────────────────*/
|
|
|
|
ComputeStaticNormal proc near
|
|
|
|
lodsw ; nbobj normal faces/points
|
|
mov cx, ax
|
|
jcxz nonp
|
|
|
|
mov edi, offset List_Normal
|
|
|
|
bouclerot: push ecx
|
|
push edi
|
|
|
|
lodsw
|
|
mov dx, ax ; AX X
|
|
lodsw
|
|
mov bx, ax ; BX Y
|
|
lodsw
|
|
mov cx, ax ; CX Z
|
|
lodsw
|
|
xchg dx, ax ; DX prenormalized range
|
|
|
|
call Rot ; DX inchangé
|
|
|
|
pop edi
|
|
|
|
mov bp, dx
|
|
|
|
mov ax, [X0]
|
|
|
|
imul word ptr[NormalXLight]
|
|
mov cx, ax
|
|
mov bx, dx
|
|
|
|
mov ax, [Y0]
|
|
imul word ptr[NormalYLight]
|
|
add cx, ax
|
|
adc bx, dx
|
|
|
|
mov ax, [Z0]
|
|
imul word ptr[NormalZLight]
|
|
add cx, ax
|
|
adc bx, dx
|
|
|
|
mov ax, cx
|
|
mov dx, bx ; intensity
|
|
|
|
or dx,dx
|
|
js nointensity ; saut si negatif
|
|
|
|
idiv bp
|
|
mov word ptr[edi], ax
|
|
add edi, 2 ; stock intensity
|
|
|
|
pop ecx
|
|
dec ecx
|
|
jnz bouclerot
|
|
|
|
nonp: ret
|
|
|
|
nointensity: xor ax, ax
|
|
mov word ptr[edi], ax
|
|
add edi, 2
|
|
pop ecx
|
|
dec ecx
|
|
jnz bouclerot
|
|
|
|
ret
|
|
|
|
ComputeStaticNormal endp
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*/
|
|
;*──────────────────────────────────────────────────────────────────────────*/
|
|
|
|
nextgroup2: pop ebx
|
|
add ebx, 38
|
|
pop ecx
|
|
dec ecx
|
|
jnz bouclegroup
|
|
jmp nonp
|
|
|
|
ComputeAnimNormal proc near
|
|
|
|
lodsw ; nbobj normal faces/points
|
|
or ax, ax
|
|
jz nonp
|
|
|
|
mov edi,offset List_Normal
|
|
|
|
movzx ecx, [NbGroupes]
|
|
|
|
mov ebx, [ListGroupe]
|
|
add ebx, 18 ; sur NbNormal
|
|
|
|
bouclegroup: push ecx
|
|
push ebx
|
|
|
|
mov cx, [ebx]
|
|
jcxz nextgroup2
|
|
|
|
; copy Mgroup vers Mrot
|
|
|
|
mov edx, esi
|
|
mov ebp, edi
|
|
mov esi, ebx
|
|
inc esi
|
|
inc esi ; sur Mgroup
|
|
|
|
mov edi, offset MatriceRot
|
|
mov ecx, 4
|
|
rep movsd
|
|
movsw
|
|
mov edi, ebp
|
|
mov esi, edx
|
|
|
|
movzx ecx, word ptr[ebx]
|
|
|
|
; cmp [FlagLight], 0
|
|
; jz nolight1
|
|
|
|
; call RotListNormal
|
|
|
|
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
|
mov [compteur], cx
|
|
|
|
bouclerot: ;push ecx
|
|
push edi
|
|
|
|
movsx ebp, word ptr[esi+0]
|
|
movsx ebx, word ptr[esi+2]
|
|
movsx ecx, word ptr[esi+4]
|
|
add esi, 6
|
|
|
|
movsx eax, word ptr[ Mat00 ]
|
|
imul eax, ebp
|
|
mov edx, eax
|
|
movsx eax, word ptr[ Mat01 ]
|
|
imul eax, ebx
|
|
add edx, eax
|
|
movsx eax, word ptr[ Mat02 ]
|
|
imul eax, ecx
|
|
add eax, edx
|
|
sar eax, 15
|
|
|
|
movsx edx, word ptr[NormalXLight]
|
|
imul eax, edx
|
|
mov edi, eax
|
|
|
|
movsx eax, word ptr[ Mat10 ]
|
|
imul eax, ebp
|
|
mov edx, eax
|
|
movsx eax, word ptr[ Mat11 ]
|
|
imul eax, ebx
|
|
add edx, eax
|
|
movsx eax, word ptr[ Mat12 ]
|
|
imul eax, ecx
|
|
add eax, edx
|
|
sar eax, 15
|
|
|
|
movsx edx, word ptr[NormalYLight]
|
|
imul eax, edx
|
|
add edi, eax
|
|
|
|
movsx eax, word ptr[ Mat20 ]
|
|
imul eax, ebp
|
|
mov edx, eax
|
|
movsx eax, word ptr[ Mat21 ]
|
|
imul eax, ebx
|
|
add edx, eax
|
|
movsx eax, word ptr[ Mat22 ]
|
|
imul eax, ecx
|
|
add eax, edx
|
|
sar eax, 15
|
|
|
|
movsx edx, word ptr[NormalZLight]
|
|
imul eax, edx
|
|
add edi, eax
|
|
|
|
or edi, edi
|
|
js nointensity ; saut si negatif
|
|
|
|
lodsw ; prenormalized range
|
|
xchg di, ax
|
|
cwd
|
|
idiv di
|
|
|
|
pop edi
|
|
mov word ptr[edi], ax
|
|
add edi, 2 ; stock intensity
|
|
|
|
; pop ecx
|
|
; dec ecx
|
|
dec word ptr[compteur]
|
|
jnz bouclerot
|
|
|
|
jmp nextgroup
|
|
|
|
nointensity: lodsw
|
|
xor ax, ax
|
|
pop edi
|
|
mov word ptr[edi], ax
|
|
add edi, 2
|
|
|
|
; pop ecx
|
|
; dec ecx
|
|
dec word ptr[compteur]
|
|
jnz bouclerot
|
|
|
|
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
|
|
|
nextgroup: pop ebx
|
|
add ebx, 38
|
|
|
|
pop ecx
|
|
dec ecx
|
|
jnz bouclegroup
|
|
; dec ecx
|
|
jnz bouclegroup
|
|
|
|
nonp: ret
|
|
|
|
nolight1: mov ebx, ecx
|
|
xor ax, ax
|
|
rep stosw
|
|
shl ebx, 3
|
|
add esi, ebx
|
|
jmp short nextgroup
|
|
|
|
ComputeAnimNormal endp
|
|
|
|
;*══════════════════════════════════════════════════════════════════════════*/
|
|
;*──────────────────────────────────────────────────────────────────────────*/
|
|
|
|
END
|