X-Git-Url: https://git.jsancho.org/?a=blobdiff_plain;f=src%2FISceneManager.cpp;h=d01e785b399fa2ca605f268be8edd02f9fff0f11;hb=HEAD;hp=71d421f801944d3024483d19e85a5df3c60528e2;hpb=d468712229faeb7fdcce0836145572e0018d62d0;p=c-irrlicht.git diff --git a/src/ISceneManager.cpp b/src/ISceneManager.cpp index 71d421f..d01e785 100644 --- a/src/ISceneManager.cpp +++ b/src/ISceneManager.cpp @@ -22,40 +22,81 @@ #include #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& getBoundingBox() const + { + return *(irr::core::aabbox3d*)GetBoundingBox(); + } + + virtual irr::u32 getMaterialCount() const + { + return GetMaterialCount(); + } + + virtual irr::video::SMaterial& getMaterial(irr::u32 i) + { + return *(irr::video::SMaterial*)GetMaterial(i); + } +}; + extern "C" { irr_scene_IAnimatedMeshSceneNode* irr_scene_addAnimatedMeshSceneNode(irr_scene_ISceneManager* smgr, irr_scene_IAnimatedMesh* mesh, irr_scene_ISceneNode* parent, - int id, + int32_t id, irr_core_vector3df* position, irr_core_vector3df* rotation, irr_core_vector3df* scale, - int alsoAddIfMeshPointerZero) + bool alsoAddIfMeshPointerZero) { - 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, + position ? *(irr::core::vector3df*)position : irr::core::vector3df(0, 0, 0), + rotation ? *(irr::core::vector3df*)rotation : irr::core::vector3df(0, 0, 0), + scale ? *(irr::core::vector3df*)scale : irr::core::vector3df(1, 1, 1), alsoAddIfMeshPointerZero); } @@ -64,35 +105,82 @@ extern "C" { irr_scene_ISceneNode* parent, irr_core_vector3df* position, irr_core_vector3df* lookat, - int id, - int makeActive) + int32_t id, + bool makeActive) { - 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, + position ? *(irr::core::vector3df*)position : irr::core::vector3df(0, 0, 0), + lookat ? *(irr::core::vector3df*)lookat : irr::core::vector3df(0, 0, 100), 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); + } + + CustomSceneNode *node = + new CustomSceneNode((irr::scene::ISceneNode*)parent, + (irr::scene::ISceneManager*)smgr, + id, + position ? *(irr::core::vector3df*)position : irr::core::vector3df(0, 0, 0), + rotation ? *(irr::core::vector3df*)rotation : irr::core::vector3df(0, 0, 0), + scale ? *(irr::core::vector3df*)scale : irr::core::vector3df(1, 1, 1), + render, + getBoundingBox, + getMaterialCount, + getMaterial); + return node; + } + irr_scene_IMeshSceneNode* - irr_scene_addOctreeSceneNodeAM(irr_scene_ISceneManager* smgr, - irr_scene_IAnimatedMesh* mesh, - irr_scene_ISceneNode* parent, - int id, - int minimalPolysPerNode, - int alsoAddIfMeshPointerZero) + 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, @@ -102,6 +190,14 @@ extern "C" { alsoAddIfMeshPointerZero); } + irr_scene_ISceneNodeAnimator* + irr_scene_createRotationAnimator(irr_scene_ISceneManager* smgr, + irr_core_vector3df* rotationSpeed) + { + return ((irr::scene::ISceneManager*)smgr) + ->createRotationAnimator(*(irr::core::vector3df*)rotationSpeed); + } + void irr_scene_drawAll(irr_scene_ISceneManager* smgr) { @@ -116,4 +212,11 @@ extern "C" { 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(); + } }