Irrlicht 3D Engine
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
IMeshManipulator.h
Go to the documentation of this file.
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 __I_MESH_MANIPULATOR_H_INCLUDED__
6 #define __I_MESH_MANIPULATOR_H_INCLUDED__
7 
8 #include "IReferenceCounted.h"
9 #include "vector3d.h"
10 #include "aabbox3d.h"
11 #include "matrix4.h"
12 #include "IAnimatedMesh.h"
13 #include "IMeshBuffer.h"
14 #include "SVertexManipulator.h"
15 
16 namespace irr
17 {
18 namespace scene
19 {
20 
21  struct SMesh;
22 
24 
29  class IMeshManipulator : public virtual IReferenceCounted
30  {
31  public:
32 
34 
37  virtual void flipSurfaces(IMesh* mesh) const = 0;
38 
40 
42  void setVertexColorAlpha(IMesh* mesh, s32 alpha) const
43  {
45  }
46 
48 
50  void setVertexColorAlpha(IMeshBuffer* buffer, s32 alpha) const
51  {
53  }
54 
56 
58  void setVertexColors(IMesh* mesh, video::SColor color) const
59  {
61  }
62 
64 
66  void setVertexColors(IMeshBuffer* buffer, video::SColor color) const
67  {
69  }
70 
72 
75  virtual void recalculateNormals(IMesh* mesh, bool smooth = false,
76  bool angleWeighted = false) const=0;
77 
79 
82  virtual void recalculateNormals(IMeshBuffer* buffer,
83  bool smooth = false, bool angleWeighted = false) const=0;
84 
86 
91  virtual void recalculateTangents(IMesh* mesh,
92  bool recalculateNormals=false, bool smooth=false,
93  bool angleWeighted=false) const=0;
94 
96 
101  virtual void recalculateTangents(IMeshBuffer* buffer,
102  bool recalculateNormals=false, bool smooth=false,
103  bool angleWeighted=false) const=0;
104 
106 
108  void scale(IMesh* mesh, const core::vector3df& factor) const
109  {
110  apply(SVertexPositionScaleManipulator(factor), mesh, true);
111  }
112 
114 
116  void scale(IMeshBuffer* buffer, const core::vector3df& factor) const
117  {
118  apply(SVertexPositionScaleManipulator(factor), buffer, true);
119  }
120 
122 
125  _IRR_DEPRECATED_ void scaleMesh(IMesh* mesh, const core::vector3df& factor) const {return scale(mesh,factor);}
126 
128 
131  void scaleTCoords(scene::IMesh* mesh, const core::vector2df& factor, u32 level=1) const
132  {
133  apply(SVertexTCoordsScaleManipulator(factor, level), mesh);
134  }
135 
137 
140  void scaleTCoords(scene::IMeshBuffer* buffer, const core::vector2df& factor, u32 level=1) const
141  {
142  apply(SVertexTCoordsScaleManipulator(factor, level), buffer);
143  }
144 
146 
148  void transform(IMesh* mesh, const core::matrix4& m) const
149  {
151  }
152 
154 
156  void transform(IMeshBuffer* buffer, const core::matrix4& m) const
157  {
158  apply(SVertexPositionTransformManipulator(m), buffer, true);
159  }
160 
162 
165  _IRR_DEPRECATED_ virtual void transformMesh(IMesh* mesh, const core::matrix4& m) const {return transform(mesh,m);}
166 
168 
172  virtual void makePlanarTextureMapping(IMesh* mesh, f32 resolution=0.001f) const=0;
173 
175 
179  virtual void makePlanarTextureMapping(scene::IMeshBuffer* meshbuffer, f32 resolution=0.001f) const=0;
180 
182 
189  virtual void makePlanarTextureMapping(scene::IMesh* mesh,
190  f32 resolutionS, f32 resolutionT,
191  u8 axis, const core::vector3df& offset) const=0;
192 
194 
201  virtual void makePlanarTextureMapping(scene::IMeshBuffer* buffer,
202  f32 resolutionS, f32 resolutionT,
203  u8 axis, const core::vector3df& offset) const=0;
204 
206 
212  virtual SMesh* createMeshCopy(IMesh* mesh) const = 0;
213 
215 
231  virtual IMesh* createMeshWithTangents(IMesh* mesh,
232  bool recalculateNormals=false, bool smooth=false,
233  bool angleWeighted=false, bool recalculateTangents=true) const=0;
234 
236 
241  virtual IMesh* createMeshWith2TCoords(IMesh* mesh) const = 0;
242 
244 
249  virtual IMesh* createMeshWith1TCoords(IMesh* mesh) const = 0;
250 
252 
257  virtual IMesh* createMeshUniquePrimitives(IMesh* mesh) const = 0;
258 
260 
265  virtual IMesh* createMeshWelded(IMesh* mesh, f32 tolerance=core::ROUNDING_ERROR_f32) const = 0;
266 
268 
270  virtual s32 getPolyCount(IMesh* mesh) const = 0;
271 
273 
275  virtual s32 getPolyCount(IAnimatedMesh* mesh) const = 0;
276 
278 
284  virtual IAnimatedMesh * createAnimatedMesh(IMesh* mesh,
286 
288 
296  virtual IMesh* createForsythOptimizedMesh(const IMesh *mesh) const = 0;
297 
299 
303  template <typename Functor>
304  bool apply(const Functor& func, IMeshBuffer* buffer, bool boundingBoxUpdate=false) const
305  {
306  return apply_(func, buffer, boundingBoxUpdate, func);
307  }
308 
309 
311 
315  template <typename Functor>
316  bool apply(const Functor& func, IMesh* mesh, bool boundingBoxUpdate=false) const
317  {
318  if (!mesh)
319  return true;
320  bool result = true;
321  core::aabbox3df bufferbox;
322  for (u32 i=0; i<mesh->getMeshBufferCount(); ++i)
323  {
324  result &= apply(func, mesh->getMeshBuffer(i), boundingBoxUpdate);
325  if (boundingBoxUpdate)
326  {
327  if (0==i)
328  bufferbox.reset(mesh->getMeshBuffer(i)->getBoundingBox());
329  else
330  bufferbox.addInternalBox(mesh->getMeshBuffer(i)->getBoundingBox());
331  }
332  }
333  if (boundingBoxUpdate)
334  mesh->setBoundingBox(bufferbox);
335  return result;
336  }
337 
338 protected:
340 
345  template <typename Functor>
346  bool apply_(const Functor& func, IMeshBuffer* buffer, bool boundingBoxUpdate, const IVertexManipulator& typeTest) const
347  {
348  if (!buffer)
349  return true;
350 
351  core::aabbox3df bufferbox;
352  for (u32 i=0; i<buffer->getVertexCount(); ++i)
353  {
354  switch (buffer->getVertexType())
355  {
356  case video::EVT_STANDARD:
357  {
358  video::S3DVertex* verts = (video::S3DVertex*)buffer->getVertices();
359  func(verts[i]);
360  }
361  break;
362  case video::EVT_2TCOORDS:
363  {
365  func(verts[i]);
366  }
367  break;
368  case video::EVT_TANGENTS:
369  {
371  func(verts[i]);
372  }
373  break;
374  }
375  if (boundingBoxUpdate)
376  {
377  if (0==i)
378  bufferbox.reset(buffer->getPosition(0));
379  else
380  bufferbox.addInternalPoint(buffer->getPosition(i));
381  }
382  }
383  if (boundingBoxUpdate)
384  buffer->setBoundingBox(bufferbox);
385  return true;
386  }
387 };
388 
389 } // end namespace scene
390 } // end namespace irr
391 
392 
393 #endif