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
This commit is contained in:
JonasDichelle
2024-02-09 12:16:16 +01:00
committed by Brecht Van Lommel
parent 9743d6992c
commit f2e27ef7b6
13 changed files with 30 additions and 6 deletions

View File

@@ -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")

View File

@@ -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");

View File

@@ -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);

View File

@@ -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");

View File

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

View File

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

View File

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

View File

@@ -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);

View File

@@ -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);

View File

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

View File

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

View File

@@ -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);

View File

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