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,