]> git.lizzy.rs Git - irrlicht.git/blob - include/SMesh.h
Add back LightManager
[irrlicht.git] / include / SMesh.h
1 // Copyright (C) 2002-2012 Nikolaus Gebhardt\r
2 // This file is part of the "Irrlicht Engine".\r
3 // For conditions of distribution and use, see copyright notice in irrlicht.h\r
4 \r
5 #ifndef __S_MESH_H_INCLUDED__\r
6 #define __S_MESH_H_INCLUDED__\r
7 \r
8 #include "IMesh.h"\r
9 #include "IMeshBuffer.h"\r
10 #include "aabbox3d.h"\r
11 #include "irrArray.h"\r
12 \r
13 namespace irr\r
14 {\r
15 namespace scene\r
16 {\r
17         //! Simple implementation of the IMesh interface.\r
18         struct SMesh : public IMesh\r
19         {\r
20                 //! constructor\r
21                 SMesh()\r
22                 {\r
23                         #ifdef _DEBUG\r
24                         setDebugName("SMesh");\r
25                         #endif\r
26                 }\r
27 \r
28                 //! destructor\r
29                 virtual ~SMesh()\r
30                 {\r
31                         // drop buffers\r
32                         for (u32 i=0; i<MeshBuffers.size(); ++i)\r
33                                 MeshBuffers[i]->drop();\r
34                 }\r
35 \r
36                 //! clean mesh\r
37                 virtual void clear()\r
38                 {\r
39                         for (u32 i=0; i<MeshBuffers.size(); ++i)\r
40                                 MeshBuffers[i]->drop();\r
41                         MeshBuffers.clear();\r
42                         BoundingBox.reset ( 0.f, 0.f, 0.f );\r
43                 }\r
44 \r
45 \r
46                 //! returns amount of mesh buffers.\r
47                 u32 getMeshBufferCount() const override\r
48                 {\r
49                         return MeshBuffers.size();\r
50                 }\r
51 \r
52                 //! returns pointer to a mesh buffer\r
53                 IMeshBuffer* getMeshBuffer(u32 nr) const override\r
54                 {\r
55                         return MeshBuffers[nr];\r
56                 }\r
57 \r
58                 //! returns a meshbuffer which fits a material\r
59                 /** reverse search */\r
60                 IMeshBuffer* getMeshBuffer( const video::SMaterial & material) const override\r
61                 {\r
62                         for (s32 i = (s32)MeshBuffers.size()-1; i >= 0; --i)\r
63                         {\r
64                                 if ( material == MeshBuffers[i]->getMaterial())\r
65                                         return MeshBuffers[i];\r
66                         }\r
67 \r
68                         return 0;\r
69                 }\r
70 \r
71                 //! returns an axis aligned bounding box\r
72                 const core::aabbox3d<f32>& getBoundingBox() const override\r
73                 {\r
74                         return BoundingBox;\r
75                 }\r
76 \r
77                 //! set user axis aligned bounding box\r
78                 void setBoundingBox( const core::aabbox3df& box) override\r
79                 {\r
80                         BoundingBox = box;\r
81                 }\r
82 \r
83                 //! recalculates the bounding box\r
84                 void recalculateBoundingBox()\r
85                 {\r
86                         bool hasMeshBufferBBox = false;\r
87                         for (u32 i=0; i<MeshBuffers.size(); ++i)\r
88                         {\r
89                                 const core::aabbox3df& bb = MeshBuffers[i]->getBoundingBox();\r
90                                 if ( !bb.isEmpty() )\r
91                                 {\r
92                                         if ( !hasMeshBufferBBox )\r
93                                         {\r
94                                                 hasMeshBufferBBox = true;\r
95                                                 BoundingBox = bb;\r
96                                         }\r
97                                         else\r
98                                         {\r
99                                                 BoundingBox.addInternalBox(bb);\r
100                                         }\r
101 \r
102                                 }\r
103                         }\r
104 \r
105                         if ( !hasMeshBufferBBox )\r
106                                 BoundingBox.reset(0.0f, 0.0f, 0.0f);\r
107                 }\r
108 \r
109                 //! adds a MeshBuffer\r
110                 /** The bounding box is not updated automatically. */\r
111                 void addMeshBuffer(IMeshBuffer* buf)\r
112                 {\r
113                         if (buf)\r
114                         {\r
115                                 buf->grab();\r
116                                 MeshBuffers.push_back(buf);\r
117                         }\r
118                 }\r
119 \r
120                 //! sets a flag of all contained materials to a new value\r
121                 void setMaterialFlag(video::E_MATERIAL_FLAG flag, bool newvalue) override\r
122                 {\r
123                         for (u32 i=0; i<MeshBuffers.size(); ++i)\r
124                                 MeshBuffers[i]->getMaterial().setFlag(flag, newvalue);\r
125                 }\r
126 \r
127                 //! set the hardware mapping hint, for driver\r
128                 void setHardwareMappingHint( E_HARDWARE_MAPPING newMappingHint, E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX ) override\r
129                 {\r
130                         for (u32 i=0; i<MeshBuffers.size(); ++i)\r
131                                 MeshBuffers[i]->setHardwareMappingHint(newMappingHint, buffer);\r
132                 }\r
133 \r
134                 //! flags the meshbuffer as changed, reloads hardware buffers\r
135                 void setDirty(E_BUFFER_TYPE buffer=EBT_VERTEX_AND_INDEX) override\r
136                 {\r
137                         for (u32 i=0; i<MeshBuffers.size(); ++i)\r
138                                 MeshBuffers[i]->setDirty(buffer);\r
139                 }\r
140 \r
141                 //! The meshbuffers of this mesh\r
142                 core::array<IMeshBuffer*> MeshBuffers;\r
143 \r
144                 //! The bounding box of this mesh\r
145                 core::aabbox3d<f32> BoundingBox;\r
146         };\r
147 \r
148 \r
149 } // end namespace scene\r
150 } // end namespace irr\r
151 \r
152 #endif\r
153 \r