X-Git-Url: https://git.jsancho.org/?p=c-irrlicht.git;a=blobdiff_plain;f=src%2FISceneManager.cpp;fp=src%2FISceneManager.cpp;h=905ad4996ef8b8f2cb688e534b0fd635176b698c;hp=b682499927e47706d5c7319e7b6fb1f3a0a210cd;hb=0f5922af37242ffe33f1b83f5bdfff79639b5d5a;hpb=9bf03a230a609e34f23e1393b676bfa3acef1268 diff --git a/src/ISceneManager.cpp b/src/ISceneManager.cpp index b682499..905ad49 100644 --- a/src/ISceneManager.cpp +++ b/src/ISceneManager.cpp @@ -22,6 +22,68 @@ #include #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& getBoundingBox() const + { + irr_core_aabbox3d_f32* box = GetBoundingBox(); + irr::core::aabbox3d* irrBox = new irr::core::aabbox3d(); + 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,