[Bf-blender-cvs] [d46632d] fracture_modifier: fix: apply scale only prior to fracture again, preserve rotation because splinter rotation needs to be local

Martin Felke noreply at git.blender.org
Sat Dec 27 14:40:16 CET 2014


Commit: d46632d4cf7e7717ef720f00c6c8899eb2a296b9
Author: Martin Felke
Date:   Sat Dec 27 13:08:27 2014 +0100
Branches: fracture_modifier
https://developer.blender.org/rBd46632d4cf7e7717ef720f00c6c8899eb2a296b9

fix: apply scale only prior to fracture again, preserve rotation because splinter rotation needs to be local

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

M	source/blender/editors/object/object_modifier.c

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

diff --git a/source/blender/editors/object/object_modifier.c b/source/blender/editors/object/object_modifier.c
index 9ad6fee..9803f28 100644
--- a/source/blender/editors/object/object_modifier.c
+++ b/source/blender/editors/object/object_modifier.c
@@ -2407,13 +2407,46 @@ static int fracture_refresh_exec(bContext *C, wmOperator *UNUSED(op))
 	return OPERATOR_FINISHED;
 }
 
+static void apply_scale(Object* ob, Scene* scene)
+{
+	float mat[4][4], smat[3][3];
+	/*better apply scale prior to fracture, else shards get distorted*/
+	BKE_object_scale_to_mat3(ob, smat);
+	copy_m4_m3(mat, smat);
+
+	/* apply to object data */
+	if (ob->type == OB_MESH) {
+		Mesh *me = ob->data;
+
+		multiresModifier_scale_disp(scene, ob);
+
+		/* adjust data */
+		BKE_mesh_transform(me, mat, true);
+
+		/* update normals */
+		BKE_mesh_calc_normals(me);
+	}
+	else if (ELEM(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
+		float scale = 1.0f;
+		Curve *cu = ob->data;
+
+		scale = mat3_to_scale(smat);
+		BKE_curve_transform_ex(cu, mat, true, scale);
+	}
+
+	/*clear scale too*/
+	ob->size[0] = ob->size[1] = ob->size[2] = 1.0f;
+}
+
 static int fracture_refresh_invoke(bContext *C, wmOperator *op, const wmEvent *UNUSED(event))
 {
 	Scene* scene = CTX_data_scene(C);
+	Object* ob = CTX_data_active_object(C);
 
 	if (WM_jobs_test(CTX_wm_manager(C), scene, WM_JOB_TYPE_OBJECT_FRACTURE))
 		return OPERATOR_CANCELLED;
 
+	apply_scale(ob, scene);
 	return fracture_refresh_exec(C, op);
 }
 
@@ -2702,42 +2735,6 @@ void OBJECT_OT_rigidbody_convert_to_objects(wmOperatorType *ot)
 	edit_modifier_properties(ot);
 }
 
-#if 0
-static void apply_rot_scale(Object* ob, Scene* scene)
-{
-	float mat[4][4], rsmat[3][3];
-	/*better apply rotation and scale during conversion*/
-	BKE_object_to_mat3(ob, rsmat);
-	copy_m4_m3(mat, rsmat);
-
-	/* apply to object data */
-	if (ob->type == OB_MESH) {
-		Mesh *me = ob->data;
-
-		multiresModifier_scale_disp(scene, ob);
-
-		/* adjust data */
-		BKE_mesh_transform(me, mat, true);
-
-		/* update normals */
-		BKE_mesh_calc_normals(me);
-	}
-	else if (ELEM(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
-		float scale = 1.0f;
-		Curve *cu = ob->data;
-
-		scale = mat3_to_scale(rsmat);
-		BKE_curve_transform_ex(cu, mat, true, scale);
-	}
-
-	/*clear rotation and scale too*/
-	ob->size[0] = ob->size[1] = ob->size[2] = 1.0f;
-	zero_v3(ob->rot);
-	unit_qt(ob->quat);
-	unit_axis_angle(ob->rotAxis, &ob->rotAngle);
-}
-#endif
-
 static bool convert_modifier_to_keyframes(FractureModifierData* fmd, Group* gr, Object* ob, Scene* scene, int start, int end)
 {
 	bool is_baked = false;




More information about the Bf-blender-cvs mailing list