[Bf-blender-cvs] [c519abe] fracture_modifier: tweaks for convert to keyframe objects and fix normals

Martin Felke noreply at git.blender.org
Fri Nov 14 16:49:49 CET 2014


Commit: c519abe4665587aa3b7503e99a8a55380ab7a2fb
Author: Martin Felke
Date:   Fri Nov 14 16:49:34 2014 +0100
Branches: fracture_modifier
https://developer.blender.org/rBc519abe4665587aa3b7503e99a8a55380ab7a2fb

tweaks for convert to keyframe objects and fix normals

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

M	release/scripts/startup/bl_operators/rigidbody.py
M	source/blender/blenloader/intern/readfile.c
M	source/blender/editors/object/object_modifier.c
M	source/blender/modifiers/intern/MOD_fracture.c

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

diff --git a/release/scripts/startup/bl_operators/rigidbody.py b/release/scripts/startup/bl_operators/rigidbody.py
index 40c1924..e9b2d0d 100644
--- a/release/scripts/startup/bl_operators/rigidbody.py
+++ b/release/scripts/startup/bl_operators/rigidbody.py
@@ -114,10 +114,11 @@ class BakeToKeyframes(Operator):
         obj = context.object
         return (obj and obj.rigid_body)
 
-    def has_fracture_modifier(self, ob):
+    def has_fracture_modifier(self, ob, report=False):
         for m in ob.modifiers:
             if m.type == 'FRACTURE':
-               self.report({'WARNING'}, "Object '%s' has a fracture modifier, use 'Convert to Objects' before 'Bake to Keyframes'" % ob.name)
+               if (report == True):
+                   self.report({'WARNING'}, "Object '%s' has a fracture modifier, use 'Convert to Objects' before 'Bake to Keyframes'" % ob.name)
                return True
         return False
 
@@ -132,7 +133,7 @@ class BakeToKeyframes(Operator):
         constraints = []
         # filter objects selection
         for obj in context.selected_objects:
-            if (not obj.rigid_body or obj.rigid_body.type != 'ACTIVE' or self.has_fracture_modifier(obj)):
+            if (not obj.rigid_body or obj.rigid_body.type != 'ACTIVE' or self.has_fracture_modifier(obj, True)):
                 obj.select = False
             if (obj.rigid_body_constraint):
                constraints.append(obj)
@@ -181,18 +182,29 @@ class BakeToKeyframes(Operator):
 
                 bpy.ops.anim.keyframe_insert(type='BUILTIN_KSI_LocRot', confirm_success=False)
 
-            #remove (selected) constraints first
-            for obj in constraints:
-                obj.select = True
-
-            bpy.ops.rigidbody.constraints_remove()
-
-            for obj in constraints:
-                obj.select = False
-                obj.hide = True
-            
-            # remove baked objects from simulation
-            bpy.ops.rigidbody.objects_remove()
+            # remove baked objects from simulation, only if no Fracture Modifier is detected (messes up bake possibly)!
+            hasFracture = False
+            for obj in bpy.data.objects:
+                 if (self.has_fracture_modifier(obj)):
+                     hasFracture = True
+                     break
+
+            if (hasFracture == False):
+                #remove (selected) constraints first
+                for obj in constraints:
+                    obj.select = True
+
+                bpy.ops.rigidbody.constraints_remove()
+
+                for obj in constraints:
+                    obj.select = False
+                    obj.hide = True
+
+                bpy.ops.rigidbody.objects_remove()
+            else:
+                 # set to kinematic only
+                 for obj in objects:
+                    obj.rigid_body.kinematic = True
 
             # clean up keyframes
             for obj in objects:
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index cdc5ee1..db006f7 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -5048,25 +5048,27 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
 				mverts = CDDM_get_verts(fmd->visible_mesh_cached);
 
 				for (mi = fmd->meshIslands.first; mi; mi = mi->next) {
+					MVert *mv;
 					int k = 0;
 					read_meshIsland(fd, &mi);
 					mi->vertices_cached = MEM_mallocN(sizeof(MVert*) * mi->vertex_count, "mi->vertices_cached readfile");
+					mv = mi->physics_mesh->getVertArray(mi->physics_mesh);
 
 					for (k = 0; k < mi->vertex_count; k++) {
 						MVert* v = mverts + vertstart + k ;
+						MVert* v2 = mv + k;
 						mi->vertices_cached[k] = v;
 						mi->vertco[k*3] = v->co[0];
 						mi->vertco[k*3+1] = v->co[1];
 						mi->vertco[k*3+2] = v->co[2];
 
 						if (mi->vertno != NULL && fmd->fix_normals) {
-							float no[3];
 							short sno[3];
-							no[0] = mi->vertno[k*3];
-							no[1] = mi->vertno[k*3+1];
-							no[2] = mi->vertno[k*3+2];
-							normal_float_to_short_v3(sno, no);
-							copy_v3_v3_short(mi->vertices_cached[k]->no, sno);
+							sno[0] = mi->vertno[k*3];
+							sno[1] = mi->vertno[k*3+1];
+							sno[2] = mi->vertno[k*3+2];
+							copy_v3_v3_short(v->no, sno);
+							copy_v3_v3_short(v2->no, sno);
 						}
 					}
 					vertstart += mi->vertex_count;
diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index 6500a94..66a810d 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -2682,9 +2682,9 @@ void OBJECT_OT_rigidbody_convert_to_objects(wmOperatorType *ot)
 
 static bool convert_modifier_to_keyframes(FractureModifierData* fmd, Group* gr, Object* ob, Scene* scene, int start, int end)
 {
-	bool is_baked = false;
+//	bool is_baked = false;
 	PointCache* cache = NULL;
-	PTCacheID pid;
+//	PTCacheID pid;
 	MeshIsland *mi = NULL;
 	int j = 0;
 	Object *parent = NULL;
@@ -2699,6 +2699,7 @@ static bool convert_modifier_to_keyframes(FractureModifierData* fmd, Group* gr,
 		cache = scene->rigidbody_world->pointcache;
 	}
 
+#if 0
 	if (cache && cache->flag & PTCACHE_BAKED)
 	{
 		start = cache->startframe;
@@ -2706,6 +2707,7 @@ static bool convert_modifier_to_keyframes(FractureModifierData* fmd, Group* gr,
 		BKE_ptcache_id_from_rigidbody(&pid, NULL, scene->rigidbody_world);
 		is_baked = true;
 	}
+#endif
 
 	if (cache && (cache->flag & PTCACHE_OUTDATED) /* && !(cache->flag & PTCACHE_BAKED)*/)
 	{
@@ -2754,14 +2756,13 @@ static bool convert_modifier_to_keyframes(FractureModifierData* fmd, Group* gr,
 
 		ED_rigidbody_object_add(scene, ob_new, RBO_TYPE_ACTIVE, NULL);
 		ob_new->rigidbody_object->flag |= RBO_FLAG_KINEMATIC;
+		ob_new->rigidbody_object->mass = mi->rigidbody->mass;
 
 		/*set origin to centroid*/
 		copy_v3_v3(cent, mi->centroid);
 		mul_m4_v3(ob_new->obmat, cent);
 		copy_v3_v3(ob_new->loc, cent);
 
-
-
 		if (start < mi->start_frame) {
 			start = mi->start_frame;
 		}
@@ -2770,49 +2771,52 @@ static bool convert_modifier_to_keyframes(FractureModifierData* fmd, Group* gr,
 			end = mi->start_frame + mi->frame_count;
 		}
 
-		for (i = start+1; i < end-1; i++)
+		for (i = start; i < end; i++)
 		{
 			/*move object (loc, rot)*/
-
-			float loc[3] = {0.0f, 0.0f, 0.0f}, rot[4] = {0.0f, 0.0f, 0.0f, 0.0f};
-			float mat[4][4];
-			float size[3] = {1.0f, 1.0f, 1.0f};
-
-			//is there a bake, if yes... use that
-			if (is_baked)
+			if (i > start)
 			{
-				BKE_ptcache_id_time(&pid, scene, (float)i, NULL, NULL, NULL);
-				if (BKE_ptcache_read(&pid, (float)i))
+				float loc[3] = {0.0f, 0.0f, 0.0f}, rot[4] = {0.0f, 0.0f, 0.0f, 0.0f};
+				float mat[4][4];
+				float size[3] = {1.0f, 1.0f, 1.0f};
+
+				//is there a bake, if yes... use that (disabled for now, odd probs...)
+#if 0
+				if (is_baked)
 				{
-					BKE_ptcache_validate(cache, i);
-					copy_v3_v3(loc, mi->rigidbody->pos);
-					copy_qt_qt(rot, mi->rigidbody->orn);
+					BKE_ptcache_id_time(&pid, scene, (float)i, NULL, NULL, NULL);
+					if (BKE_ptcache_read(&pid, (float)i))
+					{
+						BKE_ptcache_validate(cache, i);
+						copy_v3_v3(loc, mi->rigidbody->pos);
+						copy_qt_qt(rot, mi->rigidbody->orn);
+					}
+				}
+				else
+#endif
+				{
+					loc[0] = mi->locs[i*3];
+					loc[1] = mi->locs[i*3+1];
+					loc[2] = mi->locs[i*3+2];
+
+					rot[0] = mi->rots[i*4];
+					rot[1] = mi->rots[i*4+1];
+					rot[2] = mi->rots[i*4+2];
+					rot[3] = mi->rots[i*4+3];
 				}
-			}
-			else
-			{
-				loc[0] = mi->locs[i*3];
-				loc[1] = mi->locs[i*3+1];
-				loc[2] = mi->locs[i*3+2];
-
-				rot[0] = mi->rots[i*4];
-				rot[1] = mi->rots[i*4+1];
-				rot[2] = mi->rots[i*4+2];
-				rot[3] = mi->rots[i*4+3];
-			}
-
-			sub_v3_v3(loc, obloc);
-			add_v3_v3(loc, diff);
 
-			loc_quat_size_to_mat4(mat, loc, rot, size);
+				sub_v3_v3(loc, obloc);
+				add_v3_v3(loc, diff);
 
-			BKE_scene_frame_set(scene, (double)i);
+				loc_quat_size_to_mat4(mat, loc, rot, size);
+				BKE_scene_frame_set(scene, (double)i);
 
-			copy_m4_m4(ob_new->obmat, mat);
+				copy_m4_m4(ob_new->obmat, mat);
 
-			copy_v3_v3(ob_new->loc, loc);
-			copy_qt_qt(ob_new->quat, rot);
-			quat_to_eul(ob_new->rot, rot);
+				copy_v3_v3(ob_new->loc, loc);
+				copy_qt_qt(ob_new->quat, rot);
+				quat_to_eul(ob_new->rot, rot);
+			}
 
 			insert_keyframe(NULL, (ID*)ob_new, NULL, "Location", "location", 0, i, 32);
 			insert_keyframe(NULL, (ID*)ob_new, NULL, "Location", "location", 1, i, 32);
@@ -2821,6 +2825,10 @@ static bool convert_modifier_to_keyframes(FractureModifierData* fmd, Group* gr,
 			insert_keyframe(NULL, (ID*)ob_new, NULL, "Rotation", "rotation_euler", 0, i, 32);
 			insert_keyframe(NULL, (ID*)ob_new, NULL, "Rotation", "rotation_euler", 1, i, 32);
 			insert_keyframe(NULL, (ID*)ob_new, NULL, "Rotation", "rotation_euler", 2, i, 32);
+
+			insert_keyframe(NULL, (ID*)ob_new, NULL, "Scale", "scale", 0, i, 32);
+			insert_keyframe(NULL, (ID*)ob_new, NULL, "Scale", "scale", 1, i, 32);
+			insert_keyframe(NULL, (ID*)ob_new, NULL, "Scale", "scale", 2, i, 32);
 		}
 
 		j++;
@@ -2950,11 +2958,12 @@ static int rigidbody_convert_keyframes_exec(bContext *C, wmOperator *op)
 				DAG_relations_tag_update(G.main);
 				WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL);
 				WM_event_add_notifier(C, NC_OBJECT | ND_PARENT, NULL);
+				WM_event_add_notifier(C, NC_SCENE | ND_FRAME, NULL);
 				return OPERATOR_FINISHED;
 			}
 			else
 			{
-				BKE_report(op->reports, RPT_WARNING, "No valid cache data found, please run or bake simulation first");
+				BKE_report(op->reports, RPT_WARNING, "No valid cache data found, please run simulation first (baked ones too !)");
 				return OPERATOR_CANCELLED;
 			}
 		}
diff --git a/source/blender/modifiers/intern/MOD_fracture.c b/source/blender/modifiers/intern/MOD_fracture.c
index 77164f3..3edd8cf 100644
--- a/source/blender/modifiers/intern/MOD_fracture.c
+++ b/source/blender/modifiers/intern/MOD_fracture.c
@@ -460,7 +460,6 @@ static void find_normal(DerivedMesh *dm, KDTree *tree, float co[3], short no[3],
 		normal_short_to_float_v3(vno, mvert.no);
 		if ((dot_v3v3(fno, vno) > 0.0f)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list