[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