27 #include "../geometry/GeomUtils.h"
29 #include "../scene_graph/NodeShape.h"
35 void WingedEdgeBuilder::visitIndexedFaceSet(IndexedFaceSet &ifs)
37 if (_pRenderMonitor && _pRenderMonitor->testBreak()) {
40 WShape *shape =
new WShape;
41 if (!buildWShape(*shape, ifs)) {
45 shape->setId(ifs.getId().getFirst());
49 void WingedEdgeBuilder::visitNodeShape(NodeShape &ns)
52 _current_frs_material = &(ns.frs_material());
55 void WingedEdgeBuilder::visitNodeTransform(NodeTransform &tn)
57 if (!_current_matrix) {
58 _current_matrix =
new Matrix44r(tn.matrix());
62 _matrices_stack.push_back(_current_matrix);
64 _current_matrix = new_matrix;
69 delete _current_matrix;
71 if (_matrices_stack.empty()) {
72 _current_matrix =
nullptr;
76 _current_matrix = _matrices_stack.back();
77 _matrices_stack.pop_back();
82 unsigned int vsize = ifs.
vsize();
83 unsigned int nsize = ifs.
nsize();
86 const float *vertices = ifs.
vertices();
93 new_vertices =
new float[vsize];
94 new_normals =
new float[nsize];
97 if (_current_matrix) {
99 transformNormals(
normals, nsize, *_current_matrix, new_normals);
102 memcpy(new_vertices, vertices, vsize *
sizeof(*new_vertices));
103 memcpy(new_normals,
normals, nsize *
sizeof(*new_normals));
108 vector<FrsMaterial> frs_materials;
111 for (
unsigned i = 0; i < ifs.
msize(); ++i) {
112 frs_materials.push_back(*(mats[i]));
122 else if (_current_frs_material) {
129 _current_wshape = &shape;
132 buildWVertices(shape, new_vertices, vsize);
134 const unsigned int *vindices = ifs.
vindices();
135 const unsigned int *nindices = ifs.
nindices();
136 const unsigned int *tindices =
nullptr;
141 const unsigned int *mindices =
nullptr;
146 const unsigned int numfaces = ifs.
numFaces();
148 for (
unsigned int index = 0; index < numfaces; index++) {
149 switch (faceStyle[index]) {
150 case IndexedFaceSet::TRIANGLE_STRIP:
151 buildTriangleStrip(new_vertices,
160 numVertexPerFace[index]);
162 case IndexedFaceSet::TRIANGLE_FAN:
163 buildTriangleFan(new_vertices,
172 numVertexPerFace[index]);
174 case IndexedFaceSet::TRIANGLES:
175 buildTriangles(new_vertices,
184 numVertexPerFace[index]);
187 vindices += numVertexPerFace[index];
188 nindices += numVertexPerFace[index];
190 mindices += numVertexPerFace[index];
193 tindices += numVertexPerFace[index];
198 delete[] new_vertices;
199 delete[] new_normals;
213 set<Vec3f> normalsSet;
215 for (vector<WVertex *>::iterator wv = wvertices.begin(), wvend = wvertices.end(); wv != wvend;
217 if ((*wv)->isBoundary()) {
220 if ((*wv)->GetEdges().empty()) {
227 for (; fit != fitend; ++fit) {
230 if (normalsSet.size() != 1) {
234 if (normalsSet.size() != 1) {
235 (*wv)->setSmooth(
false);
240 _winged_edge->addWShape(&shape);
245 void WingedEdgeBuilder::buildWVertices(
WShape &shape,
const float *vertices,
unsigned vsize)
248 for (
unsigned int i = 0; i < vsize; i += 3) {
249 vertex =
new WVertex(
Vec3f(vertices[i], vertices[i + 1], vertices[i + 2]));
250 vertex->
setId(i / 3);
255 void WingedEdgeBuilder::buildTriangleStrip(
const float * ,
257 vector<FrsMaterial> & ,
258 const float *texCoords,
260 const unsigned *vindices,
261 const unsigned *nindices,
262 const unsigned *mindices,
263 const unsigned *tindices,
264 const unsigned nvertices)
266 unsigned nDoneVertices = 2;
267 unsigned nTriangle = 0;
270 WShape *currentShape = _current_wshape;
271 vector<WVertex *> triangleVertices;
272 vector<Vec3f> triangleNormals;
273 vector<Vec2f> triangleTexCoords;
276 while (nDoneVertices < nvertices) {
278 triangleVertices.clear();
280 if (0 == nTriangle % 2) {
281 triangleVertices.push_back(currentShape->
getVertexList()[vindices[nTriangle] / 3]);
282 triangleVertices.push_back(currentShape->
getVertexList()[vindices[nTriangle + 1] / 3]);
283 triangleVertices.push_back(currentShape->
getVertexList()[vindices[nTriangle + 2] / 3]);
285 triangleNormals.emplace_back(
normals[nindices[nTriangle]],
286 normals[nindices[nTriangle] + 1],
287 normals[nindices[nTriangle] + 2]);
288 triangleNormals.emplace_back(
normals[nindices[nTriangle + 1]],
289 normals[nindices[nTriangle + 1] + 1],
290 normals[nindices[nTriangle + 1] + 2]);
291 triangleNormals.emplace_back(
normals[nindices[nTriangle + 2]],
292 normals[nindices[nTriangle + 2] + 1],
293 normals[nindices[nTriangle + 2] + 2]);
296 triangleTexCoords.emplace_back(texCoords[tindices[nTriangle]],
297 texCoords[tindices[nTriangle] + 1]);
298 triangleTexCoords.emplace_back(texCoords[tindices[nTriangle + 1]],
299 texCoords[tindices[nTriangle + 1] + 1]);
300 triangleTexCoords.emplace_back(texCoords[tindices[nTriangle + 2]],
301 texCoords[tindices[nTriangle + 2] + 1]);
305 triangleVertices.push_back(currentShape->
getVertexList()[vindices[nTriangle] / 3]);
306 triangleVertices.push_back(currentShape->
getVertexList()[vindices[nTriangle + 2] / 3]);
307 triangleVertices.push_back(currentShape->
getVertexList()[vindices[nTriangle + 1] / 3]);
309 triangleNormals.emplace_back(
normals[nindices[nTriangle]],
310 normals[nindices[nTriangle] + 1],
311 normals[nindices[nTriangle] + 2]);
312 triangleNormals.emplace_back(
normals[nindices[nTriangle + 2]],
313 normals[nindices[nTriangle + 2] + 1],
314 normals[nindices[nTriangle + 2] + 2]);
315 triangleNormals.emplace_back(
normals[nindices[nTriangle + 1]],
316 normals[nindices[nTriangle + 1] + 1],
317 normals[nindices[nTriangle + 1] + 2]);
320 triangleTexCoords.emplace_back(texCoords[tindices[nTriangle]],
321 texCoords[tindices[nTriangle] + 1]);
322 triangleTexCoords.emplace_back(texCoords[tindices[nTriangle + 2]],
323 texCoords[tindices[nTriangle + 2] + 1]);
324 triangleTexCoords.emplace_back(texCoords[tindices[nTriangle + 1]],
325 texCoords[tindices[nTriangle + 1] + 1]);
330 triangleFaceEdgeMarks.push_back(
331 (iFaceEdgeMarks[nTriangle / 3] & IndexedFaceSet::EDGE_MARK_V1V2) != 0);
332 triangleFaceEdgeMarks.push_back(
333 (iFaceEdgeMarks[nTriangle / 3] & IndexedFaceSet::EDGE_MARK_V2V3) != 0);
334 triangleFaceEdgeMarks.push_back(
335 (iFaceEdgeMarks[nTriangle / 3] & IndexedFaceSet::EDGE_MARK_V3V1) != 0);
337 currentShape->
MakeFace(triangleVertices,
340 triangleFaceEdgeMarks,
341 mindices[nTriangle / 3]);
345 triangleVertices, triangleNormals, triangleTexCoords, triangleFaceEdgeMarks, 0);
352 void WingedEdgeBuilder::buildTriangleFan(
const float * ,
354 vector<FrsMaterial> & ,
356 const IndexedFaceSet::FaceEdgeMark * ,
366 void WingedEdgeBuilder::buildTriangles(
const float * ,
368 vector<FrsMaterial> & ,
369 const float *texCoords,
370 const IndexedFaceSet::FaceEdgeMark *iFaceEdgeMarks,
371 const unsigned *vindices,
372 const unsigned *nindices,
373 const unsigned *mindices,
374 const unsigned *tindices,
375 const unsigned nvertices)
377 WShape *currentShape = _current_wshape;
378 vector<WVertex *> triangleVertices;
379 vector<Vec3f> triangleNormals;
380 vector<Vec2f> triangleTexCoords;
384 for (
unsigned int i = 0; i < nvertices / 3; i++) {
385 triangleVertices.push_back(currentShape->getVertexList()[vindices[3 * i] / 3]);
386 triangleVertices.push_back(currentShape->getVertexList()[vindices[3 * i + 1] / 3]);
387 triangleVertices.push_back(currentShape->getVertexList()[vindices[3 * i + 2] / 3]);
389 triangleNormals.emplace_back(
391 triangleNormals.emplace_back(
normals[nindices[3 * i + 1]],
392 normals[nindices[3 * i + 1] + 1],
393 normals[nindices[3 * i + 1] + 2]);
394 triangleNormals.emplace_back(
normals[nindices[3 * i + 2]],
395 normals[nindices[3 * i + 2] + 1],
396 normals[nindices[3 * i + 2] + 2]);
399 triangleTexCoords.emplace_back(texCoords[tindices[3 * i]], texCoords[tindices[3 * i] + 1]);
400 triangleTexCoords.emplace_back(texCoords[tindices[3 * i + 1]],
401 texCoords[tindices[3 * i + 1] + 1]);
402 triangleTexCoords.emplace_back(texCoords[tindices[3 * i + 2]],
403 texCoords[tindices[3 * i + 2] + 1]);
407 triangleFaceEdgeMarks.push_back((iFaceEdgeMarks[i] & IndexedFaceSet::EDGE_MARK_V1V2) != 0);
408 triangleFaceEdgeMarks.push_back((iFaceEdgeMarks[i] & IndexedFaceSet::EDGE_MARK_V2V3) != 0);
409 triangleFaceEdgeMarks.push_back((iFaceEdgeMarks[i] & IndexedFaceSet::EDGE_MARK_V3V1) != 0);
412 currentShape->MakeFace(
413 triangleVertices, triangleNormals, triangleTexCoords, triangleFaceEdgeMarks, mindices[0]);
416 currentShape->MakeFace(
417 triangleVertices, triangleNormals, triangleTexCoords, triangleFaceEdgeMarks, 0);
426 const float *
v = vertices;
429 for (
unsigned int i = 0; i < vsize / 3; i++) {
432 for (
unsigned int j = 0; j < 3; j++) {
433 pv[j] = hv[j] / hv[3];
440 void WingedEdgeBuilder::transformNormals(
const float *
normals,
448 for (
unsigned int i = 0; i < nsize / 3; i++) {
449 Vec3r hn(n[0], n[1], n[2]);
451 for (
unsigned int j = 0; j < 3; j++) {
Class to render a WingedEdge data structure from a polyhedral data structure organized in nodes of a ...
ATTR_WARN_UNUSED_RESULT const BMVert * v
SIMD_FORCE_INLINE btVector3 transform(const btVector3 &point) const
virtual const unsigned * nindices() const
virtual const FrsMaterial *const * frs_materials() const
virtual const float * normals() const
virtual const unsigned vsize() const
unsigned char FaceEdgeMark
virtual const float * texCoords() const
virtual const unsigned char * faceEdgeMarks() const
virtual const unsigned numFaces() const
virtual const unsigned * vindices() const
virtual const unsigned * mindices() const
virtual const unsigned tsize() const
virtual const unsigned * numVertexPerFaces() const
virtual const unsigned nsize() const
virtual const unsigned * tindices() const
virtual const float * vertices() const
virtual const TRIANGLES_STYLE * trianglesStyle() const
virtual const unsigned msize() const
const FrsMaterial * frs_material() const
Vec3f & GetVertexNormal(int index)
void setFrsMaterials(const vector< FrsMaterial > &iMaterials)
real ComputeMeanEdgeSize() const
virtual WFace * MakeFace(vector< WVertex * > &iVertexList, vector< bool > &iFaceEdgeMarksList, unsigned iMaterialIndex)
void AddVertex(WVertex *iVertex)
vector< WVertex * > & getVertexList()
void setFrsMaterial(const FrsMaterial &frs_material, unsigned i)
vector< WFace * > & GetFaceList()
static float normals[][3]
void transformVertices(const vector< Vec3r > &vertices, const Matrix44r &trans, vector< Vec3r > &res)
Vec3r rotateVector(const Matrix44r &mat, const Vec3r &v)
VecMat::SquareMatrix< real, 4 > Matrix44r
VecMat::HVec3< real > HVec3r
VecMat::Vec3< real > Vec3r