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:

committed by
Brecht Van Lommel

parent
9743d6992c
commit
f2e27ef7b6
@@ -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")
|
||||
|
||||
|
||||
|
@@ -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");
|
||||
|
@@ -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);
|
||||
|
||||
|
@@ -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");
|
||||
|
@@ -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;
|
||||
|
@@ -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,
|
||||
|
@@ -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;
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -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;
|
||||
|
@@ -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);
|
||||
|
@@ -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,
|
||||
|
Reference in New Issue
Block a user