Code archives/File Utilities/Read mesh and write to bb data
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| This is another 2-part code entry. It is designed to pack meshes inside a blitz executable and then create them from data labels. The first part reads a mesh, or mesh hierarchy, and writes it to a bb data file. The second part reads the data, as an include, and creates the mesh. It uses a special format to store the data which is: nMeshes, nVerts, nTris, onetriuvset, xposition, yposition, zposition, pitch, yaw, roll, vertexx, vertexy, vertexz... vertexu, vertexv... vertex0, vertex1, vertex2 It was written to store vertex morphed meshes that have a single texture. Limitations are: only stores one uv coord set; doesn't store any texture reference; mesh hierarchy is lost and ends up all on same hierarchy level; no animation. The onetriuvset value is used to tell whether the mesh data has any face/uv data. This is to save space for vertex morphing use. | |||||
;Read Mesh Write Data, on 8/10/06
Graphics3D 640,480,0,2
SetBuffer BackBuffer()
camera=CreateCamera() ;init world
PositionEntity camera,0,0,-5
light=CreateLight()
RotateEntity light,45,45,0
fileout$="temp.bb"
filein$="yourname.x" ;mesh in
meshtype=0 ;set mesh type
Select meshtype
Case 1
mesh=LoadAnimMesh(filein$)
Default
mesh=LoadMesh(filein$)
End Select
ok=ReadMeshWriteData(mesh,filein$,fileout$,1,0)
;Main loop
While Not KeyHit(1) Or KeyHit(57) ;esc or space keys
RenderWorld
TurnEntity mesh,0.3,0.2,0.1
If KeyHit(17) wf=Not wf : WireFrame wf ;W key
Text 0,0,"ok="+ok+" filein$="+filein$+" fileout$="+fileout$
Flip
Wend
Function ReadMeshWriteData(mesh,filein$,fileout$,onelabel,onetriuvset)
;Saves a mesh, or mesh hierarchy, as a bb data file
;mesh=mesh handle, filein$="mesh.x/3ds/b3d", fileout$="name.bb"
;onelabel=one data label per mesh, 0=all/1=one
;onetriuvset=one triangle/uv set per mesh, 0=all/1=one/2=none
Local file,child,surf,nmeshes,dotlen,si,mi,vi,vx#,vy#,vz#
;Write fileout.bb
If fileout$="" Then Return False ;fail code
file=WriteFile(fileout$)
If Not file Then Return False ;write fail
;write title comment
WriteStringAscii(file,";"+fileout$)
WriteByte file,13 : WriteByte file,10 ;newline
;calculate number of meshes
child=mesh
While child
For si=1 To CountSurfaces(child) : nmeshes=nmeshes+1 : Next
child=NextChild(child)
Wend
If onelabel=0 Then nmeshes=1
;write mesh/each child
child=mesh
While child
For si=1 To CountSurfaces(child)
surf=GetSurface(child,si) ;next surface
mi=mi+1 ;mesh index
dotlen=Instr(filein$,".",1)
;write data label
If onelabel=0 Or mi=1
WriteByte file,13 : WriteByte file,10 ;newline
WriteStringAscii(file,"."+Left(filein$,dotlen-1))
If onelabel=0 Then WriteStringAscii(file,"_mesh"+mi)
WriteStringAscii(file,"_"+Mid(filein$,dotlen+1,Len(filein$)-dotlen))
EndIf
;write mesh data
WriteByte file,13 : WriteByte file,10 ;newline
WriteStringAscii(file,"Data ")
WriteStringAscii(file,nmeshes) ;1st value is nMeshes
WriteStringAscii(file,","+CountVertices(surf)) ;2nd value is nVerts
WriteStringAscii(file,","+CountTriangles(surf)) ;3rd value is nTris
WriteStringAscii(file,","+onetriuvset) ;4th value is onetriuvset
WriteStringAscii(file,","+EntityX(child,1)) ;5th value is x position
WriteStringAscii(file,","+EntityY(child,1)) ;6th value is y position
WriteStringAscii(file,","+EntityZ(child,1)) ;7th value is z position
WriteStringAscii(file,","+EntityPitch(child,1)) ;8th value is pitch
WriteStringAscii(file,","+EntityYaw(child,1)) ;9th value is yaw
WriteStringAscii(file,","+EntityRoll(child,1)) ;10th value is roll
For vi=0 To CountVertices(surf)-1 ;vertices, nVerts*3
vx#=VertexX(surf,vi) : If Abs(vx#)<0.001 Then vx#=0 ;prevent errors
vy#=VertexY(surf,vi) : If Abs(vy#)<0.001 Then vy#=0
vz#=VertexZ(surf,vi) : If Abs(vz#)<0.001 Then vz#=0
WriteStringAscii(file,","+vx#)
WriteStringAscii(file,","+vy#)
WriteStringAscii(file,","+vz#)
Next
If onetriuvset<2 And (onetriuvset=0 Or mi=1)
For vi=0 To CountVertices(surf)-1 ;uv coords, nVerts*2
WriteStringAscii(file,","+VertexU(surf,vi,0))
WriteStringAscii(file,","+VertexV(surf,vi,0))
Next
For vi=0 To CountTriangles(surf)-1 ;triangles, nTris*3
WriteStringAscii(file,","+TriangleVertex(surf,vi,0))
WriteStringAscii(file,","+TriangleVertex(surf,vi,1))
WriteStringAscii(file,","+TriangleVertex(surf,vi,2))
Next
EndIf
Next
child=NextChild(child)
Wend
CloseFile file
Return True ;success code
End Function
Function WriteStringAscii(file,ascii$)
;file=file handle, ascii$=ascii string
Local i,char$
For i=1 To Len(ascii$)
char$=Mid(ascii$,i,1)
WriteByte(file,Asc(char$))
Next
End Function
Function NextChild(ent)
;Returns next child of entity as if it was on the same hierarchy level
;"NextChild(entity)", by Beaker
If CountChildren(ent)>0
Return GetChild(ent,1)
EndIf
Local foundunused=False
Local foundent=0,parent,sibling
While foundunused=False And ent<>0
parent=GetParent(ent)
If parent<>0
If CountChildren(parent)>1
If GetChild(parent,CountChildren(parent))<>ent
For siblingcnt=1 To CountChildren(parent)
sibling=GetChild(parent,siblingcnt)
If sibling=ent
foundunused=True
foundent=GetChild(parent,siblingcnt+1)
EndIf
Next
EndIf
EndIf
EndIf
ent=parent
Wend
Return foundent
End Function |
Comments
| ||
| This is the second part. It creates meshes from the data labels. |
Code Archives Forum