[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