diff options
-rw-r--r-- | source/blender/draw/engines/basic/basic_engine.c | 4 | ||||
-rw-r--r-- | source/blender/draw/engines/clay/clay_engine.c | 4 | ||||
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_materials.c | 2 | ||||
-rw-r--r-- | source/blender/draw/engines/workbench/workbench_materials.c | 4 | ||||
-rw-r--r-- | source/blender/draw/intern/DRW_render.h | 4 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager.c | 15 | ||||
-rw-r--r-- | source/blender/draw/modes/object_mode.c | 2 |
7 files changed, 30 insertions, 5 deletions
diff --git a/source/blender/draw/engines/basic/basic_engine.c b/source/blender/draw/engines/basic/basic_engine.c index 2e0a0881928..67481a68162 100644 --- a/source/blender/draw/engines/basic/basic_engine.c +++ b/source/blender/draw/engines/basic/basic_engine.c @@ -143,6 +143,10 @@ static void basic_cache_populate(void *vedata, Object *ob) if (!DRW_object_is_renderable(ob)) return; + if (!DRW_check_particles_visible_within_active_context(ob)) { + return; + } + const DRWContextState *draw_ctx = DRW_context_state_get(); if (ob != draw_ctx->object_edit) { diff --git a/source/blender/draw/engines/clay/clay_engine.c b/source/blender/draw/engines/clay/clay_engine.c index 3eed31b6856..0ae27a4f5ef 100644 --- a/source/blender/draw/engines/clay/clay_engine.c +++ b/source/blender/draw/engines/clay/clay_engine.c @@ -833,6 +833,10 @@ static void clay_cache_populate_particles(void *vedata, Object *ob) return; } + if (!DRW_check_particles_visible_within_active_context(ob)) { + return; + } + for (ParticleSystem *psys = ob->particlesystem.first; psys; psys = psys->next) { if (!psys_check_enabled(ob, psys, false)) { continue; diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c index 6819dad8188..304baff6672 100644 --- a/source/blender/draw/engines/eevee/eevee_materials.c +++ b/source/blender/draw/engines/eevee/eevee_materials.c @@ -1472,7 +1472,7 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_ViewLayerData *sld } if (ob->type == OB_MESH) { - if (ob != draw_ctx->object_edit) { + if (DRW_check_particles_visible_within_active_context(ob)) { material_hash = stl->g_data->hair_material_hash; for (ModifierData *md = ob->modifiers.first; md; md = md->next) { if (md->type != eModifierType_ParticleSystem) { diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c index ddc3b5dc698..0fee42619c3 100644 --- a/source/blender/draw/engines/workbench/workbench_materials.c +++ b/source/blender/draw/engines/workbench/workbench_materials.c @@ -452,11 +452,9 @@ static WORKBENCH_MaterialData *get_or_create_material_data(WORKBENCH_Data *vedat static void workbench_cache_populate_particles(WORKBENCH_Data *vedata, Object *ob) { - const DRWContextState *draw_ctx = DRW_context_state_get(); - if (ob == draw_ctx->object_edit) { + if (!DRW_check_particles_visible_within_active_context(ob)) { return; } - for (ParticleSystem *psys = ob->particlesystem.first; psys != NULL; psys = psys->next) { if (!psys_check_enabled(ob, psys, false)) { continue; diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h index 21115dd961d..f343855ead1 100644 --- a/source/blender/draw/intern/DRW_render.h +++ b/source/blender/draw/intern/DRW_render.h @@ -73,6 +73,7 @@ struct DefaultFramebufferList; struct DefaultTextureList; struct DRWTextStore; struct LampEngineData; +struct ParticleSystem; struct RenderEngineType; struct ViewportEngineData; struct ViewportEngineData_Info; @@ -447,6 +448,9 @@ bool DRW_object_is_flat_normal(const struct Object *ob); int DRW_object_is_mode_shade(const struct Object *ob); int DRW_object_is_paint_mode(const struct Object *ob); +bool DRW_check_particles_visible_within_active_context(struct Object *object); +bool DRW_check_psys_visible_within_active_context(struct ParticleSystem *psys); + /* Draw commands */ void DRW_draw_pass(DRWPass *pass); void DRW_draw_pass_subset(DRWPass *pass, DRWShadingGroup *start_group, DRWShadingGroup *end_group); diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c index 98fe737410f..f3a841a17cb 100644 --- a/source/blender/draw/intern/draw_manager.c +++ b/source/blender/draw/intern/draw_manager.c @@ -45,6 +45,7 @@ #include "ED_space_api.h" #include "ED_screen.h" +#include "ED_particle.h" #include "ED_view3d.h" #include "GPU_draw.h" @@ -218,6 +219,20 @@ int DRW_object_is_paint_mode(const Object *ob) return false; } +bool DRW_check_particles_visible_within_active_context(Object *object) +{ + const DRWContextState *draw_ctx = DRW_context_state_get(); + if (object == draw_ctx->object_edit) { + return false; + } + return (object->mode != OB_MODE_PARTICLE_EDIT); +} + +bool DRW_check_psys_visible_within_active_context(struct ParticleSystem *psys) +{ + return PE_get_current_from_psys(psys) == NULL; +} + /** \} */ diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c index b70b4d567a6..24cd31d3db1 100644 --- a/source/blender/draw/modes/object_mode.c +++ b/source/blender/draw/modes/object_mode.c @@ -1914,7 +1914,7 @@ static void DRW_shgroup_object_center(OBJECT_StorageList *stl, Object *ob, ViewL static void OBJECT_cache_populate_particles(Object *ob, OBJECT_PassList *psl) { - if (ob->mode == OB_MODE_PARTICLE_EDIT) { + if (!DRW_check_particles_visible_within_active_context(ob)) { return; } for (ParticleSystem *psys = ob->particlesystem.first; psys; psys = psys->next) { |