Un dé texturé faisant une rotation sur les trois axes.
utilisation d'objects com ce trouvant dans d3d9.inc(réecris en asm)
macro pérmettant une utilisation aisée des fonctions directX
LoadTexture qui permet de charger une texture *.gif,jpeg qui ce trouve
dans la resource.
Source / Exemple :
.586
.model flat, stdcall
option casemap:none
include windows.inc
include kernel32.inc
include user32.inc
include winmm.inc
include ole32.inc
include oleaut32.inc
include gdi32.inc
include IPicture.inc
include d3d9.inc
includelib kernel32
includelib user32.lib
includelib winmm.lib
includelib ole32.lib
includelib oleaut32.lib
includelib gdi32.lib
includelib d3d9.lib
INIT PROTO :DWORD
MsgProc PROTO :HWND,:UINT,:WPARAM,:LPARAM
InitDlgProc PROTO :HWND,:UINT,:WPARAM,:LPARAM
PerCent PROTO :DWORD,:DWORD
InitD3D PROTO :DWORD,:DWORD
LoadTexture PROTO :DWORD,:DWORD
CreateCylinder PROTO :DWORD,:DWORD, :DWORD
SetupMatrices PROTO
SetupLights PROTO
Cleanup PROTO
Render PROTO
InitGeometry PROTO
ThreadP PROTO
MatrixRotationY PROTO :PTR,:FLOAT
MatrixLookAtLH PROTO :PTR,:PTR,:PTR,:PTR
MatrixPerspectiveFovLH PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
CUSTOMVERTEX STRUCT
pos D3DVECTOR <>
n D3DVECTOR <>
col DWORD ?
tu REAL4 ?
tv REAL4 ?
CUSTOMVERTEX ENDS
D3DFVF_CUSTOMVERTEX equ D3DFVF_XYZ or D3DFVF_NORMAL or D3DFVF_DIFFUSE or D3DFVF_TEX1
.DATA
align 16
matWorld D3DXMATRIXA16 <>
matView D3DXMATRIXA16 <>
matProj D3DXMATRIXA16 <>
d3ddm D3DDISPLAYMODE<>
ppvIDirect3D9 dd 0
ppvIDirect3DDevice9 dd 0
pVtxBCube dd 0
pVtxBCylinder dd 0
ppvIDirect3DTexture9 dd 0
pVertices dd 0
start_time dd 0
elapse_time dd 20
lpThreadId dd 0
Hwnd dd 0
cx_screen dd 0
cy_screen dd 0
View_Mode dd 0
FovLHParam2 dd 0
.CODE
include D3XMATH.ASM
START: INVOKE DialogBoxParam,400000h,100,0, ADDR InitDlgProc,0
INVOKE INIT,50
INVOKE Cleanup
INVOKE ExitProcess,0
;################################################# INITIALISATION ##############################################
INIT PROC size_percent:DWORD
LOCAL msg:MSG
LOCAL width_hwnd,height_hwnd
INVOKE CreateDialogParam,400000h,101,0,0,0
mov Hwnd,eax
INVOKE LoadIcon,400000h,200
INVOKE SendMessage,Hwnd,WM_SETICON,0,eax
INVOKE GetSystemMetrics,SM_CXSCREEN
mov cx_screen,eax
INVOKE GetSystemMetrics,SM_CYSCREEN
mov cy_screen,eax
fild cy_screen
fidiv cx_screen
fstp FovLHParam2
mov edi,cx_screen
mov eax,edi
shr edi,1
INVOKE PerCent,eax,size_percent
mov edx,eax
shr eax,1
sub edi,eax
mov esi,cy_screen
mov eax,esi
shr esi,1
INVOKE PerCent,eax,size_percent
mov ecx,eax
shr eax,1
sub esi,eax
INVOKE SetWindowPos,Hwnd,0,edi,esi,edx,ecx,0
INVOKE InitD3D,Hwnd,View_Mode
INVOKE InitGeometry
INVOKE ShowWindow,Hwnd, SW_SHOWNORMAL
INVOKE UpdateWindow,Hwnd
INVOKE timeGetTime
add eax,elapse_time
mov start_time,eax
INVOKE CreateThread,0,0,ADDR ThreadP,0,0,addr lpThreadId
L_0: INVOKE GetMessage,ADDR msg,0,0,0
mov eax,msg.message
cmp eax,WM_COMMAND
je L_1
cmp eax,WM_KEYDOWN
jne L_2
cmp msg.wParam,VK_ESCAPE
je L_1
L_2: INVOKE TranslateMessage, ADDR msg
INVOKE DispatchMessage, ADDR msg
jmp L_0
L_1: ret
INIT ENDP
;##################################################### INITIALISATION DU DEVICE 3D #######################################
InitD3D PROC hWnd:DWORD, Full_Scr:DWORD
LOCAL d3dpp:D3DPRESENT_PARAMETERS
INVOKE RtlZeroMemory,addr d3dpp,D3DPRESENT_PARAMETERS
INVOKE Direct3DCreate9,D3D_SDK_VERSION
mov ppvIDirect3D9,eax
IDirect3D9 GetAdapterDisplayMode,D3DADAPTER_DEFAULT,ADDR d3ddm
mov eax,Full_Scr
not eax
and eax,1
mov d3dpp.Windowed,eax
mov d3dpp.SwapEffect,D3DSWAPEFFECT_DISCARD
or eax,eax
jne @F
push d3ddm.Format
push d3ddm.Width1
push d3ddm.Height
pop d3dpp.BackBufferHeight
pop d3dpp.BackBufferWidth
pop d3dpp.BackBufferFormat
INVOKE ShowCursor,0
@@: IDirect3D9 CreateDevice,D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL, hWnd,\
D3DCREATE_SOFTWARE_VERTEXPROCESSING,addr d3dpp, addr ppvIDirect3DDevice9
IDirect3DDevice9 SetRenderState,D3DRS_CULLMODE,D3DCULL_CCW
IDirect3DDevice9 SetRenderState, D3DRS_ZENABLE, TRUE
ret
InitD3D endp
;#################################################### THREAD PROC ################################################################
ThreadP PROC
@@: INVOKE Render
jmp @B
ret
ThreadP ENDP
;############################################### INITGEOMETRY #####################################################################
InitGeometry PROC
.CONST
;FRONT
Vertices REAL4 1.0r, 1.0r, -1.0r, 1.0r, 1.0r, -1.0r
DD 00FFFFFFh
REAL4 0.333r,0.0r
REAL4 1.0r, -1.0r, -1.0r, 1.0r, -1.0r, -1.0r
DD 00FFFFFFh
REAL4 0.333r,0.333r
REAL4 -1.0r, -1.0r, -1.0r, -1.0r, -1.0r, -1.0r
DD 00FFFFFFh
REAL4 0.0r, 0.333r
REAL4 -1.0r, -1.0r, -1.0r, -1.0r, -1.0r, -1.0r
DD 00FFFFFFh
REAL4 0.0r, 0.333r
REAL4 -1.0r, 1.0r, -1.0r, -1.0r, 1.0r, -1.0r
DD 00FFFFFFh
REAL4 0.0r, 0.0r
REAL4 1.0r, 1.0r, -1.0r, 1.0r, 1.0r, -1.0r
DD 00FFFFFFh
REAL4 0.333r, 0.0r
;RIGHT
REAL4 1.0r, 1.0r, 1.0r, 1.0r, 1.0r, 1.0r
DD 00FFFFFFh
REAL4 0.666r,0.0r
REAL4 1.0r, -1.0r, 1.0r, 1.0r, -1.0r, 1.0r
DD 00FFFFFFh
REAL4 0.666r,0.333r
REAL4 1.0r, -1.0r, -1.0r, 1.0r, -1.0r, -1.0r
DD 00FFFFFFh
REAL4 0.333r,0.333r
REAL4 1.0r, -1.0r, -1.0r, 1.0r, -1.0r, -1.0r
DD 00FFFFFFh
REAL4 0.333r,0.333r
REAL4 1.0r, 1.0r, -1.0r, 1.0r, 1.0r, -1.0r
DD 00FFFFFFh
REAL4 0.333r,0.0r
REAL4 1.0r, 1.0r, 1.0r, 1.0r, 1.0r, 1.0r
DD 00FFFFFFh
REAL4 0.666r,0.0r
;BACK
REAL4 -1.0r, 1.0r, 1.0r, -1.0r, 1.0r, 1.0r
DD 00FFFFFFh
REAL4 0.999r,0.0r
REAL4 -1.0r, -1.0r, 1.0r, -1.0r, -1.0r, 1.0r
DD 00FFFFFFh
REAL4 0.999r,0.333r
REAL4 1.0r, -1.0r, 1.0r, 1.0r, -1.0r, 1.0r
DD 00FFFFFFh
REAL4 0.666r,0.333r
REAL4 1.0r, -1.0r, 1.0r, 1.0r, -1.0r, 1.0r
DD 00FFFFFFh
REAL4 0.666r,0.333r
REAL4 1.0r, 1.0r, 1.0r, 1.0r, 1.0r, 1.0r
DD 00FFFFFFh
REAL4 0.666r,0.0r
REAL4 -1.0r, 1.0r, 1.0r, -1.0r, 1.0r, 1.0r
DD 00FFFFFFh
REAL4 0.999r,0.0r
;DOWN
REAL4 -1.0r, -1.0r, 1.0r, -1.0r, -1.0r, 1.0r
DD 00FFFFFFh
REAL4 0.0r,0.666r
REAL4 -1.0r, -1.0r, -1.0r, -1.0r, -1.0r, -1.0r
DD 00FFFFFFh
REAL4 0.0r,0.333r
REAL4 1.0r, -1.0r, -1.0r, 1.0r, -1.0r, -1.0r
DD 00FFFFFFh
REAL4 0.333r,0.333r
REAL4 1.0r, -1.0r, -1.0r, 1.0r, -1.0r, -1.0r
DD 00FFFFFFh
REAL4 0.333r,0.333r
REAL4 1.0r, -1.0r, 1.0r, 1.0r, -1.0r, 1.0r
DD 00FFFFFFh
REAL4 0.333r,0.666r
REAL4 -1.0r, -1.0r, 1.0r, -1.0r, -1.0r, 1.0r
DD 00FFFFFFh
REAL4 0.0r,0.666r
;LEFT
REAL4 -1.0r, -1.0r, 1.0r, -1.0r, -1.0r, 1.0r
DD 00FFFFFFh
REAL4 0.333r,0.666r
REAL4 -1.0r, 1.0r, 1.0r, -1.0r, 1.0r, 1.0r
DD 00FFFFFFh
REAL4 0.333r,0.333r
REAL4 -1.0r, 1.0r, -1.0r, -1.0r, 1.0r, -1.0r
DD 00FFFFFFh
REAL4 0.666r,0.333r
REAL4 -1.0r, 1.0r, -1.0r, -1.0r, 1.0r, -1.0r
DD 00FFFFFFh
REAL4 0.666r,0.333r
REAL4 -1.0r, -1.0r, -1.0r, -1.0r, -1.0r, -1.0r
DD 00FFFFFFh
REAL4 0.666r,0.666r
REAL4 -1.0r, -1.0r, 1.0r, -1.0r, -1.0r, 1.0r
DD 00FFFFFFh
REAL4 0.333r,0.666r
;UP
REAL4 -1.0r, 1.0r, -1.0r, -1.0r, 1.0r, -1.0r
DD 00FFFFFFh
REAL4 0.666r,0.666r
REAL4 -1.0r, 1.0r, 1.0r, -1.0r, 1.0r, 1.0r
DD 00FFFFFFh
REAL4 0.666r,0.333r
REAL4 1.0r, 1.0r, 1.0r, 1.0r, 1.0r, 1.0r
DD 00FFFFFFh
REAL4 0.999r,0.333r
REAL4 1.0r, 1.0r, -1.0r, 1.0r, 1.0r, -1.0r
DD 00FFFFFFh
REAL4 0.999r,0.666r
REAL4 -1.0r, 1.0r, -1.0r, -1.0r, 1.0r, -1.0r
DD 00FFFFFFh
REAL4 0.666r,0.666r
REAL4 1.0r, 1.0r, 1.0r, 1.0r, 1.0r, 1.0r
DD 00FFFFFFh
REAL4 0.999r,0.333r
size_vert equ $ - offset Vertices
.CODE
INVOKE LoadTexture,400,addr ppvIDirect3DTexture9
IDirect3DDevice9 CreateVertexBuffer,size_vert,0, D3DFVF_CUSTOMVERTEX ,D3DPOOL_DEFAULT,addr pVtxBCube, NULL
IDirect3DVertexBuffer9 pVtxBCube,Lock1,0,size_vert,addr pVertices,0
mov ecx,size_vert
lea esi,Vertices
mov edi,pVertices
rep movsb
IDirect3DVertexBuffer9 pVtxBCube,Unlock
INVOKE CreateCylinder,20,60,60
ret
InitGeometry ENDP
;######################################################### RENDER ############################################################
Render PROC
IDirect3DDevice9 Clear,0, NULL,D3DCLEAR_TARGET,000000FFh,3F800000h,0
IDirect3DDevice9 BeginScene
INVOKE SetupLights
INVOKE SetupMatrices
IDirect3DDevice9 SetFVF,D3DFVF_CUSTOMVERTEX
IDirect3DDevice9 SetTexture, 0, ppvIDirect3DTexture9
IDirect3DDevice9 SetSamplerState,0,D3DSAMP_MAGFILTER,D3DTEXF_ANISOTROPIC
IDirect3DDevice9 SetStreamSource,0,pVtxBCylinder, 0, sizeof CUSTOMVERTEX
IDirect3DDevice9 DrawPrimitive,D3DPT_TRIANGLELIST,0,40
IDirect3DDevice9 SetStreamSource,0,pVtxBCube, 0, sizeof CUSTOMVERTEX
IDirect3DDevice9 DrawPrimitive,D3DPT_TRIANGLELIST,0,12
IDirect3DDevice9 EndScene
IDirect3DDevice9 Present,0,0,0,0
ret
Render ENDP
;##################################################### SETUPMATRICES ###########################################################
SetupMatrices PROC
INVOKE timeGetTime
cmp eax,start_time
jc @F
add eax,elapse_time
mov start_time,eax
push 36
push pVertices
push 3C8E8A72h ; 1 degré radian
call RVTXLY
push 36
push pVertices
push 3C8E8A72h
call RVTXLX
push 36
push pVertices
push 3C8E8A72h
call RVTXLZ
@@: lea eax,matWorld
push eax
call MatrixIdentity
IDirect3DDevice9 SetTransform,D3DTS_WORLDMATRIX,ADDR matWorld
.DATA
tmpvec31 D3DVECTOR <0.0f, 0.0f,-5.0f>
tmpvec32 D3DVECTOR <0.0f, 0.0f, 0.0f>
tmpvec33 D3DVECTOR <0.0f, 1.0f, 0.0f>
.CODE
INVOKE MatrixLookAtLH, ADDR matView, ADDR tmpvec31, ADDR tmpvec32, ADDR tmpvec33
IDirect3DDevice9 SetTransform, D3DTS_VIEW, ADDR matView
INVOKE MatrixPerspectiveFovLH, ADDR matProj,3F490FDBh,FovLHParam2,3F800000h,43FA0000h
IDirect3DDevice9 SetTransform, D3DTS_PROJECTION, ADDR matProj
ret
SetupMatrices ENDP
;################################################################### SetupLights ###############################################
SetupLights PROC
LOCAL light:D3DLIGHT9
INVOKE RtlZeroMemory,ADDR light,sizeof D3DLIGHT9
mov light.type1,D3DLIGHT_DIRECTIONAL
fld1
fst light.Diffuse.r
fst light.Diffuse.g
fstp light.Diffuse.b
.DATA
vecDir D3DVECTOR <0.5,-0.1,1.0>
.CODE
lea edx,light.Direction
lea eax,vecDir
push eax
push edx
call Normalize
IDirect3DDevice9 SetLight, 0, ADDR light
IDirect3DDevice9 LightEnable, 0, TRUE
IDirect3DDevice9 SetRenderState, D3DRS_LIGHTING, TRUE
ret
SetupLights ENDP
;############################################################ CLEANUP #######################################################
Cleanup PROC
IDirect3DTexture9 Release
mov ppvIDirect3DTexture9,0
IDirect3DVertexBuffer9 pVtxBCube,Release
mov pVtxBCube,0
IDirect3DVertexBuffer9 pVtxBCylinder,Release
mov pVtxBCylinder,0
IDirect3DDevice9 Release
mov ppvIDirect3DDevice9,0
IDirect3D9 Release
mov ppvIDirect3D9,0
ret
Cleanup ENDP
;########################################################## InitDlgProc #######################################################
InitDlgProc PROC hwnd: HWND, uMsg: UINT, wParam: WPARAM, lParam: LPARAM
pushad
mov eax,uMsg
cmp eax,WM_INITDIALOG
je WMINIT
cmp eax,WM_COMMAND
je WMCMD
cmp eax,WM_CLOSE
je WMCLOSE
jmp DLG
WMINIT:
.DATA
item0 db 'NONE',0
item1 db '2X',0
item2 db '4X',0
item3 db '8X',0
.CODE
INVOKE SendDlgItemMessage,hwnd,300,CB_ADDSTRING,0,addr item0
INVOKE SendDlgItemMessage,hwnd,300,CB_ADDSTRING,0,addr item1
INVOKE SendDlgItemMessage,hwnd,300,CB_ADDSTRING,0,addr item2
INVOKE SendDlgItemMessage,hwnd,300,CB_ADDSTRING,0,addr item3
INVOKE SendDlgItemMessage,hwnd,300,CB_SETCURSEL ,0,0
jmp DLG
WMCMD: mov eax,wParam
and eax,0FFFFh
cmp eax,303
je OK
cmp eax,304
jne DLG
INVOKE ExitProcess,0
OK: INVOKE GetDlgItem,hwnd,301
INVOKE SendMessage, eax, BM_GETCHECK, 0, 0
mov View_Mode,eax
WMCLOSE:INVOKE EndDialog, hwnd, 0
DLG: popad
xor eax, eax
ret
InitDlgProc ENDP
;############################################################### CreateCylinder
CreateCylinder PROC nFace:DWORD,ray:DWORD,h:DWORD
LOCAL nVrtx,pCylind,pVrtx,angC,heightC
push 2
fild h
fidiv dword ptr [esp]
fstp heightC
;-------------------------------------calcul angle
push 180
fild dword ptr [esp]
fidiv nFace
push 180
fidiv dword ptr [esp]
fldpi
fmulp st(1),st
fstp angC
add esp,12
;-------------------------------------cree le buffer
mov eax,nFace
shl eax,1
add eax,2
mov ecx,CUSTOMVERTEX
mul ecx
INVOKE GlobalAlloc,GPTR,eax
mov pVrtx,eax
mov edi,pVrtx
;-------------------------------------remplis le buffer
sub ecx,ecx
mov eax,nFace
inc eax
@@: push ecx
fld angC
fimul dword ptr [esp]
fsincos
fst dword ptr [edi+12] ;p1.nx
fst dword ptr [edi+48] ;p2.nx
fchs
fimul ray
fst dword ptr [edi] ;p1.x
fstp dword ptr [edi+36] ;p2.x
fchs
fst dword ptr [edi+20] ;p1.nz
fst dword ptr [edi+56] ;p2.nz
fchs
fimul ray
fst dword ptr [edi+8] ;p1.z
fstp dword ptr [edi+44] ;p2.z
fld heightC
fst dword ptr [edi+40] ;p2.y
fchs
fstp dword ptr [edi+4] ;p1.y
fld1
fidiv nFace
fimul dword ptr [esp]
fst dword ptr [edi+28] ;p1.tu
fstp dword ptr [edi+64] ;p2.tu
push 3F2AA64Ch
fld dword ptr [esp]
fstp dword ptr [edi+68] ;p1.tv
fld1
fstp dword ptr [edi+32] ;p2.tv
mov dword ptr [edi+24],00FFFFFFh
mov dword ptr [edi+60],00FFFFFFh
add edi,72
add esp,8
inc ecx
dec eax
jnz @B
mov eax,CUSTOMVERTEX*6
mov ecx,nFace
mul ecx
mov nVrtx,eax
IDirect3DDevice9 CreateVertexBuffer,nVrtx,0, D3DFVF_CUSTOMVERTEX ,D3DPOOL_DEFAULT,addr pVtxBCylinder, NULL
IDirect3DVertexBuffer9 pVtxBCylinder,Lock1,0,nVrtx,addr pCylind,0
mov eax,nFace
mov esi,pVrtx
mov edi,pCylind
@@: mov ecx,CUSTOMVERTEX*4
rep movsb
sub esi,CUSTOMVERTEX*2
mov ecx,CUSTOMVERTEX
rep movsb
sub esi,CUSTOMVERTEX*2
mov ecx,CUSTOMVERTEX
rep movsb
dec eax
jnz @B
IDirect3DVertexBuffer9 pVtxBCylinder,Unlock
INVOKE GlobalFree,pVrtx
ret
CreateCylinder ENDP
include loadTexture.asm
END START
Conclusion :
C'est difficile de trouvé des bon exemples directX en assembleur qui fonctionne,
c'est difficile aussi de trouver de la bonne doc à part le sdk en anglais.
cet exemple n'utilise que d3d9.lib, Je suis casi certain que le pro en dx
n'utilisera jamais d3dx3.lib et ses fonctions préfabriquées qui t'imposent les
runtimes mcf qui fais que ton prog pèse un tonne de plus en plus tu dois
faire une mise à jour de uuid.lib pour compiler,le sdk en anglais
propose une fonction D3DX9LoadTextureFromRes inutilisable
c'est pour ça que j'ai fais ma propre fonction qui charge l'image
qui ce trouve dans la section de resource. Je cherche un example en asm
d'un fonction qui charge des mesh (fichier *.x).
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.