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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to