Isn't strict suppose to catch things like that?
you would think :) the reason it compiles in this case (i believe) is because you can store objects to integers.
As far as the B3D thing goes, I was aiming more at keeping the flexibility of the IrrLicht, but wrap the commands so that they're easier to call.
i think we are on similar targets. im taking the approach of many of the BRL BMAX modules where they have functions that can do many things, but underneath they are actually calling type methods. while i have a B3D function set, all the functions really do are call methods on types. you would never actually need to call a single ib3d function if you so desired. plus, all the underlying functionality is still there (ie. the entity stores the T_irrISceneNode reference, ib3d_engine stores references to all its corrosponding T_irr types) and you can call Irrlicht commands direct any time. for example, here is my entity Type of which all the ib3d entities are based:
Type ib3d_Entity Extends ib3d_base ' maps a b3d entity to an ISceneNode Global SceneNodeToEntity:THashtable=Null Global EntityList:TList=Null Field _userdata:TMap=Null Field _node:T_irrISceneNode=Null Field _radius:T_irrVector3df=Null Field _collision_offset:T_irrVector3df=T_irrVector3df.create() Field _lastposition:T_irrVector3df=Null Field _OnCollision:ONCOLLISIONEVENTHANDLER=Null Method New() ' setup the ISceneNode to b3d_entity map If Not SceneNodeToEntity Then SceneNodeToEntity=New THashtable If Not EntityList Then EntityList=New TList EntityList.AddLast(Self) EndMethod Method Destroy() SceneNodeToEntity.RemoveKey(_node.handle) EntityList.Remove(Self) If _userdata Then _userdata.Clear() ' remove from the scene graph _node.Remove() _node=Null EndMethod Method setNode(node:T_irrISceneNode) If Not node.IsValid() Then RuntimeError "setNode is invalid" SceneNodeToEntity.Add(node.handle,Self,True) _node=node ' set the initial collision radius based on the bounding box extents/2 Local boxextent:T_irrVector3df=_node.getBoundingBox().getExtent() setCollisionRadius(boxextent.getX()/2,boxextent.getY()/2,boxextent.getZ()/2) EndMethod Function findEntity:ib3d_entity(node:T_irrISceneNode) If Not node Or Not node.IsValid() Then Return Null Local temp:TKeyValuePair=SceneNodeToEntity.ContainsKey(node.handle) If Not temp Return Null Else Return ib3d_entity(temp.Value) EndFunction ' ---------------------------------------------- ' userdata methods ' ---------------------------------------------- Method setUserData(key:String,data:Object) If Not _userdata Then _userdata=New TMap _userdata.Insert(key,data) EndMethod Method getUserData:Object(key:String) If _userdata Then Return _userdata.ValueForKey(key) Else Return Null EndMethod Method removeUserData(key:String) If _userdata Then _userdata.Remove(key) EndMethod ' ---------------------------------------------- ' collision support methods ' ---------------------------------------------- Method setCollisionOffset(offset:T_irrVector3df) _collision_offset=offset EndMethod Method setCollisionRadius(x:Float,y:Float,z:Float) _radius=T_irrVector3df.createFromVals(x,y,z) EndMethod Method setCollisionRadiusFromBox(box:T_irrAABbox3df) Local boxextent:T_irrVector3df=box.getExtent() setCollisionRadius(boxextent.getX()/2,boxextent.getY()/2,boxextent.getZ()/2) EndMethod Method getCollisionRadius:T_irrVector3df() Return _radius EndMethod Method setOnCollisionEventHandler(handler:ONCOLLISIONEVENTHANDLER) _OnCollision=handler EndMethod Method OnCollision(collision:COLLISION) If _OnCollision Then _OnCollision.OnCollision(collision) EndMethod Method setLastPosition(pos:T_irrVector3df=Null) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" If Not pos Then _lastposition=_node.getPosition() Else _lastposition=pos EndMethod Method getLastPosition:T_irrVector3df() Return _lastposition EndMethod ' --------------------------------------------------------------- ' B3D methods ' --------------------------------------------------------------- Method X:Float(globl:Int=False) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" If (globl=False) Return _node.getPosition().getX() Else Return _node.getAbsolutePosition().getX() EndIf EndMethod Method Y:Float(globl:Int=False) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" If (globl=False) Return _node.getPosition().getY() Else Return _node.getAbsolutePosition().getY() EndIf EndMethod Method Z:Float(globl:Int=False) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" If (globl=False) Return _node.getPosition().getZ() Else Return _node.getAbsolutePosition().getZ() EndIf EndMethod Method Pitch:Float(globl:Int=False) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" If (globl=False) Return _node.getRotation().getX() Else Return _node.getAbsoluteTransformation().getRotationDegrees().getX() EndIf EndMethod Method Yaw:Float(globl:Int=False) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" If (globl=False) Return _node.getRotation().getY() Else Return _node.getAbsoluteTransformation().getRotationDegrees().getY() EndIf EndMethod Method Roll:Float(globl:Int=False) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" If (globl=False) Return _node.getRotation().getZ() Else Return _node.getAbsoluteTransformation().getRotationDegrees().getZ() EndIf EndMethod Method Scale(x:Float,y:Float,z:Float) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" _node.setScale(T_irrVector3df.createFromVals(x,y,z)) EndMethod Method Show() If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" _node.setVisible(True) EndMethod Method Hide() If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" _node.setVisible(False) EndMethod Method Name(name:String) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" _node.setName(name) EndMethod Method GetName:String() If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" Return _node.getName() EndMethod ' TODO: implement globl param Method Parent(parent:ib3d_Entity,globl:Int=True) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" _node.setParent(parent._node) EndMethod Method GetParent:ib3d_Entity() If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" Return findEntity(_node) EndMethod Method CountChildren:Int() If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" Return _node.getChildren().Size() EndMethod Method GetChild:ib3d_Entity(index:Int) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" Local children:T_irrArray_ISceneNode_Ptr=_node.getChildren() Local childcnt:Int=children.Size() If childcnt<1 Or index>childcnt Then RuntimeError "Child index "+index+" outside of child count "+childcnt Return findEntity(children.elementAt(index-1)) EndMethod Method FindChild:ib3d_Entity(name:String) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" Local child:T_irrISceneNode=Null Local children:T_irrArray_ISceneNode_Ptr=_node.getChildren() Local childcnt:Int=children.Size() If childcnt>0 Local tempnode:T_irrISceneNode For Local i:Int=0 To childcnt-1 tempnode=children.elementAt(i) If tempnode.getName()=name child=tempnode Exit EndIf Next EndIf If Not child Then Return Null Else Return findEntity(child) EndMethod ' ---------------------------------------------------------------------- ' not sure about the following ' ---------------------------------------------------------------------- ' TODO: not sure about global Method Position(x:Float,y:Float,z:Float,globl:Int=False) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" _node.setPosition(T_irrVector3df.createFromVals(x,y,z)) EndMethod Method Rotate(pitch:Float,yaw:Float,roll:Float,globl:Int=False) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" _node.setRotation(T_irrVector3df.createFromVals(pitch,yaw,roll)) EndMethod Method Move(x:Float,y:Float,z:Float) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" If x<>y Then x:*Delta.Time() If y<>0 Then y:*Delta.Time() If z<>0 Then z:*Delta.Time() Local dest:T_irrVector3df=T_irrVector3df.createFromVals(x,y,z) _node.getRelativeTransformation().transformVect(dest) _node.setPosition(dest) EndMethod Method Turn(pitch:Float,yaw:Float,roll:Float,globl:Int=False) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" If pitch<>0 Then pitch:*Delta.Time() If yaw<>0 Then yaw:*Delta.Time() If roll<>0 Then roll:*Delta.Time() _node.setRotation(_node.getRotation().Plus(T_irrVector3df.createFromVals(pitch,yaw,roll))) EndMethod Method Translate(x:Float,y:Float,z:Float) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" If x<>0 Then x:*Delta.Time() If y<>0 Then y:*Delta.Time() If z<>0 Then z:*Delta.Time() Local m:T_irrMatrix4=T_irrMatrix4.create() m.setTranslation(T_irrVector3df.createFromVals(x,y,z)) Local pos:T_irrVector3df=_node.getPosition() m.translateVect(pos) _node.setPosition(pos) EndMethod ' TODO: implement Method Point(target:ib3d_Entity) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" PointToVect(target._node.getPosition()) EndMethod Method PointToVect:T_irrVector3df(target:T_irrVector3df) Rem Local diff:T_irrVector3df=_node.getPosition().Minus(target) Local dist:Float=Sqr((diff.getX()*diff.getX())+(diff.getZ()*diff.getZ())) Local pitch:Float=ATan2(diff.getY(),dist) Local yaw:Float=ATan2(diff.getX(),-diff.getZ()) Rotate(pitch,yaw,0) EndRem Local pos:T_irrVector3df=_node.getPosition() Local xdiff:Float=target.getX()-pos.getX() Local ydiff:Float=target.getY()-pos.getY() Local zdiff:Float=target.getZ()-pos.getZ() Local dist:Float=Sqr((xdiff*xdiff)+(zdiff*zdiff)) Local pitch:Float=ATan2(ydiff,dist) Local yaw:Float=ATan2(xdiff,-zdiff) Rotate(pitch,yaw,0) Rem xdiff# = EntityX(entity)-x# ydiff# = EntityY(entity)-y# zdiff# = EntityZ(entity)-z# dist#=Sqr#((xdiff#*xdiff#)+(zdiff#*zdiff#)) pitch# = ATan2(ydiff#,dist#) yaw# = ATan2(xdiff#,-zdiff#) RotateEntity entity,pitch#,yaw#,0 EndRem EndMethod ' TODO: note index only support 0,1 ' TODO: implement animated texture support Method setTexture(texture:TEXTURE,frame:Int=0,index:Int=0) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" _node.setMaterialTexture(index,texture.tex) EndMethod Method setDebugDataVisible(bShow:Int) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" _node.setDebugDataVisible(bShow) EndMethod Method SetColor(red:Float,green:Float,blue:Float,MaterialIDX:Int=0) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" Local color:T_irrSColor=T_irrSColor.createFromVals(0,red,green,blue) Local colorf:T_irrSColorf=T_irrSColorf.createFromSColor(color) _node.getMaterial(MaterialIDX).getDiffuseColor().set(colorf.getAlpha(),colorf.getRed(),colorf.getGreen(),colorf.getBlue()) _node.getMaterial(MaterialIDX).getAmbientColor().set(colorf.getAlpha(),colorf.getRed(),colorf.getGreen(),colorf.getBlue()) EndMethod Method setAmbientColor(red:Float,green:Float,blue:Float,MaterialIDX:Int=0) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" Local color:T_irrSColor=T_irrSColor.createFromVals(0,red,green,blue) Local colorf:T_irrSColorf=T_irrSColorf.createFromSColor(color) _node.getMaterial(MaterialIDX).getAmbientColor().set(0,colorf.getRed(),colorf.getGreen(),colorf.getBlue()) EndMethod Method setDiffuseColor(red:Float,green:Float,blue:Float,MaterialIDX:Int=0) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" Local color:T_irrSColor=T_irrSColor.createFromVals(0,red,green,blue) Local colorf:T_irrSColorf=T_irrSColorf.createFromSColor(color) _node.getMaterial(MaterialIDX).getDiffuseColor().set(0,colorf.getRed(),colorf.getGreen(),colorf.getBlue()) EndMethod Method setEmissiveColor(red:Float,green:Float,blue:Float,MaterialIDX:Int=0) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" Local color:T_irrSColor=T_irrSColor.createFromVals(0,red,green,blue) Local colorf:T_irrSColorf=T_irrSColorf.createFromSColor(color) _node.getMaterial(MaterialIDX).getEmissiveColor().set(0,colorf.getRed(),colorf.getGreen(),colorf.getBlue()) EndMethod Method setSpecularColor(red:Float,green:Float,blue:Float,MaterialIDX:Int=0) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" Local color:T_irrSColor=T_irrSColor.createFromVals(0,red,green,blue) Local colorf:T_irrSColorf=T_irrSColorf.createFromSColor(color) _node.getMaterial(MaterialIDX).getSpecularColor().set(0,colorf.getRed(),colorf.getGreen(),colorf.getBlue()) EndMethod Method setFX(E_MATERIAL_FLAG:Int,bNewVal:Int,MaterialIDX:Int=-1) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" If MaterialIDX>=0 Then _node.setMaterialFlag(E_MATERIAL_FLAG,bNewVal) Else _node.getMaterial(MaterialIDX).setFlag(E_MATERIAL_FLAG,bNewVal) EndIf EndMethod Method SetBlend(E_MATERIAL_TYPE:Int,MaterialIDX:Int=-1) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" If MaterialIDX>=0 Then _node.setMaterialType(E_MATERIAL_TYPE) Else _node.getMaterial(MaterialIDX).setMaterialType(E_MATERIAL_TYPE) EndIf EndMethod Method setShininess(shininess:Float=20.0,MaterialIDX:Int=0) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" _node.getMaterial(MaterialIDX).setShininess(shininess) EndMethod Method getDistanceFrom:Double(entity:ib3d_Entity) If Not _node Or Not _node.isValid() Then RuntimeError "Node is invalid" If Not entity._node Or Not entity._node.isValid() Then RuntimeError "Distance node is invalid" Return _node.getPosition().getDistanceFrom(entity._node.getPosition()) EndMethod EndType
do you know how the custom importer is suppose to work?
you will need to extend type T_irrIMeshLoader type. override isALoadableFileExtension() and return true if you can load the file passed in. override the createMesh method. this method must return an instance of T_irrIAnimatedMesh. there is no way to actually _create_ T_irrIAnimatedMesh, but that is what T_irrSAnimatedMesh is for. so you essentially return an instance of T_irrSAnimatedMesh. you then create an instance of your new type and then pass it to the AddExternalMeshLoader() method of T_irrISceneManager.
HTH :)