]> git.jsancho.org Git - c-irrlicht.git/blobdiff - src/ISceneManager.cpp
C types
[c-irrlicht.git] / src / ISceneManager.cpp
index 8139f840cd6cee5408d588e08e56d156b92f3065..f4f2c87e6b05b757a0e8a024f01ec9b85eaa8b63 100644 (file)
 #include <irrlicht/irrlicht.h>
 #include "ISceneManager.h"
 
+class CustomSceneNode : public irr::scene::ISceneNode
+{
+  void (*Render)();
+  irr_core_aabbox3d_f32* (*GetBoundingBox)();
+  uint32_t (*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)(),
+                  uint32_t (*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_ISceneManager_addAnimatedMeshSceneNode(irr_scene_ISceneManager* smgr,
-                                                   irr_scene_IAnimatedMesh* mesh,
-                                                   irr_scene_ISceneNode* parent,
-                                                   int32_t id,
-                                                   irr_core_vector3df* position,
-                                                   irr_core_vector3df* rotation,
-                                                   irr_core_vector3df* scale,
-                                                   bool alsoAddIfMeshPointerZero)
+  irr_scene_addAnimatedMeshSceneNode(irr_scene_ISceneManager* smgr,
+                                     irr_scene_IAnimatedMesh* mesh,
+                                     irr_scene_ISceneNode* parent,
+                                     int32_t id,
+                                     irr_core_vector3df* position,
+                                     irr_core_vector3df* rotation,
+                                     irr_core_vector3df* scale,
+                                     bool alsoAddIfMeshPointerZero)
   {
-    const irr::core::vector3df& iPosition = irr::core::vector3df(position->x,
-                                                                 position->y,
-                                                                 position->z);
-    const irr::core::vector3df& iRotation = irr::core::vector3df(rotation->x,
-                                                                 rotation->y,
-                                                                 rotation->z);
-    const irr::core::vector3df& iScale = irr::core::vector3df(scale->x,
-                                                              scale->y,
-                                                              scale->z);
+    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);
+
     return (irr_scene_IAnimatedMeshSceneNode*)
-      ((irr::scene::ISceneManager*)smgr)->addAnimatedMeshSceneNode((irr::scene::IAnimatedMesh*)mesh,
-                                                                   (irr::scene::ISceneNode*)parent,
-                                                                   id,
-                                                                   iPosition,
-                                                                   iRotation,
-                                                                   iScale,
-                                                                   alsoAddIfMeshPointerZero);
+      ((irr::scene::ISceneManager*)smgr)
+      ->addAnimatedMeshSceneNode((irr::scene::IAnimatedMesh*)mesh,
+                                 (irr::scene::ISceneNode*)parent,
+                                 id,
+                                 iPosition,
+                                 iRotation,
+                                 iScale,
+                                 alsoAddIfMeshPointerZero);
   }
 
   irr_scene_ICameraSceneNode*
-  irr_scene_ISceneManager_addCameraSceneNode(irr_scene_ISceneManager* smgr,
-                                             irr_scene_ISceneNode* parent,
-                                             irr_core_vector3df* position,
-                                             irr_core_vector3df* lookat,
-                                             int32_t id,
-                                             bool makeActive)
+  irr_scene_addCameraSceneNode(irr_scene_ISceneManager* smgr,
+                               irr_scene_ISceneNode* parent,
+                               irr_core_vector3df* position,
+                               irr_core_vector3df* lookat,
+                               int32_t id,
+                               bool makeActive)
   {
-    const irr::core::vector3df& iPosition = irr::core::vector3df(position->x,
-                                                                 position->y,
-                                                                 position->z);
-    const irr::core::vector3df& iLookat = irr::core::vector3df(lookat->x,
-                                                               lookat->y,
-                                                               lookat->z);
+    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& iLookat =
+      lookat ?
+      irr::core::vector3df(lookat->x, lookat->y, lookat->z) :
+      irr::core::vector3df(0, 0, 100);
+
     return (irr_scene_ICameraSceneNode*)
-      ((irr::scene::ISceneManager*)smgr)->addCameraSceneNode((irr::scene::ISceneNode*)parent,
-                                                             iPosition,
-                                                             iLookat,
-                                                             id,
-                                                             makeActive);
+      ((irr::scene::ISceneManager*)smgr)
+      ->addCameraSceneNode((irr::scene::ISceneNode*)parent,
+                           iPosition,
+                           iLookat,
+                           id,
+                           makeActive);
+  }
+
+  irr_scene_ICameraSceneNode*
+  irr_scene_addCameraSceneNodeFPS(irr_scene_ISceneManager* smgr,
+                                  irr_scene_ISceneNode* parent,
+                                  float_t rotateSpeed,
+                                  float_t moveSpeed,
+                                  int32_t id,
+                                  irr_SkeyMap* keyMapArray,
+                                  int32_t keyMapSize,
+                                  bool noVerticalMovement,
+                                  float_t jumpSpeed,
+                                  bool invertMouse,
+                                  bool makeActive)
+  {
+    return ((irr::scene::ISceneManager*)smgr)
+      ->addCameraSceneNodeFPS((irr::scene::ISceneNode*)parent,
+                              rotateSpeed,
+                              moveSpeed,
+                              id,
+                              (irr::SKeyMap*)keyMapArray,
+                              keyMapSize,
+                              noVerticalMovement,
+                              jumpSpeed,
+                              invertMouse,
+                              makeActive);
+  }
+
+  irr_scene_ISceneNode*
+  irr_scene_addCustomSceneNode(irr_scene_ISceneManager* smgr,
+                               irr_scene_ISceneNode* parent,
+                               int32_t id,
+                               irr_core_vector3df* position,
+                               irr_core_vector3df* rotation,
+                               irr_core_vector3df* scale,
+                               void (*render)(),
+                               irr_core_aabbox3d_f32* (*getBoundingBox)(),
+                               uint32_t (*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);
+    return node;
+  }
+
+  irr_scene_IMeshSceneNode*
+  irr_scene_addOctreeSceneNode(irr_scene_ISceneManager* smgr,
+                               irr_scene_IAnimatedMesh* mesh,
+                               irr_scene_ISceneNode* parent,
+                               int32_t id,
+                               int32_t minimalPolysPerNode,
+                               bool alsoAddIfMeshPointerZero)
+  {
+    return ((irr::scene::ISceneManager*)smgr)
+      ->addOctreeSceneNode((irr::scene::IAnimatedMesh*)mesh,
+                           (irr::scene::ISceneNode*)parent,
+                           id,
+                           minimalPolysPerNode,
+                           alsoAddIfMeshPointerZero);
   }
 
   void
-  irr_scene_ISceneManager_drawAll(irr_scene_ISceneManager* smgr)
+  irr_scene_drawAll(irr_scene_ISceneManager* smgr)
   {
     ((irr::scene::ISceneManager*)smgr)->drawAll();
   }
 
 
   irr_scene_IAnimatedMesh*
-  irr_scene_ISceneManager_getMesh(irr_scene_ISceneManager* smgr,
-                                  const char* filename)
+  irr_scene_getMesh(irr_scene_ISceneManager* smgr,
+                    const char* filename)
   {
     return (irr_scene_IAnimatedMesh*)
       ((irr::scene::ISceneManager*)smgr)->getMesh(filename);
   }
+
+  irr_scene_ISceneNode*
+  irr_scene_getRootSceneNode(irr_scene_ISceneManager* smgr)
+  {
+    return (irr_scene_ISceneNode*)
+      ((irr::scene::ISceneManager*)smgr)->getRootSceneNode();
+  }
 }