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

Read mesh and write to bb data by markcw
(Posted 20 years ago)
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

markcw
(Posted 20 years ago)
This is the second part. It creates meshes from the data labels.

;Read Data Write Mesh, 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

Restore yourname_x ;yourname_mesh1_x ;mesh data label

mesh=ReadDataWriteMesh() ;mesh out

tex=LoadTexture("yourname.bmp")
If CountChildren(mesh)=0 ;one mesh
 EntityTexture mesh,tex
Else ;multiple mesh
 For i=1 To CountChildren(mesh)
  child=GetChild(mesh,i) : EntityTexture child,tex
 Next
EndIf

;Main loop
While Not KeyHit(1) Or KeyHit(57) ;esc or space key
 RenderWorld

 TurnEntity mesh,0.3,0.2,0.1

 If KeyHit(17) wf=Not wf : WireFrame wf ;W key

 Text 0,0,"children="+CountChildren(mesh)

 Flip
Wend

;Includes
Include "temp.bb"

;Functions
Function ReadDataWriteMesh()
 ;Creates a mesh, or mesh hierarchy, from a data label

 Local mesh,child,surf,nmeshes,nverts,ntris,onetriuvset,mi,vi
 Local px#,py#,pz#,rx#,ry#,rz#,vx#,vy#,vz#,vu#,vv#,v0,v1,v2

 ;create mesh
 mesh=CreateMesh() : child=mesh
 nmeshes=1
 For mi=1 To nmeshes
  Read nmeshes ;1st value is nMeshes
  If nmeshes>1 Then child=CreateMesh(mesh)
  surf=CreateSurface(child)
  Read nverts ;2nd value is nVerts
  Read ntris ;3rd value is nTris
  Read onetriuvset ;4th value is onetriuvset
  Read px# : Read py# : Read pz# ;5th..7th value is xyz position
  PositionEntity child,px#,py#,pz#
  Read rx# : Read ry# : Read rz# ;8th..10th value is pitch/yaw/roll
  RotateEntity child,rx#,ry#,rz#
  For vi=0 To nverts-1 ;vertices, nVerts*3
   Read vx# : Read vy# : Read vz#
   AddVertex(surf,vx#,vy#,vz#)
  Next
  If onetriuvset<2 And (onetriuvset=0 Or mi=1)
   For vi=0 To nverts-1 ;uv coords, nVerts*2
    Read vu# : Read vv#
    VertexTexCoords surf,vi,vu#,vv#
   Next
   For vi=0 To ntris-1 ;triangles, nTris*3
    Read v0 : Read v1 : Read v2
    AddTriangle(surf,v0,v1,v2)
   Next
  EndIf
  UpdateNormals child ;set normals
 Next

 Return mesh ;mesh handle

End Function

Function ReadDataMorphMesh(mesh)
 ;Vertex morphs a mesh from a data label

 Local surf,nmeshes,nverts,ntris,onetriuvset,vi,vx#,vy#,vz#,vu#,vv#

 ;vertex morph mesh
 surf=GetSurface(mesh,1)
 Read nmeshes ;1st value is nMeshes
 Read nverts ;2nd value is nVerts
 Read ntris ;3rd value is nTris
 Read onetriuvset ;4th value is onetriuvset
 Read vx# : Read vy# : Read vz# ;5th..7th value is xyz position
 Read vx# : Read vy# : Read vz# ;8th..10th value is pitch/yaw/roll
 For vi=0 To nverts-1 ;vertices, nVerts*3
  Read vx# : Read vy# : Read vz#
  VertexCoords surf,vi,vx#,vy#,vz#
 Next
 If onetriuvset=0
  For vi=0 To nverts-1 ;uv coords, nVerts*2
   Read vu# : Read vv#
   VertexTexCoords surf,vi,vu#,vv#
  Next
 EndIf

 Return mesh ;mesh handle

End Function


Code Archives Forum