[Bf-blender-cvs] [c6e48575d6e] soc-2019-adaptive-cloth: Cloth: nearly completed transition to using ClothVertMap
ishbosamiya
noreply at git.blender.org
Fri Jul 26 20:19:35 CEST 2019
Commit: c6e48575d6ebd83b4dd660f020b7c200c04b288b
Author: ishbosamiya
Date: Fri Jul 26 02:07:04 2019 +0530
Branches: soc-2019-adaptive-cloth
https://developer.blender.org/rBc6e48575d6ebd83b4dd660f020b7c200c04b288b
Cloth: nearly completed transition to using ClothVertMap
===================================================================
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 d641fcbeb67..4a2d7fc2ae5 100644
--- a/source/blender/blenkernel/intern/cloth_remeshing.cpp
+++ b/source/blender/blenkernel/intern/cloth_remeshing.cpp
@@ -78,7 +78,7 @@ using namespace std;
* reference http://graphics.berkeley.edu/papers/Narain-AAR-2012-11/index.html
******************************************************************************/
-typedef map<BMVert *, ClothVertex> VertMap;
+typedef map<BMVert *, ClothVertex> ClothVertMap;
#define COLLAPSE_EDGES_DEBUG 1
#define NEXT(x) ((x) < 2 ? (x) + 1 : (x)-2)
@@ -110,7 +110,7 @@ static bool cloth_remeshing_vert_on_seam_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 float cloth_remeshing_wedge(float v_01[2], float v_02[2]);
static float cloth_remeshing_edge_size_with_vert(
- BMesh *bm, BMVert *v1, BMVert *v2, BMVert *v, map<BMVert *, ClothSizing> &sizing);
+ BMesh *bm, BMVert *v1, BMVert *v2, BMVert *v, ClothVertMap &cvm);
static void cloth_remeshing_update_active_faces(vector<BMFace *> &active_faces,
BMesh *bm,
BMVert *v);
@@ -137,7 +137,10 @@ static CustomData_MeshMasks cloth_remeshing_get_cd_mesh_masks(void)
return cddata_masks;
}
-static void cloth_remeshing_init_bmesh(Object *ob, ClothModifierData *clmd, Mesh *mesh)
+static void cloth_remeshing_init_bmesh(Object *ob,
+ ClothModifierData *clmd,
+ Mesh *mesh,
+ ClothVertMap &cvm)
{
if (clmd->sim_parms->remeshing_reset || !clmd->clothObject->bm_prev) {
cloth_to_mesh(ob, clmd, mesh);
@@ -159,7 +162,10 @@ static void cloth_remeshing_init_bmesh(Object *ob, ClothModifierData *clmd, Mesh
int i = 0;
BM_ITER_MESH_INDEX (v, &viter, clmd->clothObject->bm_prev, BM_VERTS_OF_MESH, i) {
copy_v3_v3(v->co, clmd->clothObject->verts[i].x);
+ cvm[v] = clmd->clothObject->verts[i];
}
+ /* TODO(Ish): delete the existing clmd->clothObject->verts because
+ * it is duplicated into cvm */
BM_mesh_normals_update(clmd->clothObject->bm_prev);
@@ -178,11 +184,17 @@ static void cloth_remeshing_init_bmesh(Object *ob, ClothModifierData *clmd, Mesh
BMIter viter;
int i = 0;
BM_ITER_MESH_INDEX (v, &viter, clmd->clothObject->bm_prev, BM_VERTS_OF_MESH, i) {
- copy_v3_v3(v->co, clmd->clothObject->verts[i].x);
+ copy_v3_v3(v->co, cvm[v].x);
}
}
clmd->clothObject->mvert_num_prev = clmd->clothObject->mvert_num;
clmd->clothObject->bm = clmd->clothObject->bm_prev;
+
+ if (clmd->clothObject->verts != NULL) {
+ MEM_freeN(clmd->clothObject->verts);
+ clmd->clothObject->verts = NULL;
+ }
+ clmd->clothObject->mvert_num = 0;
}
static ClothVertex cloth_remeshing_mean_cloth_vert(ClothVertex *v1, ClothVertex *v2)
@@ -240,21 +252,40 @@ static ClothVertex cloth_remeshing_mean_cloth_vert(ClothVertex *v1, ClothVertex
return new_vert;
}
-static Mesh *cloth_remeshing_update_cloth_object_bmesh(Object *ob, ClothModifierData *clmd)
+static Mesh *cloth_remeshing_update_cloth_object_bmesh(Object *ob,
+ ClothModifierData *clmd,
+ ClothVertMap &cvm)
{
Mesh *mesh_result = NULL;
+ Cloth *cloth = clmd->clothObject;
CustomData_MeshMasks cddata_masks = cloth_remeshing_get_cd_mesh_masks();
mesh_result = BKE_mesh_from_bmesh_for_eval_nomain(clmd->clothObject->bm, &cddata_masks);
+ /* Allocate our vertices since they were removed before the
+ * remeshing step */
+ const unsigned int mvert_num = mesh_result->totvert;
+ clmd->clothObject->mvert_num = mvert_num;
+ clmd->clothObject->verts = (ClothVertex *)MEM_callocN(
+ sizeof(ClothVertex) * clmd->clothObject->mvert_num, "clothVertex");
+ if (clmd->clothObject->verts == NULL) {
+ cloth_free_modifier(clmd);
+ modifier_setError(&(clmd->modifier), "Out of memory on allocating clmd->clothObject->verts");
+ printf("cloth_free_modifier clmd->clothObject->verts\n");
+ return NULL;
+ }
+ BMVert *v;
+ BMIter viter;
+ int v_index = 0;
+ BM_ITER_MESH_INDEX (v, &viter, clmd->clothObject->bm, BM_VERTS_OF_MESH, v_index) {
+ cloth->verts[v_index] = cvm[v];
+ }
+
if (clmd->clothObject->mvert_num_prev == clmd->clothObject->mvert_num) {
clmd->clothObject->bm_prev = BM_mesh_copy(clmd->clothObject->bm);
BM_mesh_free(clmd->clothObject->bm);
clmd->clothObject->bm = NULL;
return mesh_result;
}
- /* cloth_remeshing_update_cloth_object_mesh(clmd, mesh_result); */
- /**/
- Cloth *cloth = clmd->clothObject;
// Free the springs.
if (cloth->springs != NULL) {
LinkNode *search = cloth->springs;
@@ -382,7 +413,7 @@ static pair<BMVert *, BMVert *> cloth_remeshing_edge_side_verts(BMEdge *e)
/* from Bossen and Heckbert 1996 */
#define CLOTH_REMESHING_EDGE_FLIP_THRESHOLD 0.001f
-static bool cloth_remeshing_should_flip(BMesh *bm, BMEdge *e, map<BMVert *, ClothSizing> &sizing)
+static bool cloth_remeshing_should_flip(BMesh *bm, BMEdge *e, ClothVertMap &cvm)
{
BMVert *v1, *v2, *v3, *v4;
float x[2], y[2], z[2], w[2];
@@ -392,9 +423,8 @@ static bool cloth_remeshing_should_flip(BMesh *bm, BMEdge *e, map<BMVert *, Clot
v4 = cloth_remeshing_edge_opposite_vert(bm, e, 1, y);
float m[2][2];
- /* TODO(Ish): need to fix this when sizing is improved */
- ClothSizing size_temp_01 = cloth_remeshing_find_average_sizing(sizing[v1], sizing[v2]);
- ClothSizing size_temp_02 = cloth_remeshing_find_average_sizing(sizing[v3], sizing[v4]);
+ ClothSizing size_temp_01 = cloth_remeshing_find_average_sizing(*cvm[v1].sizing, *cvm[v2].sizing);
+ ClothSizing size_temp_02 = cloth_remeshing_find_average_sizing(*cvm[v3].sizing, *cvm[v4].sizing);
ClothSizing size_temp = cloth_remeshing_find_average_sizing(size_temp_01, size_temp_02);
copy_m2_m2(m, size_temp.m);
@@ -414,7 +444,7 @@ static bool cloth_remeshing_should_flip(BMesh *bm, BMEdge *e, map<BMVert *, Clot
}
static bool cloth_remeshing_should_flip(
- BMesh *bm, BMVert *v1, BMVert *v2, BMVert *v3, BMVert *v4, map<BMVert *, ClothSizing> &sizing)
+ BMesh *bm, BMVert *v1, BMVert *v2, BMVert *v3, BMVert *v4, ClothVertMap &cvm)
{
BMFace *f1, *f2;
cloth_remeshing_edge_face_pair(BM_edge_exists(v1, v2), &f1, &f2);
@@ -425,9 +455,8 @@ static bool cloth_remeshing_should_flip(
cloth_remeshing_uv_of_vert_in_face(bm, f1, v3, w);
float m[2][2];
- /* TODO(Ish): need to fix this when sizing is improved */
- ClothSizing size_temp_01 = cloth_remeshing_find_average_sizing(sizing[v1], sizing[v2]);
- ClothSizing size_temp_02 = cloth_remeshing_find_average_sizing(sizing[v3], sizing[v4]);
+ ClothSizing size_temp_01 = cloth_remeshing_find_average_sizing(*cvm[v1].sizing, *cvm[v2].sizing);
+ ClothSizing size_temp_02 = cloth_remeshing_find_average_sizing(*cvm[v3].sizing, *cvm[v4].sizing);
ClothSizing size_temp = cloth_remeshing_find_average_sizing(size_temp_01, size_temp_02);
copy_m2_m2(m, size_temp.m);
@@ -505,7 +534,7 @@ static bool cloth_remeshing_vert_on_seam_or_boundary_test(BMesh *bm, BMVert *v)
#if 1
static vector<BMEdge *> cloth_remeshing_find_edges_to_flip(BMesh *bm,
- map<BMVert *, ClothSizing> &sizing,
+ ClothVertMap &cvm,
vector<BMFace *> &active_faces)
{
vector<BMEdge *> edges;
@@ -522,7 +551,7 @@ static vector<BMEdge *> cloth_remeshing_find_edges_to_flip(BMesh *bm,
if (cloth_remeshing_edge_on_seam_or_boundary_test(bm, e)) {
continue;
}
- if (!cloth_remeshing_should_flip(bm, e, sizing)) {
+ if (!cloth_remeshing_should_flip(bm, e, cvm)) {
continue;
}
fedges.push_back(e);
@@ -531,7 +560,7 @@ static vector<BMEdge *> cloth_remeshing_find_edges_to_flip(BMesh *bm,
}
#else
static vector<BMEdge *> cloth_remeshing_find_edges_to_flip(BMesh *bm,
- map<BMVert *, ClothSizing> &sizing,
+ ClothVertMap &cvm,
vector<BMFace *> &active_faces)
{
vector<BMEdge *> edges;
@@ -575,11 +604,11 @@ static vector<BMEdge *> cloth_remeshing_find_edges_to_flip(BMesh *bm,
continue;
}
- if (cloth_remeshing_edge_size_with_vert(bm, v3, v4, e->v1, sizing) > 1.0f) {
+ if (cloth_remeshing_edge_size_with_vert(bm, v3, v4, e->v1, cvm) > 1.0f) {
continue;
}
- if (!cloth_remeshing_should_flip(bm, v1, v2, v3, v4, sizing)) {
+ if (!cloth_remeshing_should_flip(bm, v1, v2, v3, v4, cvm)) {
continue;
}
@@ -614,11 +643,11 @@ static vector<BMEdge *> cloth_remeshing_find_independent_edges(vector<BMEdge *>
}
static bool cloth_remeshing_flip_edges(BMesh *bm,
- map<BMVert *, ClothSizing> &sizing,
+ ClothVertMap &cvm,
vector<BMFace *> &active_faces)
{
static int prev_num_independent_edges = 0;
- vector<BMEdge *> flipable_edges = cloth_remeshing_find_edges_to_flip(bm, sizing, active_faces);
+ vector<BMEdge *> flipable_edges = cloth_remeshing_find_edges_to_flip(bm, cvm, active_faces);
vector<BMEdge *> independent_edges = cloth_remeshing_find_independent_edges(flipable_edges);
if (independent_edges.size() == prev_num_independent_edges) {
return false;
@@ -636,12 +665,10 @@ static bool cloth_remeshing_flip_edges(BMesh *bm,
return true;
}
-static bool cloth_remeshing_fix_mesh(BMesh *bm,
- map<BMVert *, ClothSizing> &sizing,
- vector<BMFace *> active_faces)
+static bool cloth_remeshing_fix_mesh(BMesh *bm, ClothVertMap &cvm, vector<BMFace *> active_fa
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list