Cycles: Override World per View Layer #117920

Merged
Brecht Van Lommel merged 8 commits from JonasDichelle/blender:override-background into main 2024-02-09 12:16:25 +01:00
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;
JonasDichelle marked this conversation as resolved Outdated

Don't change scene to screen, it's actually a scene.

Don't change scene to screen, it's actually a scene.

I had coppied that from rna_Scene_world_update while testing.
Do you think it's a typo there?

I had coppied that from `rna_Scene_world_update` while testing. Do you think it's a typo there?
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,