forked from bartvdbraak/blender
Fix T39180: Particle with fluid physics unstable.
Fluid sims have a very nasty feature for interaction, in which a psys can directly update the bvhtree for //another object's psys//. This breaks with threaded depsgraph evaluation and is generally a no-go. To avoid crashes for now, use a global mutex to avoid concurrent writes to an object psys' bvhtree.
This commit is contained in:
parent
a6e347177b
commit
5febb09639
@ -109,6 +109,8 @@
|
||||
|
||||
#endif // WITH_MOD_FLUID
|
||||
|
||||
static ThreadMutex psys_bvhtree_rwlock = BLI_RWLOCK_INITIALIZER;
|
||||
|
||||
/************************************************/
|
||||
/* Reacting to system events */
|
||||
/************************************************/
|
||||
@ -2209,15 +2211,22 @@ static void psys_update_particle_bvhtree(ParticleSystem *psys, float cfra)
|
||||
if (psys) {
|
||||
PARTICLE_P;
|
||||
int totpart = 0;
|
||||
bool need_rebuild;
|
||||
|
||||
if (!psys->bvhtree || psys->bvhtree_frame != cfra) {
|
||||
BLI_rw_mutex_lock(&psys_bvhtree_rwlock, THREAD_LOCK_READ);
|
||||
need_rebuild = !psys->bvhtree || psys->bvhtree_frame != cfra;
|
||||
BLI_rw_mutex_unlock(&psys_bvhtree_rwlock);
|
||||
|
||||
if (need_rebuild) {
|
||||
LOOP_SHOWN_PARTICLES {
|
||||
totpart++;
|
||||
}
|
||||
|
||||
BLI_rw_mutex_lock(&psys_bvhtree_rwlock, THREAD_LOCK_WRITE);
|
||||
|
||||
BLI_bvhtree_free(psys->bvhtree);
|
||||
psys->bvhtree = BLI_bvhtree_new(totpart, 0.0, 4, 6);
|
||||
|
||||
|
||||
LOOP_SHOWN_PARTICLES {
|
||||
if (pa->alive == PARS_ALIVE) {
|
||||
if (pa->state.time == cfra)
|
||||
@ -2227,8 +2236,10 @@ static void psys_update_particle_bvhtree(ParticleSystem *psys, float cfra)
|
||||
}
|
||||
}
|
||||
BLI_bvhtree_balance(psys->bvhtree);
|
||||
|
||||
|
||||
psys->bvhtree_frame = cfra;
|
||||
|
||||
BLI_rw_mutex_unlock(&psys_bvhtree_rwlock);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2546,7 +2557,11 @@ static void sph_evaluate_func(BVHTree *tree, ParticleSystem **psys, float co[3],
|
||||
break;
|
||||
}
|
||||
else {
|
||||
BLI_rw_mutex_lock(&psys_bvhtree_rwlock, THREAD_LOCK_READ);
|
||||
|
||||
BLI_bvhtree_range_query(psys[i]->bvhtree, co, interaction_radius, callback, pfr);
|
||||
|
||||
BLI_rw_mutex_unlock(&psys_bvhtree_rwlock);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -304,8 +304,8 @@ typedef struct ParticleSystem {
|
||||
ParticleSpring *fluid_springs;
|
||||
int tot_fluidsprings, alloc_fluidsprings;
|
||||
|
||||
struct KDTree *tree; /* used for interactions with self and other systems */
|
||||
struct BVHTree *bvhtree; /* used for interactions with self and other systems */
|
||||
struct KDTree *tree; /* used for interactions with self and other systems */
|
||||
struct BVHTree *bvhtree; /* used for interactions with self and other systems */
|
||||
|
||||
struct ParticleDrawData *pdd;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user