Can't get External Mesh Loader to work in irrBMAX

BlitzMax Forums/BlitzMax Programming/Can't get External Mesh Loader to work in irrBMAX

The forum is locked. These are the original blitzbasic.com forums, kept so they can still be read. No new topics, replies or edits can be made here. To join in, head over to the Blitz3D+ forums.

Ok, I'm getting closer. The program I have down here will attempt to open a b3d file called bridge.b3d, but in reality, it's set up to just make a cube, just for testing purposes. I did manage to get something to show on the screen, but not exactly what I expected. Just point the bridge.b3d to point to your own b3d file. Contents don't matter, you can even haev a .txt file renamed to .b3d since I don't have it reading from it yet anyway.
Strict

Import gg.irrBMAX

Type T_chunk_header
 Field id:Int
 Field length:Int
End Type

' GG - based on BMXIMeshLoader instead
Type B3DLoader Extends BMXIMeshLoader
 Field ChunkHeader:T_chunk_header

 Method IsALoadableFileExtension:Int(Filename:String)
DebugLog("IsALoadableFileExtension")
  Return (Lower(Right(Filename,4)) = ".b3d")
 End Method

 
 Method createMesh:T_irrIAnimatedMesh(file:T_irrIReadFile)
  Local BMFile:TStream = ReadStream(file.getFileName())
DebugLog("createMesh")
  ChunkHeader = New T_chunk_header
  SeekStream(BMFile,0) 'seek to start of file
  ReadChunkHeader(BMFile)

  If TestByteStringArray(Varptr ChunkHeader.id,"BB3D")
   Print "BB3D header found"
  Else
   Print "BB3D header not found"
  End If

  Local Animmesh:T_irrSAnimatedMesh = T_irrSAnimatedMesh.create()
  Local Mesh:T_irrSMesh = T_irrSMesh.create()
  Local MeshBuffer:T_irrSMeshBuffer = T_irrSMeshBuffer.create()

  Local VertexBuffer:T_irrArray_S3DVertex = MeshBuffer.getVertices()
  VertexBuffer.reallocate(8)
  
  VertexBuffer.insert(T_irrS3DVertex.createFromVals(1,1,1,1,1,1,T_irrSColor.createFromVals(255,255,0,0),0,0),0)
  VertexBuffer.insert(T_irrS3DVertex.createFromVals(1,1,-1,1,1,-1,T_irrSColor.createFromVals(255,255,255,0),0,0),1)
  VertexBuffer.insert(T_irrS3DVertex.createFromVals(-1,1,-1,-1,1,-1,T_irrSColor.createFromVals(255,0,255,0),0,0),2)
  VertexBuffer.insert(T_irrS3DVertex.createFromVals(-1,1,1,-1,1,1,T_irrSColor.createFromVals(255,0,255,255),0,0),3)
  VertexBuffer.insert(T_irrS3DVertex.createFromVals(1,-1,1,1,-1,1,T_irrSColor.createFromVals(255,0,0,255),0,0),4)
  VertexBuffer.insert(T_irrS3DVertex.createFromVals(1,-1,-1,1,-1,-1,T_irrSColor.createFromVals(255,255,0,255),0,0),5)
  VertexBuffer.insert(T_irrS3DVertex.createFromVals(-1,-1,-1,-1,-1,-1,T_irrSColor.createFromVals(255,255,255,255),0,0),6)
  VertexBuffer.insert(T_irrS3DVertex.createFromVals(-1,-1,1,-1,-1,1,T_irrSColor.createFromVals(255,0,0,0),0,0),7)

  Local IndexBuffer:T_irrArray_u16 = MeshBuffer.getIndices()
  IndexBuffer.reallocate(36)
  IndexBuffer.insert(0,0)
  IndexBuffer.insert(1,1)
  IndexBuffer.insert(2,2)
  IndexBuffer.insert(2,3)
  IndexBuffer.insert(3,4)
  IndexBuffer.insert(0,5)
  IndexBuffer.insert(4,6)
  IndexBuffer.insert(1,7)
  IndexBuffer.insert(1,8)
  IndexBuffer.insert(4,9)
  IndexBuffer.insert(5,10)
  IndexBuffer.insert(4,11)
  IndexBuffer.insert(4,12)
  IndexBuffer.insert(6,13)
  IndexBuffer.insert(7,14)
  IndexBuffer.insert(4,15)
  IndexBuffer.insert(5,16)
  IndexBuffer.insert(6,17)
  IndexBuffer.insert(7,18)
  IndexBuffer.insert(2,19)
  IndexBuffer.insert(3,20)
  IndexBuffer.insert(7,21)
  IndexBuffer.insert(6,22)
  IndexBuffer.insert(2,23)
  IndexBuffer.insert(2,24)
  IndexBuffer.insert(1,25)
  IndexBuffer.insert(5,26)
  IndexBuffer.insert(5,27)
  IndexBuffer.insert(6,28)
  IndexBuffer.insert(2,29)
  IndexBuffer.insert(0,30)
  IndexBuffer.insert(3,31)
  IndexBuffer.insert(4,32)
  IndexBuffer.insert(4,33)
  IndexBuffer.insert(3,34)
  IndexBuffer.insert(7,35)

  mesh.addMeshBuffer(T_irrIMeshBuffer(MeshBuffer))
  Animmesh.addMesh(T_irrIMesh(mesh))


  CloseStream(BMFile)
  Return T_irrIAnimatedMesh(Animmesh) 
 End Method

 Method TestByteStringArray:Int(test1:Byte Ptr,test2:String)
  Local t:Int
   
  For t = 1 To Len(test2)
   If Chr(test1[t-1]) <> Mid(test2,t,1) Then Return False
  Next
  Return True
 End Method

 Method ReadChunkHeader(file:TStream)
  DebugLog("ReadChunkHeader")
  ChunkHeader.id = Readint(file)
  Chunkheader.length = Readint(file)
  DebugLog("I got here")
  DebugLog(Chr((Varptr Chunkheader.id)[0]))
 End Method
 ' GG - changed to return BMXIMeshLoader
 Function generate:BMXIMeshLoader()
  Return BMXIMeshLoader(New B3DLoader)
 End Function
  
End Type


Local device:T_irrIrrlichtDevice=T_irrIrrlichtDevice.create(EDT_OPENGL,T_irrDimension2d_s32.create(640,480),32,False,False,False,0)

device.setWindowCaption("Hello World! - Irrlicht Engine Demo")

Local driver:T_irrIVideoDriver=device.getVideoDriver()
Local smgr:T_irrISceneManager=device.getSceneManager()
Local guienv:T_irrIGUIEnvironment=device.getGUIEnvironment()

' GG - create the loader, convert it to a T_irrIMeshLoader and pass to addexternalmeshloader
Local loader:B3DLoader = B3DLoader(B3DLoader.create(B3DLoader.generate))
smgr.AddExternalMeshLoader(T_irrIMeshLoader.createFromHandle(loader.handle))

guienv.addStaticText("Hello World! This is the Irrlicht Software renderer!",T_irrRect_s32.createFromVals(10,10,200,22),True)

Local mesh:T_irrIAnimatedMesh=smgr.getMesh("bridge.b3d")
If mesh.handle = 0 Then Print "Error in creating mesh"; End
Local node:T_irrIAnimatedMeshSceneNode=smgr.addAnimatedMeshSceneNode(mesh)
Local anim:T_irrISceneNodeAnimator
If node.handle<>0
    node.setScale(T_irrVector3df.createFromVals(10,10,10))
	node.setMaterialFlag(EMF_LIGHTING,False)
	node.setFrameLoop(0,310)
	'node.setMaterialTexture(0,driver.getTexture("pebble2.jpg"))
	anim = smgr.createRotationAnimator(T_irrVector3df.createFromVals(.1,1,.5))
	node.addAnimator(anim)

EndIf

smgr.addCameraSceneNode(0,T_irrVector3df.createFromVals(0,30,-40),T_irrVector3df.createFromVals(0,5,0))

While (device.run())

	driver.beginScene(True,True,T_irrSColor.createFromVals(0,200,200,200))
	smgr.drawAll()
	guienv.drawAll()
	driver.endScene()

Wend

device.drop()