Fix crash in some cases when deleting particle systems.

Those 'never null' ID pointers are really a PITA to handle... luckily we don't have much of those around!

Found by Sybren, thanks.

Should be backported to 2.78.
This commit is contained in:
Bastien Montagne 2016-09-15 11:50:56 +02:00 committed by Sergey Sharybin
parent 4733544195
commit 7b748e9478
3 changed files with 7 additions and 3 deletions

View File

@ -44,7 +44,7 @@ enum {
* (like e.g. Object->data). */
ID_REMAP_FLAG_NEVER_NULL_USAGE = 1 << 2,
/* This tells the callback func to force setting IDs using target one with a 'never NULL' pointer to NULL.
* WARNING! Use with extreme care, this will leave database in broken state! */
* WARNING! Use with extreme care, this will leave database in broken state and can cause crashes very easily! */
ID_REMAP_FORCE_NEVER_NULL_USAGE = 1 << 3,
};

View File

@ -503,7 +503,9 @@ void psys_free_particles(ParticleSystem *psys)
PARTICLE_P;
if (psys->particles) {
if (psys->part->type == PART_HAIR) {
/* Even though psys->part should never be NULL, this can happen as an exception during deletion.
* See ID_REMAP_SKIP/FORCE/FLAG_NEVER_NULL_USAGE in BKE_library_remap. */
if (psys->part && psys->part->type == PART_HAIR) {
LOOP_PARTICLES {
if (pa->hair)
MEM_freeN(pa->hair);

View File

@ -4336,7 +4336,9 @@ void BKE_particlesystem_id_loop(ParticleSystem *psys, ParticleSystemIDFunc func,
func(psys, (ID **)&pt->ob, userdata, IDWALK_NOP);
}
if (psys->part->phystype == PART_PHYS_BOIDS) {
/* Even though psys->part should never be NULL, this can happen as an exception during deletion.
* See ID_REMAP_SKIP/FORCE/FLAG_NEVER_NULL_USAGE in BKE_library_remap. */
if (psys->part && psys->part->phystype == PART_PHYS_BOIDS) {
ParticleData *pa;
int p;