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_CUBE_SCENE_NODE_H_INCLUDED__
6 #define __C_CUBE_SCENE_NODE_H_INCLUDED__
7 
8 #include "IMeshSceneNode.h"
9 #include "SMesh.h"
10 
11 namespace irr
12 {
13 namespace scene
14 {
15 	class CCubeSceneNode : public IMeshSceneNode
16 	{
17 	public:
18 
19 		//! constructor
20 		CCubeSceneNode(f32 size, ISceneNode* parent, ISceneManager* mgr, s32 id,
21 			const core::vector3df& position = core::vector3df(0,0,0),
22 			const core::vector3df& rotation = core::vector3df(0,0,0),
23 			const core::vector3df& scale = core::vector3df(1.0f, 1.0f, 1.0f));
24 
25 		virtual ~CCubeSceneNode();
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 		//! returns the material based on the zero based index i. To get the amount
36 		//! of materials used by this scene node, use getMaterialCount().
37 		//! This function is needed for inserting the node into the scene hirachy on a
38 		//! optimal position for minimizing renderstate changes, but can also be used
39 		//! to directly modify the material of a scene node.
40 		virtual video::SMaterial& getMaterial(u32 i);
41 
42 		//! returns amount of materials used by this scene node.
43 		virtual u32 getMaterialCount() const;
44 
45 		//! Returns type of the scene node
getType()46 		virtual ESCENE_NODE_TYPE getType() const { return ESNT_CUBE; }
47 
48 		//! Creates shadow volume scene node as child of this node
49 		//! and returns a pointer to it.
50 		virtual IShadowVolumeSceneNode* addShadowVolumeSceneNode(const IMesh* shadowMesh,
51 			s32 id, bool zfailmethod=true, f32 infinity=10000.0f);
52 
53 		//! Writes attributes of the scene node.
54 		virtual void serializeAttributes(io::IAttributes* out, io::SAttributeReadWriteOptions* options=0) const;
55 
56 		//! Reads attributes of the scene node.
57 		virtual void deserializeAttributes(io::IAttributes* in, io::SAttributeReadWriteOptions* options=0);
58 
59 		//! Creates a clone of this scene node and its children.
60 		virtual ISceneNode* clone(ISceneNode* newParent=0, ISceneManager* newManager=0);
61 
62 		//! Sets a new mesh to display
setMesh(IMesh * mesh)63 		virtual void setMesh(IMesh* mesh) {}
64 
65 		//! Returns the current mesh
getMesh(void)66 		virtual IMesh* getMesh(void) { return Mesh; }
67 
68 		//! Sets if the scene node should not copy the materials of the mesh but use them in a read only style.
69 		/* In this way it is possible to change the materials a mesh causing all mesh scene nodes
70 		referencing this mesh to change too. */
setReadOnlyMaterials(bool readonly)71 		virtual void setReadOnlyMaterials(bool readonly) {}
72 
73 		//! Returns if the scene node should not copy the materials of the mesh but use them in a read only style
isReadOnlyMaterials()74 		virtual bool isReadOnlyMaterials() const { return false; }
75 
76 		//! Removes a child from this scene node.
77 		//! Implemented here, to be able to remove the shadow properly, if there is one,
78 		//! or to remove attached childs.
79 		virtual bool removeChild(ISceneNode* child);
80 
81 	private:
82 		void setSize();
83 
84 		IMesh* Mesh;
85 		IShadowVolumeSceneNode* Shadow;
86 		f32 Size;
87 	};
88 
89 } // end namespace scene
90 } // end namespace irr
91 
92 #endif
93 
94