diff options
Diffstat (limited to 'source/blender/draw')
-rw-r--r-- | source/blender/draw/intern/draw_cache.c | 12 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_cache.h | 6 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_cache_impl.h | 6 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_cache_impl_particles.c | 31 | ||||
-rw-r--r-- | source/blender/draw/modes/particle_mode.c | 49 |
5 files changed, 63 insertions, 41 deletions
diff --git a/source/blender/draw/intern/draw_cache.c b/source/blender/draw/intern/draw_cache.c index b70ed1d053d..6c6e9a732b3 100644 --- a/source/blender/draw/intern/draw_cache.c +++ b/source/blender/draw/intern/draw_cache.c @@ -2886,19 +2886,19 @@ Gwn_Batch *DRW_cache_particles_get_dots(Object *object, ParticleSystem *psys) return DRW_particles_batch_cache_get_dots(object, psys); } -Gwn_Batch *DRW_cache_particles_get_edit_strands(struct PTCacheEdit *edit) +Gwn_Batch *DRW_cache_particles_get_edit_strands(Object *object, struct PTCacheEdit *edit) { - return DRW_particles_batch_cache_get_edit_strands(edit); + return DRW_particles_batch_cache_get_edit_strands(object, edit); } -Gwn_Batch *DRW_cache_particles_get_edit_inner_points(struct PTCacheEdit *edit) +Gwn_Batch *DRW_cache_particles_get_edit_inner_points(Object *object, struct PTCacheEdit *edit) { - return DRW_particles_batch_cache_get_edit_inner_points(edit); + return DRW_particles_batch_cache_get_edit_inner_points(object, edit); } -Gwn_Batch *DRW_cache_particles_get_edit_tip_points(struct PTCacheEdit *edit) +Gwn_Batch *DRW_cache_particles_get_edit_tip_points(Object *object, struct PTCacheEdit *edit) { - return DRW_particles_batch_cache_get_edit_tip_points(edit); + return DRW_particles_batch_cache_get_edit_tip_points(object, edit); } Gwn_Batch *DRW_cache_particles_get_prim(int type) diff --git a/source/blender/draw/intern/draw_cache.h b/source/blender/draw/intern/draw_cache.h index 66db405786d..2dc07e40c42 100644 --- a/source/blender/draw/intern/draw_cache.h +++ b/source/blender/draw/intern/draw_cache.h @@ -169,9 +169,9 @@ struct Gwn_Batch *DRW_cache_lattice_vert_overlay_get(struct Object *ob); /* Particles */ struct Gwn_Batch *DRW_cache_particles_get_hair(struct ParticleSystem *psys, struct ModifierData *md); struct Gwn_Batch *DRW_cache_particles_get_dots(struct Object *object, struct ParticleSystem *psys); -struct Gwn_Batch *DRW_cache_particles_get_edit_strands(struct PTCacheEdit *edit); -struct Gwn_Batch *DRW_cache_particles_get_edit_inner_points(struct PTCacheEdit *edit); -struct Gwn_Batch *DRW_cache_particles_get_edit_tip_points(struct PTCacheEdit *edit); +struct Gwn_Batch *DRW_cache_particles_get_edit_strands(struct Object *object, struct PTCacheEdit *edit); +struct Gwn_Batch *DRW_cache_particles_get_edit_inner_points(struct Object *object, struct PTCacheEdit *edit); +struct Gwn_Batch *DRW_cache_particles_get_edit_tip_points(struct Object *object, struct PTCacheEdit *edit); struct Gwn_Batch *DRW_cache_particles_get_prim(int type); /* Metaball */ diff --git a/source/blender/draw/intern/draw_cache_impl.h b/source/blender/draw/intern/draw_cache_impl.h index 4e3c56eb427..9d9668f3ffc 100644 --- a/source/blender/draw/intern/draw_cache_impl.h +++ b/source/blender/draw/intern/draw_cache_impl.h @@ -125,8 +125,8 @@ void DRW_mesh_cache_sculpt_coords_ensure(struct Mesh *me); /* Particles */ struct Gwn_Batch *DRW_particles_batch_cache_get_hair(struct ParticleSystem *psys, struct ModifierData *md); struct Gwn_Batch *DRW_particles_batch_cache_get_dots(struct Object *object, struct ParticleSystem *psys); -struct Gwn_Batch *DRW_particles_batch_cache_get_edit_strands(struct PTCacheEdit *edit); -struct Gwn_Batch *DRW_particles_batch_cache_get_edit_inner_points(struct PTCacheEdit *edit); -struct Gwn_Batch *DRW_particles_batch_cache_get_edit_tip_points(struct PTCacheEdit *edit); +struct Gwn_Batch *DRW_particles_batch_cache_get_edit_strands(struct Object *object, struct PTCacheEdit *edit); +struct Gwn_Batch *DRW_particles_batch_cache_get_edit_inner_points(struct Object *object, struct PTCacheEdit *edit); +struct Gwn_Batch *DRW_particles_batch_cache_get_edit_tip_points(struct Object *object, struct PTCacheEdit *edit); #endif /* __DRAW_CACHE_IMPL_H__ */ diff --git a/source/blender/draw/intern/draw_cache_impl_particles.c b/source/blender/draw/intern/draw_cache_impl_particles.c index 4102b72175f..f1ae9d6ef8c 100644 --- a/source/blender/draw/intern/draw_cache_impl_particles.c +++ b/source/blender/draw/intern/draw_cache_impl_particles.c @@ -597,10 +597,25 @@ Gwn_Batch *DRW_particles_batch_cache_get_dots(Object *object, ParticleSystem *ps return cache->hairs; } -Gwn_Batch *DRW_particles_batch_cache_get_edit_strands(PTCacheEdit *edit) +/* TODO(sergey): Avoid linear lookup. */ +static ParticleBatchCache *particle_batch_cache_get_edit(Object *object, PTCacheEdit *edit) +{ + ParticleSystem *psys_orig = edit->psys; + for (ParticleSystem *psys_eval = object->particlesystem.first; + psys_eval != NULL; + psys_eval = psys_eval->next) + { + if (STREQ(psys_orig->name, psys_eval->name)) { + return particle_batch_cache_get(psys_eval); + } + } + return NULL; +} + +Gwn_Batch *DRW_particles_batch_cache_get_edit_strands(Object *object, PTCacheEdit *edit) { ParticleSystem *psys = edit->psys; - ParticleBatchCache *cache = particle_batch_cache_get(psys); + ParticleBatchCache *cache = particle_batch_cache_get_edit(object, edit); if (cache->hairs != NULL) { return cache->hairs; } @@ -676,10 +691,9 @@ static void particle_batch_cache_ensure_edit_inner_pos( } } -Gwn_Batch *DRW_particles_batch_cache_get_edit_inner_points(PTCacheEdit *edit) +Gwn_Batch *DRW_particles_batch_cache_get_edit_inner_points(Object *object, PTCacheEdit *edit) { - ParticleSystem *psys = edit->psys; - ParticleBatchCache *cache = particle_batch_cache_get(psys); + ParticleBatchCache *cache = particle_batch_cache_get_edit(object, edit); if (cache->edit_inner_points != NULL) { return cache->edit_inner_points; } @@ -692,7 +706,7 @@ Gwn_Batch *DRW_particles_batch_cache_get_edit_inner_points(PTCacheEdit *edit) } static void ensure_edit_tip_points_count(const PTCacheEdit *edit, - ParticleBatchCache *cache) + ParticleBatchCache *cache) { if (cache->edit_tip_pos != NULL) { return; @@ -738,10 +752,9 @@ static void particle_batch_cache_ensure_edit_tip_pos( } } -Gwn_Batch *DRW_particles_batch_cache_get_edit_tip_points(PTCacheEdit *edit) +Gwn_Batch *DRW_particles_batch_cache_get_edit_tip_points(Object *object, PTCacheEdit *edit) { - ParticleSystem *psys = edit->psys; - ParticleBatchCache *cache = particle_batch_cache_get(psys); + ParticleBatchCache *cache = particle_batch_cache_get_edit(object, edit); if (cache->edit_tip_points != NULL) { return cache->edit_tip_points; } diff --git a/source/blender/draw/modes/particle_mode.c b/source/blender/draw/modes/particle_mode.c index dc08ba63cb3..d9363a18054 100644 --- a/source/blender/draw/modes/particle_mode.c +++ b/source/blender/draw/modes/particle_mode.c @@ -139,18 +139,30 @@ static void particle_cache_init(void *vedata) DRW_shgroup_uniform_float(stl->g_data->tip_points_group, "outlineWidth", &outline_width, 1); } -static void draw_update_ptcache_edit(Object *object, PTCacheEdit *edit) +/* TODO(sergey): Avoid linear lookup. */ +static void draw_update_ptcache_edit(Object *object_eval, PTCacheEdit *edit) { - if (edit->psys && edit->psys->flag & PSYS_HAIR_UPDATED) { + if (edit->psys == NULL) { + return; + } + ParticleSystem *psys_eval; + for (psys_eval = object_eval->particlesystem.first; + psys_eval != NULL; + psys_eval = psys_eval->next) + { + if (STREQ(edit->psys->name, psys_eval->name)) { + break; + } + } + if (psys_eval->flag & PSYS_HAIR_UPDATED) { const DRWContextState *draw_ctx = DRW_context_state_get(); Scene *scene_orig = (Scene *)DEG_get_original_id(&draw_ctx->scene->id); - Object *object_orig = DEG_get_original_object(object); + Object *object_orig = DEG_get_original_object(object_eval); PE_update_object(draw_ctx->depsgraph, scene_orig, object_orig, 0); } BLI_assert(edit->pathcache != NULL); } - static void particle_edit_cache_populate(void *vedata, Object *object, PTCacheEdit *edit) @@ -160,35 +172,32 @@ static void particle_edit_cache_populate(void *vedata, draw_update_ptcache_edit(object, edit); ParticleEditSettings *pset = PE_settings(draw_ctx->scene); { - struct Gwn_Batch *strands = DRW_cache_particles_get_edit_strands(edit); + struct Gwn_Batch *strands = + DRW_cache_particles_get_edit_strands(object, edit); DRW_shgroup_call_add(stl->g_data->strands_group, strands, NULL); } if (pset->selectmode == SCE_SELECT_POINT) { - struct Gwn_Batch *points = DRW_cache_particles_get_edit_inner_points(edit); + struct Gwn_Batch *points = + DRW_cache_particles_get_edit_inner_points(object, edit); DRW_shgroup_call_add(stl->g_data->inner_points_group, points, NULL); } if (ELEM(pset->selectmode, SCE_SELECT_POINT, SCE_SELECT_END)) { - struct Gwn_Batch *points = DRW_cache_particles_get_edit_tip_points(edit); + struct Gwn_Batch *points = + DRW_cache_particles_get_edit_tip_points(object, edit); DRW_shgroup_call_add(stl->g_data->tip_points_group, points, NULL); } } static void particle_cache_populate(void *vedata, Object *object) { - for (ParticleSystem *psys = object->particlesystem.first; - psys != NULL; - psys = psys->next) - { - if (!psys_check_enabled(object, psys, false)) { - continue; - } - PTCacheEdit *edit = PE_get_current_from_psys(psys); - if (edit == NULL) { - continue; - } - particle_edit_cache_populate(vedata, object, edit); - break; + const DRWContextState *draw_ctx = DRW_context_state_get(); + Object *object_orig = DEG_get_original_object(object); + PTCacheEdit *edit = PE_get_current(draw_ctx->scene, object_orig); + if (edit == NULL) { + printf("Particle edit struct is NULL, not supposed to happen.\n"); + return; } + particle_edit_cache_populate(vedata, object, edit); } /* Optional: Post-cache_populate callback */ |