[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [47124] trunk/blender/source/blender/ blenkernel/intern: Fix #29846, Dynamic rotation of particles not affected by forcefields 2.61 64 bit.

Lukas Toenne lukas.toenne at googlemail.com
Mon May 28 18:58:12 CEST 2012


Revision: 47124
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=47124
Author:   lukastoenne
Date:     2012-05-28 16:58:12 +0000 (Mon, 28 May 2012)
Log Message:
-----------
Fix #29846, Dynamic rotation of particles not affected by forcefields 2.61 64 bit. Patch by Arno Mayrhofer (azrael3000).

Minor fix by me to initialize the effector point angular velocity vector correctly.

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

Modified: trunk/blender/source/blender/blenkernel/intern/effect.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/effect.c	2012-05-28 16:48:56 UTC (rev 47123)
+++ trunk/blender/source/blender/blenkernel/intern/effect.c	2012-05-28 16:58:12 UTC (rev 47124)
@@ -929,6 +929,7 @@
 		}
 	}
 
+	zero_v3(point->ave);
 	if (pd->flag & PFIELD_DO_ROTATION && point->ave && point->rot) {
 		float xvec[3] = {1.0f, 0.0f, 0.0f};
 		float dave[3];

Modified: trunk/blender/source/blender/blenkernel/intern/particle_system.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/particle_system.c	2012-05-28 16:48:56 UTC (rev 47123)
+++ trunk/blender/source/blender/blenkernel/intern/particle_system.c	2012-05-28 16:58:12 UTC (rev 47124)
@@ -2673,6 +2673,9 @@
 		force[1] += (BLI_frand()-0.5f) * part->brownfac;
 		force[2] += (BLI_frand()-0.5f) * part->brownfac;
 	}
+
+	if(part->flag & PART_ROT_DYN && epoint.ave)
+		copy_v3_v3(pa->state.ave, epoint.ave);
 }
 /* gathers all forces that effect particles and calculates a new state for the particle */
 static void basic_integrate(ParticleSimulationData *sim, int p, float dfra, float cfra)
@@ -2730,7 +2733,7 @@
 }
 static void basic_rotate(ParticleSettings *part, ParticleData *pa, float dfra, float timestep)
 {
-	float rotfac, rot1[4], rot2[4]={1.0,0.0,0.0,0.0}, dtime=dfra*timestep;
+	float rotfac, rot1[4], rot2[4]={1.0,0.0,0.0,0.0}, dtime=dfra*timestep, extrotfac;
 
 	if ((part->flag & PART_ROTATIONS)==0) {
 		pa->state.rot[0]=1.0f;
@@ -2738,7 +2741,9 @@
 		return;
 	}
 
-	if ((part->flag & PART_ROT_DYN)==0 && ELEM3(part->avemode, PART_AVE_VELOCITY, PART_AVE_HORIZONTAL, PART_AVE_VERTICAL)) {
+	extrotfac = len_v3(pa->state.ave);
+
+	if ((part->flag & PART_ROT_DYN) && ELEM3(part->avemode, PART_AVE_VELOCITY, PART_AVE_HORIZONTAL, PART_AVE_VERTICAL)) {
 		float angle;
 		float len1 = len_v3(pa->prev_state.vel);
 		float len2 = len_v3(pa->state.vel);
@@ -2758,7 +2763,7 @@
 	}
 
 	rotfac = len_v3(pa->state.ave);
-	if (rotfac == 0.0f) { /* unit_qt(in VecRotToQuat) doesn't give unit quat [1,0,0,0]?? */
+	if (rotfac == 0.0f || (part->flag & PART_ROT_DYN)==0 || extrotfac == 0.0f) { /* unit_qt(in VecRotToQuat) doesn't give unit quat [1,0,0,0]?? */
 		rot1[0]=1.0f;
 		rot1[1]=rot1[2]=rot1[3]=0;
 	}




More information about the Bf-blender-cvs mailing list