Code archives/3D Graphics - Mesh/DirectX X File Exporter
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| Here's a tidied up version of my DirectX mesh exporter. Call it with savemeshdx9(mesh,file$) e.g. savemeshdx9(mymesh,"mymesh.x") You must supply an array of texture names for each surface in SurfaceTexture(). [Edit] Just posted fixed version, have tested with a few meshes, looks OK. [Edit] New code 12/11/04 Texture ripping does not work yet. Vertexcolor/alpha is saved but does not load correctly...could be a bug need to check out those brackets ^^ | |||||
;savemeshdx9(mymesh,"mymesh.x")
Function savemeshdx9(mesh,file$)
NumberofSurfaces=CountSurfaces(mesh)
If NumberofSurfaces=0 Return
output=WriteFile(file$)
WriteLine output,"xof 0302txt 0064"
WriteLine output,""
;Header
WriteLine output,"Header {"
WriteLine output,"1;"
WriteLine output,"0;"
WriteLine output,"1;"
WriteLine output,"}"
WriteLine output,""
;TX Matrix
WriteLine output,"Frame Root {"
WriteLine output," FrameTransformMatrix {"
WriteLine output," 1.000000, 0.000000, 0.000000, 0.000000,"
WriteLine output," 0.000000, 1.000000, 0.000000, 0.000000,"
WriteLine output," 0.000000, 0.000000, 1.000000, 0.000000,"
WriteLine output," 0.000000, 0.000000, 0.000000, 1.000000;;"
WriteLine output,"}"
WriteLine output,""
For s=1 To NumberofSurfaces
Surface=GetSurface(mesh,s)
MeshName$="Mesh Surface_"+s+" {"
WriteLine output,MeshName$
NumberofVertices=CountVertices(Surface)
WriteLine output,NumberofVertices+";"
For v=0 To NumberofVertices-2
WriteLine output,VertexX(Surface,v)+";"+VertexY(Surface,v)+";"+VertexZ(Surface,v)+";,"
Next
WriteLine output,VertexX(Surface,v)+";"+VertexY(Surface,v)+";"+VertexZ(Surface,v)+";;"
;WriteLine output,""
NumberofTriangles=CountTriangles(Surface)
WriteLine output," "+NumberofTriangles+";"
For t=0 To NumberofTriangles-2
index1=TriangleVertex(Surface,t,0)
index2=TriangleVertex(Surface,t,1)
index3=TriangleVertex(Surface,t,2)
tl$=" 3;"+index1+","+index2+","+index3+";,"
WriteLine output,tl$
Next
index1=TriangleVertex(Surface,t,0)
index2=TriangleVertex(Surface,t,1)
index3=TriangleVertex(Surface,t,2)
tl$=" 3;"+index1+","+index2+","+index3+";;"
WriteLine output,tl$
;WriteLine output,""
WriteLine output,"MeshMaterialList {"
WriteLine output,"1;"
WriteLine output,"1;"
WriteLine output,"0;;"
WriteLine output,""
WriteLine output,"Material {"
WriteLine output,"1.000000;1.000000;1.000000;1.000000;;"
WriteLine output,"0.000000;"
WriteLine output,"1.000000;1.000000;1.000000;;"
WriteLine output,"0.000000;0.000000;0.000000;;"
WriteLine output,"TextureFilename {"
;new code not working
b=GetSurfaceBrush(Surface)
bt=GetBrushTexture(b)
use_tex$=TextureName$(bt)
FreeTexture bt
FreeBrush b
; so strip the path
For i2= Len(use_tex$) To 1 Step -1
If Mid$(use_tex$,i2,1)="\" Then
use_tex$=Right$(use_tex$,Len(use_tex$)-i2)
Exit
EndIf
Next
If use_tex$="" Then use_tex$="xxx.jpg"
WriteLine output,Chr$(34)+use_tex$+Chr$(34)+";"
;WriteLine output,Chr$(34)+SurfaceTexture(s)+Chr$(34)+";"
WriteLine output,"}"
WriteLine output,"}"
WriteLine output,"}"
WriteLine output,"MeshNormals {"
WriteLine output,NumberofVertices+";"
For v=0 To NumberofVertices-1
vnx#=VertexNX(Surface,v)
vny#=VertexNY(Surface,v)
vnz#=VertexNZ(Surface,v)
l$=vnx#+";"+vny#+";"+vnz#+";"
If v=NumberofVertices-1 Then l$=l$+";" Else l$=l$+","
WriteLine output,l$
Next
WriteLine output," "+NumberofTriangles+";"
For t=0 To NumberofTriangles-1
in1=TriangleVertex(Surface,t,0)
in2=TriangleVertex(Surface,t,1)
in3=TriangleVertex(Surface,t,2)
l$=" 3;"+in1+","+in2+","+in3+";"
If t=NumberofTriangles-1 Then l$=l$+";" Else l$=l$+","
WriteLine output,l$
Next
WriteLine output,"}"
WriteLine output,"MeshTextureCoords {"
WriteLine output,NumberofVertices+";"
For v=0 To NumberofVertices-1
tc$=VertexU(Surface,v)+";"+VertexV(Surface,v)+";"
If v=NumberofVertices-1 Then tc$=tc$+";" Else tc$=tc$+","
WriteLine output,tc$
Next
;WriteLine output,"}"
WriteLine output,"}"
WriteLine output,"}"
;meshvertexcolors
WriteLine output,"MeshVertexColors {"
WriteLine output,NumberofVertices+";"
For v=0 To NumberofVertices-1
tc$=v+";"
tc$=tc$+VertexRed#(Surface,v)+";"
tc$=tc$+VertexGreen#(Surface,v)+";"
tc$=tc$+VertexBlue#(Surface,v)+";"
tc$=tc$+VertexAlpha#(Surface,v)+";"
If v=NumberofVertices-1 Then tc$=tc$+";" Else tc$=tc$+","
WriteLine output,tc$
Next
WriteLine output,"}"
;WriteLine output,"}"
Next
WriteLine output,"}"
WriteLine output,"}"
CloseFile output
End Function |
Comments
| ||
| it wont work.. on any blitz created mesh.. internally with createsphere() ect.. or with other loaded meshes.. from loadmesh |
| ||
| New version posted! Not sure what happened there =/ When I get time I'll try and get it to rip the texture names from your meshes and entity colours too if poss...very busy atm -.- |
| ||
| *making compatibility easier u are. im a free3d modeller hunter, so this 'll increase my product usage range: thanks |
| ||
| For automatic texture assigments REPLACE WriteLine output,Chr$(34)+SurfaceTexture(s)+Chr$(34)+";" WITH THIS b=GetSurfaceBrush(surface) bt=GetBrushTexture(b) use_tex$=TextureName$(bt) ; so strip the path For i2= Len(use_tex$) To 1 Step -1 If Mid$(use_tex$,i2,1)="\" Then use_tex$=Right$(use_tex$,Len(use_tex$)-i2) Exit EndIf Next WriteLine output,Chr$(34)+use_tex$+Chr$(34)+";" |
| ||
| Now if someone can help me figure out how to save vertex color, and alpha.. also save double sided material(no backface culling) AND Mask color. ! |
| ||
| RifRaf: I think you're missing a freebrush b in that ? From the help: "Remember, GetSurfaceBrush actually creates a new brush so don't forget to free it afterwards using FreeBrush to prevent memory leaks. " |
| ||
| your right.. sorry.. youll need to free the b brush |
| ||
| And : "You should release the texture returned by GetBrushTexture after use to prevent leaks! Use FreeTexture to do this. " Like this then?: b=GetSurfaceBrush(surface) bt=GetBrushTexture(b) use_tex$=TextureName$(bt) freetexture bt freebrush b ; so strip the path For i2= Len(use_tex$) To 1 Step -1 If Mid$(use_tex$,i2,1)="\" Then use_tex$=Right$(use_tex$,Len(use_tex$)-i2) Exit EndIf Next WriteLine output,Chr$(34)+use_tex$+Chr$(34)+";" |
Code Archives Forum