Dll-fonctions 3d

Description

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

Codes Sources

A voir également

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.