Commit: 36faf739a71624b6ca10cec7233779f9eeace0bd Author: Sergey Sharybin Date: Wed Jun 5 12:39:40 2019 +0200 Branches: master https://developer.blender.org/rB36faf739a71624b6ca10cec7233779f9eeace0bd
Particle system: Move runtime data to runtime field Allows it to be preserved during copy-on-write update when on-geometry related update is needed. This is a required part for T63537, where we need to preserve the entire evaluation data when object is tagged for only RECALC_COPY_ON_WRITE. Reviewers: brecht Reviewed By: brecht Differential Revision: https://developer.blender.org/D5023 =================================================================== M source/blender/blenkernel/BKE_particle.h M source/blender/blenkernel/intern/object.c M source/blender/blenkernel/intern/particle.c M source/blender/blenkernel/intern/particle_distribute.c M source/blender/blenkernel/intern/particle_system.c M source/blender/blenloader/intern/readfile.c M source/blender/draw/intern/draw_cache_impl_particles.c M source/blender/editors/physics/particle_edit.c M source/blender/editors/physics/particle_object.c M source/blender/editors/transform/transform_conversions.c M source/blender/makesdna/DNA_modifier_types.h M source/blender/makesrna/intern/rna_particle.c M source/blender/modifiers/intern/MOD_explode.c M source/blender/modifiers/intern/MOD_particleinstance.c M source/blender/modifiers/intern/MOD_particlesystem.c =================================================================== diff --git a/source/blender/blenkernel/BKE_particle.h b/source/blender/blenkernel/BKE_particle.h index 164dbbbf482..ca3a560286f 100644 --- a/source/blender/blenkernel/BKE_particle.h +++ b/source/blender/blenkernel/BKE_particle.h @@ -38,6 +38,7 @@ struct ParticleKey; struct ParticleSettings; struct ParticleSystem; struct ParticleSystemModifierData; +struct ParticleSystemModifierDataRuntime; struct BVHTreeRay; struct BVHTreeRayHit; @@ -608,6 +609,13 @@ float psys_get_current_display_percentage(struct ParticleSystem *psys, #define DMCACHE_NOTFOUND -1 #define DMCACHE_ISCHILD -2 +/* **** Particle system modifier helpers. **** */ + +struct Mesh *BKE_particle_modifier_mesh_final_get(struct ParticleSystemModifierData *psmd); +struct Mesh *BKE_particle_modifier_mesh_original_get(struct ParticleSystemModifierData *psmd); +struct ParticleSystemModifierDataRuntime *BKE_particle_modifier_runtime_ensure( + struct ParticleSystemModifierData *psmd); + /* **** Depsgraph evaluation **** */ struct Depsgraph; diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 2a66edc8d42..e74b2b0f671 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -497,12 +497,13 @@ void BKE_object_free_caches(Object *object) for (md = object->modifiers.first; md != NULL; md = md->next) { if (md->type == eModifierType_ParticleSystem) { ParticleSystemModifierData *psmd = (ParticleSystemModifierData *)md; - if (psmd->mesh_final) { - BKE_id_free(NULL, psmd->mesh_final); - psmd->mesh_final = NULL; - if (psmd->mesh_original) { - BKE_id_free(NULL, psmd->mesh_original); - psmd->mesh_original = NULL; + ParticleSystemModifierDataRuntime *psmd_runtime = BKE_particle_modifier_runtime_ensure(psmd); + if (psmd_runtime->mesh_final) { + BKE_id_free(NULL, psmd_runtime->mesh_final); + psmd_runtime->mesh_final = NULL; + if (psmd_runtime->mesh_original) { + BKE_id_free(NULL, psmd_runtime->mesh_original); + psmd_runtime->mesh_original = NULL; } psmd->flag |= eParticleSystemFlag_file_loaded; update_flag |= ID_RECALC_GEOMETRY; diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c index 13649eaf096..61ee5685451 100644 --- a/source/blender/blenkernel/intern/particle.c +++ b/source/blender/blenkernel/intern/particle.c @@ -1889,7 +1889,8 @@ void psys_particle_on_emitter(ParticleSystemModifierData *psmd, float vtan[3], float orco[3]) { - if (psmd && psmd->mesh_final) { + Mesh *mesh_final = BKE_particle_modifier_mesh_final_get(psmd); + if (psmd && mesh_final) { if (psmd->psys->part->distr == PART_DISTR_GRID && psmd->psys->part->from != PART_FROM_VERT) { if (vec) { copy_v3_v3(vec, fuv); @@ -1902,7 +1903,7 @@ void psys_particle_on_emitter(ParticleSystemModifierData *psmd, } /* we cant use the num_dmcache */ psys_particle_on_dm( - psmd->mesh_final, from, index, index_dmcache, fuv, foffset, vec, nor, utan, vtan, orco); + mesh_final, from, index, index_dmcache, fuv, foffset, vec, nor, utan, vtan, orco); } else { psys_particle_on_shape(from, index, fuv, vec, nor, utan, vtan, orco); @@ -2253,13 +2254,15 @@ void psys_find_parents(ParticleSimulationData *sim, const bool use_render_params tree = BLI_kdtree_3d_new(totparent); + Mesh *mesh_final = BKE_particle_modifier_mesh_final_get(sim->psmd); + for (p = 0, cpa = sim->psys->child; p < totparent; p++, cpa++) { psys_particle_on_emitter( sim->psmd, from, cpa->num, DMCACHE_ISCHILD, cpa->fuv, cpa->foffset, co, 0, 0, 0, orco); /* Check if particle doesn't exist because of texture influence. * Insert only existing particles into kdtree. */ - get_cpa_texture(sim->psmd->mesh_final, + get_cpa_texture(mesh_final, psys, part, psys->particles + cpa->pa[0], @@ -2427,6 +2430,8 @@ static void psys_thread_create_path(ParticleTask *task, return; } + Mesh *mesh_final = BKE_particle_modifier_mesh_final_get(ctx->sim.psmd); + if (ctx->between) { ParticleData *pa = psys->particles + cpa->pa[0]; int w, needupdate; @@ -2531,7 +2536,7 @@ static void psys_thread_create_path(ParticleTask *task, sub_v3_v3v3(off1[w], co, key[w]->co); } - psys_mat_hair_to_global(ob, ctx->sim.psmd->mesh_final, psys->part->from, pa, hairmat); + psys_mat_hair_to_global(ob, mesh_final, psys->part->from, pa, hairmat); } else { ParticleData *pa = psys->particles + cpa->parent; @@ -2562,7 +2567,7 @@ static void psys_thread_create_path(ParticleTask *task, pa->num_dmcache; /* XXX hack to avoid messed up particle num and subsequent crash (#40733) */ - if (cpa_num > ctx->sim.psmd->mesh_final->totface) { + if (cpa_num > mesh_final->totface) { cpa_num = 0; } cpa_fuv = pa->fuv; @@ -2579,7 +2584,7 @@ static void psys_thread_create_path(ParticleTask *task, 0, orco); - psys_mat_hair_to_global(ob, ctx->sim.psmd->mesh_final, psys->part->from, pa, hairmat); + psys_mat_hair_to_global(ob, mesh_final, psys->part->from, pa, hairmat); } child_keys->segments = ctx->segments; @@ -2925,19 +2930,21 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra, const bool use_re copy_v3_v3(col, &ma->r); } + Mesh *mesh_final = BKE_particle_modifier_mesh_final_get(psmd); + if ((psys->flag & PSYS_GLOBAL_HAIR) == 0) { if ((psys->part->flag & PART_CHILD_EFFECT) == 0) { - vg_effector = psys_cache_vgroup(psmd->mesh_final, psys, PSYS_VG_EFFECTOR); + vg_effector = psys_cache_vgroup(mesh_final, psys, PSYS_VG_EFFECTOR); } if (!psys->totchild) { - vg_length = psys_cache_vgroup(psmd->mesh_final, psys, PSYS_VG_LENGTH); + vg_length = psys_cache_vgroup(mesh_final, psys, PSYS_VG_LENGTH); } } /* ensure we have tessfaces to be used for mapping */ if (part->from != PART_FROM_VERT) { - BKE_mesh_tessface_ensure(psmd->mesh_final); + BKE_mesh_tessface_ensure(mesh_final); } /*---first main loop: create all actual particles' paths---*/ @@ -2947,7 +2954,7 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra, const bool use_re psys_get_texture(sim, pa, &ptex, PAMAP_LENGTH, 0.f); pa_length = ptex.length * (1.0f - part->randlength * psys_frand(psys, psys->seed + p)); if (vg_length) { - pa_length *= psys_particle_value_from_verts(psmd->mesh_final, part->from, pa, vg_length); + pa_length *= psys_particle_value_from_verts(mesh_final, part->from, pa, vg_length); } } @@ -2965,7 +2972,7 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra, const bool use_re init_particle_interpolation(sim->ob, sim->psys, pa, &pind); /* hairmat is needed for for non-hair particle too so we get proper rotations */ - psys_mat_hair_to_global(sim->ob, psmd->mesh_final, psys->part->from, pa, hairmat); + psys_mat_hair_to_global(sim->ob, mesh_final, psys->part->from, pa, hairmat); copy_v3_v3(rotmat[0], hairmat[2]); copy_v3_v3(rotmat[1], hairmat[1]); copy_v3_v3(rotmat[2], hairmat[0]); @@ -3023,7 +3030,7 @@ void psys_cache_paths(ParticleSimulationData *sim, float cfra, const bool use_re float effector = 1.0f; if (vg_effector) { effector *= psys_particle_value_from_verts( - psmd->mesh_final, psys->part->from, pa, vg_effector); + mesh_final, psys->part->from, pa, vg_effector); } sub_v3_v3v3(vec, (cache[p] + 1)->co, cache[p]->co); @@ -3158,7 +3165,8 @@ static void psys_cache_edit_paths_iter(void *__restrict iter_data_v, init_particle_interpolation(ob, psys, pa, &pind); if (psys) { - psys_mat_hair_to_global(ob, psmd->mesh_final, psys->part->from, pa, hairmat); + Mesh *mesh_final = BKE_particle_modifier_mesh_final_get(psmd); + psys_mat_hair_to_global(ob, mesh_final, psys->part->from, pa, hairmat); copy_v3_v3(rotmat[0], hairmat[2]); copy_v3_v3(rotmat[1], hairmat[1]); copy_v3_v3(rotmat[2], hairmat[0]); @@ -4038,8 +4046,9 @@ void psys_get_texture( mul_m4_v3(mtex->object->imat, texvec); } break; - case TEXCO_UV: - if (get_particle_uv(sim->psmd->mesh_final, + case TEXCO_UV: { + Mesh *mesh_final = BKE_particle_modifier_mesh_final_get(sim->psmd); + if (get_particle_uv(mesh_final, pa, 0, pa->fuv, @@ -4050,6 +4059,7 @@ void psys_get_texture( } /* no break, failed to get uv's, so let's try orco's */ ATTR_FALLTHROUGH; + } case TEXCO_ORCO: psys_particle_on_emitter(sim->psmd, sim->psys->part->from, @@ -4323,7 +4333,8 @@ void psys_get_particle_on_path(ParticleSimulationData *sim, } else if (!keyed && !cached && !(psys->flag & PSYS_GLOBAL_HAIR)) { if ((pa->flag & PARS_REKEY) == 0) { - psys_mat_hair_to_global(sim->ob, sim->psmd->mesh_final, part->from, pa, hairmat); + Mesh *mesh_final = BKE_particle_modifier_mesh_final_get(sim->psmd); + psys_mat_hair_to_global(sim->ob, mesh_final, part->from, pa, hairmat); mul_m4_v3(hairmat, state->co); mul_mat3_m4_v3(hairmat, state->vel); @@ -4405,7 +4416,8 @@ void psys_get_particle_on_path(ParticleSimulationData *sim, 0, par_orco); if (part->type == PART_HAIR) { - psys_mat_hair_to_global(sim->ob, sim->psmd->mesh_final, psys->part->from, pa, hairmat); + Mesh *mesh_final = BKE_particle_modifier_mesh_final_get(psmd); + psys_mat_hair_to_global(sim->ob, mesh_final, psys->part->from, pa, hairmat); } @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs