[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16831] trunk/blender/source/blender: Add 2 items to CTL-A menu: Scale to ObData and Rotation to ObData.

Benoit Bolsee benoit.bolsee at online.be
Mon Sep 29 22:13:41 CEST 2008


Revision: 16831
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16831
Author:   ben2610
Date:     2008-09-29 22:13:40 +0200 (Mon, 29 Sep 2008)

Log Message:
-----------
Add 2 items to CTL-A menu: Scale to ObData and Rotation to ObData. These options allows to apply separately the scale and the rotation to the object data. Usefull to physics compound objects that do not support scaling.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_object.h
    trunk/blender/source/blender/blenkernel/intern/object.c
    trunk/blender/source/blender/include/BDR_editobject.h
    trunk/blender/source/blender/src/editobject.c

Modified: trunk/blender/source/blender/blenkernel/BKE_object.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_object.h	2008-09-29 18:10:42 UTC (rev 16830)
+++ trunk/blender/source/blender/blenkernel/BKE_object.h	2008-09-29 20:13:40 UTC (rev 16831)
@@ -88,6 +88,8 @@
 void disable_speed_curve(int val);
 
 float bsystem_time(struct Object *ob, float cfra, float ofs);
+void object_scale_to_mat3(struct Object *ob, float mat[][3]);
+void object_rot_to_mat3(struct Object *ob, float mat[][3]);
 void object_to_mat3(struct Object *ob, float mat[][3]);
 void object_to_mat4(struct Object *ob, float mat[][4]);
 

Modified: trunk/blender/source/blender/blenkernel/intern/object.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/object.c	2008-09-29 18:10:42 UTC (rev 16830)
+++ trunk/blender/source/blender/blenkernel/intern/object.c	2008-09-29 20:13:40 UTC (rev 16831)
@@ -1479,23 +1479,43 @@
 	return cfra;
 }
 
-void object_to_mat3(Object *ob, float mat[][3])	/* no parent */
+void object_scale_to_mat3(Object *ob, float mat[][3])
 {
-	float smat[3][3], vec[3];
-	float rmat[3][3];
-	/*float q1[4];*/
-	
-	/* size */
+	float vec[3];
 	if(ob->ipo) {
 		vec[0]= ob->size[0]+ob->dsize[0];
 		vec[1]= ob->size[1]+ob->dsize[1];
 		vec[2]= ob->size[2]+ob->dsize[2];
-		SizeToMat3(vec, smat);
+		SizeToMat3(vec, mat);
 	}
 	else {
-		SizeToMat3(ob->size, smat);
+		SizeToMat3(ob->size, mat);
 	}
+}
 
+void object_rot_to_mat3(Object *ob, float mat[][3])
+{
+	float vec[3];
+	if(ob->ipo) {
+		vec[0]= ob->rot[0]+ob->drot[0];
+		vec[1]= ob->rot[1]+ob->drot[1];
+		vec[2]= ob->rot[2]+ob->drot[2];
+		EulToMat3(vec, mat);
+	}
+	else {
+		EulToMat3(ob->rot, mat);
+	}
+}
+
+void object_to_mat3(Object *ob, float mat[][3])	/* no parent */
+{
+	float smat[3][3];
+	float rmat[3][3];
+	/*float q1[4];*/
+	
+	/* size */
+	object_scale_to_mat3(ob, smat);
+
 	/* rot */
 	/* Quats arnt used yet */
 	/*if(ob->transflag & OB_QUAT) {
@@ -1508,15 +1528,7 @@
 		}
 	}
 	else {*/
-		if(ob->ipo) {
-			vec[0]= ob->rot[0]+ob->drot[0];
-			vec[1]= ob->rot[1]+ob->drot[1];
-			vec[2]= ob->rot[2]+ob->drot[2];
-			EulToMat3(vec, rmat);
-		}
-		else {
-			EulToMat3(ob->rot, rmat);
-		}
+		object_rot_to_mat3(ob, rmat);
 	/*}*/
 	Mat3MulMat3(mat, rmat, smat);
 }

Modified: trunk/blender/source/blender/include/BDR_editobject.h
===================================================================
--- trunk/blender/source/blender/include/BDR_editobject.h	2008-09-29 18:10:42 UTC (rev 16830)
+++ trunk/blender/source/blender/include/BDR_editobject.h	2008-09-29 20:13:40 UTC (rev 16831)
@@ -77,6 +77,8 @@
 void make_links(short event);
 void make_duplilist_real(void);
 void apply_objects_locrot(void);
+void apply_objects_scale(void);
+void apply_objects_rot(void);
 void apply_objects_visual_tx(void);
 void apply_object(void);
 

Modified: trunk/blender/source/blender/src/editobject.c
===================================================================
--- trunk/blender/source/blender/src/editobject.c	2008-09-29 18:10:42 UTC (rev 16830)
+++ trunk/blender/source/blender/src/editobject.c	2008-09-29 20:13:40 UTC (rev 16831)
@@ -3938,7 +3938,7 @@
 	BIF_undo_push("Create links");
 }
 
-void apply_objects_locrot( void )
+static void apply_objects_internal( int apply_scale, int apply_rot )
 {
 	Base *base, *basact;
 	Object *ob;
@@ -3952,7 +3952,11 @@
 	float mat[3][3];
 	int a, change = 0;
 	
-	
+	if (!apply_scale && !apply_rot) {
+		/* do nothing? */
+		error("Nothing to do!");
+		return;
+	}
 	/* first check if we can execute */
 	for (base= FIRSTBASE; base; base= base->next) {
 		if TESTBASELIB(base) {
@@ -4000,7 +4004,13 @@
 			ob= base->object;
 			
 			if(ob->type==OB_MESH) {
-				object_to_mat3(ob, mat);
+				if (apply_scale && apply_rot)
+					object_to_mat3(ob, mat);
+				else if (apply_scale)
+					object_scale_to_mat3(ob, mat);
+				else
+					object_rot_to_mat3(ob, mat);
+
 				me= ob->data;
 				
 				/* see checks above */
@@ -4009,8 +4019,10 @@
 				for(a=0; a<me->totvert; a++, mvert++) {
 					Mat3MulVecfl(mat, mvert->co);
 				}
-				ob->size[0]= ob->size[1]= ob->size[2]= 1.0;
-				ob->rot[0]= ob->rot[1]= ob->rot[2]= 0.0;
+				if (apply_scale)
+					ob->size[0]= ob->size[1]= ob->size[2]= 1.0;
+				if (apply_rot)
+					ob->rot[0]= ob->rot[1]= ob->rot[2]= 0.0;
 				/*QuatOne(ob->quat);*/ /* Quats arnt used yet */
 				
 				where_is_object(ob);
@@ -4025,15 +4037,22 @@
 				change = 1;
 			}
 			else if (ob->type==OB_ARMATURE) {
-				object_to_mat3(ob, mat);
+				if (apply_scale && apply_rot)
+					object_to_mat3(ob, mat);
+				else if (apply_scale)
+					object_scale_to_mat3(ob, mat);
+				else
+					object_rot_to_mat3(ob, mat);
 				arm= ob->data;
 				
 				/* see checks above */
 				apply_rot_armature(ob, mat);
 				
 				/* Reset the object's transforms */
-				ob->size[0]= ob->size[1]= ob->size[2]= 1.0;
-				ob->rot[0]= ob->rot[1]= ob->rot[2]= 0.0;
+				if (apply_scale)
+					ob->size[0]= ob->size[1]= ob->size[2]= 1.0;
+				if (apply_rot)
+					ob->rot[0]= ob->rot[1]= ob->rot[2]= 0.0;
 				/*QuatOne(ob->quat); (not used anymore)*/
 				
 				where_is_object(ob);
@@ -4042,7 +4061,12 @@
 			}
 			else if ELEM(ob->type, OB_CURVE, OB_SURF) {
 				float scale;
-				object_to_mat3(ob, mat);
+				if (apply_scale && apply_rot)
+					object_to_mat3(ob, mat);
+				else if (apply_scale)
+					object_scale_to_mat3(ob, mat);
+				else
+					object_rot_to_mat3(ob, mat);
 				scale = Mat3ToScalef(mat);
 				cu= ob->data;
 				
@@ -4071,9 +4095,10 @@
 					}
 					nu= nu->next;
 				}
-			
-				ob->size[0]= ob->size[1]= ob->size[2]= 1.0;
-				ob->rot[0]= ob->rot[1]= ob->rot[2]= 0.0;
+				if (apply_scale)
+					ob->size[0]= ob->size[1]= ob->size[2]= 1.0;
+				if (apply_rot)
+					ob->rot[0]= ob->rot[1]= ob->rot[2]= 0.0;
 				/*QuatOne(ob->quat); (quats arnt used anymore)*/
 				
 				where_is_object(ob);
@@ -4095,10 +4120,30 @@
 	}
 	if (change) {
 		allqueue(REDRAWVIEW3D, 0);
-		BIF_undo_push("Apply Objects Scale & Rotation");
+		if (apply_scale && apply_rot)
+			BIF_undo_push("Apply Objects Scale & Rotation");
+		else if (apply_scale)
+			BIF_undo_push("Apply Objects Scale");
+		else
+			BIF_undo_push("Apply Objects Rotation");
 	}
 }
 
+void apply_objects_locrot(void)
+{
+	apply_objects_internal(1, 1);
+}
+
+void apply_objects_scale(void)
+{
+	apply_objects_internal(1, 0);
+}
+
+void apply_objects_rot(void)
+{
+	apply_objects_internal(0, 1);
+}
+
 void apply_objects_visual_tx( void )
 {
 	Base *base;
@@ -4154,7 +4199,7 @@
 		if ((ob->pose) && (ob->flag & OB_POSEMODE))
 			evt = pupmenu("Apply Object%t|Current Pose as RestPose%x3");
 		else
-			evt = pupmenu("Apply Object%t|Scale and Rotation to ObData%x1|Visual Transform to Objects Loc/Scale/Rot%x2");
+			evt = pupmenu("Apply Object%t|Scale and Rotation to ObData%x1|Visual Transform to Objects Loc/Scale/Rot%x2|Scale to ObData%x4|Rotation to ObData%x5");
 		if (evt==-1) return;
 		
 		switch (evt) {
@@ -4167,6 +4212,12 @@
 			case 3:
 				apply_armature_pose2bones();
 				break;
+			case 4:
+				apply_objects_scale();
+				break;
+			case 5:
+				apply_objects_rot();
+				break;
 		}
 	}
 }





More information about the Bf-blender-cvs mailing list