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
{
44
apply
(
scene::SVertexColorSetAlphaManipulator
(alpha), mesh);
45
}
46
48
50
void
setVertexColorAlpha
(
IMeshBuffer
* buffer,
s32
alpha)
const
51
{
52
apply
(
scene::SVertexColorSetAlphaManipulator
(alpha), buffer);
53
}
54
56
58
void
setVertexColors
(
IMesh
* mesh,
video::SColor
color)
const
59
{
60
apply
(
scene::SVertexColorSetManipulator
(color), mesh);
61
}
62
64
66
void
setVertexColors
(
IMeshBuffer
* buffer,
video::SColor
color)
const
67
{
68
apply
(
scene::SVertexColorSetManipulator
(color), buffer);
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
{
150
apply
(
SVertexPositionTransformManipulator
(m), mesh,
true
);
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,
285
scene::E_ANIMATED_MESH_TYPE
type =
scene::EAMT_UNKNOWN
)
const
= 0;
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
{
364
video::S3DVertex2TCoords
* verts = (
video::S3DVertex2TCoords
*)buffer->
getVertices
();
365
func(verts[i]);
366
}
367
break
;
368
case
video::EVT_TANGENTS
:
369
{
370
video::S3DVertexTangents
* verts = (
video::S3DVertexTangents
*)buffer->
getVertices
();
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
Irrlicht Engine
Documentation © 2003-2012 by Nikolaus Gebhardt. Generated on Mon Jun 6 2022 20:53:05 for Irrlicht 3D Engine by
Doxygen
1.8.1.2