[Bf-blender-cvs] [4f9941a] fracture_modifier: fix: modifier will respond now to manual changes in transformation (setting values numerically, clear transformations, apply transformations and origins) and ghost setting should be respected properly now with mesh collision shape

Martin Felke noreply at git.blender.org
Tue Apr 7 17:12:40 CEST 2015


Commit: 4f9941afcb8aa8764641043af405ccb004bb9e77
Author: Martin Felke
Date:   Tue Apr 7 17:10:48 2015 +0200
Branches: fracture_modifier
https://developer.blender.org/rB4f9941afcb8aa8764641043af405ccb004bb9e77

fix: modifier will respond now to manual changes in transformation (setting values numerically, clear transformations, apply transformations and origins) and ghost setting should be respected properly now with mesh collision shape

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

M	intern/rigidbody/rb_bullet_api.cpp
M	source/blender/blenkernel/intern/rigidbody.c
M	source/blender/editors/object/object_transform.c
M	source/blender/makesrna/intern/rna_object.c

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

diff --git a/intern/rigidbody/rb_bullet_api.cpp b/intern/rigidbody/rb_bullet_api.cpp
index 8921f88..cc2bdd6 100644
--- a/intern/rigidbody/rb_bullet_api.cpp
+++ b/intern/rigidbody/rb_bullet_api.cpp
@@ -206,7 +206,8 @@ struct rbFilterCallback : public btOverlapFilterCallback
 				}
 				else
 				{
-					result = 1;
+					//just check for ghost flags and collision groups there
+					result = this->callback(NULL, NULL, NULL, rb0->blenderOb, rb1->blenderOb);
 				}
 			}
 			else
diff --git a/source/blender/blenkernel/intern/rigidbody.c b/source/blender/blenkernel/intern/rigidbody.c
index ea5ee3b..796ffa0 100644
--- a/source/blender/blenkernel/intern/rigidbody.c
+++ b/source/blender/blenkernel/intern/rigidbody.c
@@ -1714,6 +1714,13 @@ static void do_activate(Object* ob, Object *ob2, MeshIsland *mi_compare, RigidBo
 	}
 }
 
+static int check_colgroup_ghost(Object* ob1, Object *ob2)
+{
+	int ret = 0;
+	ret = colgroup_check(ob1->rigidbody_object->col_groups, ob2->rigidbody_object->col_groups);
+	return ret && (!(ob1->rigidbody_object->flag & RBO_FLAG_IS_GHOST) && !(ob2->rigidbody_object->flag & RBO_FLAG_IS_GHOST));
+}
+
 /* this allows partial object activation, only some shards will be activated, called from bullet(!) */
 static int filterCallback(void* world, void* island1, void* island2, void *blenderOb1, void* blenderOb2) {
 	MeshIsland* mi1, *mi2;
@@ -1721,14 +1728,16 @@ static int filterCallback(void* world, void* island1, void* island2, void *blend
 	Object* ob1, *ob2;
 	int ob_index1, ob_index2;
 	bool validOb = true;
-	bool ret = false;
 
 	mi1 = (MeshIsland*)island1;
 	mi2 = (MeshIsland*)island2;
 
 	if (rbw == NULL)
 	{
-		return 1;
+		/* just check for ghost flags here, do not activate anything */
+		ob1 = blenderOb1;
+		ob2 = blenderOb2;
+		return check_colgroup_ghost(ob1, ob2);
 	}
 
 	/* cache offset map is a dull name for that... */
@@ -1787,8 +1796,7 @@ static int filterCallback(void* world, void* island1, void* island2, void *blend
 		}
 	}
 
-	ret = colgroup_check(ob1->rigidbody_object->col_groups, ob2->rigidbody_object->col_groups);
-	return ret && (!(ob1->rigidbody_object->flag & RBO_FLAG_IS_GHOST) && !(ob2->rigidbody_object->flag & RBO_FLAG_IS_GHOST));
+	return check_colgroup_ghost(ob1, ob2);
 }
 
 /* --------------------- */
diff --git a/source/blender/editors/object/object_transform.c b/source/blender/editors/object/object_transform.c
index 92fe5de..73283ec 100644
--- a/source/blender/editors/object/object_transform.c
+++ b/source/blender/editors/object/object_transform.c
@@ -39,6 +39,7 @@
 #include "DNA_scene_types.h"
 #include "DNA_group_types.h"
 #include "DNA_lattice_types.h"
+#include "DNA_modifier_types.h"
 
 #include "BLI_math.h"
 #include "BLI_listbase.h"
@@ -54,6 +55,7 @@
 #include "BKE_object.h"
 #include "BKE_report.h"
 #include "BKE_editmesh.h"
+#include "BKE_modifier.h"
 #include "BKE_multires.h"
 #include "BKE_armature.h"
 #include "BKE_lattice.h"
@@ -73,6 +75,17 @@
 
 #include "object_intern.h"
 
+static void reset_fracturemodifier_matrix(Object* ob, bool do_refresh)
+{
+	/* reset modifier matrix here as well, else clear transforms wont have an effect with Fracture Modifier enabled */
+	FractureModifierData *fmd = (FractureModifierData*) modifiers_findByType(ob, eModifierType_Fracture);
+
+	if (fmd) {
+		zero_m4(fmd->origmat);
+		fmd->refresh = do_refresh;
+	}
+}
+
 /*************************** Clear Transformation ****************************/
 
 /* clear location of object */
@@ -230,6 +243,10 @@ static int object_clear_transform_generic_exec(bContext *C, wmOperator *op,
 	CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects)
 	{
 		if (!(ob->mode & OB_MODE_WEIGHT_PAINT)) {
+
+			/* reset modifier matrix here as well, else clear transforms wont have an effect with Fracture Modifier enabled */
+			reset_fracturemodifier_matrix(ob, false);
+
 			/* run provided clearing function */
 			clear_func(ob);
 
@@ -319,6 +336,8 @@ static int object_origin_clear_exec(bContext *C, wmOperator *UNUSED(op))
 
 	CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects)
 	{
+		reset_fracturemodifier_matrix(ob, true);
+
 		if (ob->parent) {
 			/* vectors pointed to by v1 and v3 will get modified */
 			v1 = ob->loc;
@@ -429,6 +448,8 @@ static int apply_objects_internal(bContext *C, ReportList *reports, bool apply_l
 	/* now execute */
 	CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects)
 	{
+		/* reset modifier matrix here as well, else clear transforms wont have an effect with Fracture Modifier enabled */
+		reset_fracturemodifier_matrix(ob, true);
 
 		/* calculate rotation/scale matrix */
 		if (apply_scale && apply_rot)
@@ -572,6 +593,9 @@ static int visual_transform_apply_exec(bContext *C, wmOperator *UNUSED(op))
 	
 	CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects)
 	{
+		/* reset modifier matrix here as well, else clear transforms wont have an effect with Fracture Modifier enabled */
+		reset_fracturemodifier_matrix(ob, true);
+
 		BKE_object_where_is_calc(scene, ob);
 		BKE_object_apply_mat4(ob, ob->obmat, true, true);
 		BKE_object_where_is_calc(scene, ob);
@@ -731,6 +755,8 @@ static int object_origin_set_exec(bContext *C, wmOperator *op)
 		Object *ob = ctx_ob->ptr.data;
 		ob->flag &= ~OB_DONE;
 
+		reset_fracturemodifier_matrix(ob, true);
+
 		/* move active first */
 		if (ob == obact) {
 			ctx_ob_act = ctx_ob;
diff --git a/source/blender/makesrna/intern/rna_object.c b/source/blender/makesrna/intern/rna_object.c
index d8aa659..70ac46c 100644
--- a/source/blender/makesrna/intern/rna_object.c
+++ b/source/blender/makesrna/intern/rna_object.c
@@ -184,6 +184,7 @@ EnumPropertyItem object_axis_unsigned_items[] = {
 #include "DNA_key_types.h"
 #include "DNA_constraint_types.h"
 #include "DNA_lattice_types.h"
+#include "DNA_modifier_types.h"
 #include "DNA_node_types.h"
 
 #include "BKE_armature.h"
@@ -198,6 +199,7 @@ EnumPropertyItem object_axis_unsigned_items[] = {
 #include "BKE_object.h"
 #include "BKE_material.h"
 #include "BKE_mesh.h"
+#include "BKE_modifier.h"
 #include "BKE_particle.h"
 #include "BKE_scene.h"
 #include "BKE_deform.h"
@@ -210,6 +212,14 @@ EnumPropertyItem object_axis_unsigned_items[] = {
 
 static void rna_Object_internal_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr)
 {
+	/*keep object and modifier matrix in sync... but... what was the modifier matrix good for still ? XXX */
+
+	Object *ob = (Object*)ptr->id.data;
+	FractureModifierData *fmd = (FractureModifierData*) modifiers_findByType(ob, eModifierType_Fracture);
+	if (fmd) {
+		zero_m4(fmd->origmat);
+	}
+
 	DAG_id_tag_update(ptr->id.data, OB_RECALC_OB);
 }




More information about the Bf-blender-cvs mailing list