diff options
author | Lukas Stockner <lukas.stockner@freenet.de> | 2022-04-02 01:11:11 +0300 |
---|---|---|
committer | Lukas Stockner <lukas.stockner@freenet.de> | 2022-04-02 07:14:27 +0300 |
commit | ad35453cd19b3db779b0b3a90feac2e93c7a73cf (patch) | |
tree | 3ad7893815bda3e34e18302422ad1f978e828603 /source/blender/editors/render | |
parent | 5387d33e5f954c4cecdb7ffd3d1042d8632d6c15 (diff) |
Cycles: Add support for light groups
Light groups are a type of pass that only contains lighting from a subset of light sources.
They are created in the View layer, and light sources (lamps, objects with emissive materials
and/or the environment) can be assigned to a group.
Currently, each light group ends up generating its own version of the Combined pass.
In the future, additional types of passes (e.g. shadowcatcher) might be getting their own
per-lightgroup versions.
The lightgroup creation and assignment is not Cycles-specific, so Eevee or external render
engines could make use of it in the future.
Note that Lightgroups are identified by their name - therefore, the name of the Lightgroup
in the View Layer and the name that's set in an object's settings must match for it to be
included.
Currently, changing a Lightgroup's name does not update objects - this is planned for the
future, along with other features such as denoising for light groups and viewing them in
preview renders.
Original patch by Alex Fuller (@mistaed), with some polishing by Lukas Stockner (@lukasstockner97).
Differential Revision: https://developer.blender.org/D12871
Diffstat (limited to 'source/blender/editors/render')
-rw-r--r-- | source/blender/editors/render/render_intern.hh | 2 | ||||
-rw-r--r-- | source/blender/editors/render/render_ops.cc | 2 | ||||
-rw-r--r-- | source/blender/editors/render/render_shading.cc | 80 |
3 files changed, 84 insertions, 0 deletions
diff --git a/source/blender/editors/render/render_intern.hh b/source/blender/editors/render/render_intern.hh index fc40fb06851..4135a0d97a9 100644 --- a/source/blender/editors/render/render_intern.hh +++ b/source/blender/editors/render/render_intern.hh @@ -33,6 +33,8 @@ void SCENE_OT_view_layer_add(struct wmOperatorType *ot); void SCENE_OT_view_layer_remove(struct wmOperatorType *ot); void SCENE_OT_view_layer_add_aov(struct wmOperatorType *ot); void SCENE_OT_view_layer_remove_aov(struct wmOperatorType *ot); +void SCENE_OT_view_layer_add_lightgroup(struct wmOperatorType *ot); +void SCENE_OT_view_layer_remove_lightgroup(struct wmOperatorType *ot); void SCENE_OT_light_cache_bake(struct wmOperatorType *ot); void SCENE_OT_light_cache_free(struct wmOperatorType *ot); diff --git a/source/blender/editors/render/render_ops.cc b/source/blender/editors/render/render_ops.cc index 1583ce44ee5..f671b2f950d 100644 --- a/source/blender/editors/render/render_ops.cc +++ b/source/blender/editors/render/render_ops.cc @@ -39,6 +39,8 @@ void ED_operatortypes_render() WM_operatortype_append(SCENE_OT_view_layer_remove); WM_operatortype_append(SCENE_OT_view_layer_add_aov); WM_operatortype_append(SCENE_OT_view_layer_remove_aov); + WM_operatortype_append(SCENE_OT_view_layer_add_lightgroup); + WM_operatortype_append(SCENE_OT_view_layer_remove_lightgroup); WM_operatortype_append(SCENE_OT_render_view_add); WM_operatortype_append(SCENE_OT_render_view_remove); diff --git a/source/blender/editors/render/render_shading.cc b/source/blender/editors/render/render_shading.cc index f48ac99fe75..07a07b462ef 100644 --- a/source/blender/editors/render/render_shading.cc +++ b/source/blender/editors/render/render_shading.cc @@ -1115,6 +1115,86 @@ void SCENE_OT_view_layer_remove_aov(wmOperatorType *ot) /** \} */ /* -------------------------------------------------------------------- */ +/** \name View Layer Add Lightgroup Operator + * \{ */ + +static int view_layer_add_lightgroup_exec(bContext *C, wmOperator *UNUSED(op)) +{ + Scene *scene = CTX_data_scene(C); + ViewLayer *view_layer = CTX_data_view_layer(C); + + BKE_view_layer_add_lightgroup(view_layer); + + if (scene->nodetree) { + ntreeCompositUpdateRLayers(scene->nodetree); + } + + DEG_id_tag_update(&scene->id, 0); + DEG_relations_tag_update(CTX_data_main(C)); + WM_event_add_notifier(C, NC_SCENE | ND_LAYER, scene); + + return OPERATOR_FINISHED; +} + +void SCENE_OT_view_layer_add_lightgroup(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Add Lightgroup"; + ot->idname = "SCENE_OT_view_layer_add_lightgroup"; + ot->description = "Add a Light Group"; + + /* api callbacks */ + ot->exec = view_layer_add_lightgroup_exec; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; +} + +/** \} */ + +/* -------------------------------------------------------------------- */ +/** \name View Layer Remove Lightgroup Operator + * \{ */ + +static int view_layer_remove_lightgroup_exec(bContext *C, wmOperator *UNUSED(op)) +{ + Scene *scene = CTX_data_scene(C); + ViewLayer *view_layer = CTX_data_view_layer(C); + + if (view_layer->active_lightgroup == nullptr) { + return OPERATOR_FINISHED; + } + + BKE_view_layer_remove_lightgroup(view_layer, view_layer->active_lightgroup); + + if (scene->nodetree) { + ntreeCompositUpdateRLayers(scene->nodetree); + } + + DEG_id_tag_update(&scene->id, 0); + DEG_relations_tag_update(CTX_data_main(C)); + WM_event_add_notifier(C, NC_SCENE | ND_LAYER, scene); + + return OPERATOR_FINISHED; +} + +void SCENE_OT_view_layer_remove_lightgroup(wmOperatorType *ot) +{ + /* identifiers */ + ot->name = "Remove Lightgroup"; + ot->idname = "SCENE_OT_view_layer_remove_lightgroup"; + ot->description = "Remove Active Lightgroup"; + + /* api callbacks */ + ot->exec = view_layer_remove_lightgroup_exec; + + /* flags */ + ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL; +} + +/** \} */ + +/* -------------------------------------------------------------------- */ /** \name Light Cache Bake Operator * \{ */ |