+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
+ {
+ return *(irr::core::aabbox3d<irr::f32>*)GetBoundingBox();
+ }
+
+ virtual irr::u32 getMaterialCount() const
+ {
+ return GetMaterialCount();
+ }
+
+ virtual irr::video::SMaterial& getMaterial(irr::u32 i)
+ {
+ return *(irr::video::SMaterial*)GetMaterial(i);
+ }
+};
+