[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58192] trunk/blender/source/blender/ blenkernel/intern/particle_system.c: fix [#36093] Stationary Particle system - particle Y axis fails to follow emitter object rotation

Campbell Barton ideasman42 at gmail.com
Fri Jul 12 10:41:27 CEST 2013


Revision: 58192
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58192
Author:   campbellbarton
Date:     2013-07-12 08:41:27 +0000 (Fri, 12 Jul 2013)
Log Message:
-----------
fix [#36093] Stationary Particle system - particle Y axis fails to follow emitter object rotation

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/particle_system.c

Modified: trunk/blender/source/blender/blenkernel/intern/particle_system.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle_system.c	2013-07-12 08:31:39 UTC (rev 58191)
+++ trunk/blender/source/blender/blenkernel/intern/particle_system.c	2013-07-12 08:41:27 UTC (rev 58192)
@@ -1823,36 +1823,73 @@
 		unit_qt(state->rot);
 
 		if (part->rotmode) {
+			bool use_global_space;
+
 			/* create vector into which rotation is aligned */
 			switch (part->rotmode) {
 				case PART_ROT_NOR:
 					copy_v3_v3(rot_vec, nor);
+					use_global_space = false;
 					break;
 				case PART_ROT_VEL:
 					copy_v3_v3(rot_vec, vel);
+					use_global_space = true;
 					break;
 				case PART_ROT_GLOB_X:
 				case PART_ROT_GLOB_Y:
 				case PART_ROT_GLOB_Z:
 					rot_vec[part->rotmode - PART_ROT_GLOB_X] = 1.0f;
+					use_global_space = true;
 					break;
 				case PART_ROT_OB_X:
 				case PART_ROT_OB_Y:
 				case PART_ROT_OB_Z:
 					copy_v3_v3(rot_vec, ob->obmat[part->rotmode - PART_ROT_OB_X]);
+					use_global_space = false;
 					break;
 			}
 			
 			/* create rotation quat */
 			negate_v3(rot_vec);
-			vec_to_quat( q2,rot_vec, OB_POSX, OB_POSZ);
 
-			/* randomize rotation quat */
-			if (part->randrotfac!=0.0f)
-				interp_qt_qtqt(rot, q2, r_rot, part->randrotfac);
-			else
-				copy_qt_qt(rot,q2);
+			if (use_global_space) {
+				/* calculate rotation in global-space */
+				vec_to_quat(q2, rot_vec, OB_POSX, OB_POSZ);
 
+				/* randomize rotation quat */
+				if (part->randrotfac != 0.0f) {
+					interp_qt_qtqt(rot, q2, r_rot, part->randrotfac);
+				}
+				else {
+					copy_qt_qt(rot, q2);
+				}
+			}
+			else {
+				/* calculate rotation in local-space */
+				float q_obmat[4];
+				float q_imat[4];
+				float tvec[3];
+
+				mat4_to_quat(q_obmat, ob->obmat);
+				invert_qt_qt(q_imat, q_obmat);
+
+				copy_v3_v3(tvec, rot_vec);
+				mul_qt_v3(q_imat, tvec);
+				normalize_v3(tvec);
+				vec_to_quat(q2, tvec, OB_POSX, OB_POSZ);
+
+				/* randomize rotation quat */
+				if (part->randrotfac != 0.0f) {
+					mul_qt_qtqt(r_rot, r_rot, q_imat);
+					interp_qt_qtqt(rot, q2, r_rot, part->randrotfac);
+				}
+				else {
+					copy_qt_qt(rot, q2);
+				}
+
+				mul_qt_qtqt(rot, q_obmat, rot);
+			}
+
 			/* rotation phase */
 			phasefac = part->phasefac;
 			if (part->randphasefac != 0.0f)




More information about the Bf-blender-cvs mailing list