418 char *name = ob->
id.
name + 2;
420 const Span<float3> vert_positions = mesh->vert_positions();
421 const OffsetIndices mesh_polys = mesh->faces();
422 const Span<int> corner_verts = mesh->corner_verts();
427 tottri,
sizeof(*corner_tris), __func__);
429 vert_positions, mesh_polys, corner_verts, {corner_tris, tottri});
441 float viewinv[4][4], viewmat[4][4];
446 float obmat[4][4], nmat[4][4];
447 mul_m4_m4m4(obmat, viewmat, ob->object_to_world().ptr());
454 float v1[3],
v2[3], v3[3];
455 float n1[3], n2[3], n3[3], facenormal[3];
457 for (
int a = 0; a < tottri; a++) {
458 const int3 &tri = corner_tris[
a];
460 copy_v3_v3(v1, vert_positions[corner_verts[tri[0]]]);
462 copy_v3_v3(v3, vert_positions[corner_verts[tri[2]]]);
476 cout <<
"numFaces " << numFaces << endl;
488 uint vSize = 3 * 3 * numFaces;
489 float *vertices =
new float[vSize];
491 float *normals =
new float[nSize];
492 uint *numVertexPerFaces =
new uint[numFaces];
493 vector<Material *> meshMaterials;
494 vector<FrsMaterial> meshFrsMaterials;
498 for (i = 0; i < numFaces; i++) {
500 numVertexPerFaces[i] = 3;
505 uint viSize = 3 * numFaces;
507 uint niSize = viSize;
514 ls.
pm = faceEdgeMarks;
524 const VArray<int> material_indices = *attributes.lookup_or_default<
int>(
525 "material_index", bke::AttrDomain::Face, 0);
526 const VArray<bool> sharp_faces = *attributes.lookup_or_default<
bool>(
527 "sharp_face", bke::AttrDomain::Face,
false);
531 for (
int a = 0; a < tottri; a++) {
532 const int3 &tri = corner_tris[
a];
533 const int poly_i = tri_faces[
a];
536 copy_v3_v3(v1, vert_positions[corner_verts[tri[0]]]);
538 copy_v3_v3(v3, vert_positions[corner_verts[tri[2]]]);
548 if (
_smooth && (!sharp_faces[poly_i])) {
575 bool em1 =
false, em2 =
false, em3 =
false;
591 if (meshMaterials.empty()) {
592 meshMaterials.push_back(mat);
593 meshFrsMaterials.push_back(tmpMat);
594 shape->setFrsMaterial(tmpMat);
601 for (vector<Material *>::iterator it = meshMaterials.begin(), itend = meshMaterials.end();
613 meshMaterials.push_back(mat);
614 meshFrsMaterials.push_back(tmpMat);
619 float triCoords[5][3], triNormals[5][3];
623 numTris, triCoords, v1,
v2, v3, triNormals, n1, n2, n3, edgeMarks, em1, em2, em3, clip);
624 for (i = 0; i < numTris; i++) {
633 (i == 0) ? edgeMarks[0] :
false,
635 (i == numTris - 1) ? edgeMarks[i + 2] :
false);
644 float *cleanVertices =
nullptr;
646 uint *cleanVIndices =
nullptr;
649 vertices, vSize, VIndices, viSize, &cleanVertices, &cvSize, &cleanVIndices);
651 float *cleanNormals =
nullptr;
653 uint *cleanNIndices =
nullptr;
656 normals, nSize, NIndices, niSize, &cleanNormals, &cnSize, &cleanNIndices);
661 for (vector<FrsMaterial>::iterator m = meshFrsMaterials.begin(), mend = meshFrsMaterials.end();
682 vector<detri_t> detriList;
683 Vec3r zero(0.0, 0.0, 0.0);
685 for (i = 0; i < viSize; i += 3) {
687 vi0 = cleanVIndices[i];
688 vi1 = cleanVIndices[i + 1];
689 vi2 = cleanVIndices[i + 2];
690 Vec3r v0(cleanVertices[vi0], cleanVertices[vi0 + 1], cleanVertices[vi0 + 2]);
691 Vec3r v1(cleanVertices[vi1], cleanVertices[vi1 + 1], cleanVertices[vi1 + 2]);
692 Vec3r v2(cleanVertices[vi2], cleanVertices[vi2 + 1], cleanVertices[vi2 + 2]);
693 if (v0 == v1 || v0 ==
v2 || v1 ==
v2) {
717 for (
uint j = 0; j < viSize; j += 3) {
721 vi0 = cleanVIndices[j];
722 vi1 = cleanVIndices[j + 1];
723 vi2 = cleanVIndices[j + 2];
724 Vec3r v0(cleanVertices[vi0], cleanVertices[vi0 + 1], cleanVertices[vi0 + 2]);
725 Vec3r v1(cleanVertices[vi1], cleanVertices[vi1 + 1], cleanVertices[vi1 + 2]);
726 Vec3r v2(cleanVertices[vi2], cleanVertices[vi2 + 1], cleanVertices[vi2 + 2]);
727 if (detri.
viP == vi0 && (detri.
viA == vi1 || detri.
viB == vi1)) {
728 detri.
v += (
v2 - v0);
731 else if (detri.
viP == vi0 && (detri.
viA == vi2 || detri.
viB == vi2)) {
732 detri.
v += (v1 - v0);
735 else if (detri.
viP == vi1 && (detri.
viA == vi0 || detri.
viB == vi0)) {
736 detri.
v += (
v2 - v1);
739 else if (detri.
viP == vi1 && (detri.
viA == vi2 || detri.
viB == vi2)) {
740 detri.
v += (v0 - v1);
743 else if (detri.
viP == vi2 && (detri.
viA == vi0 || detri.
viB == vi0)) {
744 detri.
v += (v1 -
v2);
747 else if (detri.
viP == vi2 && (detri.
viA == vi1 || detri.
viB == vi1)) {
748 detri.
v += (v0 -
v2);
755 detriList.push_back(detri);
758 if (!detriList.empty()) {
759 vector<detri_t>::iterator
v;
760 for (
v = detriList.begin();
v != detriList.end();
v++) {
763 cleanVertices[detri.
viP] = cleanVertices[detri.
viA];
764 cleanVertices[detri.
viP + 1] = cleanVertices[detri.
viA + 1];
765 cleanVertices[detri.
viP + 2] = cleanVertices[detri.
viA + 2];
767 else if (detri.
v.
norm() > 0.0) {
768 cleanVertices[detri.
viP] += 1.0e-5 * detri.
v.
x();
769 cleanVertices[detri.
viP + 1] += 1.0e-5 * detri.
v.
y();
770 cleanVertices[detri.
viP + 2] += 1.0e-5 * detri.
v.
z();
774 printf(
"Warning: Object %s contains %lu degenerated triangle%s (strokes may be incorrect)\n",
776 ulong(detriList.size()),
777 (detriList.size() > 1) ?
"s" :
"");
788 meshFrsMaterials.size(),
static T sum(const btAlignedObjectArray< T > &items)