Author Topic: Here's a .B3D(Blitz3D) loader...  (Read 3525 times)

0 Members and 1 Guest are viewing this topic.

Offline Dr_D

  • Atari ST
  • ***
  • Posts: 151
  • Karma: 29
    • View Profile
Here's a .B3D(Blitz3D) loader...
« on: December 11, 2006 »
It was ported to FreeBASIC as an experiment. We're experimenting with different file formats for our Rogue3D game. When I say we, I mean rdc and I are working on a Rogue3D game. hehehe  :cheers:

I haven't fully tested any models with this yet, but it seems to be printing the correct vertices & stuff. I hope someone gets some use out of it. ;)

Code: [Select]
Const False = 0, True = Not False

#define Chunk_ID(a,b,c,d) ( ((a)) Or (b Shl(8)) Or (c Shl(16)) Or (d Shl(24)))
#define Chunk_2String(_Chunk) Chr$(_Chunk)+Chr$(_Chunk Shr 8)+Chr$(_Chunk Shr 16)+Chr$(_Chunk Shr 24)
#define ID_BB3DÂ  Chunk_ID( Asc("B"), Asc("B"), Asc("3"), Asc("D") )
#define ID_TEXSÂ  Chunk_ID( Asc("T"), Asc("E"), Asc("X"), Asc("S") )
#define ID_VRTSÂ  Chunk_ID( Asc("V"), Asc("R"), Asc("T"), Asc("S") )
#define ID_ANIMÂ  Chunk_ID( Asc("A"), Asc("N"), Asc("I"), Asc("M") )
#define ID_KEYSÂ  Chunk_ID( Asc("K"), Asc("E"), Asc("Y"), Asc("S") )
#define ID_BRUSÂ  Chunk_ID( Asc("B"), Asc("R"), Asc("U"), Asc("S") )
#define ID_TRISÂ  Chunk_ID( Asc("T"), Asc("R"), Asc("I"), Asc("S") )
#define ID_MESHÂ  Chunk_ID( Asc("M"), Asc("E"), Asc("S"), Asc("H") )
#define ID_BONEÂ  Chunk_ID( Asc("B"), Asc("O"), Asc("N"), Asc("E") )


Declare Sub b3dExitChunk()
Declare Sub Read_String( Byval File_Num As Uinteger, Byref tString As String )
Declare Sub b3dSetFile( Byref file As Uinteger )
Declare Function Dump_B3D() As Integer
Declare Function b3dReadByte() As Byte
Declare Function b3dReadInt() As Integer
Declare Function b3dReadFloat() As Single
Declare Function b3dReadString() As String
Declare Function b3dReadChunk() As String
Declare Function b3dChunkSize() As Integer


Dim Shared As Integer b3d_Stack(100), b3d_file, b3d_tos
Dim As Uinteger File_Num = Freefile
b3dSetFile( File_Num )

Open "Models/B3D/Test_Cylinder.b3d" For Binary As #File_Num

  Â  Dim As String Chunk
  Â  Dim As Integer Version

  Â  If b3dReadChunk()<>"BB3D" Then
  Â  Â  Â  Print "Invalid b3d file"
  Â  End If
  Â  Version = b3dReadInt()/100
  Â  Print Version
  Â  If Version>0 Then
  Â  Â  Â  Print "Invalid b3d file version"
  Â  End If

  Â  Dump_B3D( )

Close #File_Num
Sleep





Function Dump_B3D() As Integer
  Â  
  Â  Dim As String tname, Chunk
  Â  Dim As Integer flags, n_frames, n_keys, sz, frame, blend, n_texs, k, j, tex_id
  Â  Dim As Integer tc_sets, tc_size, n_verts, brush_id
  Â  Dim As Integer v0,v1,v2, n_tris, n_weights, vertex_id
  Â  Dim As Single fps = Any, fx = Any, weight = Any
  Â  Dim As Single key_px = Any, key_py = Any, key_pz = Any
  Â  Dim As Single key_sx = Any, key_sy = Any, key_sz = Any
  Â  Dim As Single key_rw = Any, key_rx = Any, key_ry = Any, key_rz = Any
  Â  Dim As Single x_pos = Any, y_pos = Any, z_pos = Any
  Â  Dim As Single x_scl = Any, y_scl = Any, z_scl = Any
  Â  Dim As Single w_rot = Any, x_rot = Any, y_rot = Any, z_rot = Any
  Â  Dim As Single rot = Any, lfa = Any
  Â  Dim As Single red = Any, grn = Any, blu = Any, alp = Any, shi = Any
  Â  Dim As Single x = Any, y = Any, z = Any
  Â  Dim As Single nx = Any, ny = Any, nz = Any
  Â  
  Â  
  Â  Do While b3dChunkSize()
  Â  Â  Â  Â  Â  Â  Â  chunk = b3dReadChunk()
  Â  Â  Â  Print "Chunk: " & chunk & " size =" & b3dchunksize()
  Â  Â  Â  
  Â  Â  Â  Â  Â  Â  Â  Select Case chunk
  Â  Â  Â  Â  Â  Â  Â  Case "ANIM"
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  flags  Â  = b3dReadInt()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  n_frames = b3dReadInt()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  fps  Â  Â  = b3dReadFloat()
  Â  Â  Â  Â  Â  Print "Animation Flags/fps " & flags & "/" & fps
  Â  Â  Â  Case "KEYS"
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  flags=b3dReadInt()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  sz=4
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  If flags And 1 Then sz=sz+12
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  If flags And 2 Then sz=sz+12
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  If flags And 4 Then sz=sz+16
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  n_keys=b3dChunkSize()/sz
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  If n_keys*sz=b3dChunkSize() Then
  Â  Â  Â  Â  Â  Â  Â  Print "keys " & n_keys
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  'read all keys in chunk
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  While b3dChunkSize()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  frame = b3dReadInt()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  If flags And 1 Then
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  key_px = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  key_py = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  key_pz = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  End If
  Â  Â  Â  Â  Â  Â  Â  Â  Â  If flags And 2 Then
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  key_sx = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  key_sy = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  key_sz = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  End If
  Â  Â  Â  Â  Â  Â  Â  Â  Â  If flags And 4 Then
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  key_rw = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  key_rx = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  key_ry = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  key_rz = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  End If
  Â  Â  Â  Â  Â  Â  Â  Wend
  Â  Â  Â  Â  Â  Else
  Â  Â  Â  Â  Â  Â  Â  Print "Illegal number of keys!!!"
  Â  Â  Â  Â  Â  End If
  Â  Â  Â  Case "TEXS"
  Â  Â  Â  Â  Â  While b3dChunkSize()
  Â  Â  Â  Â  Â  Â  Â  tname = b3dReadString()
  Â  Â  Â  Â  Â  Â  Â  flags = b3dReadInt()
  Â  Â  Â  Â  Â  Â  Â  blend = b3dReadInt()
  Â  Â  Â  Â  Â  Â  Â  x_pos = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  y_pos = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  x_scl = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  y_scl = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  rot  Â = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  Print tname
  Â  Â  Â  Â  Â  Wend
  Â  Â  Â  Case "BRUS"
  Â  Â  Â  Â  Â  n_texs=b3dReadInt()
  Â  Â  Â  Â  Â  'read all brushes in chunk...
  Â  Â  Â  Â  Â  While b3dChunkSize()
  Â  Â  Â  Â  Â  Â  Â  tname = b3dReadString$()
  Â  Â  Â  Â  Â  Â  Â  red  Â = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  grn  Â = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  blu  Â = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  alp  Â = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  shi  Â = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  blend = b3dReadInt()
  Â  Â  Â  Â  Â  Â  Â  fx  Â  = b3dReadInt()
  Â  Â  Â  Â  Â  Â  Â  For k=0 To n_texs-1
  Â  Â  Â  Â  Â  Â  Â  Â  Â  tex_id=b3dReadInt()
  Â  Â  Â  Â  Â  Â  Â  Next
  Â  Â  Â  Â  Â  Â  Â  Print tname
  Â  Â  Â  Â  Â  Wend
  Â  Â  Â  Case "VRTS"
  Â  Â  Â  Â  Â  flags  Â = b3dReadInt()
  Â  Â  Â  Â  Â  tc_sets = b3dReadInt()
  Â  Â  Â  Â  Â  tc_size = b3dReadInt()
  Â  Â  Â  Â  Â  sz=12+tc_sets*tc_size*4
  Â  Â  Â  Â  Â  If flags And 1 Then sz = sz + 12
  Â  Â  Â  Â  Â  If flags And 2 Then sz = sz + 16
  Â  Â  Â  Â  Â  n_verts=b3dChunkSize()/sz
  Â  Â  Â  Â  Â  If n_verts*sz = b3dChunkSize() Then
  Â  Â  Â  Â  Â  Â  Â  Print "vertex count: " & n_verts
  Â  Â  Â  Â  Â  Â  Â  'read all verts in chunk
  Â  Â  Â  Â  Â  Â  Â  While b3dChunkSize()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  x = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  y = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  z = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Print x,y,z
  Â  Â  Â  Â  Â  Â  Â  Â  Â  If flags And 1 Then
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  nx = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  ny = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  nz = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  End If
  Â  Â  Â  Â  Â  Â  Â  Â  Â  If flags And 2 Then
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  red = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  grn = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  blu = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  lfa = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  End If
  Â  Â  Â  Â  Â  Â  Â  Â  Â  'read tex coords...
  Â  Â  Â  Â  Â  Â  Â  Â  Â  For j=1 To tc_sets*tc_size
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Dim As Single t
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  Â  t = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  Next
  Â  Â  Â  Â  Â  Â  Â  Wend
  Â  Â  Â  Â  Â  Else
  Â  Â  Â  Â  Â  Â  Â  Print "Illegal number of vertices!!!"
  Â  Â  Â  Â  Â  End If
  Â  Â  Â  Case "TRIS"
  Â  Â  Â  Â  Â  brush_id = b3dReadInt()
  Â  Â  Â  Â  Â  sz=12
  Â  Â  Â  Â  Â  n_tris = b3dChunkSize()/sz
  Â  Â  Â  Â  Â  If n_tris * sz = b3dChunkSize() Then
  Â  Â  Â  Â  Â  Â  Â  Print "Triangle count: " & n_tris
  Â  Â  Â  Â  Â  Â  Â  'read all tris in chunk
  Â  Â  Â  Â  Â  Â  Â  While b3dChunkSize()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  v0 = b3dReadInt()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  v1 = b3dReadInt()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  v2 = b3dReadInt()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  
  Â  Â  Â  Â  Â  Â  Â  Wend
  Â  Â  Â  Â  Â  Else
  Â  Â  Â  Â  Â  Â  Â  Print "Illegal number of triangles!!!"
  Â  Â  Â  Â  Â  End If
  Â  Â  Â  Case "MESH"
  Â  Â  Â  Â  Â  brush_id = b3dReadInt()
  Â  Â  Â  Â  Â  Print "Brush ID " & brush_id
  Â  Â  Â  Case "BONE"
  Â  Â  Â  Â  Â  sz=8
  Â  Â  Â  Â  Â  n_weights = b3dChunkSize()/sz
  Â  Â  Â  Â  Â  If n_weights * sz = b3dChunkSize() Then
  Â  Â  Â  Â  Â  Â  Â  'read all weights
  Â  Â  Â  Â  Â  Â  Â  Print "Weights " & n_weights
  Â  Â  Â  Â  Â  Â  Â  While b3dChunkSize()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  vertex_id = b3dReadInt()
  Â  Â  Â  Â  Â  Â  Â  Â  Â  weight = b3dReadFloat()
  Â  Â  Â  Â  Â  Â  Â  Wend
  Â  Â  Â  Â  Â  Else
  Â  Â  Â  Â  Â  Â  Â  Print "Illegal number of bone weights!!!"
  Â  Â  Â  Â  Â  End If
  Â  Â  Â  Case "NODE"
  Â  Â  Â  Â  Â  tname = b3dReadString$()
  Â  Â  Â  Â  Â  x_pos = b3dReadFloat()
  Â  Â  Â  Â  Â  y_pos = b3dReadFloat()
  Â  Â  Â  Â  Â  z_pos = b3dReadFloat()
  Â  Â  Â  Â  Â  x_scl = b3dReadFloat()
  Â  Â  Â  Â  Â  y_scl = b3dReadFloat()
  Â  Â  Â  Â  Â  z_scl = b3dReadFloat()
  Â  Â  Â  Â  Â  w_rot = b3dReadFloat()
  Â  Â  Â  Â  Â  x_rot = b3dReadFloat()
  Â  Â  Â  Â  Â  y_rot = b3dReadFloat()
  Â  Â  Â  Â  Â  z_rot = b3dReadFloat()
  Â  Â  Â  Â  Â  Print "name = " & tname
  Â  Â  Â  End Select
  Â  Â  Â  
  Â  Â  Â  Dump_B3D()  Â  Â  Â  Â  'load the sub_chunks
  Â  Â  Â  b3dExitChunk()  Â  Â  Â  Â  Â  Â  Â  'exit this chunk
  Â  Â  Â  
  Â  Loop
  Â  Return True
End Function



Sub b3dSetFile( Byref file As Uinteger )
  Â  Â  Â  b3d_tos=0
  Â  Â  Â  b3d_file = file
End Sub

Function b3dReadByte() As Byte
  Â  Dim As Byte rbyte
  Â  Get #b3d_file,, rbyte
  Â  Â  Â  Return rbyte
End Function

Function b3dReadInt() As Integer
  Â  Dim As Integer rInt
  Â  Get #b3d_file,, rInt
  Â  Return rInt
End Function

Function b3dReadFloat() As Single
  Â  Dim As Single rFloat
  Â  Get #b3d_file,, rFloat
  Â  Return rFloat
End Function

Function b3dReadString() As String
  Â  Dim As String T
  Â  Dim As Byte ch
  Â  Â  Â  Do
  Â  Â  Â  Â  Â  Â  Â  ch=b3dReadByte()
  Â  Â  Â  Â  Â  Â  Â  If ch=0 Then
  Â  Â  Â  Â  Â  Return T
  Â  Â  Â  End If
  Â  Â  Â  Â  Â  Â  Â  T+=Chr$(ch)
  Â  Loop
End Function

Function b3dReadChunk() As String
  Â  Dim As Integer k, sz
  Â  Dim As String Tag
  Â  Â  Â  For k=1 To 4
  Â  Â  Â  Â  Â  Â  Â  tag+=Chr$(b3dReadByte())
  Â  Next
  Â  Â  Â  sz = b3dReadInt()
  Â  Â  Â  b3d_tos+=1
  Â  Â  Â  b3d_stack(b3d_tos) = Seek(b3d_file)+sz
  Â  Â  Â  Return Tag
End Function

Sub b3dExitChunk()
  Â  Seek b3d_file, b3d_stack(b3d_tos)
  Â  Â  Â  b3d_tos-=1
End Sub

Function b3dChunkSize() As Integer
  Â  Dim As Integer rint
  Â  Â  Â  rint = b3d_stack(b3d_tos)- Seek(b3d_file)
  Â  Return rint
End Function
The Dr. is INsane!!!

Offline Stonemonkey

  • Pentium
  • *****
  • Posts: 1315
  • Karma: 96
    • View Profile
Re: Here's a .B3D(Blitz3D) loader...
« Reply #1 on: December 11, 2006 »
Nice one Dr_D, something I'm in need of is some kind of loader so this could be handy.

Offline Dr_D

  • Atari ST
  • ***
  • Posts: 151
  • Karma: 29
    • View Profile
Re: Here's a .B3D(Blitz3D) loader...
« Reply #2 on: December 12, 2006 »
Cool. The only real problem I can see with it, is the recursion. It might hit a stack overflow, if you send a structure in the header repeatedly. But... I haven't tested... hopefully, it wont.  :o
The Dr. is INsane!!!

Offline Clyde

  • A Little Fuzzy Wuzzy
  • DBF Aficionado
  • ******
  • Posts: 7271
  • Karma: 71
    • View Profile
Re: Here's a .B3D(Blitz3D) loader...
« Reply #3 on: December 14, 2006 »
Looks Smart Dr D dude.
Still Putting The IT Into Gravy
If Only I Knew Then What I Know Now.

Challenge Trophies Won:

Offline Dr_D

  • Atari ST
  • ***
  • Posts: 151
  • Karma: 29
    • View Profile
Re: Here's a .B3D(Blitz3D) loader...
« Reply #4 on: December 16, 2006 »
Thanks. ;) Anyone tried using it yet? I might have to end up using this. I don't really want to, but I'm having a hell of a time with this Lightwave loader. It seems like every time i port a new function, the loader has some other quirky function that also needs to be ported. It becomes a real pain in the arse when you don't know squat about C++.

A reason for the Lightwave loader? I model in Lightwave, almost exclusively... just because I love it. I've been working with Lightwave for a few years now. I just love the program. Those guys rock! :D

Anyway, I'd like to know if anyone reading this thread has had a successful attempt at loading, displaying, using weight-maps with this code. I haven't really tried yet because I've been working on the Lightwave loader so much. :)
The Dr. is INsane!!!