Code archives/3D Graphics - Mesh/MultiTextureModel->SingleTextureFile Convertor
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| This program converts a multi-surface multi-textured model into a single surface single textured model. It supports a model of up to 4 textures and outputs two files with 4in1 in the name. The .x exporter is David Bird's from the code archives. The 4in1 texture will need to be re-applied to the mesh. Written because I needed it, shared because it actually worked. | |||||
Graphics3D 640,480,0,2
Global source$="source.3ds"
Global model=LoadMesh(source)
Global vQ=0
Type vert
Field index
Field surface
Field x#
Field y#
Field z#
Field u#
Field v#
Field w#
Field nx#
Field ny#
Field nz#
End Type
Type tri
Field vertA,vertB,vertC
End Type
compileMesh
Function compileMesh()
texture=CreateImage(512,512)
For s=1 To CountSurfaces(model)
surface=GetSurface(model,s)
brush=GetSurfaceBrush(surface)
tex=GetBrushTexture(brush)
FreeBrush brush
uOff=0 : vOff=0
If s=2 Then uOff=256
If s=3 Then vOff=256
If s=4 Then uOff=256 : vOff=256
CopyRect 0,0,256,256,uOff,vOff,TextureBuffer(tex),ImageBuffer(texture)
FreeTexture tex
For tr=0 To CountTriangles(surface)
t.tri=New tri
t\vertA=TriangleVertex(surface,tr,0)
t\vertB=TriangleVertex(surface,tr,1)
t\vertC=TriangleVertex(surface,tr,2)
If t\vertA>CountVertices(surface) Or t\vertB>CountVertices(surface) Or t\vertC>CountVertices(surface)
Delete t
Else
t\vertA=checkVertice(surface,t\vertA,s)
t\vertB=checkVertice(surface,t\vertB,s)
t\vertC=checkVertice(surface,t\vertC,s)
EndIf
Next
Next
mesh=CreateMesh()
surface=CreateSurface(mesh)
For v.vert=Each vert
AddVertex surface,v\x,v\y,v\z,v\u,v\v
Delete v
Next
For t.tri=Each tri
AddTriangle surface,t\vertA,t\vertB,t\vertC
Delete t
Next
SaveImage(texture,Left(source,Len(source)-4)+"4in1.bmp")
saveMeshX(mesh,Left(source,Len(source)-4)+"4in1.x")
End Function
Function checkVertice(surface,vertice,s)
offU#=0.0
offV#=0.0
If s=2 Then offU=.5
If s=3 Then offV=.5
If s=4 Then offU=.5 : offV=.5
vertExist=False
For v.vert=Each vert
If v\surface=surface
If v\x=VertexX(surface,vertice)
If v\y=VertexY(surface,vertice)
If v\z=VertexZ(surface,vertice)
If v\u=(VertexU(surface,vertice)/2.0)+offU
If v\v=(VertexV(surface,vertice)/2.0)+offV
If v\w=VertexW(surface,vertice)
If v\nx=VertexNX(surface,vertice)
If v\ny=VertexNY(surface,vertice)
If v\nz=VertexNZ(surface,vertice)
vertExist=True
foundVert=v\index
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
EndIf
Next
If Not vertExist
v.vert=New vert
v\index=vQ
v\surface=surface
v\x=VertexX(surface,vertice)
v\y=VertexY(surface,vertice)
v\z=VertexZ(surface,vertice)
v\u=(VertexU(surface,vertice)/2.0)+offU
v\v=(VertexV(surface,vertice)/2.0)+offV
v\w=VertexW(surface,vertice)
v\nx=VertexNX(surface,vertice)
v\ny=VertexNY(surface,vertice)
v\nz=VertexNZ(surface,vertice)
vQ=vQ+1
foundVert=v\index
EndIf
Return foundVert
End Function
; X File Saving Function (c)2001 David Bird
; dave@birdie72.freeserve.co.uk
; www.birdie72.freeserve.co.uk
Function SaveMeshX(mesh,file$)
;single surface at the moment
cnt=CountSurfaces(mesh)
If cnt=0 Then Return
;TODO Multi surface support
surf=GetSurface(mesh,1)
out=WriteFile(file$)
WriteLine out,"xof 0302txt 0064"
WriteLine out,""
WriteLine out,"Header {"
WriteLine out," 1;"
WriteLine out," 0;"
WriteLine out," 1;"
WriteLine out,"}"
WriteLine out,""
WriteLine out,"Frame frm_Scene_Root {"
WriteLine out," FrameTransformMatrix {"
WriteLine out," 1.000000,0.000000,0.000000,0.000000,"
WriteLine out," 0.000000,1.000000,0.000000,0.000000,"
WriteLine out," 0.000000,0.000000,1.000000,0.000000,"
WriteLine out," 0.000000,0.000000,0.000000,1.000000;"
WriteLine out,"}"
WriteLine out,""
name$=EntityName$(mesh)
If name$="" Then name$="Unknown"
WriteLine out,"Frame frm_"+name$+" {"
WriteLine out," FrameTransformMatrix {"
WriteLine out," 1.000000,0.000000,0.000000,0.000000,"
WriteLine out," 0.000000,1.000000,0.000000,0.000000,"
WriteLine out," 0.000000,0.000000,1.000000,0.000000,"
WriteLine out," 0.000000,0.000000,0.000000,1.000000;"
WriteLine out,"}"
WriteLine out,""
WriteLine out," Mesh frm_"+name$+" {"
WriteLine out,CountVertices(surf)+";"
For a=0 To CountVertices(surf)-1
WriteLine out,VertexX(surf,a)+";"+VertexY(surf,a)+";"+VertexZ(surf,a)+";,"
Next
WriteLine out,""
WriteLine out," "+CountTriangles(surf)+";"
For a=0 To CountTriangles(surf)-1
in1=TriangleVertex(surf,a,0)
in2=TriangleVertex(surf,a,1)
in3=TriangleVertex(surf,a,2)
ln$=" 3;"+in1+","+in2+","+in3+";"
If a=CountTriangles(surf)-1 Then ln$=ln$+";" Else ln$=ln$+","
WriteLine out,ln$
Next
WriteLine out,""
WriteLine out,"MeshMaterialList {"
WriteLine out,"1;"
WriteLine out,"1;"
WriteLine out,"0;;"
WriteLine out,""
WriteLine out,"Material {"
WriteLine out," 1.000000,1.000000,1.000000,1.000000;;";rgba
WriteLine out," 1.000000;"
WriteLine out," 0.500000,0.500000,0.500000;;"
WriteLine out," 0.000000,0.000000,0.000000;;"
WriteLine out,"}"
WriteLine out,"}"
WriteLine out,""
WriteLine out,"MeshNormals {"
WriteLine out,CountVertices(surf)+";"
For a=0 To CountVertices(surf)-1
WriteLine out,VertexNX(surf,a)+";"+VertexNY(surf,a)+";"+VertexNZ(surf,a)+";,"
Next
WriteLine out," "+CountTriangles(surf)+";"
For a=0 To CountTriangles(surf)-1
in1=TriangleVertex(surf,a,0)
in2=TriangleVertex(surf,a,1)
in3=TriangleVertex(surf,a,2)
ln$=" 3;"+in1+","+in2+","+in3+";"
If a=CountTriangles(surf)-1 Then ln$=ln$+";" Else ln$=ln$+","
WriteLine out,ln$
Next
WriteLine out,"}"
WriteLine out,""
WriteLine out,"MeshTextureCoords {"
WriteLine out,CountVertices(surf)+";"
For a=0 To CountVertices(surf)-1
ln$=VertexU(surf,a)+";"+VertexV(surf,a)+";"
If a=CountVertices(surf)-1 Then ln$=ln$+";" Else ln$=ln$+","
WriteLine out,ln$
Next
WriteLine out," }"
WriteLine out," }"
WriteLine out," }"
WriteLine out,"}"
CloseFile out
End Function |
Comments
| ||
| Hey, now THIS could come in very very handy indeed! |
| ||
| I should also say the code fixes the texture at 512x512 and expects the source textures to be 256x256 as that's what the model I was converting had, but it shouldn't be too hard to tweek. |
| ||
| Oops, yup. I'll have to tweak. I want to use it on a large chunk of an entire level :P Still, good work! BTW, I just got my first pair (kay okay, second pair) of... "Spectacles".... |
Code Archives Forum