Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Stockner <lukas.stockner@freenet.de>2022-04-08 03:19:55 +0300
committerLukas Stockner <lukas.stockner@freenet.de>2022-04-10 19:45:16 +0300
commit2e77a8f9748fdf6311b6956d299e76cf05e6823d (patch)
tree963033628e315577f5b7dfab2de8a22493c9ba8c /source/blender/editors/render
parent0b05e0b97e4b556ce87dd659a3786be53f89e4e5 (diff)
Render: Add operators to add all used or remove all unused lightgroups
These operators build a list of all lightgroups that are used by the view layer's scene and either add all used lightgroups that are not part of the view layer yet or remove all lightgroups in the view layer that are not being used. Differential Revision: https://developer.blender.org/D14596
Diffstat (limited to 'source/blender/editors/render')
-rw-r--r--source/blender/editors/render/render_intern.hh2
-rw-r--r--source/blender/editors/render/render_ops.cc2
-rw-r--r--source/blender/editors/render/render_shading.cc108
3 files changed, 112 insertions, 0 deletions
diff --git a/source/blender/editors/render/render_intern.hh b/source/blender/editors/render/render_intern.hh
index 85d917ae8e8..a4056f3dab3 100644
--- a/source/blender/editors/render/render_intern.hh
+++ b/source/blender/editors/render/render_intern.hh
@@ -35,6 +35,8 @@ 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_view_layer_add_used_lightgroups(struct wmOperatorType *ot);
+void SCENE_OT_view_layer_remove_unused_lightgroups(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 f671b2f950d..def220fb4fc 100644
--- a/source/blender/editors/render/render_ops.cc
+++ b/source/blender/editors/render/render_ops.cc
@@ -41,6 +41,8 @@ void ED_operatortypes_render()
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_view_layer_add_used_lightgroups);
+ WM_operatortype_append(SCENE_OT_view_layer_remove_unused_lightgroups);
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 4c885d50b4c..1bd6b87f1a7 100644
--- a/source/blender/editors/render/render_shading.cc
+++ b/source/blender/editors/render/render_shading.cc
@@ -1217,6 +1217,114 @@ void SCENE_OT_view_layer_remove_lightgroup(wmOperatorType *ot)
/** \} */
/* -------------------------------------------------------------------- */
+/** \name View Layer Add Used Lightgroups Operator
+ * \{ */
+
+static GSet *get_used_lightgroups(Scene *scene)
+{
+ GSet *used_lightgroups = BLI_gset_str_new(__func__);
+
+ FOREACH_SCENE_OBJECT_BEGIN (scene, ob) {
+ if (ob->lightgroup && ob->lightgroup->name[0]) {
+ BLI_gset_add(used_lightgroups, ob->lightgroup->name);
+ }
+ }
+ FOREACH_SCENE_OBJECT_END;
+
+ if (scene->world && scene->world->lightgroup && scene->world->lightgroup->name[0]) {
+ BLI_gset_add(used_lightgroups, scene->world->lightgroup->name);
+ }
+
+ return used_lightgroups;
+}
+
+static int view_layer_add_used_lightgroups_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ Scene *scene = CTX_data_scene(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+
+ GSet *used_lightgroups = get_used_lightgroups(scene);
+ GSET_FOREACH_BEGIN (const char *, used_lightgroup, used_lightgroups) {
+ if (!BLI_findstring(
+ &view_layer->lightgroups, used_lightgroup, offsetof(ViewLayerLightgroup, name))) {
+ BKE_view_layer_add_lightgroup(view_layer, used_lightgroup);
+ }
+ }
+ GSET_FOREACH_END();
+ BLI_gset_free(used_lightgroups, nullptr);
+
+ 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_used_lightgroups(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Add Used Lightgroups";
+ ot->idname = "SCENE_OT_view_layer_add_used_lightgroups";
+ ot->description = "Add all used Light Groups";
+
+ /* api callbacks */
+ ot->exec = view_layer_add_used_lightgroups_exec;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
+/** \name View Layer Remove Unussed Lightgroups Operator
+ * \{ */
+
+static int view_layer_remove_unused_lightgroups_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ Scene *scene = CTX_data_scene(C);
+ ViewLayer *view_layer = CTX_data_view_layer(C);
+
+ GSet *used_lightgroups = get_used_lightgroups(scene);
+ LISTBASE_FOREACH_MUTABLE (ViewLayerLightgroup *, lightgroup, &view_layer->lightgroups) {
+ if (!BLI_gset_haskey(used_lightgroups, lightgroup->name)) {
+ BKE_view_layer_remove_lightgroup(view_layer, lightgroup);
+ }
+ }
+ BLI_gset_free(used_lightgroups, nullptr);
+
+ 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_unused_lightgroups(wmOperatorType *ot)
+{
+ /* identifiers */
+ ot->name = "Remove Unused Lightgroups";
+ ot->idname = "SCENE_OT_view_layer_remove_unused_lightgroups";
+ ot->description = "Remove all unused Light Groups";
+
+ /* api callbacks */
+ ot->exec = view_layer_remove_unused_lightgroups_exec;
+
+ /* flags */
+ ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO | OPTYPE_INTERNAL;
+}
+
+/** \} */
+
+/* -------------------------------------------------------------------- */
/** \name Light Cache Bake Operator
* \{ */