Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorishbosamiya <ishbosamiya@gmail.com>2021-09-02 17:36:57 +0300
committerishbosamiya <ishbosamiya@gmail.com>2021-09-02 17:37:25 +0300
commit189c38dced44513bc60f55bf585d7044292659cd (patch)
tree485239084b0fae8eeab5d698bc31bbdd248cb955
parentb04ba2e8eb667cba701c90496fc991a0ec22ec77 (diff)
adaptive_cloth: AdaptiveMesh: set uv area for faces
-rw-r--r--source/blender/blenkernel/intern/cloth_remesh.cc37
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
*