Commit: 6d3a1d871f30b1352a46bfe19eabb3aed1d91aa1
Author: Lukas Tönne
Date:   Fri Aug 8 12:11:00 2014 +0200
Branches: hair_system
https://developer.blender.org/rB6d3a1d871f30b1352a46bfe19eabb3aed1d91aa1

Fix for threading crash: Collision contact filtering has to happen
outside the thread functions, or Bullet will have a race condition.

===================================================================

M       source/blender/hair/intern/HAIR_solver.cpp
M       source/blender/hair/intern/HAIR_solver.h

===================================================================

diff --git a/source/blender/hair/intern/HAIR_solver.cpp 
b/source/blender/hair/intern/HAIR_solver.cpp
index 6f6d588..81f1217 100644
--- a/source/blender/hair/intern/HAIR_solver.cpp
+++ b/source/blender/hair/intern/HAIR_solver.cpp
@@ -351,7 +351,7 @@ static void do_collision(const HairParams &params, const 
SolverForces &forces, f
        }
 }
 
-void Solver::do_integration(float time, float timestep, const SolverTaskData 
&data) const
+void Solver::do_integration(float time, float timestep, const SolverTaskData 
&data, const PointContactCache &contacts) const
 {
        const int totsteps = m_params.substeps_forces; /* can have multiple 
integration steps per tick for accuracy */
        float dt = timestep / (float)totsteps;
@@ -359,9 +359,6 @@ void Solver::do_integration(float time, float timestep, 
const SolverTaskData &da
        int totcurve = data.totcurves;
        /*int totpoint = data.totpoints;*/
        
-       PointContactCache contacts;
-       cache_point_contacts(contacts);
-       
        for (int step = 0; step < totsteps; ++step) {
                
                /* clear forces */
@@ -456,13 +453,14 @@ void Solver::do_integration(float time, float timestep, 
const SolverTaskData &da
 struct SolverPoolData {
        const Solver *solver;
        float time, timestep;
+       const PointContactCache *contacts;
 };
 
 static void step_threaded_func(TaskPool *pool, void *vtaskdata, int 
UNUSED(threadid))
 {
        const SolverPoolData *pooldata = (const SolverPoolData 
*)BLI_task_pool_userdata(pool);
        SolverTaskData *taskdata = (SolverTaskData *)vtaskdata;
-       pooldata->solver->do_integration(pooldata->time, pooldata->timestep, 
*taskdata);
+       pooldata->solver->do_integration(pooldata->time, pooldata->timestep, 
*taskdata, *pooldata->contacts);
 }
 
 static void advance_state(SolverData *data)
@@ -481,6 +479,10 @@ static void advance_state(SolverData *data)
 
 void Solver::step_threaded(float time, float timestep, DebugThreadDataVector 
*debug_thread_data)
 {
+       /* filter and cache Bullet contact information */
+       PointContactCache contacts;
+       cache_point_contacts(contacts);
+       
        typedef std::vector<SolverTaskData> SolverTaskVector;
        
        const int max_points_per_task = 1024;
@@ -490,6 +492,7 @@ void Solver::step_threaded(float time, float timestep, 
DebugThreadDataVector *de
        pooldata.solver = this;
        pooldata.time = time;
        pooldata.timestep = timestep;
+       pooldata.contacts = &contacts;
        
        TaskScheduler *task_scheduler = BLI_task_scheduler_get();
        TaskPool *task_pool = BLI_task_pool_create(task_scheduler, 
(void*)(&pooldata));
diff --git a/source/blender/hair/intern/HAIR_solver.h 
b/source/blender/hair/intern/HAIR_solver.h
index 24b7f41..b285ee7 100644
--- a/source/blender/hair/intern/HAIR_solver.h
+++ b/source/blender/hair/intern/HAIR_solver.h
@@ -167,7 +167,7 @@ public:
        
        void cache_point_contacts(PointContactCache &cache) const;
        
-       void do_integration(float time, float timestep, const SolverTaskData 
&data) const;
+       void do_integration(float time, float timestep, const SolverTaskData 
&data, const PointContactCache &contacts) const;
        
        void step_threaded(float time, float timestep, DebugThreadDataVector 
*debug_thread_data = NULL);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to