diff options
author | ishbosamiya <ishbosamiya@gmail.com> | 2021-09-02 17:36:57 +0300 |
---|---|---|
committer | ishbosamiya <ishbosamiya@gmail.com> | 2021-09-02 17:37:25 +0300 |
commit | 189c38dced44513bc60f55bf585d7044292659cd (patch) | |
tree | 485239084b0fae8eeab5d698bc31bbdd248cb955 | |
parent | b04ba2e8eb667cba701c90496fc991a0ec22ec77 (diff) |
adaptive_cloth: AdaptiveMesh: set uv area for faces
-rw-r--r-- | source/blender/blenkernel/intern/cloth_remesh.cc | 37 |
1 files changed, 36 insertions, 1 deletions
diff --git a/source/blender/blenkernel/intern/cloth_remesh.cc b/source/blender/blenkernel/intern/cloth_remesh.cc index 4b52fce3011..3e783aba511 100644 --- a/source/blender/blenkernel/intern/cloth_remesh.cc +++ b/source/blender/blenkernel/intern/cloth_remesh.cc @@ -401,7 +401,7 @@ class AdaptiveMesh : public Mesh<NodeData<END>, VertData, EdgeData, FaceData> { { const auto edge_size = this->compute_edge_size(edge); - auto op_edge_data = edge.get_extra_data_mut(); + auto &op_edge_data = edge.get_extra_data_mut(); if (op_edge_data) { auto &edge_data = edge.get_checked_extra_data_mut(); edge_data.set_sizing(edge_size); @@ -425,6 +425,41 @@ class AdaptiveMesh : public Mesh<NodeData<END>, VertData, EdgeData, FaceData> { } } + float face_calculate_uv_area(const AdaptiveFace &face) const + { + /* The face should be triangulated to make it easier to + * calculate */ + BLI_assert(face.get_verts().size() == 3); + + const auto cross_2d = [](const float2 &a, const float2 &b) { return a.x * b.y - a.y * b.x; }; + + const auto &uv1 = this->get_checked_vert(face.get_verts()[0]).get_uv(); + const auto &uv2 = this->get_checked_vert(face.get_verts()[1]).get_uv(); + const auto &uv3 = this->get_checked_vert(face.get_verts()[2]).get_uv(); + + return std::fabs(cross_2d(uv2 - uv1, uv3 - uv1)); + } + + void set_face_uv_area(AdaptiveFace &face) + { + const auto uv_area = this->face_calculate_uv_area(face); + auto &op_face_data = face.get_extra_data_mut(); + if (op_face_data) { + auto &face_data = op_face_data.value(); + face_data.set_uv_area(uv_area); + } + else { + face.set_extra_data(FaceData(uv_area)); + } + } + + void set_faces_uv_area() + { + for (auto &face : this->get_faces_mut()) { + this->set_face_uv_area(face); + } + } + /** * Marks verts which are on a seam or boundary for preserve * |