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