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, this is what I have so far. It's getting very close. Only problem is that it seems that the first element of the first vertex (X pos) changes to 0 about half a second after the program begins running. I don't know why. Possibly a bug in the wrappers? Or am I still missing something?
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,0,0,0),0,0),0)
  VertexBuffer.insert(T_irrS3DVertex.createFromVals(1,1,1,1,1,1,T_irrSColor.createFromVals(255,255,0,0),0,1),1)
  VertexBuffer.insert(T_irrS3DVertex.createFromVals(-1,1,1,-1,1,1,T_irrSColor.createFromVals(255,255,0,255),1,1),2)
  VertexBuffer.insert(T_irrS3DVertex.createFromVals(-1,1,-1,-1,1,-1,T_irrSColor.createFromVals(255,0,255,0),1,0),3)
  VertexBuffer.insert(T_irrS3DVertex.createFromVals(1,-1,-1,1,-1,-1,T_irrSColor.createFromVals(255,0,255,255),1,0),4)
  VertexBuffer.insert(T_irrS3DVertex.createFromVals(1,-1,1,1,-1,1,T_irrSColor.createFromVals(255,255,0,255),1,1),5)
  VertexBuffer.insert(T_irrS3DVertex.createFromVals(-1,-1,1,-1,-1,1,T_irrSColor.createFromVals(255,255,255,0),0,1),6)
  VertexBuffer.insert(T_irrS3DVertex.createFromVals(-1,-1,-1,-1,-1,-1,T_irrSColor.createFromVals(255,255,0,0),0,0),7)

  Local IndexBuffer:T_irrArray_u16 = MeshBuffer.getIndices()

  IndexBuffer.reallocate(36)
  IndexBuffer.insert(0)
  IndexBuffer.insert(1)
  IndexBuffer.insert(2)
  IndexBuffer.insert(2)
  IndexBuffer.insert(3)
  IndexBuffer.insert(0)

  IndexBuffer.insert(4)
  IndexBuffer.insert(1)
  IndexBuffer.insert(0)
  IndexBuffer.insert(4)
  IndexBuffer.insert(5)
  IndexBuffer.insert(1)

  IndexBuffer.insert(4)
  IndexBuffer.insert(6)
  IndexBuffer.insert(5)
  IndexBuffer.insert(4)
  IndexBuffer.insert(7)
  IndexBuffer.insert(6)

  IndexBuffer.insert(7)
  IndexBuffer.insert(3)
  IndexBuffer.insert(2)
  IndexBuffer.insert(7)
  IndexBuffer.insert(2)
  IndexBuffer.insert(6)

  IndexBuffer.insert(2)
  IndexBuffer.insert(1)
  IndexBuffer.insert(5)
  IndexBuffer.insert(5)
  IndexBuffer.insert(6)
  IndexBuffer.insert(2)

  IndexBuffer.insert(0)
  IndexBuffer.insert(3)
  IndexBuffer.insert(4)
  IndexBuffer.insert(4)
  IndexBuffer.insert(3)
  IndexBuffer.insert(7)

  MeshBuffer.recalculateBoundingBox()
  
  mesh.addMeshBuffer(T_irrIMeshBuffer(MeshBuffer))
  MeshBuffer.Drop()
  MeshBuffer = Null
  Animmesh.addMesh(T_irrIMesh(mesh))
  Mesh.Drop()
  Mesh = Null

  Animmesh.RecalculateBoundingBox()


  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,0,-5),T_irrVector3df.createFromVals(0,0,0))

While (device.run())

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

Wend

device.drop()