[Bf-blender-cvs] [361bc2bc507] blender2.8: Particle edit: Make visibility check to be per-particle system

Sergey Sharybin noreply at git.blender.org
Tue May 15 17:21:27 CEST 2018


Commit: 361bc2bc507fc187c205781130df9fed11907455
Author: Sergey Sharybin
Date:   Tue May 15 11:35:39 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB361bc2bc507fc187c205781130df9fed11907455

Particle edit: Make visibility check to be per-particle system

This way we can see other particle systems while combing another one.

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

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 67481a68162..fe368872d48 100644
--- a/source/blender/draw/engines/basic/basic_engine.c
+++ b/source/blender/draw/engines/basic/basic_engine.c
@@ -140,30 +140,27 @@ static void basic_cache_populate(void *vedata, Object *ob)
 {
 	BASIC_StorageList *stl = ((BASIC_Data *)vedata)->stl;
 
-	if (!DRW_object_is_renderable(ob))
-		return;
-
-	if (!DRW_check_particles_visible_within_active_context(ob)) {
+	if (!DRW_object_is_renderable(ob)) {
 		return;
 	}
 
 	const DRWContextState *draw_ctx = DRW_context_state_get();
+	if (ob == draw_ctx->object_edit) {
+		return;
+	}
 
-	if (ob != draw_ctx->object_edit) {
-		for (ParticleSystem *psys = ob->particlesystem.first; psys; psys = psys->next) {
-			if (psys_check_enabled(ob, psys, false)) {
-				ParticleSettings *part = psys->part;
-				int draw_as = (part->draw_as == PART_DRAW_REND) ? part->ren_as : part->draw_as;
-
-				if (draw_as == PART_DRAW_PATH && !psys->pathcache && !psys->childcache) {
-					draw_as = PART_DRAW_DOT;
-				}
-
-				if (draw_as == PART_DRAW_PATH) {
-					struct Gwn_Batch *hairs = DRW_cache_particles_get_hair(psys, NULL);
-					DRW_shgroup_call_add(stl->g_data->depth_shgrp, hairs, NULL);
-				}
-			}
+	for (ParticleSystem *psys = ob->particlesystem.first; psys; psys = psys->next) {
+		if (!psys_check_enabled(ob, psys, false)) {
+			continue;
+		}
+		if (!DRW_check_psys_visible_within_active_context(ob, psys)) {
+			return;
+		}
+		ParticleSettings *part = psys->part;
+		const int draw_as = (part->draw_as == PART_DRAW_REND) ? part->ren_as : part->draw_as;
+		if (draw_as == PART_DRAW_PATH) {
+			struct Gwn_Batch *hairs = DRW_cache_particles_get_hair(psys, NULL);
+			DRW_shgroup_call_add(stl->g_data->depth_shgrp, hairs, NULL);
 		}
 	}
 
diff --git a/source/blender/draw/engines/clay/clay_engine.c b/source/blender/draw/engines/clay/clay_engine.c
index 0ae27a4f5ef..2be914cb234 100644
--- a/source/blender/draw/engines/clay/clay_engine.c
+++ b/source/blender/draw/engines/clay/clay_engine.c
@@ -833,21 +833,15 @@ 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;
 		}
-		ParticleSettings *part = psys->part;
-		int draw_as = (part->draw_as == PART_DRAW_REND) ? part->ren_as : part->draw_as;
-
-		if (draw_as == PART_DRAW_PATH && !psys->pathcache && !psys->childcache) {
-			draw_as = PART_DRAW_DOT;
+		if (!DRW_check_psys_visible_within_active_context(ob, psys)) {
+			return;
 		}
-
+		ParticleSettings *part = psys->part;
+		const int draw_as = (part->draw_as == PART_DRAW_REND) ? part->ren_as : part->draw_as;
 		if (draw_as == PART_DRAW_PATH) {
 			struct Gwn_Batch *geom = DRW_cache_particles_get_hair(psys, NULL);
 			DRWShadingGroup *hair_shgrp = CLAY_hair_shgrp_get(vedata, ob, stl, psl);
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index 304baff6672..44a117ab9d3 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 (DRW_check_particles_visible_within_active_context(ob)) {
+		if (ob != draw_ctx->object_edit) {
 			material_hash = stl->g_data->hair_material_hash;
 			for (ModifierData *md = ob->modifiers.first; md; md = md->next) {
 				if (md->type != eModifierType_ParticleSystem) {
@@ -1482,9 +1482,12 @@ void EEVEE_materials_cache_populate(EEVEE_Data *vedata, EEVEE_ViewLayerData *sld
 				if (!psys_check_enabled(ob, psys, false)) {
 					continue;
 				}
+				if (!DRW_check_psys_visible_within_active_context(ob, psys)) {
+					continue;
+				}
 				ParticleSettings *part = psys->part;
-				int draw_as = (part->draw_as == PART_DRAW_REND) ? part->ren_as : part->draw_as;
-				if (draw_as != PART_DRAW_PATH || (psys->pathcache == NULL && psys->childcache == NULL)) {
+				const int draw_as = (part->draw_as == PART_DRAW_REND) ? part->ren_as : part->draw_as;
+				if (draw_as != PART_DRAW_PATH) {
 					continue;
 				}
 				struct Gwn_Batch *hair_geom = DRW_cache_particles_get_hair(psys, md);
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c
index 553f4801d19..1013623260c 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -488,19 +488,19 @@ static WORKBENCH_MaterialData *get_or_create_material_data(WORKBENCH_Data *vedat
 
 static void workbench_cache_populate_particles(WORKBENCH_Data *vedata, Object *ob)
 {
-	if (!DRW_check_particles_visible_within_active_context(ob)) {
+	const DRWContextState *draw_ctx = DRW_context_state_get();
+	if (ob == draw_ctx->object_edit) {
 		return;
 	}
 	for (ParticleSystem *psys = ob->particlesystem.first; psys != NULL; psys = psys->next) {
 		if (!psys_check_enabled(ob, psys, false)) {
 			continue;
 		}
-		ParticleSettings *part = psys->part;
-		int draw_as = (part->draw_as == PART_DRAW_REND) ? part->ren_as : part->draw_as;
-
-		if (draw_as == PART_DRAW_PATH && !psys->pathcache && !psys->childcache) {
-			draw_as = PART_DRAW_DOT;
+		if (!DRW_check_psys_visible_within_active_context(ob, psys)) {
+			return;
 		}
+		ParticleSettings *part = psys->part;
+		const int draw_as = (part->draw_as == PART_DRAW_REND) ? part->ren_as : part->draw_as;
 
 		static float mat[4][4];
 		unit_m4(mat);
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 4fb299202b7..901f009e7ed 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -451,7 +451,7 @@ 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 Object *object, struct ParticleSystem *psys);
 
 /* Draw commands */
 void DRW_draw_pass(DRWPass *pass);
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 25c1940627b..8f7097a8bc0 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -36,6 +36,8 @@
 #include "BKE_global.h"
 #include "BKE_mesh.h"
 #include "BKE_object.h"
+#include "BKE_particle.h"
+#include "BKE_pointcache.h"
 #include "BKE_workspace.h"
 
 #include "draw_manager.h"
@@ -219,13 +221,20 @@ int DRW_object_is_paint_mode(const Object *ob)
 	return false;
 }
 
-bool DRW_check_particles_visible_within_active_context(Object *object)
+bool DRW_check_psys_visible_within_active_context(
+        Object *object,
+        struct ParticleSystem *psys)
 {
 	const DRWContextState *draw_ctx = DRW_context_state_get();
 	if (object == draw_ctx->object_edit) {
 		return false;
 	}
-	return (object->mode != OB_MODE_PARTICLE_EDIT);
+	if (object->mode == OB_MODE_PARTICLE_EDIT) {
+		if (psys_in_edit_mode(draw_ctx->depsgraph, psys)) {
+			return false;
+		}
+	}
+	return true;
 }
 
 /** \} */
diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c
index 24cd31d3db1..97dc7726510 100644
--- a/source/blender/draw/modes/object_mode.c
+++ b/source/blender/draw/modes/object_mode.c
@@ -1914,74 +1914,76 @@ static void DRW_shgroup_object_center(OBJECT_StorageList *stl, Object *ob, ViewL
 static void OBJECT_cache_populate_particles(Object *ob,
                                             OBJECT_PassList *psl)
 {
-	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)) {
-			ParticleSettings *part = psys->part;
-			int draw_as = (part->draw_as == PART_DRAW_REND) ? part->ren_as : part->draw_as;
+		if (!psys_check_enabled(ob, psys, false)) {
+			continue;
+		}
+		if (!DRW_check_psys_visible_within_active_context(ob, psys)) {
+			return;
+		}
 
-			if (draw_as == PART_DRAW_PATH && !psys->pathcache && !psys->childcache) {
-				draw_as = PART_DRAW_DOT;
-			}
+		ParticleSettings *part = psys->part;
+		int draw_as = (part->draw_as == PART_DRAW_REND) ? part->ren_as : part->draw_as;
 
-			static float mat[4][4];
-			unit_m4(mat);
-
-			if (draw_as != PART_DRAW_PATH) {
-				struct Gwn_Batch *geom = DRW_cache_particles_get_dots(ob, psys);
-				DRWShadingGroup *shgrp = NULL;
-				static int screen_space[2] = {0, 1};
-				static float def_prim_col[3] = {0.5f, 0.5f, 0.5f};
-				static float def_sec_col[3] = {1.0f, 1.0f, 1.0f};
-
-				/* Dummy particle format for instancing to work. */
-				DRW_shgroup_instance_format(e_data.particle_format, {{"dummy", DRW_ATTRIB_FLOAT, 1}});
-
-				Material *ma = give_current_material(ob, part->omat);
-
-				switch (draw_as) {
-					case PART_DRAW_DOT:
-						shgrp = DRW_shgroup_create(e_data.part_dot_sh, psl->particle);
-						DRW_shgroup_uniform_vec3(shgrp, "color", ma ? &ma->r : def_prim_col, 1);
-						DRW_shgroup_uniform_vec3(shgrp, "outlineColor", ma ? &ma->specr : def_sec_col, 1);
-						DRW_shgroup_uniform_float(shgrp, "pixel_size", DRW_viewport_pixelsize_get(), 1);
-						DRW_shgroup_uniform_float(shgrp, "size", &part->draw_size, 1);
-						DRW_shgroup_uniform_texture(shgrp, "ramp", globals_ramp);
-						DRW_shgroup_call_add(shgrp, geom, mat);
-						break;
-					case PART_DRAW_CROSS:
-						shgrp = DRW_shgroup_instance_create(
-						        e_data.part_prim_sh, psl->particle, DRW_cache_particles_get_prim(PART_DRAW_CROSS),
-						        e_data.particle_format);
-						DRW_shgroup_uniform_texture(shgrp, "ramp", globals_ramp);
-						DRW_shgroup_uniform_vec3(shgrp, "color", ma ? &ma->r : def_prim_col, 1);
-						DRW_shgroup_uniform_int(shgrp, "screen_space", &screen_space[0], 1);
-

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list