diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2014-04-09 16:54:13 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2014-04-10 15:49:49 +0400 |
commit | f93bc7693a530632455d3ec7acc4bce54a1f85bc (patch) | |
tree | d0e067438cbc547875b3cb77e53904c5ea2a537d /extern/carve/carve-capi.cc | |
parent | 19e627cab34a04a3d01b2e3a868b7bf91d56e8f9 (diff) |
Backport revisions for the 2.70a releasev2.70a
d2660a0, 6e99fb0, 58c22d8, 83f2012 + ff21f6a, a7ed1db. cc6b106
7997e38, 9d4b54b, efb48fc, 3fc293c, 29f359c, 77c1d17, 92a539e,
c626462, f48828b, 6452d9f, 765d077, 74518b2, af16d46, 8da4936,
6babbf5, f0106d2, f88776b, ee72cba, 467596d, e21a7b3, eed3974,
71a2ff1, ccf9afd, 44d6c68, 30fdfc3, b69809c, b0a8e4c, bd57ec6,
3b0832d, 2a25676, 3977b76, fb25a86, 9bbb30b, 51abc2b, 0ebade5,
2c0e32f, 3deaf7d, ea01b24, c61eb64, f3db038, a6fb670, eedde31,
b66a954, 7ff123c, f5b79df, 7148c97, 54a8753, fcaa018, 4c73001,
7a21330, 07578be, e9a64e2, fd3de8b, ae792e9, b7712a7 + 3600622,
d9557d0, 6d973b8, 688257d, 4acb57a, 95ac6bc,
Also backported openmp changes to sculpt making it so number
of real CPU cores is used as a number of threads here.
Diffstat (limited to 'extern/carve/carve-capi.cc')
-rw-r--r-- | extern/carve/carve-capi.cc | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/extern/carve/carve-capi.cc b/extern/carve/carve-capi.cc index a65d1a8d766..af9ecad685d 100644 --- a/extern/carve/carve-capi.cc +++ b/extern/carve/carve-capi.cc @@ -38,7 +38,7 @@ typedef std::pair<int, int> OrigIndex; typedef std::pair<MeshSet<3>::vertex_t *, MeshSet<3>::vertex_t *> VertexPair; typedef carve::interpolate::VertexAttr<OrigIndex> OrigVertMapping; typedef carve::interpolate::FaceAttr<OrigIndex> OrigFaceMapping; -typedef carve::interpolate::FaceEdgeAttr<OrigIndex> OrigFaceEdgeMapping; +typedef carve::interpolate::SwapableFaceEdgeAttr<OrigIndex> OrigFaceEdgeMapping; typedef carve::interpolate::SimpleFaceEdgeAttr<bool> FaceEdgeTriangulatedFlag; typedef struct CarveMeshDescr { @@ -522,6 +522,39 @@ public: } }; +template <typename Interpolator> +void copyFaceEdgeAttrs(const MeshSet<3> *poly, + Interpolator *old_interpolator, + Interpolator *new_interpolator) +{ + for (MeshSet<3>::const_face_iter face_iter = poly->faceBegin(); + face_iter != poly->faceEnd(); + ++face_iter) + { + const MeshSet<3>::face_t *face = *face_iter; + + for (int edge_index = 0; + edge_index < face->nEdges(); + ++edge_index) + { + new_interpolator->copyAttribute(face, + edge_index, + old_interpolator); + } + } +} + +template <typename Interpolator> +void cleanupFaceEdgeAttrs(const MeshSet<3> *left, + const MeshSet<3> *right, + Interpolator *interpolator) +{ + Interpolator new_interpolator; + copyFaceEdgeAttrs(left, interpolator, &new_interpolator); + copyFaceEdgeAttrs(right, interpolator, &new_interpolator); + interpolator->swapAttributes(&new_interpolator); +} + } // namespace CarveMeshDescr *carve_addMesh(struct ImportMeshData *import_data, @@ -698,7 +731,15 @@ bool carve_performBooleanOperation(CarveMeshDescr *left_mesh, // intersecting that meshes tessellation of operation result can't be // done properly. The only way to make such situations working is to // union intersecting meshes of the same operand. - carve_unionIntersections(&csg, &left, &right); + if (carve_unionIntersections(&csg, &left, &right)) { + cleanupFaceEdgeAttrs(left, + right, + &output_descr->face_edge_triangulated_flag); + cleanupFaceEdgeAttrs(left, + right, + &output_descr->orig_face_edge_mapping); + } + left_mesh->poly = left; right_mesh->poly = right; |