Go to the documentation of this file.00001
00002
00003
00004
00005 #ifndef __I_SKIN_MESH_BUFFER_H_INCLUDED__
00006 #define __I_SKIN_MESH_BUFFER_H_INCLUDED__
00007
00008 #include "IMeshBuffer.h"
00009 #include "S3DVertex.h"
00010
00011
00012 namespace irr
00013 {
00014 namespace scene
00015 {
00016
00017
00019 struct SSkinMeshBuffer : public IMeshBuffer
00020 {
00022 SSkinMeshBuffer(video::E_VERTEX_TYPE vt=video::EVT_STANDARD) :
00023 ChangedID_Vertex(1), ChangedID_Index(1), VertexType(vt),
00024 MappingHint_Vertex(EHM_NEVER), MappingHint_Index(EHM_NEVER),
00025 BoundingBoxNeedsRecalculated(true)
00026 {
00027 #ifdef _DEBUG
00028 setDebugName("SSkinMeshBuffer");
00029 #endif
00030 }
00031
00033 virtual const video::SMaterial& getMaterial() const
00034 {
00035 return Material;
00036 }
00037
00039 virtual video::SMaterial& getMaterial()
00040 {
00041 return Material;
00042 }
00043
00045 virtual video::S3DVertex *getVertex(u32 index)
00046 {
00047 switch (VertexType)
00048 {
00049 case video::EVT_2TCOORDS:
00050 return (video::S3DVertex*)&Vertices_2TCoords[index];
00051 case video::EVT_TANGENTS:
00052 return (video::S3DVertex*)&Vertices_Tangents[index];
00053 default:
00054 return &Vertices_Standard[index];
00055 }
00056 }
00057
00059 virtual const void* getVertices() const
00060 {
00061 switch (VertexType)
00062 {
00063 case video::EVT_2TCOORDS:
00064 return Vertices_2TCoords.const_pointer();
00065 case video::EVT_TANGENTS:
00066 return Vertices_Tangents.const_pointer();
00067 default:
00068 return Vertices_Standard.const_pointer();
00069 }
00070 }
00071
00073 virtual void* getVertices()
00074 {
00075 switch (VertexType)
00076 {
00077 case video::EVT_2TCOORDS:
00078 return Vertices_2TCoords.pointer();
00079 case video::EVT_TANGENTS:
00080 return Vertices_Tangents.pointer();
00081 default:
00082 return Vertices_Standard.pointer();
00083 }
00084 }
00085
00087 virtual u32 getVertexCount() const
00088 {
00089 switch (VertexType)
00090 {
00091 case video::EVT_2TCOORDS:
00092 return Vertices_2TCoords.size();
00093 case video::EVT_TANGENTS:
00094 return Vertices_Tangents.size();
00095 default:
00096 return Vertices_Standard.size();
00097 }
00098 }
00099
00101
00102 virtual video::E_INDEX_TYPE getIndexType() const
00103 {
00104 return video::EIT_16BIT;
00105 }
00106
00108 virtual const u16* getIndices() const
00109 {
00110 return Indices.const_pointer();
00111 }
00112
00114 virtual u16* getIndices()
00115 {
00116 return Indices.pointer();
00117 }
00118
00120 virtual u32 getIndexCount() const
00121 {
00122 return Indices.size();
00123 }
00124
00126 virtual const core::aabbox3d<f32>& getBoundingBox() const
00127 {
00128 return BoundingBox;
00129 }
00130
00132 virtual void setBoundingBox( const core::aabbox3df& box)
00133 {
00134 BoundingBox = box;
00135 }
00136
00138 virtual void recalculateBoundingBox()
00139 {
00140 if(!BoundingBoxNeedsRecalculated)
00141 return;
00142
00143 BoundingBoxNeedsRecalculated = false;
00144
00145 switch (VertexType)
00146 {
00147 case video::EVT_STANDARD:
00148 {
00149 if (Vertices_Standard.empty())
00150 BoundingBox.reset(0,0,0);
00151 else
00152 {
00153 BoundingBox.reset(Vertices_Standard[0].Pos);
00154 for (u32 i=1; i<Vertices_Standard.size(); ++i)
00155 BoundingBox.addInternalPoint(Vertices_Standard[i].Pos);
00156 }
00157 break;
00158 }
00159 case video::EVT_2TCOORDS:
00160 {
00161 if (Vertices_2TCoords.empty())
00162 BoundingBox.reset(0,0,0);
00163 else
00164 {
00165 BoundingBox.reset(Vertices_2TCoords[0].Pos);
00166 for (u32 i=1; i<Vertices_2TCoords.size(); ++i)
00167 BoundingBox.addInternalPoint(Vertices_2TCoords[i].Pos);
00168 }
00169 break;
00170 }
00171 case video::EVT_TANGENTS:
00172 {
00173 if (Vertices_Tangents.empty())
00174 BoundingBox.reset(0,0,0);
00175 else
00176 {
00177 BoundingBox.reset(Vertices_Tangents[0].Pos);
00178 for (u32 i=1; i<Vertices_Tangents.size(); ++i)
00179 BoundingBox.addInternalPoint(Vertices_Tangents[i].Pos);
00180 }
00181 break;
00182 }
00183 }
00184 }
00185
00187 virtual video::E_VERTEX_TYPE getVertexType() const
00188 {
00189 return VertexType;
00190 }
00191
00193 virtual void convertTo2TCoords()
00194 {
00195 if (VertexType==video::EVT_STANDARD)
00196 {
00197 for(u32 n=0;n<Vertices_Standard.size();++n)
00198 {
00199 video::S3DVertex2TCoords Vertex;
00200 Vertex.Color=Vertices_Standard[n].Color;
00201 Vertex.Pos=Vertices_Standard[n].Pos;
00202 Vertex.Normal=Vertices_Standard[n].Normal;
00203 Vertex.TCoords=Vertices_Standard[n].TCoords;
00204 Vertices_2TCoords.push_back(Vertex);
00205 }
00206 Vertices_Standard.clear();
00207 VertexType=video::EVT_2TCOORDS;
00208 }
00209 }
00210
00212 virtual void convertToTangents()
00213 {
00214 if (VertexType==video::EVT_STANDARD)
00215 {
00216 for(u32 n=0;n<Vertices_Standard.size();++n)
00217 {
00218 video::S3DVertexTangents Vertex;
00219 Vertex.Color=Vertices_Standard[n].Color;
00220 Vertex.Pos=Vertices_Standard[n].Pos;
00221 Vertex.Normal=Vertices_Standard[n].Normal;
00222 Vertex.TCoords=Vertices_Standard[n].TCoords;
00223 Vertices_Tangents.push_back(Vertex);
00224 }
00225 Vertices_Standard.clear();
00226 VertexType=video::EVT_TANGENTS;
00227 }
00228 else if (VertexType==video::EVT_2TCOORDS)
00229 {
00230 for(u32 n=0;n<Vertices_2TCoords.size();++n)
00231 {
00232 video::S3DVertexTangents Vertex;
00233 Vertex.Color=Vertices_2TCoords[n].Color;
00234 Vertex.Pos=Vertices_2TCoords[n].Pos;
00235 Vertex.Normal=Vertices_2TCoords[n].Normal;
00236 Vertex.TCoords=Vertices_2TCoords[n].TCoords;
00237 Vertices_Tangents.push_back(Vertex);
00238 }
00239 Vertices_2TCoords.clear();
00240 VertexType=video::EVT_TANGENTS;
00241 }
00242 }
00243
00245 virtual const core::vector3df& getPosition(u32 i) const
00246 {
00247 switch (VertexType)
00248 {
00249 case video::EVT_2TCOORDS:
00250 return Vertices_2TCoords[i].Pos;
00251 case video::EVT_TANGENTS:
00252 return Vertices_Tangents[i].Pos;
00253 default:
00254 return Vertices_Standard[i].Pos;
00255 }
00256 }
00257
00259 virtual core::vector3df& getPosition(u32 i)
00260 {
00261 switch (VertexType)
00262 {
00263 case video::EVT_2TCOORDS:
00264 return Vertices_2TCoords[i].Pos;
00265 case video::EVT_TANGENTS:
00266 return Vertices_Tangents[i].Pos;
00267 default:
00268 return Vertices_Standard[i].Pos;
00269 }
00270 }
00271
00273 virtual const core::vector3df& getNormal(u32 i) const
00274 {
00275 switch (VertexType)
00276 {
00277 case video::EVT_2TCOORDS:
00278 return Vertices_2TCoords[i].Normal;
00279 case video::EVT_TANGENTS:
00280 return Vertices_Tangents[i].Normal;
00281 default:
00282 return Vertices_Standard[i].Normal;
00283 }
00284 }
00285
00287 virtual core::vector3df& getNormal(u32 i)
00288 {
00289 switch (VertexType)
00290 {
00291 case video::EVT_2TCOORDS:
00292 return Vertices_2TCoords[i].Normal;
00293 case video::EVT_TANGENTS:
00294 return Vertices_Tangents[i].Normal;
00295 default:
00296 return Vertices_Standard[i].Normal;
00297 }
00298 }
00299
00301 virtual const core::vector2df& getTCoords(u32 i) const
00302 {
00303 switch (VertexType)
00304 {
00305 case video::EVT_2TCOORDS:
00306 return Vertices_2TCoords[i].TCoords;
00307 case video::EVT_TANGENTS:
00308 return Vertices_Tangents[i].TCoords;
00309 default:
00310 return Vertices_Standard[i].TCoords;
00311 }
00312 }
00313
00315 virtual core::vector2df& getTCoords(u32 i)
00316 {
00317 switch (VertexType)
00318 {
00319 case video::EVT_2TCOORDS:
00320 return Vertices_2TCoords[i].TCoords;
00321 case video::EVT_TANGENTS:
00322 return Vertices_Tangents[i].TCoords;
00323 default:
00324 return Vertices_Standard[i].TCoords;
00325 }
00326 }
00327
00329 virtual void append(const void* const vertices, u32 numVertices, const u16* const indices, u32 numIndices) {}
00330
00332 virtual void append(const IMeshBuffer* const other) {}
00333
00335 virtual E_HARDWARE_MAPPING getHardwareMappingHint_Vertex() const
00336 {
00337 return MappingHint_Vertex;
00338 }
00339
00341 virtual E_HARDWARE_MAPPING getHardwareMappingHint_Index() const
00342 {
00343 return MappingHint_Index;
00344 }
00345
00347 virtual void setHardwareMappingHint( E_HARDWARE_MAPPING NewMappingHint, E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX )
00348 {
00349 if (Buffer==EBT_VERTEX)
00350 MappingHint_Vertex=NewMappingHint;
00351 else if (Buffer==EBT_INDEX)
00352 MappingHint_Index=NewMappingHint;
00353 else if (Buffer==EBT_VERTEX_AND_INDEX)
00354 {
00355 MappingHint_Vertex=NewMappingHint;
00356 MappingHint_Index=NewMappingHint;
00357 }
00358 }
00359
00361 virtual void setDirty(E_BUFFER_TYPE Buffer=EBT_VERTEX_AND_INDEX)
00362 {
00363 if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_VERTEX)
00364 ++ChangedID_Vertex;
00365 if (Buffer==EBT_VERTEX_AND_INDEX || Buffer==EBT_INDEX)
00366 ++ChangedID_Index;
00367 }
00368
00369 virtual u32 getChangedID_Vertex() const {return ChangedID_Vertex;}
00370
00371 virtual u32 getChangedID_Index() const {return ChangedID_Index;}
00372
00374 void boundingBoxNeedsRecalculated(void) { BoundingBoxNeedsRecalculated = true; }
00375
00376 core::array<video::S3DVertexTangents> Vertices_Tangents;
00377 core::array<video::S3DVertex2TCoords> Vertices_2TCoords;
00378 core::array<video::S3DVertex> Vertices_Standard;
00379 core::array<u16> Indices;
00380
00381 u32 ChangedID_Vertex;
00382 u32 ChangedID_Index;
00383
00384
00385 core::matrix4 Transformation;
00386
00387 video::SMaterial Material;
00388 video::E_VERTEX_TYPE VertexType;
00389
00390 core::aabbox3d<f32> BoundingBox;
00391
00392
00393 E_HARDWARE_MAPPING MappingHint_Vertex:3;
00394 E_HARDWARE_MAPPING MappingHint_Index:3;
00395
00396 bool BoundingBoxNeedsRecalculated:1;
00397 };
00398
00399
00400 }
00401 }
00402
00403 #endif
00404