1 // Copyright (C) 2002-2012 Nikolaus Gebhardt 2 // This file is part of the "Irrlicht Engine". 3 // For conditions of distribution and use, see copyright notice in irrlicht.h 4 5 #ifndef __C_OCTREE_SCENE_NODE_H_INCLUDED__ 6 #define __C_OCTREE_SCENE_NODE_H_INCLUDED__ 7 8 #include "IMeshSceneNode.h" 9 #include "Octree.h" 10 11 namespace irr 12 { 13 namespace scene 14 { 15 //! implementation of the IBspTreeSceneNode 16 class COctreeSceneNode : public IMeshSceneNode 17 { 18 public: 19 20 //! constructor 21 COctreeSceneNode(ISceneNode* parent, ISceneManager* mgr, s32 id, 22 s32 minimalPolysPerNode=512); 23 24 //! destructor 25 virtual ~COctreeSceneNode(); 26 27 virtual void OnRegisterSceneNode(); 28 29 //! renders the node. 30 virtual void render(); 31 32 //! returns the axis aligned bounding box of this node 33 virtual const core::aabbox3d<f32>& getBoundingBox() const; 34 35 //! creates the tree 36 bool createTree(IMesh* mesh); 37 38 //! returns the material based on the zero based index i. To get the amount 39 //! of materials used by this scene node, use getMaterialCount(). 40 //! This function is needed for inserting the node into the scene hirachy on a 41 //! optimal position for minimizing renderstate changes, but can also be used 42 //! to directly modify the material of a scene node. 43 virtual video::SMaterial& getMaterial(u32 i); 44 45 //! returns amount of materials used by this scene node. 46 virtual u32 getMaterialCount() const; 47 48 //! Writes attributes of the scene node. 49 virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options=0) const; 50 51 //! Reads attributes of the scene node. 52 virtual void deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options=0); 53 54 //! Returns type of the scene node getType()55 virtual ESCENE_NODE_TYPE getType() const { return ESNT_OCTREE; } 56 57 //! Sets a new mesh to display 58 virtual void setMesh(IMesh* mesh); 59 60 //! Get the currently defined mesh for display. 61 virtual IMesh* getMesh(void); 62 63 //! Sets if the scene node should not copy the materials of the mesh but use them in a read only style. 64 virtual void setReadOnlyMaterials(bool readonly); 65 66 //! Check if the scene node should not copy the materials of the mesh but use them in a read only style 67 virtual bool isReadOnlyMaterials() const; 68 69 //! Creates shadow volume scene node as child of this node 70 //! and returns a pointer to it. 71 virtual IShadowVolumeSceneNode* addShadowVolumeSceneNode(const IMesh* shadowMesh, 72 s32 id, bool zfailmethod=true, f32 infinity=10000.0f); 73 74 //! Removes a child from this scene node. 75 //! Implemented here, to be able to remove the shadow properly, if there is one, 76 //! or to remove attached childs. 77 virtual bool removeChild(ISceneNode* child); 78 79 private: 80 81 void deleteTree(); 82 83 core::aabbox3d<f32> Box; 84 85 Octree<video::S3DVertex>* StdOctree; 86 core::array< Octree<video::S3DVertex>::SMeshChunk > StdMeshes; 87 88 Octree<video::S3DVertex2TCoords>* LightMapOctree; 89 core::array< Octree<video::S3DVertex2TCoords>::SMeshChunk > LightMapMeshes; 90 91 Octree<video::S3DVertexTangents>* TangentsOctree; 92 core::array< Octree<video::S3DVertexTangents>::SMeshChunk > TangentsMeshes; 93 94 video::E_VERTEX_TYPE VertexType; 95 core::array< video::SMaterial > Materials; 96 97 core::stringc MeshName; 98 s32 MinimalPolysPerNode; 99 s32 PassCount; 100 101 IMesh * Mesh; 102 IShadowVolumeSceneNode* Shadow; 103 //! use VBOs for rendering where possible 104 bool UseVBOs; 105 //! use visibility information together with VBOs 106 bool UseVisibilityAndVBOs; 107 //! use bounding box or frustum for calculate polys 108 bool BoxBased; 109 }; 110 111 } // end namespace scene 112 } // end namespace irr 113 114 #endif 115 116