[Bf-blender-cvs] [428ff2217a5] soc-2019-adaptive-cloth: Cloth: further additions to collapse edges
ishbosamiya
noreply at git.blender.org
Fri Jun 28 19:52:34 CEST 2019
Commit: 428ff2217a5ef4068f6137d76836ede36fe52ee8
Author: ishbosamiya
Date: Thu Jun 27 12:19:01 2019 +0530
Branches: soc-2019-adaptive-cloth
https://developer.blender.org/rB428ff2217a5ef4068f6137d76836ede36fe52ee8
Cloth: further additions to collapse edges
===================================================================
M source/blender/blenkernel/intern/cloth.c
===================================================================
diff --git a/source/blender/blenkernel/intern/cloth.c b/source/blender/blenkernel/intern/cloth.c
index e3658258800..4571fe832b2 100644
--- a/source/blender/blenkernel/intern/cloth.c
+++ b/source/blender/blenkernel/intern/cloth.c
@@ -1118,17 +1118,103 @@ static bool cloth_remeshing_split_edges(ClothModifierData *clmd, LinkNodePair *s
return true;
}
+static void cloth_remeshing_get_uv_from_face(BMFace *f, float **r_uvs, int *r_uv_num)
+{
+ BMFace *e;
+ BMIter eiter;
+ int i = 0;
+ BM_ITER_ELEM_INDEX (e, &eiter, f, BM_EDGES_OF_FACE, i) {
+ MLoopUV *luv;
+ const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
+ BMLoop *l, *l2;
+ float u1[2], u2[2];
+
+ l = e->l;
+ if (l->v == e->v1) {
+ if (l->next->v == e->v2) {
+ l2 = l->next;
+ }
+ else {
+ l2 = l->prev;
+ }
+ }
+ else {
+ if (l->next->v == e->v1) {
+ l2 = l->next;
+ }
+ else {
+ l2 = l->prev;
+ }
+ }
+
+ luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+ copy_v2_v2(u1, luv->uv);
+ luv = BM_ELEM_CD_GET_VOID_P(l2, cd_loop_uv_offset);
+ copy_v2_v2(u2, luv->uv);
+
+ /* copy over the UVs only if they don't already exist */
+ bool uv_exists = false;
+ for (int j = 0; j < i; j++) {
+ if (equals_v2v2(u1, r_uvs[j])) {
+ uv_exists = true;
+ }
+ }
+ if (!uv_exists) {
+ copy_v2_v2(r_uvs[i], u1);
+ }
+ uv_exists = false;
+ for (int j = 0; j < i; j++) {
+ if (equals_v2v2(u2, r_uvs[j])) {
+ uv_exists = true;
+ }
+ }
+ if (!uv_exists) {
+ copy_v2_v2(r_uvs[i], u2);
+ }
+ }
+}
+
+static float cloth_remeshing_edge_size_collapse(BMEdge *e, BMVert *v)
+{
+}
+
+#define REMESHING_HYSTERESIS_PARAMETER 0.2
static bool cloth_remeshing_can_collapse_edge(BMEdge *e, BMesh *bm)
{
if (BM_edge_face_count(e) < 2) {
return false;
}
+ /* TODO(Ish): aspect ratio parameter */
+
+ /* Edge Metric, not same as split edge edge metric */
+ BMVert *v1 = e->v1;
+ BMVert *v2 = e->v2;
+ BMVert *v3 = NULL;
+ BMEdge *adj_e;
+ BMIter adj_e_iter;
+ BM_ITER_ELEM (adj_e, &adj_e_iter, v1, BM_EDGES_OF_VERT) {
+ BMIter adj_v_iter;
+ BM_ITER_ELEM (v3, &adj_v_iter, adj_e, BM_VERTS_OF_EDGE) {
+ if (v3 != v1 && v3 != v2) {
+ break;
+ }
+ }
+ /* Edge metric using v1, v2, v3 */
+ if (v3) {
+ if (cloth_remeshing_edge_size_collapse(e, v3) > (1.0f - REMESHING_HYSTERESIS_PARAMETER)) {
+ return false;
+ }
+ v3 = NULL; /* done so that edge metric is found only if v3 exists */
+ }
+ }
+
return true;
}
-static void cloth_remeshing_collapse_edge(BMEdge *e, BMesh *bm)
+static BMEdge *cloth_remeshing_collapse_edge(BMEdge *e, BMesh *bm)
{
+ return BM_vert_collapse_faces(bm, e, e->v1, 1.0f, true, true, true);
}
static bool cloth_remeshing_try_edge_collapse(BMEdge *e, BMesh *bm)
@@ -1136,6 +1222,7 @@ static bool cloth_remeshing_try_edge_collapse(BMEdge *e, BMesh *bm)
if (!cloth_remeshing_can_collapse_edge(e, bm)) {
return false;
}
+
cloth_remeshing_collapse_edge(e, bm);
return true;
}
More information about the Bf-blender-cvs
mailing list