[Bf-blender-cvs] [327789eaf87] blender2.8: Draw manager: Add utility function to check whether particle systems are to be drawn

Sergey Sharybin noreply at git.blender.org
Fri May 11 12:49:30 CEST 2018


Commit: 327789eaf875195cb2b1374dae330d9a3ec9b478
Author: Sergey Sharybin
Date:   Wed May 9 16:55:09 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB327789eaf875195cb2b1374dae330d9a3ec9b478

Draw manager: Add utility function to check whether particle systems are to be drawn

===================================================================

M	source/blender/draw/engines/basic/basic_engine.c
M	source/blender/draw/engines/clay/clay_engine.c
M	source/blender/draw/engines/eevee/eevee_materials.c
M	source/blender/draw/engines/workbench/workbench_materials.c
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_manager.c
M	source/blender/draw/modes/object_mode.c

===================================================================

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) {



More information about the Bf-blender-cvs mailing list