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