comp: masm32.
Animation 3D cet exemple contient 2 version VB et ASM
pour comparer la vitesse.
Source / Exemple :
.386
.model flat,stdcall
include \masm32\include\gdi32.inc
include \masm32\include\user32.inc
include data.inc
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\user32.lib
.data
Trgle dd 6 dup(?) ;triangle
ZL dd 500 dup(?) ;tableau reçevant valeur Z chaque triangle
OF dd 500 dup(?) ;tableau reçevant offs debut chaque triangle
ZFValue dd ?
CSCRNX dd 266.0
CSCRNY dd 171.0
PX dd 1024.0
PZ dd 256.0
ZERO dd 0
TROIS dd 3.0
nFV dd 0 ;nombre de triangle devant être dessinés
rct dd 4 dup(?) ;reçois dimenssion zone client
hBrush dd ? ;pinceau zone client
.code
DLLMain proc p1,p2,p3
push ebp
mov ebp, esp
mov eax, 1
leave
ret 12
DLLMain endp
;remplis le vtx buffer en ce basant sur les données du data.inc
MVTXB proc export vtx:PTR
push edi
mov ecx,48
mov ebx,Offset vtxb
mov edx,Offset Face
mov edi,vtx
boucle:
mov eax,[edx]
shl eax,5
add eax,ebx
mov esi,eax
push ecx
mov ecx,8
rep movsd
add edx,4
pop ecx
loop boucle
pop edi
ret
MVTXB endp
;routine principale
Project proc export vtx:PTR,v2:PTR,nFace:DWORD
;--------------------------remet à zero nFV(nbr face à dessiner)
mov edx,Offset nFV
xor eax,eax
mov dword ptr[edx],eax
;--------------------------
;---------------------------vide le tableau v2
mov eax,nFace
mov ebx,3
mul ebx
mov ecx,eax
mov eax,v2
xor edx,edx
CLEARBUFF2D:
mov dword ptr[eax],edx
add eax,4
loop CLEARBUFF2D
;------------------------------
;-----------------------------Initialise tableau OF
;on stocke l'adresse du debut de chaque triangle,
;ce tableau va être trié par MakeOF en fonction des
;des valeurs contenu dans ZL.
mov eax,v2
push eax
mov ecx,nFace
push ecx
call InitOF
;-----------------------------
;------------------------------Transforme 3D en 2D
;chaque fois qu'un triangle 2D est creé SortFV est appellé
;pour savoir si il est caché ou si il doit être dessiné
;si dessiné nFV est incrementé, la valeur Z du triangle est
;stockée dans tableau ZL ces valeurs vont être utilisées
;par MakeOF pour definir l'ordre dans lequel les triangles
;doivent être dessinés.
pop ecx
mov ebx,vtx
nextFace:
xor eax,eax
mov edx,3
nextVtx:
fld dword ptr [ebx]
fmul PX
fld dword ptr [ebx+8]
fadd PZ
fdivp st(1),st(0)
fadd CSCRNX
fistp dword ptr [Trgle+eax] ;x
fld dword ptr [ebx+4]
fchs
fmul PX
fld dword ptr [ebx+8]
fadd PZ
fdivp st(1),st(0)
fadd CSCRNY
fistp dword ptr [Trgle+eax+4] ;y
add ebx,32
add eax,8
dec edx
jnz nextVtx
call ZFace
mov edx,Offset nFV
pop eax
call SortFV
push eax
loop nextFace
call MakeOF
ret
Project endp
ZFace proc
fld dword ptr[ebx-88]
fadd dword ptr[ebx-56]
fadd dword ptr[ebx-24]
fdiv TROIS
fstp dword ptr[ZFValue]
ret
ZFace endp
SortFV proc
fld dword ptr [Trgle+8]
fsub dword ptr [Trgle]
fld dword ptr [Trgle+20]
fsub dword ptr [Trgle+4]
fmulp st(1), st(0)
fld dword ptr [Trgle+12]
fsub dword ptr [Trgle+4]
fld dword ptr [Trgle+16]
fsub dword ptr [Trgle]
fmulp st(1), st(0)
fsubp st(1), st(0)
fcomp ZERO
push eax
fstsw ax
and ah,01000001b
jnz NEXT
pop eax
call MFace
push eax
mov eax,[edx]
push ebx
mov ebx,ZFValue
mov dword ptr [ZL+eax*4],ebx
pop ebx
inc eax
mov dword ptr [edx],eax
pop eax
ret
NEXT:
pop eax
ret
SortFV endp
MFace proc
push edi
push ecx
mov esi,Offset Trgle
mov edi,eax
mov ecx,6
rep movsd
add eax,24
pop ecx
pop edi
ret
MFace endp
MakeOF proc
mov ecx,nFV
dec ecx
OUTER:
xor edx,edx
INNER:
fld dword ptr [ZL+edx*4]
fcomp dword ptr [ZL+edx*4+4]
fstsw ax
and ah,01000001b
jnz NEXT
mov eax,[ZL+edx*4]
xchg eax,[ZL+edx*4+4]
mov dword ptr [ZL+edx*4],eax
mov eax,[OF+edx*4]
xchg eax,[OF+edx*4+4]
mov dword ptr [OF+edx*4],eax
NEXT:
inc edx
cmp edx,ecx
jne INNER
loop OUTER
ret
MakeOF endp
InitOF proc
xor ebx,ebx
boucle:
mov dword ptr [OF+ebx*4],eax
add eax,24
inc ebx
loop boucle
ret
InitOF endp
DrawFace proc export hwnd:DWORD,hDC:DWORD,v2:PTR
;----------------------------------- redessine le fond
invoke GetClientRect, hwnd,ADDR rct
mov eax,00BFBFBFh
invoke CreateSolidBrush, eax
mov hBrush,eax
invoke FillRect,hDC,ADDR rct,hBrush
;------------------------------------
mov ebx,v2
mov ecx,nFV
DRAW:
push ecx
dec ecx
mov ebx,[OF+ecx*4]
invoke Polygon ,hDC,ebx,3
pop ecx
loop DRAW
invoke InvalidateRect, hwnd,0,0
invoke DeleteObject, hBrush
ret
DrawFace endp
;//////////////////////////////////////////////////////////////////////////////////////
;FONCTIONS DE TRANSFORMATION DE VERTEX
;-----------------------------------------------------------------------------RVTXLX
;definition:Modifie les elements d'un tableau de vertex de
; sorte qu 'ils fassent une rotation sur l'axe X.
;declaration de la fonction dll dans un module VB :
;declare public sub RVTXLX lib "dll"(ByVal angle as single, _
; vtx as D3DVERTEX,ByVal nCount as Long)
RVTXLX proc export Angle:DWORD,vtx:PTR,nCount:DWORD
LOCAL qSin:DWORD
LOCAL qCos:DWORD
LOCAL qY:DWORD
LOCAL qNy:DWORD
fld Angle
fsincos
fstp qCos
fstp qSin
mov edx,vtx
mov ecx,nCount
NextElement:
;-----------------------------------------------yz
fld qCos
fmul dword ptr [edx+4]
fld qSin
fmul dword ptr [edx+8]
fsubp st(1), st(0)
fstp qY
fld qSin
fmul dword ptr [edx+4]
fld qCos
fmul dword ptr [edx+8]
faddp st(1), st(0)
fstp dword ptr[edx+8]
;-------------------------------------------------nynz
fld qCos
fmul dword ptr [edx+16]
fld qSin
fmul dword ptr [edx+20]
fsubp st(1), st(0)
fstp qNy
fld qSin
fmul dword ptr [edx+16]
fld qCos
fmul dword ptr [edx+20]
faddp st(1), st(0)
fstp dword ptr[edx+20]
;-------------------------------------------------
mov ebx,qY
mov dword ptr[edx+4],ebx
mov ebx,qNy
mov dword ptr[edx+16],ebx
add edx,32
loop NextElement
ret
RVTXLX endp
;-----------------------------------------------------------------------------RVTXLY
;definition:Modifie les elements d'un tableau de vertex de
; sorte qu 'ils fassent une rotation sur l'axe Y.
;declaration de la fonction dll dans un module VB :
;declare public sub RVTXLY lib "dll"(ByVal angle as single, _
; vtx as D3DVERTEX,ByVal nCount as Long)
RVTXLY proc export Angle:DWORD,vtx:PTR,nCount:DWORD
LOCAL qX:DWORD
LOCAL qNx:DWORD
LOCAL qSin:DWORD
LOCAL qCos:DWORD
fld Angle
fsincos
fstp qCos
fstp qSin
mov edx,vtx
mov ecx,nCount
NextElement:
;-----------------------------------------------xz
fld qCos
fmul dword ptr [edx]
fld qSin
fmul dword ptr [edx+8]
fsubp st(1), st(0)
fstp qX
fld qSin
fmul dword ptr [edx]
fld qCos
fmul dword ptr [edx+8]
faddp st(1), st(0)
fstp dword ptr[edx+8]
;-------------------------------------------------nxnz
fld qCos
fmul dword ptr [edx+12]
fld qSin
fmul dword ptr [edx+20]
fsubp st(1), st(0)
fstp qNx
fld qSin
fmul dword ptr [edx+12]
fld qCos
fmul dword ptr [edx+20]
faddp st(1), st(0)
fstp dword ptr[edx+20]
;-------------------------------------------------
mov ebx,qX
mov dword ptr[edx],ebx
mov ebx,qNx
mov dword ptr[edx+12],ebx
add edx,32
loop NextElement
ret
RVTXLY endp
;-----------------------------------------------------------------------------RVTXLZ
;definition:Modifie les elements d'un tableau de vertex de
; sorte qu 'ils fassent une rotation sur l'axe Z.
;declaration de la fonction dll dans un module VB :
;declare public sub RVTXLZ lib "dll"(ByVal angle as single, _
; vtx as D3DVERTEX,ByVal nCount as Long)
RVTXLZ proc export
push ebp
mov ebp,esp
sub esp,16
fld dword ptr [ebp+8]
fsincos
fstp dword ptr[ebp-16]
fstp dword ptr[ebp-12]
mov edx,[ebp+12]
mov ecx,[ebp+16]
NextElement:
;-----------------------------------------------xy
fld dword ptr[ebp-16]
fmul dword ptr [edx]
fld dword ptr[ebp-12]
fmul dword ptr [edx+4]
fsubp st(1), st(0)
fstp dword ptr[ebp-8]
fld dword ptr[ebp-12]
fmul dword ptr [edx]
fld dword ptr[ebp-16]
fmul dword ptr [edx+4]
faddp st(1), st(0)
fstp dword ptr [edx+4]
;-------------------------------------------------nxny
fld dword ptr[ebp-16]
fmul dword ptr [edx+12]
fld dword ptr[ebp-12]
fmul dword ptr [edx+16]
fsubp st(1), st(0)
fstp dword ptr[ebp-4]
fld dword ptr[ebp-12]
fmul dword ptr [edx+12]
fld dword ptr [ebp-16]
fmul dword ptr [edx+16]
faddp st(1), st(0)
fstp dword ptr[edx+16]
mov ebx,[ebp-8]
mov dword ptr[edx],ebx
mov ebx,[ebp-4]
mov dword ptr[edx+12],ebx
add edx,32
loop NextElement
mov esp,ebp
pop ebp
ret 12
RVTXLZ endp
end DLLMain
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.