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