[Bf-blender-cvs] [8fedf978831] fracture_modifier: improved rotation calculation in bind animated mesh

Martin Felke noreply at git.blender.org
Fri Jan 26 00:09:04 CET 2018


Commit: 8fedf9788317ce55621ecb2c3c5a5b03c17b7340
Author: Martin Felke
Date:   Fri Jan 26 00:08:41 2018 +0100
Branches: fracture_modifier
https://developer.blender.org/rB8fedf9788317ce55621ecb2c3c5a5b03c17b7340

improved rotation calculation in bind animated mesh

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

M	source/blender/blenkernel/intern/fracture.c
M	source/blender/makesdna/DNA_modifier_types.h

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

diff --git a/source/blender/blenkernel/intern/fracture.c b/source/blender/blenkernel/intern/fracture.c
index f399bbef3cd..1be1f54dedf 100644
--- a/source/blender/blenkernel/intern/fracture.c
+++ b/source/blender/blenkernel/intern/fracture.c
@@ -3924,6 +3924,8 @@ void BKE_read_animated_loc_rot(FractureModifierData *fmd, Object *ob, bool do_bi
 		{
 			fmd->anim_bind[i].mi = -1;
 			fmd->anim_bind[i].v = -1;
+			fmd->anim_bind[i].v1 = -1;
+			fmd->anim_bind[i].v2 = -1;
 			zero_v3(fmd->anim_bind[i].offset);
 			zero_v3(fmd->anim_bind[i].no);
 		}
@@ -3960,20 +3962,31 @@ void BKE_read_animated_loc_rot(FractureModifierData *fmd, Object *ob, bool do_bi
 		i = 0;
 		for (mi = fmd->meshIslands.first; mi; mi = mi->next)
 		{
-			KDTreeNearest n;
+			KDTreeNearest n[3];
 			float co[3], diff[3] = {0, 0, 0};
+			int x = 0;
 
 			copy_v3_v3(co, mi->rigidbody->pos);
 			mul_m4_v3(imat, co);
-			BLI_kdtree_find_nearest(tree, co, &n);
+			x = BLI_kdtree_find_nearest_n(tree, co, n, 3);
 
-			if (n.dist <= fmd->anim_bind_limit || fmd->anim_bind_limit == 0)
+			if (n[0].dist <= fmd->anim_bind_limit || fmd->anim_bind_limit == 0)
 			{
-				fmd->anim_bind[i].v = n.index;
+				fmd->anim_bind[i].v = n[0].index;
+				fmd->anim_bind[i].v1 = n[1].index;
+				fmd->anim_bind[i].v2 = n[2].index;
 				fmd->anim_bind[i].mi = i;
-				sub_v3_v3v3(diff, n.co, co);
+				sub_v3_v3v3(diff, n[0].co, co);
 				copy_v3_v3(fmd->anim_bind[i].offset, diff);
-				normal_short_to_float_v3(fmd->anim_bind[i].no, mvert[n.index].no);
+				if (x < 3 || n[1].index == -1 || n[2].index == -1) {
+					//fallback if not enough verts around
+					normal_short_to_float_v3(fmd->anim_bind[i].no, mvert[n[0].index].no);
+					fmd->anim_bind[i].v1 = -1;
+					fmd->anim_bind[i].v2 = -1;
+				}
+				else {
+					normal_tri_v3(fmd->anim_bind[i].no, mvert[n[0].index].co, mvert[n[1].index].co, mvert[n[2].index].co);
+				}
 			}
 			else
 			{
@@ -4026,7 +4039,17 @@ void BKE_read_animated_loc_rot(FractureModifierData *fmd, Object *ob, bool do_bi
 				if (fmd->anim_mesh_rot)
 				{
 					copy_v3_v3(vec, fmd->anim_bind[i].no);
-					normal_short_to_float_v3(no, mvert[v].no);
+					if (fmd->anim_bind[i].v1 == -1 || fmd->anim_bind[i].v2 == -1) {
+						//fallback if not enough verts around
+						normal_short_to_float_v3(no, mvert[v].no);
+					}
+					else
+					{
+						normal_tri_v3(no, mvert[fmd->anim_bind[i].v].co,
+										  mvert[fmd->anim_bind[i].v1].co,
+										  mvert[fmd->anim_bind[i].v2].co);
+					}
+
 					rotation_between_vecs_to_quat(quat, vec, no);
 				}
 
diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h
index eb9cec877b8..62b72f3c43d 100644
--- a/source/blender/makesdna/DNA_modifier_types.h
+++ b/source/blender/makesdna/DNA_modifier_types.h
@@ -1699,6 +1699,8 @@ typedef struct FractureSetting {
 
 typedef struct AnimBind {
 	int v;
+	int v1;
+	int v2;
 	int mi;
 	float offset[3];
 	float no[3];



More information about the Bf-blender-cvs mailing list