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
