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()