[Bf-blender-cvs] [07e365dbaab] soc-2019-adaptive-cloth: Cloth: optimization: uv offset calculated only every frame
ishbosamiya
noreply at git.blender.org
Fri Aug 2 19:26:55 CEST 2019
Commit: 07e365dbaab8157ae3749787ce72750cd68955e8
Author: ishbosamiya
Date: Thu Aug 1 19:47:46 2019 +0530
Branches: soc-2019-adaptive-cloth
https://developer.blender.org/rB07e365dbaab8157ae3749787ce72750cd68955e8
Cloth: optimization: uv offset calculated only every frame
===================================================================
M source/blender/blenkernel/intern/cloth_remeshing.cpp
===================================================================
diff --git a/source/blender/blenkernel/intern/cloth_remeshing.cpp b/source/blender/blenkernel/intern/cloth_remeshing.cpp
index ee78ede007f..e847ec8be44 100644
--- a/source/blender/blenkernel/intern/cloth_remeshing.cpp
+++ b/source/blender/blenkernel/intern/cloth_remeshing.cpp
@@ -86,7 +86,7 @@ class ClothPlane {
};
#define REMESHING_DATA_DEBUG 0 /* split and collapse edge count */
-#define COLLAPSE_EDGES_DEBUG 1
+#define COLLAPSE_EDGES_DEBUG 0
#define FACE_SIZING_DEBUG 0
#define FACE_SIZING_DEBUG_COMP 0
#define FACE_SIZING_DEBUG_OBS 0
@@ -145,10 +145,13 @@ ClothSizing ClothSizing::operator*(float value)
static bool cloth_remeshing_boundary_test(BMVert *v);
static bool cloth_remeshing_boundary_test(BMEdge *e);
-static bool cloth_remeshing_edge_on_seam_test(BMesh *bm, BMEdge *e);
-static bool cloth_remeshing_vert_on_seam_test(BMesh *bm, BMVert *v);
-static bool cloth_remeshing_vert_on_seam_or_boundary_test(BMesh *bm, BMVert *v);
-static void cloth_remeshing_uv_of_vert_in_face(BMesh *bm, BMFace *f, BMVert *v, float r_uv[2]);
+static bool cloth_remeshing_edge_on_seam_test(BMesh *bm, BMEdge *e, const int cd_loop_uv_offset);
+static bool cloth_remeshing_vert_on_seam_test(BMesh *bm, BMVert *v, const int cd_loop_uv_offset);
+static bool cloth_remeshing_vert_on_seam_or_boundary_test(BMesh *bm,
+ BMVert *v,
+ const int cd_loop_uv_offset);
+static void cloth_remeshing_uv_of_vert_in_face(
+ BMesh *bm, BMFace *f, BMVert *v, const int cd_loop_uv_offset, float r_uv[2]);
static float cloth_remeshing_wedge(float v_01[2], float v_02[2]);
static void cloth_remeshing_update_active_faces(vector<BMFace *> &active_faces,
vector<BMFace *> &remove_faces,
@@ -163,7 +166,8 @@ static ClothSizing cloth_remeshing_find_average_sizing(ClothSizing &size_01, Clo
static void mul_m2_m2m2(float r[2][2], float a[2][2], float b[2][2]);
static BMVert *cloth_remeshing_edge_vert(BMEdge *e, int which);
static BMVert *cloth_remeshing_edge_vert(BMesh *bm, BMEdge *e, int side, int i, float r_uv[2]);
-static BMVert *cloth_remeshing_edge_opposite_vert(BMesh *bm, BMEdge *e, int side, float r_uv[2]);
+static BMVert *cloth_remeshing_edge_opposite_vert(
+ BMesh *bm, BMEdge *e, int side, const int cd_loop_uv_offset, float r_uv[2]);
static void cloth_remeshing_edge_face_pair(BMEdge *e, BMFace **r_f1, BMFace **r_f2);
static void cloth_remeshing_uv_of_vert_in_edge(BMesh *bm, BMEdge *e, BMVert *v, float r_uv[2]);
static bool cloth_remeshing_edge_label_test(BMEdge *e);
@@ -202,6 +206,8 @@ static void cloth_remeshing_init_bmesh(Object *ob,
BMVert *v;
BMIter viter;
int i = 0;
+ const int cd_loop_uv_offset = CustomData_get_offset(&clmd->clothObject->bm_prev->ldata,
+ CD_MLOOPUV);
BM_ITER_MESH_INDEX (v, &viter, clmd->clothObject->bm_prev, BM_VERTS_OF_MESH, i) {
mul_m4_v3(ob->obmat, v->co);
if (!equals_v3v3(v->co, clmd->clothObject->verts[i].x)) {
@@ -215,7 +221,8 @@ static void cloth_remeshing_init_bmesh(Object *ob,
copy_v3_v3(v->co, clmd->clothObject->verts[i].x);
}
cvm[v] = clmd->clothObject->verts[i];
- if (cloth_remeshing_vert_on_seam_or_boundary_test(clmd->clothObject->bm_prev, v)) {
+ if (cloth_remeshing_vert_on_seam_or_boundary_test(
+ clmd->clothObject->bm_prev, v, cd_loop_uv_offset)) {
cvm[v].flags |= CLOTH_VERT_FLAG_PRESERVE;
}
}
@@ -428,14 +435,17 @@ static Mesh *cloth_remeshing_update_cloth_object_bmesh(Object *ob, ClothModifier
/* from Bossen and Heckbert 1996 */
#define CLOTH_REMESHING_EDGE_FLIP_THRESHOLD 0.001f
-static bool cloth_remeshing_should_flip(BMesh *bm, BMEdge *e, ClothVertMap &cvm)
+static bool cloth_remeshing_should_flip(BMesh *bm,
+ BMEdge *e,
+ ClothVertMap &cvm,
+ const int cd_loop_uv_offset)
{
BMVert *v1, *v2, *v3, *v4;
float x[2], y[2], z[2], w[2];
v1 = cloth_remeshing_edge_vert(bm, e, 0, 0, x);
v2 = cloth_remeshing_edge_vert(bm, e, 0, 1, z);
- v3 = cloth_remeshing_edge_opposite_vert(bm, e, 0, w);
- v4 = cloth_remeshing_edge_opposite_vert(bm, e, 1, y);
+ v3 = cloth_remeshing_edge_opposite_vert(bm, e, 0, cd_loop_uv_offset, w);
+ v4 = cloth_remeshing_edge_opposite_vert(bm, e, 1, cd_loop_uv_offset, y);
float m[2][2];
ClothSizing size_temp_01 = cloth_remeshing_find_average_sizing(*cvm[v1].sizing, *cvm[v2].sizing);
@@ -458,7 +468,9 @@ static bool cloth_remeshing_should_flip(BMesh *bm, BMEdge *e, ClothVertMap &cvm)
(cloth_remeshing_wedge(zy, xy) + cloth_remeshing_wedge(xw, zw));
}
-static bool cloth_remeshing_edge_on_seam_or_boundary_test(BMesh *bm, BMEdge *e)
+static bool cloth_remeshing_edge_on_seam_or_boundary_test(BMesh *bm,
+ BMEdge *e,
+ const int cd_loop_uv_offset)
{
#if 0
BMFace *f1, *f2;
@@ -475,22 +487,24 @@ static bool cloth_remeshing_edge_on_seam_or_boundary_test(BMesh *bm, BMEdge *e)
return true;
}
float uv_f1_v1[2], uv_f1_v2[2], uv_f2_v1[2], uv_f2_v2[2];
- cloth_remeshing_uv_of_vert_in_face(bm, f1, e->v1, uv_f1_v1);
- cloth_remeshing_uv_of_vert_in_face(bm, f1, e->v2, uv_f1_v2);
- cloth_remeshing_uv_of_vert_in_face(bm, f2, e->v1, uv_f2_v1);
- cloth_remeshing_uv_of_vert_in_face(bm, f2, e->v2, uv_f2_v2);
+ cloth_remeshing_uv_of_vert_in_face(bm, f1, e->v1, cd_loop_uv_offset, uv_f1_v1);
+ cloth_remeshing_uv_of_vert_in_face(bm, f1, e->v2, cd_loop_uv_offset, uv_f1_v2);
+ cloth_remeshing_uv_of_vert_in_face(bm, f2, e->v1, cd_loop_uv_offset, uv_f2_v1);
+ cloth_remeshing_uv_of_vert_in_face(bm, f2, e->v2, cd_loop_uv_offset, uv_f2_v2);
return (!equals_v2v2(uv_f1_v1, uv_f2_v1) || !equals_v2v2(uv_f1_v2, uv_f2_v2));
#endif
}
-static bool cloth_remeshing_vert_on_seam_or_boundary_test(BMesh *bm, BMVert *v)
+static bool cloth_remeshing_vert_on_seam_or_boundary_test(BMesh *bm,
+ BMVert *v,
+ const int cd_loop_uv_offset)
{
BMEdge *e;
BMIter eiter;
BM_ITER_ELEM (e, &eiter, v, BM_EDGES_OF_VERT) {
- if (cloth_remeshing_edge_on_seam_or_boundary_test(bm, e)) {
+ if (cloth_remeshing_edge_on_seam_or_boundary_test(bm, e, cd_loop_uv_offset)) {
return true;
}
}
@@ -504,7 +518,8 @@ static bool cloth_remeshing_edge_label_test(BMEdge *e)
static vector<BMEdge *> cloth_remeshing_find_edges_to_flip(BMesh *bm,
ClothVertMap &cvm,
- vector<BMFace *> &active_faces)
+ vector<BMFace *> &active_faces,
+ const int cd_loop_uv_offset)
{
vector<BMEdge *> edges;
for (int i = 0; i < active_faces.size(); i++) {
@@ -517,13 +532,13 @@ static vector<BMEdge *> cloth_remeshing_find_edges_to_flip(BMesh *bm,
vector<BMEdge *> fedges;
for (int i = 0; i < edges.size(); i++) {
BMEdge *e = edges[i];
- if (cloth_remeshing_edge_on_seam_or_boundary_test(bm, e)) {
+ if (cloth_remeshing_edge_on_seam_or_boundary_test(bm, e, cd_loop_uv_offset)) {
continue;
}
if (cloth_remeshing_edge_label_test(e)) {
continue;
}
- if (!cloth_remeshing_should_flip(bm, e, cvm)) {
+ if (!cloth_remeshing_should_flip(bm, e, cvm, cd_loop_uv_offset)) {
continue;
}
fedges.push_back(e);
@@ -555,10 +570,12 @@ static vector<BMEdge *> cloth_remeshing_find_independent_edges(vector<BMEdge *>
static bool cloth_remeshing_flip_edges(BMesh *bm,
ClothVertMap &cvm,
- vector<BMFace *> &active_faces)
+ vector<BMFace *> &active_faces,
+ const int cd_loop_uv_offset)
{
static int prev_num_independent_edges = 0;
- vector<BMEdge *> flipable_edges = cloth_remeshing_find_edges_to_flip(bm, cvm, active_faces);
+ vector<BMEdge *> flipable_edges = cloth_remeshing_find_edges_to_flip(
+ bm, cvm, active_faces, cd_loop_uv_offset);
vector<BMEdge *> independent_edges = cloth_remeshing_find_independent_edges(flipable_edges);
if (independent_edges.size() == prev_num_independent_edges) {
return false;
@@ -598,10 +615,13 @@ static bool cloth_remeshing_flip_edges(BMesh *bm,
return true;
}
-static bool cloth_remeshing_fix_mesh(BMesh *bm, ClothVertMap &cvm, vector<BMFace *> active_faces)
+static bool cloth_remeshing_fix_mesh(BMesh *bm,
+ ClothVertMap &cvm,
+ vector<BMFace *> active_faces,
+ const int cd_loop_uv_offset)
{
for (int i = 0; i < bm->totvert * 3; i++) {
- if (cloth_remeshing_flip_edges(bm, cvm, active_faces) == false) {
+ if (cloth_remeshing_flip_edges(bm, cvm, active_faces, cd_loop_uv_offset) == false) {
break;
}
}
@@ -1016,7 +1036,9 @@ static BMEdge *cloth_remeshing_fix_sewing_verts(
}
}
-static bool cloth_remeshing_split_edges(ClothModifierData *clmd, ClothVertMap &cvm)
+static bool cloth_remeshing_split_edges(ClothModifierData *clmd,
+ ClothVertMap &cvm,
+ const int cd_loop_uv_offset)
{
BMesh *bm = clmd->clothObject->bm;
static int prev_num_bad_edges = 0;
@@ -1052,7 +1074,7 @@ static bool cloth_remeshing_split_edges(ClothModifierData *clmd, ClothVertMap &c
BM_ITER_ELEM (af, &afiter, new_vert, BM_FACES_OF_VERT) {
active_faces.push_back(af);
}
- cloth_remeshing_fix_mesh(bm, cvm, active_faces);
+ cloth_remeshing_fix_mesh(bm, cvm, active_faces, cd_loop_uv_offset);
if (clmd->sim_parms->flags & CLOTH_SIMSETTINGS_FLAG_SEW) {
if (cloth_remeshing_find_next_loo
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list