[Bf-blender-cvs] [b89f2276e50] blender2.8: Implement duplicator viewport/render visibility options

Dalai Felinto noreply at git.blender.org
Thu Dec 21 16:43:54 CET 2017


Commit: b89f2276e502da6480b4ceeb414b0e6b79e4edfe
Author: Dalai Felinto
Date:   Thu Dec 21 13:29:14 2017 -0200
Branches: blender2.8
https://developer.blender.org/rBb89f2276e502da6480b4ceeb414b0e6b79e4edfe

Implement duplicator viewport/render visibility options

This allows a duplicator (as known as dupli parent) to be in a visible
collection so its duplicated objects are visible, however while being
invisible for the final render.

An object that is a particle emitter is also considered a duplicator.

Many thanks for the reviewers for the extense feedback.

Reviewers: sergey, campbellbarton

Differential Revision: https://developer.blender.org/D2966

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

M	intern/cycles/blender/blender_object.cpp
M	release/scripts/startup/bl_ui/properties_object.py
M	release/scripts/startup/bl_ui/properties_particle.py
M	source/blender/blenkernel/BKE_object.h
M	source/blender/blenkernel/intern/object.c
M	source/blender/blenkernel/intern/particle.c
M	source/blender/blenloader/intern/versioning_280.c
M	source/blender/depsgraph/DEG_depsgraph_query.h
M	source/blender/depsgraph/intern/depsgraph_query_iter.cc
M	source/blender/draw/engines/clay/clay_engine.c
M	source/blender/draw/engines/eevee/eevee_engine.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
M	source/blender/editors/space_view3d/drawobject.c
M	source/blender/makesdna/DNA_object_types.h
M	source/blender/makesrna/intern/rna_depsgraph.c
M	source/blender/makesrna/intern/rna_layer.c
M	source/blender/makesrna/intern/rna_object.c
M	source/blender/makesrna/intern/rna_particle.c
M	source/blender/render/intern/source/convertblender.c

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

diff --git a/intern/cycles/blender/blender_object.cpp b/intern/cycles/blender/blender_object.cpp
index 0c29c606df8..6564eea4767 100644
--- a/intern/cycles/blender/blender_object.cpp
+++ b/intern/cycles/blender/blender_object.cpp
@@ -469,6 +469,7 @@ static bool object_render_hide(BL::Object& b_ob,
 	BL::Object::particle_systems_iterator b_psys;
 
 	bool hair_present = false;
+	bool has_particles = false;
 	bool show_emitter = false;
 	bool hide_emitter = false;
 	bool hide_as_dupli_parent = false;
@@ -478,20 +479,17 @@ static bool object_render_hide(BL::Object& b_ob,
 		if((b_psys->settings().render_type() == BL::ParticleSettings::render_type_PATH) &&
 		   (b_psys->settings().type()==BL::ParticleSettings::type_HAIR))
 			hair_present = true;
-
-		if(b_psys->settings().use_render_emitter())
-			show_emitter = true;
-		else
-			hide_emitter = true;
+		has_particles = true;
 	}
 
-	if(show_emitter)
-		hide_emitter = false;
-
-	/* duplicators hidden by default, except dupliframes which duplicate self */
-	if(b_ob.is_duplicator())
-		if(top_level || b_ob.dupli_type() != BL::Object::dupli_type_FRAMES)
+	if(has_particles) {
+		show_emitter = b_ob.show_duplicator_for_render();
+		hide_emitter = !show_emitter;
+	} else if(b_ob.is_duplicator()) {
+		if(top_level || b_ob.show_duplicator_for_render()) {
 			hide_as_dupli_parent = true;
+		}
+	}
 
 	/* hide original object for duplis */
 	BL::Object parent = b_ob.parent();
diff --git a/release/scripts/startup/bl_ui/properties_object.py b/release/scripts/startup/bl_ui/properties_object.py
index 23787756121..de608c42cb5 100644
--- a/release/scripts/startup/bl_ui/properties_object.py
+++ b/release/scripts/startup/bl_ui/properties_object.py
@@ -278,6 +278,13 @@ class OBJECT_PT_display(ObjectButtonsPanel, Panel):
             col.label(text="Object Color:")
             col.prop(obj, "color", text="")
 
+        col = layout.column()
+        col.active = bool(is_dupli or obj.particle_systems)
+        col.label(text="Duplicator Visibility:")
+        row = col.row(align=True)
+        row.prop(obj, "show_duplicator_for_viewport", text="Viewport")
+        row.prop(obj, "show_duplicator_for_render", text="Render")
+
 
 class OBJECT_PT_duplication(ObjectButtonsPanel, Panel):
     bl_label = "Duplication"
diff --git a/release/scripts/startup/bl_ui/properties_particle.py b/release/scripts/startup/bl_ui/properties_particle.py
index a5793e6d9a9..fda3096a3f5 100644
--- a/release/scripts/startup/bl_ui/properties_particle.py
+++ b/release/scripts/startup/bl_ui/properties_particle.py
@@ -926,7 +926,6 @@ class PARTICLE_PT_render(ParticleButtonsPanel, Panel):
         split = layout.split()
 
         col = split.column()
-        col.prop(part, "use_render_emitter")
         col.prop(part, "use_parent_particles")
 
         col = split.column()
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 2b183906f57..d98c52aa91a 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -82,7 +82,14 @@ bool BKE_object_exists_check(struct Object *obtest);
 bool BKE_object_is_in_editmode(struct Object *ob);
 bool BKE_object_is_in_editmode_vgroup(struct Object *ob);
 bool BKE_object_is_in_wpaint_select_vert(struct Object *ob);
-bool BKE_object_is_visible(struct Object *ob);
+
+typedef enum eObjectVisibilityCheck {
+	OB_VISIBILITY_CHECK_FOR_VIEWPORT,
+	OB_VISIBILITY_CHECK_FOR_RENDER,
+	OB_VISIBILITY_CHECK_UNKNOWN_RENDER_MODE,
+} eObjectVisibilityCheck;
+
+bool BKE_object_is_visible(struct Object *ob, const eObjectVisibilityCheck mode);
 
 void BKE_object_init(struct Object *ob);
 struct Object *BKE_object_add_only_object(
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index 66c87ac7a5c..923cea6acff 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -552,11 +552,32 @@ bool BKE_object_is_in_wpaint_select_vert(Object *ob)
 
 /**
  * Return if the object is visible, as evaluated by depsgraph
- * Keep in sync with rna_object.c (object.is_visible).
  */
-bool BKE_object_is_visible(Object *ob)
+bool BKE_object_is_visible(Object *ob, const eObjectVisibilityCheck mode)
 {
-	return (ob->base_flag & BASE_VISIBLED) != 0;
+	if ((ob->base_flag & BASE_VISIBLED) == 0) {
+		return false;
+	}
+
+	if (mode == OB_VISIBILITY_CHECK_UNKNOWN_RENDER_MODE) {
+		return true;
+	}
+
+	if (((ob->transflag & OB_DUPLI) == 0) &&
+	    (ob->particlesystem.first == NULL))
+	{
+		return true;
+	}
+
+	switch (mode) {
+		case OB_VISIBILITY_CHECK_FOR_VIEWPORT:
+			return ((ob->duplicator_visibility_flag & OB_DUPLI_FLAG_VIEWPORT) != 0);
+		case OB_VISIBILITY_CHECK_FOR_RENDER:
+			return ((ob->duplicator_visibility_flag & OB_DUPLI_FLAG_RENDER) != 0);
+		default:
+			BLI_assert(!"Object visible test mode not supported.");
+			return false;
+	}
 }
 
 bool BKE_object_exists_check(Object *obtest)
@@ -684,6 +705,7 @@ void BKE_object_init(Object *ob)
 	ob->col_group = 0x01;
 	ob->col_mask = 0xffff;
 	ob->preview = NULL;
+	ob->duplicator_visibility_flag = OB_DUPLI_FLAG_VIEWPORT | OB_DUPLI_FLAG_RENDER;
 
 	/* NT fluid sim defaults */
 	ob->fluidsimSettings = NULL;
diff --git a/source/blender/blenkernel/intern/particle.c b/source/blender/blenkernel/intern/particle.c
index a161dd4fac3..77c648e53fe 100644
--- a/source/blender/blenkernel/intern/particle.c
+++ b/source/blender/blenkernel/intern/particle.c
@@ -3279,7 +3279,7 @@ static void default_particle_settings(ParticleSettings *part)
 	part->clength = 1.0f;
 	part->clength_thres = 0.0f;
 
-	part->draw = PART_DRAW_EMITTER;
+	part->draw = 0;
 	part->draw_line[0] = 0.5;
 	part->path_start = 0.0f;
 	part->path_end = 1.0f;
diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c
index 944ddf1763d..547ae6709b2 100644
--- a/source/blender/blenloader/intern/versioning_280.c
+++ b/source/blender/blenloader/intern/versioning_280.c
@@ -45,6 +45,7 @@
 #include "DNA_lightprobe_types.h"
 #include "DNA_material_types.h"
 #include "DNA_mesh_types.h"
+#include "DNA_particle_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_screen_types.h"
 #include "DNA_view3d_types.h"
@@ -855,4 +856,28 @@ void blo_do_versions_280(FileData *fd, Library *UNUSED(lib), Main *main)
 			}
 		}
 	}
+
+	{
+		if (!DNA_struct_elem_find(fd->filesdna, "Object", "char", "duplicator_visibility_flag")) {
+			for (Object *object = main->object.first; object; object = object->id.next) {
+				if (object->particlesystem.first) {
+					bool show_emitter = false;
+					for (ParticleSystem *psys = object->particlesystem.first; psys; psys=psys->next) {
+						show_emitter |= (psys->part->draw & PART_DRAW_EMITTER) != 0;
+					}
+
+					object->duplicator_visibility_flag = OB_DUPLI_FLAG_VIEWPORT;
+					if (show_emitter) {
+						object->duplicator_visibility_flag |= OB_DUPLI_FLAG_RENDER;
+					}
+				}
+				else if (object->transflag & OB_DUPLI){
+					object->duplicator_visibility_flag = OB_DUPLI_FLAG_VIEWPORT;
+				}
+				else {
+					object->duplicator_visibility_flag = OB_DUPLI_FLAG_VIEWPORT | OB_DUPLI_FLAG_RENDER;
+				}
+			}
+		}
+	}
 }
diff --git a/source/blender/depsgraph/DEG_depsgraph_query.h b/source/blender/depsgraph/DEG_depsgraph_query.h
index c782a91f76e..83fb100436c 100644
--- a/source/blender/depsgraph/DEG_depsgraph_query.h
+++ b/source/blender/depsgraph/DEG_depsgraph_query.h
@@ -77,12 +77,18 @@ enum {
 	DEG_ITER_OBJECT_FLAG_DUPLI             = (1 << 4),
 };
 
+typedef enum eDepsObjectIteratorMode {
+	DEG_ITER_OBJECT_MODE_VIEWPORT = 0,
+	DEG_ITER_OBJECT_MODE_RENDER   = 1,
+} eDepsObjectIteratorMode;
+
 typedef struct DEGObjectIterData {
 	struct Depsgraph *graph;
 	struct Scene *scene;
 	struct EvaluationContext eval_ctx;
 
 	int flag;
+	eDepsObjectIteratorMode mode;
 
 	/* **** Iteration over dupli-list. *** */
 
@@ -115,10 +121,11 @@ void DEG_iterator_objects_end(struct BLI_Iterator *iter);
  * Although they are available they have no overrides (collection_properties)
  * and will crash if you try to access it.
  */
-#define DEG_OBJECT_ITER(graph_, instance_, flag_)                                 \
+#define DEG_OBJECT_ITER(graph_, instance_, mode_, flag_)                          \
 	{                                                                             \
 		DEGObjectIterData data_ = {                                               \
 			.graph = (graph_),                                                    \
+			.mode = (mode_),                                                      \
 			.flag = (flag_),                                                      \
 		};                                                                        \
                                                                                   \
@@ -134,8 +141,8 @@ void DEG_iterator_objects_end(struct BLI_Iterator *iter);
 /**
   * Depsgraph objects iterator for draw manager and final render
   */
-#define DEG_OBJECT_ITER_FOR_RENDER_ENGINE(graph_, instance_) \
-	DEG_OBJECT_ITER(graph_, instance_,                       \
+#define DEG_OBJECT_ITER_FOR_RENDER_ENGINE(graph_, instance_, mode_) \
+	DEG_OBJECT_ITER(graph_, instance_, mode_,                \
 	        DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY  |          \
 	        DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET |            \
 	        DEG_ITER_OBJECT_FLAG_VISIBLE |                   \
diff --git a/source/blender/depsgraph/intern/depsgraph_query_iter.cc b/source/blender/depsgraph/intern/depsgraph_query_iter.cc
index 2a323fe63bd..42d512d473c 100644
--- a/source/blender/depsgraph/intern/depsgraph_query_iter.cc
+++ b/source/blender/depsgraph/intern/depsgraph_query_iter.cc
@@ -84,6 +84,7 @@ static bool deg_objects_dupli_iterator_next(BLI_Iterator *iter)
 		Object *dupli_parent = data->dupli_parent;
 		Object *temp_dupli_object = &data->temp_dupli_object;
 		*temp_dupli_object = *dob->ob;
+		temp_dupli_object->transflag &= ~OB_DUPLI;
 		temp_dupli_object->select_color = dupli_parent->select_color;
 		temp_dupli_object->base_flag = dupli_parent->base_flag | BASE_FROMDUPLI;
 
@@ -139,7 +140,7 @@ static void DEG_iterator_objects_step(BLI_Iterator *iter, DEG::IDDepsNode *id_no
 	Object *object = (Object *)i

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list