[Bf-blender-cvs] [bb9f2e40376] fracture_modifier: keep distorted shape after tearing, todo, make this optional ?

Martin Felke noreply at git.blender.org
Thu Jun 8 14:25:44 CEST 2017


Commit: bb9f2e40376c8c9ae936749ab08498ae7aef8fbd
Author: Martin Felke
Date:   Thu Jun 8 14:25:34 2017 +0200
Branches: fracture_modifier
https://developer.blender.org/rBbb9f2e40376c8c9ae936749ab08498ae7aef8fbd

keep distorted shape after tearing, todo, make this optional ?

===================================================================

M	source/blender/modifiers/intern/MOD_fracture.c

===================================================================

diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index a555f21abd2..a8e99eefe18 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -99,14 +99,18 @@ static void reset_automerge(FractureModifierData *fmd);
 typedef struct SharedVertGroup {
 	struct SharedVertGroup* next, *prev;
 	int index;
-	bool exceeded;
+	bool exceeded, deltas_set;
+	float rest_co[3];
+	float delta[3];
 	ListBase verts;
 } SharedVertGroup;
 
 typedef struct SharedVert {
 	struct SharedVert* next, *prev;
 	int index;
-	bool exceeded;
+	bool exceeded, deltas_set;
+	float rest_co[3];
+	float delta[3];
 } SharedVert;
 
 //TODO XXX Make BKE
@@ -3217,10 +3221,27 @@ static void reset_automerge(FractureModifierData *fmd)
 	}
 }
 
+static void calc_delta(SharedVert* sv, BMVert *v)
+{
+	//apply deltas
+	float a[3], b[3], delta[3], quat[3], co[3];
+	copy_v3_v3(co, v->co);
+	normalize_v3_v3(a, sv->rest_co);
+	normalize_v3_v3(b, v->co);
+	rotation_between_vecs_to_quat(quat, a, b);
+
+	copy_v3_v3(delta, sv->delta);
+	mul_qt_v3(quat, delta);
+	add_v3_v3(co, delta);
+	copy_v3_v3(v->co, co);
+}
+
 static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
 {
 	SharedVert *sv;
 	SharedVertGroup *vg;
+	bool do_calc_delta = true;
+
 	int cd_edge_crease_offset = CustomData_get_offset(&bm->edata, CD_CREASE);
 	if (cd_edge_crease_offset == -1) {
 		BM_data_layer_add(bm, &bm->edata, CD_CREASE);
@@ -3247,6 +3268,13 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
 				add_v3_v3(co, v2->co);
 				verts++;
 			}
+			else
+			{
+				if (do_calc_delta && sv->deltas_set)
+				{
+					calc_delta(sv, v2);
+				}
+			}
 
 			if (vg->exceeded)
 			{
@@ -3275,16 +3303,33 @@ static void prepare_automerge(FractureModifierData *fmd, BMesh *bm)
 				else {
 					sv->exceeded = true;
 					vg->exceeded = true;
+
+					if (!sv->deltas_set){
+						sub_v3_v3v3(sv->delta, co, v2->co);
+						sv->deltas_set = true;
+					}
 				}
 			}
 
 			if (len_squared_v3v3(co, v1->co) <= fmd->automerge_dist * fmd->automerge_dist)
 			{
-				copy_v3_v3(v1->co, co);
+				copy_v3_v3(v1->co, co);	
+			}
+			else {
+
+				if (!vg->deltas_set){
+					sub_v3_v3v3(vg->delta, co, v1->co);
+					vg->deltas_set = true;
+				}
 			}
 		}
 		else
 		{
+			if (do_calc_delta && vg->deltas_set)
+			{
+				calc_delta((SharedVert*)vg, v1);
+			}
+
 			BM_ITER_ELEM(e, &iter, v1, BM_EDGES_OF_VERT)
 			{
 				BM_ELEM_CD_SET_FLOAT(e, cd_edge_crease_offset, fmd->inner_crease);
@@ -3937,6 +3982,9 @@ static void make_shared_vert_groups(FractureModifierData* fmd, DerivedMesh* dm)
 			gvert->verts.first = NULL;
 			gvert->verts.last = NULL;
 			gvert->exceeded = false;
+			gvert->deltas_set = false;
+			zero_v3(gvert->delta);
+			copy_v3_v3(gvert->rest_co, mvert[i].co);
 
 			for (j = 1; j < r; j++)
 			{
@@ -3948,6 +3996,9 @@ static void make_shared_vert_groups(FractureModifierData* fmd, DerivedMesh* dm)
 					SharedVert *svert = MEM_mallocN(sizeof(SharedVert), "sharedVert");
 					svert->index = index;
 					svert->exceeded = false;
+					svert->deltas_set = false;
+					zero_v3(svert->delta);
+					copy_v3_v3(svert->rest_co, mvert[index].co);
 					BLI_addtail(&gvert->verts, svert);
 				}
 			}




More information about the Bf-blender-cvs mailing list