13 #include "../geometry/GeomUtils.h"
15 #include "../scene_graph/NodeShape.h"
21 void WingedEdgeBuilder::visitIndexedFaceSet(IndexedFaceSet &ifs)
23 if (_pRenderMonitor && _pRenderMonitor->testBreak()) {
26 WShape *shape =
new WShape;
27 if (!buildWShape(*shape, ifs)) {
31 shape->setId(ifs.getId().getFirst());
35 void WingedEdgeBuilder::visitNodeShape(NodeShape &ns)
38 _current_frs_material = &(ns.frs_material());
41 void WingedEdgeBuilder::visitNodeTransform(NodeTransform &tn)
43 if (!_current_matrix) {
44 _current_matrix =
new Matrix44r(tn.matrix());
48 _matrices_stack.push_back(_current_matrix);
50 _current_matrix = new_matrix;
55 delete _current_matrix;
57 if (_matrices_stack.empty()) {
58 _current_matrix =
nullptr;
62 _current_matrix = _matrices_stack.back();
63 _matrices_stack.pop_back();
68 unsigned int vsize = ifs.
vsize();
69 unsigned int nsize = ifs.
nsize();
72 const float *vertices = ifs.
vertices();
79 new_vertices =
new float[vsize];
80 new_normals =
new float[nsize];
83 if (_current_matrix) {
85 transformNormals(
normals, nsize, *_current_matrix, new_normals);
88 memcpy(new_vertices, vertices, vsize *
sizeof(*new_vertices));
89 memcpy(new_normals,
normals, nsize *
sizeof(*new_normals));
94 vector<FrsMaterial> frs_materials;
97 for (
unsigned i = 0; i < ifs.
msize(); ++i) {
98 frs_materials.push_back(*(mats[i]));
108 else if (_current_frs_material) {
115 _current_wshape = &shape;
118 buildWVertices(shape, new_vertices, vsize);
120 const unsigned int *vindices = ifs.
vindices();
121 const unsigned int *nindices = ifs.
nindices();
122 const unsigned int *tindices =
nullptr;
127 const unsigned int *mindices =
nullptr;
132 const unsigned int numfaces = ifs.
numFaces();
134 for (
unsigned int index = 0; index < numfaces; index++) {
135 switch (faceStyle[index]) {
136 case IndexedFaceSet::TRIANGLE_STRIP:
137 buildTriangleStrip(new_vertices,
146 numVertexPerFace[index]);
148 case IndexedFaceSet::TRIANGLE_FAN:
149 buildTriangleFan(new_vertices,
158 numVertexPerFace[index]);
160 case IndexedFaceSet::TRIANGLES:
161 buildTriangles(new_vertices,
170 numVertexPerFace[index]);
173 vindices += numVertexPerFace[index];
174 nindices += numVertexPerFace[index];
176 mindices += numVertexPerFace[index];
179 tindices += numVertexPerFace[index];
184 delete[] new_vertices;
185 delete[] new_normals;
199 set<Vec3f> normalsSet;
201 for (vector<WVertex *>::iterator wv = wvertices.begin(), wvend = wvertices.end(); wv != wvend;
203 if ((*wv)->isBoundary()) {
206 if ((*wv)->GetEdges().empty()) {
213 for (; fit != fitend; ++fit) {
216 if (normalsSet.size() != 1) {
220 if (normalsSet.size() != 1) {
221 (*wv)->setSmooth(
false);
226 _winged_edge->addWShape(&shape);
231 void WingedEdgeBuilder::buildWVertices(
WShape &shape,
const float *vertices,
unsigned vsize)
234 for (
unsigned int i = 0; i < vsize; i += 3) {
235 vertex =
new WVertex(
Vec3f(vertices[i], vertices[i + 1], vertices[i + 2]));
236 vertex->
setId(i / 3);
241 void WingedEdgeBuilder::buildTriangleStrip(
const float * ,
243 vector<FrsMaterial> & ,
244 const float *texCoords,
246 const unsigned *vindices,
247 const unsigned *nindices,
248 const unsigned *mindices,
249 const unsigned *tindices,
250 const unsigned nvertices)
252 unsigned nDoneVertices = 2;
253 unsigned nTriangle = 0;
256 WShape *currentShape = _current_wshape;
257 vector<WVertex *> triangleVertices;
258 vector<Vec3f> triangleNormals;
259 vector<Vec2f> triangleTexCoords;
262 while (nDoneVertices < nvertices) {
264 triangleVertices.clear();
266 if (0 == nTriangle % 2) {
267 triangleVertices.push_back(currentShape->
getVertexList()[vindices[nTriangle] / 3]);
268 triangleVertices.push_back(currentShape->
getVertexList()[vindices[nTriangle + 1] / 3]);
269 triangleVertices.push_back(currentShape->
getVertexList()[vindices[nTriangle + 2] / 3]);
271 triangleNormals.emplace_back(
normals[nindices[nTriangle]],
272 normals[nindices[nTriangle] + 1],
273 normals[nindices[nTriangle] + 2]);
274 triangleNormals.emplace_back(
normals[nindices[nTriangle + 1]],
275 normals[nindices[nTriangle + 1] + 1],
276 normals[nindices[nTriangle + 1] + 2]);
277 triangleNormals.emplace_back(
normals[nindices[nTriangle + 2]],
278 normals[nindices[nTriangle + 2] + 1],
279 normals[nindices[nTriangle + 2] + 2]);
282 triangleTexCoords.emplace_back(texCoords[tindices[nTriangle]],
283 texCoords[tindices[nTriangle] + 1]);
284 triangleTexCoords.emplace_back(texCoords[tindices[nTriangle + 1]],
285 texCoords[tindices[nTriangle + 1] + 1]);
286 triangleTexCoords.emplace_back(texCoords[tindices[nTriangle + 2]],
287 texCoords[tindices[nTriangle + 2] + 1]);
291 triangleVertices.push_back(currentShape->
getVertexList()[vindices[nTriangle] / 3]);
292 triangleVertices.push_back(currentShape->
getVertexList()[vindices[nTriangle + 2] / 3]);
293 triangleVertices.push_back(currentShape->
getVertexList()[vindices[nTriangle + 1] / 3]);
295 triangleNormals.emplace_back(
normals[nindices[nTriangle]],
296 normals[nindices[nTriangle] + 1],
297 normals[nindices[nTriangle] + 2]);
298 triangleNormals.emplace_back(
normals[nindices[nTriangle + 2]],
299 normals[nindices[nTriangle + 2] + 1],
300 normals[nindices[nTriangle + 2] + 2]);
301 triangleNormals.emplace_back(
normals[nindices[nTriangle + 1]],
302 normals[nindices[nTriangle + 1] + 1],
303 normals[nindices[nTriangle + 1] + 2]);
306 triangleTexCoords.emplace_back(texCoords[tindices[nTriangle]],
307 texCoords[tindices[nTriangle] + 1]);
308 triangleTexCoords.emplace_back(texCoords[tindices[nTriangle + 2]],
309 texCoords[tindices[nTriangle + 2] + 1]);
310 triangleTexCoords.emplace_back(texCoords[tindices[nTriangle + 1]],
311 texCoords[tindices[nTriangle + 1] + 1]);
316 triangleFaceEdgeMarks.push_back(
317 (iFaceEdgeMarks[nTriangle / 3] & IndexedFaceSet::EDGE_MARK_V1V2) != 0);
318 triangleFaceEdgeMarks.push_back(
319 (iFaceEdgeMarks[nTriangle / 3] & IndexedFaceSet::EDGE_MARK_V2V3) != 0);
320 triangleFaceEdgeMarks.push_back(
321 (iFaceEdgeMarks[nTriangle / 3] & IndexedFaceSet::EDGE_MARK_V3V1) != 0);
323 currentShape->
MakeFace(triangleVertices,
326 triangleFaceEdgeMarks,
327 mindices[nTriangle / 3]);
331 triangleVertices, triangleNormals, triangleTexCoords, triangleFaceEdgeMarks, 0);
338 void WingedEdgeBuilder::buildTriangleFan(
const float * ,
340 vector<FrsMaterial> & ,
342 const IndexedFaceSet::FaceEdgeMark * ,
352 void WingedEdgeBuilder::buildTriangles(
const float * ,
354 vector<FrsMaterial> & ,
355 const float *texCoords,
356 const IndexedFaceSet::FaceEdgeMark *iFaceEdgeMarks,
357 const unsigned *vindices,
358 const unsigned *nindices,
359 const unsigned *mindices,
360 const unsigned *tindices,
361 const unsigned nvertices)
363 WShape *currentShape = _current_wshape;
364 vector<WVertex *> triangleVertices;
365 vector<Vec3f> triangleNormals;
366 vector<Vec2f> triangleTexCoords;
370 for (
unsigned int i = 0; i < nvertices / 3; i++) {
371 triangleVertices.push_back(currentShape->getVertexList()[vindices[3 * i] / 3]);
372 triangleVertices.push_back(currentShape->getVertexList()[vindices[3 * i + 1] / 3]);
373 triangleVertices.push_back(currentShape->getVertexList()[vindices[3 * i + 2] / 3]);
375 triangleNormals.emplace_back(
377 triangleNormals.emplace_back(
normals[nindices[3 * i + 1]],
378 normals[nindices[3 * i + 1] + 1],
379 normals[nindices[3 * i + 1] + 2]);
380 triangleNormals.emplace_back(
normals[nindices[3 * i + 2]],
381 normals[nindices[3 * i + 2] + 1],
382 normals[nindices[3 * i + 2] + 2]);
385 triangleTexCoords.emplace_back(texCoords[tindices[3 * i]], texCoords[tindices[3 * i] + 1]);
386 triangleTexCoords.emplace_back(texCoords[tindices[3 * i + 1]],
387 texCoords[tindices[3 * i + 1] + 1]);
388 triangleTexCoords.emplace_back(texCoords[tindices[3 * i + 2]],
389 texCoords[tindices[3 * i + 2] + 1]);
393 triangleFaceEdgeMarks.push_back((iFaceEdgeMarks[i] & IndexedFaceSet::EDGE_MARK_V1V2) != 0);
394 triangleFaceEdgeMarks.push_back((iFaceEdgeMarks[i] & IndexedFaceSet::EDGE_MARK_V2V3) != 0);
395 triangleFaceEdgeMarks.push_back((iFaceEdgeMarks[i] & IndexedFaceSet::EDGE_MARK_V3V1) != 0);
398 currentShape->MakeFace(
399 triangleVertices, triangleNormals, triangleTexCoords, triangleFaceEdgeMarks, mindices[0]);
402 currentShape->MakeFace(
403 triangleVertices, triangleNormals, triangleTexCoords, triangleFaceEdgeMarks, 0);
412 const float *
v = vertices;
415 for (
unsigned int i = 0; i < vsize / 3; i++) {
418 for (
unsigned int j = 0; j < 3; j++) {
419 pv[j] = hv[j] / hv[3];
426 void WingedEdgeBuilder::transformNormals(
const float *
normals,
434 for (
unsigned int i = 0; i < nsize / 3; i++) {
435 Vec3r hn(n[0], n[1], n[2]);
437 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()
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
MutableSpan< float3 > normals