Trouver une ressource (Nouvelle version du moteur, plus rapide & pertinent, essayez le !)
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
LECTEUR 3DS EN ASSEMBLEUR SOUS OPENGL
Information sur la source
Description
bonjour, Voici un bout de code permetant de lire les fichier 3ds et de les incorporer dans vos sources. Il n'est qu'en BETA, je doit y ajouter qq modifications.
Source
- OBJ STRUCT
- Nb_Poylgon WORD ? ;nombre de polygon
- textureId DWORD ? ;Texture ID
- Pt_Vertex DWORD ? ;pointeur vers zone memoire Vertex
- Pt_Polygon DWORD ? ;pointeur vers zone memoire polygon
- Pt_Map_Cord DWORD ? ;pointeur vers zone memoire des coordonées MAP
- OBJ ends
-
- .data
- string_file_not_found DB "fichier introuvable",0
- Temp_String DB 255 dup(0)
- N_Texture DD 0 ; numero de texture en cours
- Max_Texture DD 25 ; nombre de texture max
- N_Objets BYTE 0
- .data?
- End_File DD ?
- count dD ?
- bytes_read dd ?
- Temp_DD DD ?
- Objets OBJ <>
- .code
-
-
- File_to_RAM PROC File_name:DWORD
- push edi
- push 0
- push 0
- push OPEN_EXISTING
- push 0
- push FILE_SHARE_READ
- push GENERIC_READ
- push File_name
- call CreateFile
- test eax,eax
- jne @f
- push MB_ICONERROR
- push offset string_file_not_found
- push File_name
- push 0
- call MessageBox
- xor eax, eax
- ret
- @@:
- mov ebx, eax
- push ebx
- push 0
- push ebx
- call GetFileSize
- push 0
- push offset bytes_read
- push eax
- inc eax
- push eax
- push GPTR
- call GlobalAlloc
- mov edi,eax
- push eax
- push ebx
- call ReadFile
- call CloseHandle
- mov eax,edi
- pop edi
- ret
- File_to_RAM endp
-
-
- Load_3d proc file:dword
- push ebp
- push edi
- push esi
- invoke File_to_RAM,file
- test eax,eax
- jne @f
- pop esi
- pop edi
- pop ebp
- ret
- @@:
- mov ebp,eax
- push eax
- mov End_File,eax
- xor eax, eax
- ; lecture du 1er chunk
- movzx edi,WORD PTR [ebp]
- mov eax,DWORD PTR [ebp+2]
- add End_File,eax
- add ebp,6
- test di,4D4Dh
- jne short @f
- xor eax, eax ; le fichier n'est pas un fichier 3ds
- pop esi
- pop edi
- pop ebp
- ret
- @@:
- ;lecture du fichier
- xor ebx,ebx
- read_chunk:
- ;lecture d'un chunk
- movzx edi,WORD PTR [ebp]
- movzx esi,WORD PTR [ebp+2]
- add ebp,6
- cmp di,03d3dH;CHUNK_OBJMESH
- je short read_chunk
- cmp di,0A200H;CHUNK_TEXTURE
- je short read_chunk
- cmp di,0AFFFH;CHUNK_MATERIAL
- je short read_chunk
- cmp di,4100H;CHUNK_TRIMESH
- je short read_chunk
- cmp di,4130H;CHUNK_FACEMAT
- je short read_chunk
-
- cmp di,4000H;CHUNK_OBJBLOCK
- je short CHUNK_OBJBLOCK
- cmp di,4110H;CHUNK_VERTLIST
- je short CHUNK_VERTLIST
- cmp di,4120H;CHUNK_FACELIST ;
- je CHUNK_FACELIST
- cmp di,4140H;CHUNK_MAPLIST
- je CHUNK_MAPLIST
- cmp di,0A000H;CHUNK_MATNAME
- je CHUNK_MATNAME
- cmp di,0A300H;CHUNK_MAPFILE
- je CHUNK_MAPFILE
- ; UNKNOW CHUNK
- sub esi,6
- add ebp,esi
- cmp ebp,End_File
- jl read_chunk
-
- pop ebx
- push ebx
- call GlobalFree
- pop esi
- pop edi
- pop ebp
- ret
-
- CHUNK_OBJBLOCK:
- inc N_Objets
- mov eax, offset Temp_String
- @@:
- mov bl,BYTE PTR [ebp]
- mov [eax],bl
- test bl,bl
- je @f
- inc eax
- inc ebp
- jmp short @b
- @@:
- mov BYTE PTR [eax],0
- inc ebp
- ;call newObject
- jmp read_chunk
-
- CHUNK_VERTLIST:
- push esi
- push edi
- mov esi,ebp
- movzx eax,WORD PTR[esi] ; nb vertices
- mov ebx,12 ; 3 points par vertices
- mul ebx
- push eax
- push eax
- push GPTR
- call GlobalAlloc
- mov Objets.Pt_Vertex, eax
- add esi,2
- mov edi, Objets.Pt_Vertex
- pop ecx
- rep movsb
- pop edi
- pop esi
- sub esi,6
- add ebp,esi
- jmp read_chunk
-
- CHUNK_FACELIST:
- push esi
- push edi
- mov esi,ebp
- movzx eax,WORD PTR[esi] ; nb Polygon
- mov Objets.Nb_Poylgon,ax
- mov ebx,8 ; 4 points par Polygon (3 + flag)
- mul ebx
- push eax
- push eax
- push GPTR
- call GlobalAlloc
- mov Objets.Pt_Polygon, eax
- add esi,2
- mov edi,Objets.Pt_Polygon
- pop ecx
- rep movsb
- pop edi
- pop esi
- sub esi,6
- add ebp,esi
- jmp read_chunk
-
- CHUNK_MAPLIST:
- push esi
- push edi
- mov esi,ebp
- movzx eax,WORD PTR[esi] ; nb Map coord
- mov ebx,8 ; 2 points par map
- mul ebx
- push eax
- push eax
- push GPTR
- call GlobalAlloc
- mov Objets.Pt_Map_Cord, eax
- add esi,2
- mov edi,Objets.Pt_Map_Cord
- pop ecx
- rep movsb
- pop edi
- pop esi
- sub esi,6
- add ebp,esi
- jmp read_chunk
-
- CHUNK_MAPFILE:
- mov eax, offset Temp_String
- @@:
- mov bl,BYTE PTR [ebp]
- mov [eax],bl
- test bl,bl
- je @f
- inc eax
- inc ebp
- jmp short @b
- @@:
- mov BYTE PTR [eax],0
- inc ebp
- push offset Temp_String
- call LoadGLTexture
- mov Objets.textureId,eax
- jmp read_chunk
-
- CHUNK_MATNAME:
- mov eax, offset Temp_String
- @@:
- mov bl,BYTE PTR [ebp]
- mov [eax],bl
- test bl,bl
- je @f
- inc eax
- inc ebp
- jmp short @b
- @@:
- mov BYTE PTR [eax],0
- inc ebp
- ;call newMaterial
- jmp read_chunk
-
- Load_3d endp
-
- LoadGLTexture PROC file_texture:DWORD
- LOCAL info: BITMAP
-
- push edi
- cmp N_Texture,0
- jne @f
- push offset texture
- push Max_Texture
- call glGenTextures
- @@:
- push LR_LOADFROMFILE or LR_CREATEDIBSECTION
- push 0
- push 0
- push IMAGE_BITMAP
- push file_texture
- push 0
- call LoadImage
- test eax,eax
- jne @f
- push MB_ICONERROR
- push offset string_file_not_found
- push file_texture
- push 0
- call MessageBox
- pop edi
- ret
- @@:
- MOV Temp_DD,eax
- lea edi,Temp_DD
- MOV ebx,N_Texture
- push texture[ebx]
- push GL_TEXTURE_2D
- call glBindTexture
- push GL_REPEAT
- push GL_TEXTURE_WRAP_S
- push GL_TEXTURE_2D
- call glTexParameteri
- push GL_REPEAT
- push GL_TEXTURE_WRAP_T
- push GL_TEXTURE_2D
- call glTexParameteri
- push GL_LINEAR
- push GL_TEXTURE_MAG_FILTER
- push GL_TEXTURE_2D
- call glTexParameteri
- push GL_LINEAR_MIPMAP_NEAREST
- push GL_TEXTURE_MIN_FILTER
- push GL_TEXTURE_2D
- call glTexParameteri
- invoke GetObject,[edi],sizeof info,addr info
- push GL_REPLACE
- push GL_TEXTURE_ENV_MODE
- push GL_TEXTURE_ENV
- call glTexEnvi
- push info.bmBits
- push GL_UNSIGNED_BYTE
- push GL_BGR_EXT
- push 0
- push info.bmHeight
- push info.bmWidth
- push 4
- push 0
- push GL_TEXTURE_2D
- call glTexImage2D
- push info.bmBits
- push GL_UNSIGNED_BYTE
- push GL_BGR_EXT
- push info.bmHeight
- push info.bmWidth
- push 4
- push GL_TEXTURE_2D
- call gluBuild2DMipmaps
- push Temp_DD
- call DeleteObject
- pop edi
- MOV eax,N_Texture
- inc N_Texture
- ret
- LoadGLTexture endp
-
- draw_3d proc
- invoke glEnable,GL_CULL_FACE
- invoke glEnable,GL_TEXTURE_2D
- mov ebx,Objets.textureId
- invoke glBindTexture,GL_TEXTURE_2D,texture[ebx]
- invoke glBegin,GL_TRIANGLES
-
- push edi
- push esi
- push ebp
- xor eax,eax
- mov count,eax
- dec Objets.Nb_Poylgon
-
- .while (ax < Objets.Nb_Poylgon)
- ; 1 vertex
-
- shl eax,3 ; 1 poly = 4 pts = 8 octets
- add eax,Objets.Pt_Polygon
- mov esi,eax
-
- ;1er vertice
- movzx eax,WORD PTR[eax]
- mov ebx,eax
- shl eax,3 ; 2 points par map
- mov edi,eax
- add edi,Objets.Pt_Map_Cord
- push edi
- call glTexCoord2fv
- mov eax,ebx
- mov ebx,12 ; 3 points par vertice
- mul ebx
- mov edi,eax
- add edi,Objets.Pt_Vertex
- push edi
- call glVertex3fv
-
- ;2nd vertice
- mov eax,esi
- add eax,2
- movzx eax,WORD PTR[eax]
- mov ebx,eax
- shl eax,3 ; 2 points par map
- mov edi,eax
- add edi,Objets.Pt_Map_Cord
- push edi
- call glTexCoord2fv
- mov eax,ebx
- mov ebx,12 ; 3 points par vertice
- mul ebx
- mov edi,eax
- add edi,Objets.Pt_Vertex
- push edi
- call glVertex3fv
-
- ;3eme vertice
- mov eax,esi
- add eax,4
- movzx eax,WORD PTR[eax]
- mov ebx,eax
- shl eax,3 ; 2 points par map
- mov edi,eax
- add edi,Objets.Pt_Map_Cord
- push edi
- call glTexCoord2fv
- mov eax,ebx
- mov ebx,12 ; 3 points par verice
- mul ebx
- mov edi,eax
- add edi,Objets.Pt_Vertex
- push edi
- call glVertex3fv
-
- inc count
- mov eax, count
- .endw
- call glEnd
- push GL_TEXTURE_2D
- call glDisable
- push GL_CULL_FACE
- call glDisable ; desactive les faces cachés
- pop ebp
- pop esi
- pop edi
- ret
- draw_3d endp
OBJ STRUCT
Nb_Poylgon WORD ? ;nombre de polygon
textureId DWORD ? ;Texture ID
Pt_Vertex DWORD ? ;pointeur vers zone memoire Vertex
Pt_Polygon DWORD ? ;pointeur vers zone memoire polygon
Pt_Map_Cord DWORD ? ;pointeur vers zone memoire des coordonées MAP
OBJ ends
.data
string_file_not_found DB "fichier introuvable",0
Temp_String DB 255 dup(0)
N_Texture DD 0 ; numero de texture en cours
Max_Texture DD 25 ; nombre de texture max
N_Objets BYTE 0
.data?
End_File DD ?
count dD ?
bytes_read dd ?
Temp_DD DD ?
Objets OBJ <>
.code
File_to_RAM PROC File_name:DWORD
push edi
push 0
push 0
push OPEN_EXISTING
push 0
push FILE_SHARE_READ
push GENERIC_READ
push File_name
call CreateFile
test eax,eax
jne @f
push MB_ICONERROR
push offset string_file_not_found
push File_name
push 0
call MessageBox
xor eax, eax
ret
@@:
mov ebx, eax
push ebx
push 0
push ebx
call GetFileSize
push 0
push offset bytes_read
push eax
inc eax
push eax
push GPTR
call GlobalAlloc
mov edi,eax
push eax
push ebx
call ReadFile
call CloseHandle
mov eax,edi
pop edi
ret
File_to_RAM endp
Load_3d proc file:dword
push ebp
push edi
push esi
invoke File_to_RAM,file
test eax,eax
jne @f
pop esi
pop edi
pop ebp
ret
@@:
mov ebp,eax
push eax
mov End_File,eax
xor eax, eax
; lecture du 1er chunk
movzx edi,WORD PTR [ebp]
mov eax,DWORD PTR [ebp+2]
add End_File,eax
add ebp,6
test di,4D4Dh
jne short @f
xor eax, eax ; le fichier n'est pas un fichier 3ds
pop esi
pop edi
pop ebp
ret
@@:
;lecture du fichier
xor ebx,ebx
read_chunk:
;lecture d'un chunk
movzx edi,WORD PTR [ebp]
movzx esi,WORD PTR [ebp+2]
add ebp,6
cmp di,03d3dH;CHUNK_OBJMESH
je short read_chunk
cmp di,0A200H;CHUNK_TEXTURE
je short read_chunk
cmp di,0AFFFH;CHUNK_MATERIAL
je short read_chunk
cmp di,4100H;CHUNK_TRIMESH
je short read_chunk
cmp di,4130H;CHUNK_FACEMAT
je short read_chunk
cmp di,4000H;CHUNK_OBJBLOCK
je short CHUNK_OBJBLOCK
cmp di,4110H;CHUNK_VERTLIST
je short CHUNK_VERTLIST
cmp di,4120H;CHUNK_FACELIST ;
je CHUNK_FACELIST
cmp di,4140H;CHUNK_MAPLIST
je CHUNK_MAPLIST
cmp di,0A000H;CHUNK_MATNAME
je CHUNK_MATNAME
cmp di,0A300H;CHUNK_MAPFILE
je CHUNK_MAPFILE
; UNKNOW CHUNK
sub esi,6
add ebp,esi
cmp ebp,End_File
jl read_chunk
pop ebx
push ebx
call GlobalFree
pop esi
pop edi
pop ebp
ret
CHUNK_OBJBLOCK:
inc N_Objets
mov eax, offset Temp_String
@@:
mov bl,BYTE PTR [ebp]
mov [eax],bl
test bl,bl
je @f
inc eax
inc ebp
jmp short @b
@@:
mov BYTE PTR [eax],0
inc ebp
;call newObject
jmp read_chunk
CHUNK_VERTLIST:
push esi
push edi
mov esi,ebp
movzx eax,WORD PTR[esi] ; nb vertices
mov ebx,12 ; 3 points par vertices
mul ebx
push eax
push eax
push GPTR
call GlobalAlloc
mov Objets.Pt_Vertex, eax
add esi,2
mov edi, Objets.Pt_Vertex
pop ecx
rep movsb
pop edi
pop esi
sub esi,6
add ebp,esi
jmp read_chunk
CHUNK_FACELIST:
push esi
push edi
mov esi,ebp
movzx eax,WORD PTR[esi] ; nb Polygon
mov Objets.Nb_Poylgon,ax
mov ebx,8 ; 4 points par Polygon (3 + flag)
mul ebx
push eax
push eax
push GPTR
call GlobalAlloc
mov Objets.Pt_Polygon, eax
add esi,2
mov edi,Objets.Pt_Polygon
pop ecx
rep movsb
pop edi
pop esi
sub esi,6
add ebp,esi
jmp read_chunk
CHUNK_MAPLIST:
push esi
push edi
mov esi,ebp
movzx eax,WORD PTR[esi] ; nb Map coord
mov ebx,8 ; 2 points par map
mul ebx
push eax
push eax
push GPTR
call GlobalAlloc
mov Objets.Pt_Map_Cord, eax
add esi,2
mov edi,Objets.Pt_Map_Cord
pop ecx
rep movsb
pop edi
pop esi
sub esi,6
add ebp,esi
jmp read_chunk
CHUNK_MAPFILE:
mov eax, offset Temp_String
@@:
mov bl,BYTE PTR [ebp]
mov [eax],bl
test bl,bl
je @f
inc eax
inc ebp
jmp short @b
@@:
mov BYTE PTR [eax],0
inc ebp
push offset Temp_String
call LoadGLTexture
mov Objets.textureId,eax
jmp read_chunk
CHUNK_MATNAME:
mov eax, offset Temp_String
@@:
mov bl,BYTE PTR [ebp]
mov [eax],bl
test bl,bl
je @f
inc eax
inc ebp
jmp short @b
@@:
mov BYTE PTR [eax],0
inc ebp
;call newMaterial
jmp read_chunk
Load_3d endp
LoadGLTexture PROC file_texture:DWORD
LOCAL info: BITMAP
push edi
cmp N_Texture,0
jne @f
push offset texture
push Max_Texture
call glGenTextures
@@:
push LR_LOADFROMFILE or LR_CREATEDIBSECTION
push 0
push 0
push IMAGE_BITMAP
push file_texture
push 0
call LoadImage
test eax,eax
jne @f
push MB_ICONERROR
push offset string_file_not_found
push file_texture
push 0
call MessageBox
pop edi
ret
@@:
MOV Temp_DD,eax
lea edi,Temp_DD
MOV ebx,N_Texture
push texture[ebx]
push GL_TEXTURE_2D
call glBindTexture
push GL_REPEAT
push GL_TEXTURE_WRAP_S
push GL_TEXTURE_2D
call glTexParameteri
push GL_REPEAT
push GL_TEXTURE_WRAP_T
push GL_TEXTURE_2D
call glTexParameteri
push GL_LINEAR
push GL_TEXTURE_MAG_FILTER
push GL_TEXTURE_2D
call glTexParameteri
push GL_LINEAR_MIPMAP_NEAREST
push GL_TEXTURE_MIN_FILTER
push GL_TEXTURE_2D
call glTexParameteri
invoke GetObject,[edi],sizeof info,addr info
push GL_REPLACE
push GL_TEXTURE_ENV_MODE
push GL_TEXTURE_ENV
call glTexEnvi
push info.bmBits
push GL_UNSIGNED_BYTE
push GL_BGR_EXT
push 0
push info.bmHeight
push info.bmWidth
push 4
push 0
push GL_TEXTURE_2D
call glTexImage2D
push info.bmBits
push GL_UNSIGNED_BYTE
push GL_BGR_EXT
push info.bmHeight
push info.bmWidth
push 4
push GL_TEXTURE_2D
call gluBuild2DMipmaps
push Temp_DD
call DeleteObject
pop edi
MOV eax,N_Texture
inc N_Texture
ret
LoadGLTexture endp
draw_3d proc
invoke glEnable,GL_CULL_FACE
invoke glEnable,GL_TEXTURE_2D
mov ebx,Objets.textureId
invoke glBindTexture,GL_TEXTURE_2D,texture[ebx]
invoke glBegin,GL_TRIANGLES
push edi
push esi
push ebp
xor eax,eax
mov count,eax
dec Objets.Nb_Poylgon
.while (ax < Objets.Nb_Poylgon)
; 1 vertex
shl eax,3 ; 1 poly = 4 pts = 8 octets
add eax,Objets.Pt_Polygon
mov esi,eax
;1er vertice
movzx eax,WORD PTR[eax]
mov ebx,eax
shl eax,3 ; 2 points par map
mov edi,eax
add edi,Objets.Pt_Map_Cord
push edi
call glTexCoord2fv
mov eax,ebx
mov ebx,12 ; 3 points par vertice
mul ebx
mov edi,eax
add edi,Objets.Pt_Vertex
push edi
call glVertex3fv
;2nd vertice
mov eax,esi
add eax,2
movzx eax,WORD PTR[eax]
mov ebx,eax
shl eax,3 ; 2 points par map
mov edi,eax
add edi,Objets.Pt_Map_Cord
push edi
call glTexCoord2fv
mov eax,ebx
mov ebx,12 ; 3 points par vertice
mul ebx
mov edi,eax
add edi,Objets.Pt_Vertex
push edi
call glVertex3fv
;3eme vertice
mov eax,esi
add eax,4
movzx eax,WORD PTR[eax]
mov ebx,eax
shl eax,3 ; 2 points par map
mov edi,eax
add edi,Objets.Pt_Map_Cord
push edi
call glTexCoord2fv
mov eax,ebx
mov ebx,12 ; 3 points par verice
mul ebx
mov edi,eax
add edi,Objets.Pt_Vertex
push edi
call glVertex3fv
inc count
mov eax, count
.endw
call glEnd
push GL_TEXTURE_2D
call glDisable
push GL_CULL_FACE
call glDisable ; desactive les faces cachés
pop ebp
pop esi
pop edi
ret
draw_3d endp
Historique
- 16 septembre 2006 17:33:39 :
- rajout d'un nportion de code manquante
Sources de la même categorie
Commentaires
|
CalendriCode
| | | L | M | M | J | V | S | D |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | | | | | |
|
Téléchargements
Logiciels à télécharger sur le même thème :
|