[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38663] trunk/blender/source/blender/ blenkernel: Effector calculations are now thread safe.

Janne Karhu jhkarh at gmail.com
Sun Jul 24 19:44:22 CEST 2011


Revision: 38663
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38663
Author:   jhk
Date:     2011-07-24 17:44:22 +0000 (Sun, 24 Jul 2011)
Log Message:
-----------
Effector calculations are now thread safe.
* where_is_object_time was called for every effector evaluation only to determine the object velocity in some rare cases.
* Calculating the effector velocity is now done in the effector precalculation stage.
* Removing this makes the code thread safe and also should give some nice performance boosts when simulating a lot of points.
* Thanks to MiikaH for noticing this problem.

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

Modified: trunk/blender/source/blender/blenkernel/BKE_effect.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_effect.h	2011-07-24 17:40:02 UTC (rev 38662)
+++ trunk/blender/source/blender/blenkernel/BKE_effect.h	2011-07-24 17:44:22 UTC (rev 38663)
@@ -105,6 +105,7 @@
 	/* precalculated for guides */
 	struct GuideEffectorData *guide_data;
 	float guide_loc[4], guide_dir[3], guide_radius;
+	float velocity[3];
 
 	float frame;
 	int flag;

Modified: trunk/blender/source/blender/blenkernel/intern/effect.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/effect.c	2011-07-24 17:40:02 UTC (rev 38662)
+++ trunk/blender/source/blender/blenkernel/intern/effect.c	2011-07-24 17:44:22 UTC (rev 38663)
@@ -241,6 +241,16 @@
 	}
 	else if(eff->psys)
 		psys_update_particle_tree(eff->psys, eff->scene->r.cfra);
+
+	/* Store object velocity */
+	if(eff->ob) {
+		float old_vel[3];
+
+		where_is_object_time(eff->scene, eff->ob, cfra - 1.0f);
+		copy_v3_v3(old_vel, eff->ob->obmat[3]);	
+		where_is_object_time(eff->scene, eff->ob, cfra);
+		sub_v3_v3v3(eff->velocity, eff->ob->obmat[3], old_vel);
+	}
 }
 static EffectorCache *new_effector_cache(Scene *scene, Object *ob, ParticleSystem *psys, PartDeflect *pd)
 {
@@ -680,10 +690,6 @@
 		Object *ob = eff->ob;
 		Object obcopy = *ob;
 
-		/* XXX this is not thread-safe, but used from multiple threads by
-		   particle system */
-		where_is_object_time(eff->scene, ob, cfra);
-
 		/* use z-axis as normal*/
 		normalize_v3_v3(efd->nor, ob->obmat[2]);
 
@@ -702,14 +708,9 @@
 			VECCOPY(efd->loc, ob->obmat[3]);
 		}
 
-		if(real_velocity) {
-			VECCOPY(efd->vel, ob->obmat[3]);
+		if(real_velocity)
+			copy_v3_v3(efd->vel, eff->velocity);
 
-			where_is_object_time(eff->scene, ob, cfra - 1.0f);
-
-			sub_v3_v3v3(efd->vel, efd->vel, ob->obmat[3]);
-		}
-
 		*eff->ob = obcopy;
 
 		efd->size = 0.0f;




More information about the Bf-blender-cvs mailing list