]> git.jsancho.org Git - c-irrlicht.git/blobdiff - src/ISceneManager.cpp
Custom scene node
[c-irrlicht.git] / src / ISceneManager.cpp
index b682499927e47706d5c7319e7b6fb1f3a0a210cd..905ad4996ef8b8f2cb688e534b0fd635176b698c 100644 (file)
 #include <irrlicht/irrlicht.h>
 #include "ISceneManager.h"
 
+class CustomSceneNode : public irr::scene::ISceneNode
+{
+  void (*Render)();
+  irr_core_aabbox3d_f32* (*GetBoundingBox)();
+  int (*GetMaterialCount)();
+  irr_video_SMaterial* (*GetMaterial)(unsigned int i);
+
+public:
+  CustomSceneNode(irr::scene::ISceneNode* parent,
+                  irr::scene::ISceneManager* smgr,
+                  irr::s32 id,
+                  const irr::core::vector3df& position,
+                  const irr::core::vector3df& rotation,
+                  const irr::core::vector3df& scale,
+                  void (*render)(),
+                  irr_core_aabbox3d_f32* (*getBoundingBox)(),
+                  int (*getMaterialCount)(),
+                  irr_video_SMaterial* (*getMaterial)(unsigned int i))
+  : irr::scene::ISceneNode(parent, smgr, id, position, rotation, scale)
+  {
+    Render = render;
+    GetBoundingBox = getBoundingBox;
+    GetMaterialCount = getMaterialCount;
+    GetMaterial = getMaterial;
+  }
+
+  virtual void OnRegisterSceneNode()
+  {
+    if (IsVisible) {
+      SceneManager->registerNodeForRendering(this);
+    }
+
+    ISceneNode::OnRegisterSceneNode();
+  }
+
+  virtual void render()
+  {
+    Render();
+  }
+
+  virtual const irr::core::aabbox3d<irr::f32>& getBoundingBox() const
+  {
+    irr_core_aabbox3d_f32* box = GetBoundingBox();
+    irr::core::aabbox3d<irr::f32>* irrBox = new irr::core::aabbox3d<irr::f32>();
+    return *irrBox;
+  }
+
+  virtual irr::u32 getMaterialCount() const
+  {
+    return GetMaterialCount();
+  }
+
+  virtual irr::video::SMaterial& getMaterial(irr::u32 i)
+  {
+    irr_video_SMaterial* material = GetMaterial(i);
+    irr::video::SMaterial* irrMaterial = new irr::video::SMaterial();
+    irrMaterial->Wireframe = material->wireframe;
+    irrMaterial->Lighting = material->lighting;
+    return *irrMaterial;
+  }
+};
+
 extern "C" {
   irr_scene_IAnimatedMeshSceneNode*
   irr_scene_addAnimatedMeshSceneNode(irr_scene_ISceneManager* smgr,
@@ -112,6 +174,55 @@ extern "C" {
                               makeActive);
   }
 
+  irr_scene_ICustomSceneNode*
+  irr_scene_addCustomSceneNode(irr_scene_ISceneManager* smgr,
+                               irr_scene_ISceneNode* parent,
+                               int id,
+                               irr_core_vector3df* position,
+                               irr_core_vector3df* rotation,
+                               irr_core_vector3df* scale,
+                               void (*render)(),
+                               irr_core_aabbox3d_f32* (*getBoundingBox)(),
+                               int (*getMaterialCount)(),
+                               irr_video_SMaterial* (*getMaterial)(unsigned int i))
+  {
+    if (parent == NULL)
+      {
+        parent = irr_scene_getRootSceneNode(smgr);
+      }
+
+    const irr::core::vector3df iPosition =
+      position ?
+      irr::core::vector3df(position->x, position->y, position->z) :
+      irr::core::vector3df(0, 0, 0);
+
+    const irr::core::vector3df iRotation =
+      rotation ?
+      irr::core::vector3df(rotation->x, rotation->y, rotation->z) :
+      irr::core::vector3df(0, 0, 0);
+
+    const irr::core::vector3df& iScale =
+      scale ?
+      irr::core::vector3df(scale->x, scale->y, scale->z) :
+      irr::core::vector3df(1, 1, 1);
+
+    CustomSceneNode *node =
+      new CustomSceneNode((irr::scene::ISceneNode*)parent,
+                          (irr::scene::ISceneManager*)smgr,
+                          id,
+                          iPosition,
+                          iRotation,
+                          iScale,
+                          render,
+                          getBoundingBox,
+                          getMaterialCount,
+                          getMaterial);
+    node->drop();
+    node = 0;
+    return NULL;
+    //return node;
+  }
+
   irr_scene_IMeshSceneNode*
   irr_scene_addOctreeSceneNodeAM(irr_scene_ISceneManager* smgr,
                                  irr_scene_IAnimatedMesh* mesh,