From f2e27ef7b6bdc1fdba10d01235a7f554c0483aec Mon Sep 17 00:00:00 2001 From: JonasDichelle Date: Fri, 9 Feb 2024 12:16:16 +0100 Subject: [PATCH] Cycles: Override World option per View Layer This feature is useful for many production scenarios as it allows for the creation of separate render passes with specific worlds. This would help workflows that require different skies or other backgrounds for compositing. Ref #117919 Pull Request: https://projects.blender.org/blender/blender/pulls/117920 --- intern/cycles/blender/addon/ui.py | 1 + intern/cycles/blender/light.cpp | 2 +- intern/cycles/blender/shader.cpp | 2 +- intern/cycles/blender/sync.cpp | 2 ++ intern/cycles/blender/sync.h | 2 ++ source/blender/blenkernel/intern/scene.cc | 1 + source/blender/blenloader/intern/versioning_280.cc | 1 + .../intern/builder/deg_builder_nodes_view_layer.cc | 4 ++++ .../builder/deg_builder_relations_view_layer.cc | 4 ++++ source/blender/makesdna/DNA_layer_types.h | 1 + source/blender/makesdna/DNA_scene_types.h | 1 + source/blender/makesrna/intern/rna_internal.hh | 2 +- source/blender/makesrna/intern/rna_scene.cc | 13 ++++++++++--- 13 files changed, 30 insertions(+), 6 deletions(-) diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py index f7826bbbba1..cd0b8ae2bd9 100644 --- a/intern/cycles/blender/addon/ui.py +++ b/intern/cycles/blender/addon/ui.py @@ -927,6 +927,7 @@ class CYCLES_RENDER_PT_override(CyclesButtonsPanel, Panel): view_layer = context.view_layer layout.prop(view_layer, "material_override") + layout.prop(view_layer, "world_override") layout.prop(view_layer, "samples") diff --git a/intern/cycles/blender/light.cpp b/intern/cycles/blender/light.cpp index 6eaa4529250..08898f0e440 100644 --- a/intern/cycles/blender/light.cpp +++ b/intern/cycles/blender/light.cpp @@ -166,7 +166,7 @@ void BlenderSync::sync_light(BL::Object &b_parent, void BlenderSync::sync_background_light(BL::SpaceView3D &b_v3d, bool use_portal) { - BL::World b_world = b_scene.world(); + BL::World b_world = view_layer.world_override ? view_layer.world_override : b_scene.world(); if (b_world) { PointerRNA cworld = RNA_pointer_get(&b_world.ptr, "cycles"); diff --git a/intern/cycles/blender/shader.cpp b/intern/cycles/blender/shader.cpp index 998be73d555..3a28c09b1f3 100644 --- a/intern/cycles/blender/shader.cpp +++ b/intern/cycles/blender/shader.cpp @@ -1592,7 +1592,7 @@ void BlenderSync::sync_world(BL::Depsgraph &b_depsgraph, BL::SpaceView3D &b_v3d, Integrator *integrator = scene->integrator; PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles"); - BL::World b_world = b_scene.world(); + BL::World b_world = view_layer.world_override ? view_layer.world_override : b_scene.world(); BlenderViewportParameters new_viewport_parameters(b_v3d, use_developer_ui); diff --git a/intern/cycles/blender/sync.cpp b/intern/cycles/blender/sync.cpp index 2f177731fd6..255b05998da 100644 --- a/intern/cycles/blender/sync.cpp +++ b/intern/cycles/blender/sync.cpp @@ -555,6 +555,8 @@ void BlenderSync::sync_view_layer(BL::ViewLayer &b_view_layer) /* Material override. */ view_layer.material_override = b_view_layer.material_override(); + /* World override. */ + view_layer.world_override = b_view_layer.world_override(); /* Sample override. */ PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles"); diff --git a/intern/cycles/blender/sync.h b/intern/cycles/blender/sync.h index 6c3c5f26237..2c892c21e7f 100644 --- a/intern/cycles/blender/sync.h +++ b/intern/cycles/blender/sync.h @@ -249,6 +249,7 @@ class BlenderSync { struct RenderLayerInfo { RenderLayerInfo() : material_override(PointerRNA_NULL), + world_override(PointerRNA_NULL), use_background_shader(true), use_surfaces(true), use_hair(true), @@ -261,6 +262,7 @@ class BlenderSync { string name; BL::Material material_override; + BL::World world_override; bool use_background_shader; bool use_surfaces; bool use_hair; diff --git a/source/blender/blenkernel/intern/scene.cc b/source/blender/blenkernel/intern/scene.cc index f15afa4ce10..a8297b49bc4 100644 --- a/source/blender/blenkernel/intern/scene.cc +++ b/source/blender/blenkernel/intern/scene.cc @@ -901,6 +901,7 @@ static void scene_foreach_id(ID *id, LibraryForeachIDData *data) LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) { BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, view_layer->mat_override, IDWALK_CB_USER); + BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, view_layer->world_override, IDWALK_CB_USER); BKE_LIB_FOREACHID_PROCESS_FUNCTION_CALL( data, IDP_foreach_property(view_layer->id_properties, diff --git a/source/blender/blenloader/intern/versioning_280.cc b/source/blender/blenloader/intern/versioning_280.cc index 8c36e848dd5..6136d12ab23 100644 --- a/source/blender/blenloader/intern/versioning_280.cc +++ b/source/blender/blenloader/intern/versioning_280.cc @@ -330,6 +330,7 @@ static void do_version_layers_to_collections(Main *bmain, Scene *scene) view_layer->pass_alpha_threshold = srl->pass_alpha_threshold; view_layer->samples = srl->samples; view_layer->mat_override = srl->mat_override; + view_layer->world_override = srl->world_override; BKE_freestyle_config_free(&view_layer->freestyle_config, true); view_layer->freestyle_config = srl->freestyleConfig; diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc index f8f65f852f4..db5692d4756 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc @@ -143,6 +143,10 @@ void DepsgraphNodeBuilder::build_view_layer(Scene *scene, if (view_layer->mat_override != nullptr) { build_material(view_layer->mat_override); } + /* World override */ + if (view_layer->world_override != nullptr) { + build_world(view_layer->world_override); + } /* Freestyle linesets. */ LISTBASE_FOREACH (FreestyleLineSet *, fls, &view_layer->freestyle_config.linesets) { build_freestyle_lineset(fls); diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc index 5770d64749e..d514f33c542 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc @@ -144,6 +144,10 @@ void DepsgraphRelationBuilder::build_view_layer(Scene *scene, if (view_layer->mat_override != nullptr) { build_material(view_layer->mat_override); } + /* World override */ + if (view_layer->world_override != nullptr) { + build_world(view_layer->world_override); + } /* Freestyle linesets. */ LISTBASE_FOREACH (FreestyleLineSet *, fls, &view_layer->freestyle_config.linesets) { build_freestyle_lineset(fls); diff --git a/source/blender/makesdna/DNA_layer_types.h b/source/blender/makesdna/DNA_layer_types.h index c7c431ceebe..661a7fde678 100644 --- a/source/blender/makesdna/DNA_layer_types.h +++ b/source/blender/makesdna/DNA_layer_types.h @@ -178,6 +178,7 @@ typedef struct ViewLayer { int samples; struct Material *mat_override; + struct World *world_override; /** Equivalent to datablocks ID properties. */ struct IDProperty *id_properties; diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index 0bd15e5b80a..9410bbe59bf 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -199,6 +199,7 @@ typedef struct SceneRenderLayer { /** Converted to ViewLayer setting. */ struct Material *mat_override DNA_DEPRECATED; + struct World *world_override DNA_DEPRECATED; /** Converted to LayerCollection cycles camera visibility override. */ unsigned int lay DNA_DEPRECATED; diff --git a/source/blender/makesrna/intern/rna_internal.hh b/source/blender/makesrna/intern/rna_internal.hh index b8a9bde7e07..50545609667 100644 --- a/source/blender/makesrna/intern/rna_internal.hh +++ b/source/blender/makesrna/intern/rna_internal.hh @@ -347,7 +347,7 @@ void rna_Scene_use_view_map_cache_update(Main *bmain, Scene *scene, PointerRNA * void rna_Scene_render_update(Main *bmain, Scene *scene, PointerRNA *ptr); void rna_Scene_freestyle_update(Main *bmain, Scene *scene, PointerRNA *ptr); void rna_ViewLayer_name_set(PointerRNA *ptr, const char *value); -void rna_ViewLayer_material_override_update(Main *bmain, Scene *activescene, PointerRNA *ptr); +void rna_ViewLayer_override_update(Main *bmain, Scene *activescene, PointerRNA *ptr); void rna_ViewLayer_pass_update(Main *bmain, Scene *activescene, PointerRNA *ptr); void rna_ViewLayer_active_aov_index_range( PointerRNA *ptr, int *min, int *max, int *softmin, int *softmax); diff --git a/source/blender/makesrna/intern/rna_scene.cc b/source/blender/makesrna/intern/rna_scene.cc index 1ac359380f6..9cf1b020779 100644 --- a/source/blender/makesrna/intern/rna_scene.cc +++ b/source/blender/makesrna/intern/rna_scene.cc @@ -1870,7 +1870,7 @@ static void rna_SceneRenderView_name_set(PointerRNA *ptr, const char *value) sizeof(rv->name)); } -void rna_ViewLayer_material_override_update(Main *bmain, Scene * /*scene*/, PointerRNA *ptr) +void rna_ViewLayer_override_update(Main *bmain, Scene * /*scene*/, PointerRNA *ptr) { Scene *scene = (Scene *)ptr->owner_id; rna_Scene_render_update(bmain, scene, ptr); @@ -4734,8 +4734,15 @@ void rna_def_view_layer_common(BlenderRNA *brna, StructRNA *srna, const bool sce RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); RNA_def_property_ui_text( prop, "Material Override", "Material to override all other materials in this view layer"); - RNA_def_property_update( - prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_ViewLayer_material_override_update"); + RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_ViewLayer_override_update"); + + prop = RNA_def_property(srna, "world_override", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_sdna(prop, nullptr, "world_override"); + RNA_def_property_struct_type(prop, "World"); + RNA_def_property_flag(prop, PROP_EDITABLE); + RNA_def_property_override_flag(prop, PROPOVERRIDE_OVERRIDABLE_LIBRARY); + RNA_def_property_ui_text(prop, "World Override", "Override world in this view layer"); + RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_ViewLayer_override_update"); prop = RNA_def_property(srna, "samples", PROP_INT, PROP_UNSIGNED); RNA_def_property_ui_text(prop,