From d88d4cc8ce489edf03c421238251537cff6f9c76 Mon Sep 17 00:00:00 2001 From: Habib Gahbiche Date: Wed, 18 Jun 2025 18:39:02 +0200 Subject: [PATCH] Compositor: remove "Use Nodes" Part of simplifying the compositor workflow: https://projects.blender.org/blender/blender/issues/134214 The option "Use Nodes" is removed from the UI and marked deprecated. It will get fully removed in 6.0. "Use Nodes" is effectively replaced by the existing "Compositing" option in the post-processing panel Pull Request: https://projects.blender.org/blender/blender/pulls/138560 --- scripts/startup/bl_ui/space_node.py | 3 --- .../blender/blenkernel/BKE_blender_version.h | 2 +- source/blender/blenkernel/intern/scene.cc | 6 +++++ .../blenloader/intern/versioning_500.cc | 21 ++++++++++++++++++ source/blender/draw/intern/draw_context.cc | 4 ---- .../blender/editors/render/render_update.cc | 2 +- .../blender/editors/space_node/node_draw.cc | 3 --- .../blender/editors/space_node/node_edit.cc | 4 ---- .../blender/editors/space_node/space_node.cc | 8 +++---- source/blender/makesdna/DNA_scene_types.h | 2 +- source/blender/makesrna/intern/rna_scene.cc | 22 ++++++++++++++++--- source/blender/render/intern/engine.cc | 2 +- source/blender/render/intern/pipeline.cc | 16 ++++---------- source/blender/sequencer/intern/render.cc | 2 +- 14 files changed, 58 insertions(+), 39 deletions(-) diff --git a/scripts/startup/bl_ui/space_node.py b/scripts/startup/bl_ui/space_node.py index 2799d6cb19b..83e703914bb 100644 --- a/scripts/startup/bl_ui/space_node.py +++ b/scripts/startup/bl_ui/space_node.py @@ -147,9 +147,6 @@ class NODE_HT_header(Header): NODE_MT_editor_menus.draw_collapsible(context, layout) - if snode_id: - layout.prop(snode_id, "use_nodes") - layout.separator_spacer() row = layout.row() row.enabled = not snode.pin diff --git a/source/blender/blenkernel/BKE_blender_version.h b/source/blender/blenkernel/BKE_blender_version.h index ccee2f8dab1..323a746a906 100644 --- a/source/blender/blenkernel/BKE_blender_version.h +++ b/source/blender/blenkernel/BKE_blender_version.h @@ -27,7 +27,7 @@ /* Blender file format version. */ #define BLENDER_FILE_VERSION BLENDER_VERSION -#define BLENDER_FILE_SUBVERSION 16 +#define BLENDER_FILE_SUBVERSION 17 /* Minimum Blender version that supports reading file written with the current * version. Older Blender versions will test this and cancel loading the file, showing a warning to diff --git a/source/blender/blenkernel/intern/scene.cc b/source/blender/blenkernel/intern/scene.cc index e78e3b87914..9d7a4e44d3e 100644 --- a/source/blender/blenkernel/intern/scene.cc +++ b/source/blender/blenkernel/intern/scene.cc @@ -1009,6 +1009,12 @@ static void scene_blend_write(BlendWriter *writer, ID *id, const void *id_addres sce->nodetree = reinterpret_cast(MEM_mallocN(1, "dummy pointer")); } + /* Todo(#140111): Forward compatibility support will be removed in 6.0. Remove mapping between + * `scene->use_nodes` and `scene->r.scemode`. */ + if (sce->compositing_node_group && sce->r.scemode & R_DOCOMP) { + sce->use_nodes = true; + } + /* write LibData */ BLO_write_id_struct(writer, Scene, id_address, &sce->id); BKE_id_blend_write(writer, &sce->id); diff --git a/source/blender/blenloader/intern/versioning_500.cc b/source/blender/blenloader/intern/versioning_500.cc index 4439725d14c..ecf613016dd 100644 --- a/source/blender/blenloader/intern/versioning_500.cc +++ b/source/blender/blenloader/intern/versioning_500.cc @@ -330,6 +330,21 @@ static void versioning_replace_legacy_combined_and_separate_color_nodes(bNodeTre } } +/* "Use Nodes" was removed. */ +static void do_version_scene_remove_use_nodes(Scene *scene) +{ + if (scene->nodetree == nullptr && scene->compositing_node_group == nullptr) { + /* scene->use_nodes is set to false by default. Files saved without compositing node trees + * should not disable compositing. */ + return; + } + else if (scene->use_nodes == false && scene->r.scemode & R_DOCOMP) { + /* A compositing node tree exists but users explicitly disabled compositing. */ + scene->r.scemode &= ~R_DOCOMP; + } + /* Ignore use_nodes otherwise. */ +} + void do_versions_after_linking_500(FileData * /*fd*/, Main * /*bmain*/) { /** @@ -451,6 +466,12 @@ void blo_do_versions_500(FileData * /*fd*/, Library * /*lib*/, Main *bmain) FOREACH_NODETREE_END; } + if (!MAIN_VERSION_FILE_ATLEAST(bmain, 500, 17)) { + LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { + do_version_scene_remove_use_nodes(scene); + } + } + /** * Always bump subversion in BKE_blender_version.h when adding versioning * code here, and wrap it inside a MAIN_VERSION_FILE_ATLEAST check. diff --git a/source/blender/draw/intern/draw_context.cc b/source/blender/draw/intern/draw_context.cc index 6c359f5dd79..d28b5a37d88 100644 --- a/source/blender/draw/intern/draw_context.cc +++ b/source/blender/draw/intern/draw_context.cc @@ -1973,10 +1973,6 @@ bool DRWContext::is_viewport_compositor_enabled() const return false; } - if (!this->scene->use_nodes) { - return false; - } - if (!this->scene->compositing_node_group) { return false; } diff --git a/source/blender/editors/render/render_update.cc b/source/blender/editors/render/render_update.cc index 415b8925763..1952c82d172 100644 --- a/source/blender/editors/render/render_update.cc +++ b/source/blender/editors/render/render_update.cc @@ -251,7 +251,7 @@ static void texture_changed(Main *bmain, Tex *tex) BKE_paint_invalidate_overlay_tex(scene, view_layer, tex); } /* find compositing nodes */ - if (scene->use_nodes && scene->compositing_node_group) { + if (scene->compositing_node_group) { for (bNode *node : scene->compositing_node_group->all_nodes()) { if (node->id == &tex->id) { blender::ed::space_node::tag_update_id(&scene->id); diff --git a/source/blender/editors/space_node/node_draw.cc b/source/blender/editors/space_node/node_draw.cc index cc9ec4256ac..46b19981a67 100644 --- a/source/blender/editors/space_node/node_draw.cc +++ b/source/blender/editors/space_node/node_draw.cc @@ -5239,9 +5239,6 @@ static void snode_setup_v2d(SpaceNode &snode, ARegion ®ion, const float2 &cen static bool compositor_is_in_use(const bContext &context) { const Scene *scene = CTX_data_scene(&context); - if (!scene->use_nodes) { - return false; - } if (!scene->compositing_node_group) { return false; diff --git a/source/blender/editors/space_node/node_edit.cc b/source/blender/editors/space_node/node_edit.cc index b575a6b0bef..54cf7f2dbd9 100644 --- a/source/blender/editors/space_node/node_edit.cc +++ b/source/blender/editors/space_node/node_edit.cc @@ -297,10 +297,6 @@ static void compo_startjob(void *cjv, wmJobWorkerStatus *worker_status) bNodeTree *ntree = cj->localtree; Scene *scene = DEG_get_evaluated_scene(cj->compositor_depsgraph); - if (scene->use_nodes == false) { - return; - } - cj->stop = &worker_status->stop; cj->do_update = &worker_status->do_update; cj->progress = &worker_status->progress; diff --git a/source/blender/editors/space_node/space_node.cc b/source/blender/editors/space_node/space_node.cc index 665d8ea6f4b..b2f267cded5 100644 --- a/source/blender/editors/space_node/space_node.cc +++ b/source/blender/editors/space_node/space_node.cc @@ -1241,11 +1241,9 @@ static void node_area_refresh(const bContext *C, ScrArea *area) if (snode->nodetree) { if (snode->nodetree->type == NTREE_COMPOSIT) { Scene *scene = (Scene *)snode->id; - if (scene->use_nodes) { - if (snode->runtime->recalc_regular_compositing) { - snode->runtime->recalc_regular_compositing = false; - ED_node_composite_job(C, snode->nodetree, scene); - } + if (snode->runtime->recalc_regular_compositing) { + snode->runtime->recalc_regular_compositing = false; + ED_node_composite_job(C, snode->nodetree, scene); } } } diff --git a/source/blender/makesdna/DNA_scene_types.h b/source/blender/makesdna/DNA_scene_types.h index b165bf8887c..68c3d3dd8ad 100644 --- a/source/blender/makesdna/DNA_scene_types.h +++ b/source/blender/makesdna/DNA_scene_types.h @@ -2085,7 +2085,7 @@ typedef struct Scene { /** Various settings. */ short flag; - char use_nodes; + char use_nodes DNA_DEPRECATED; char _pad3[1]; struct bNodeTree *nodetree DNA_DEPRECATED; diff --git a/source/blender/makesrna/intern/rna_scene.cc b/source/blender/makesrna/intern/rna_scene.cc index 637036cd33e..866087f23a3 100644 --- a/source/blender/makesrna/intern/rna_scene.cc +++ b/source/blender/makesrna/intern/rna_scene.cc @@ -1997,10 +1997,24 @@ static std::optional rna_SceneRenderView_path(const PointerRNA *ptr return fmt::format("render.views[\"{}\"]", srv_name_esc); } +static bool rna_Scene_use_nodes_get(PointerRNA *ptr) +{ + Scene *scene = reinterpret_cast(ptr->data); + return scene->r.scemode & R_DOCOMP; +} + +static void rna_Scene_use_nodes_set(PointerRNA *ptr, const bool use_nodes) +{ + Scene *scene = reinterpret_cast(ptr->data); + SET_FLAG_FROM_TEST(scene->r.scemode, use_nodes, R_DOCOMP); +} + +/* Todo(#140111): Remove in 6.0. In Python API, this function is used to create a compositing node + * tree if none exists. scene.use_nodes will be replaced by the existing scene.use_compositing. */ static void rna_Scene_use_nodes_update(bContext *C, PointerRNA *ptr) { Scene *scene = (Scene *)ptr->data; - if (scene->use_nodes && scene->compositing_node_group == nullptr) { + if (scene->r.scemode & R_DOCOMP && scene->compositing_node_group == nullptr) { ED_node_composit_default(C, scene); } DEG_relations_tag_update(CTX_data_main(C)); @@ -7332,7 +7346,7 @@ static void rna_def_scene_render_data(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Compositing", "Process the render result through the compositing pipeline, " - "if compositing nodes are enabled"); + "if a compositing node group is assigned to the scene"); RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, nullptr); prop = RNA_def_property(srna, "use_sequencer", PROP_BOOLEAN, PROP_NONE); @@ -9051,7 +9065,9 @@ void RNA_def_scene(BlenderRNA *brna) prop = RNA_def_property(srna, "use_nodes", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, nullptr, "use_nodes", 1); RNA_def_property_flag(prop, PROP_CONTEXT_UPDATE); - RNA_def_property_ui_text(prop, "Use Nodes", "Enable the compositing node tree"); + RNA_def_property_ui_text( + prop, "Use Nodes", "Enable the compositing node tree. (Deprecated: use use_compositing)"); + RNA_def_property_boolean_funcs(prop, "rna_Scene_use_nodes_get", "rna_Scene_use_nodes_set"); RNA_def_property_update(prop, NC_SCENE | ND_RENDER_OPTIONS, "rna_Scene_use_nodes_update"); /* Sequencer */ diff --git a/source/blender/render/intern/engine.cc b/source/blender/render/intern/engine.cc index ba063b9bbf7..4976d00353c 100644 --- a/source/blender/render/intern/engine.cc +++ b/source/blender/render/intern/engine.cc @@ -856,7 +856,7 @@ static bool possibly_using_gpu_compositor(const Render *re) } const Scene *scene = re->pipeline_scene_eval; - return (scene->compositing_node_group && scene->use_nodes && (scene->r.scemode & R_DOCOMP)); + return (scene->compositing_node_group && (scene->r.scemode & R_DOCOMP)); } static void engine_render_view_layer(Render *re, diff --git a/source/blender/render/intern/pipeline.cc b/source/blender/render/intern/pipeline.cc index 1a583362434..ca18fa32b5c 100644 --- a/source/blender/render/intern/pipeline.cc +++ b/source/blender/render/intern/pipeline.cc @@ -715,7 +715,7 @@ void RE_FreeUnusedGPUResources() /* Detect if scene is using GPU compositing, and if either a node editor is * showing the nodes, or an image editor is showing the render result or viewer. */ - if (!(scene->use_nodes && scene->compositing_node_group && + if (!(scene->compositing_node_group && scene->r.compositor_device == SCE_COMPOSITOR_DEVICE_GPU)) { continue; @@ -1222,9 +1222,6 @@ static bool compositor_needs_render(Scene *scene) if (ntree == nullptr) { return true; } - if (scene->use_nodes == false) { - return true; - } if ((scene->r.scemode & R_DOCOMP) == 0) { return true; } @@ -1360,7 +1357,7 @@ static void do_render_compositor(Render *re) } if (!re->test_break()) { - if (ntree && re->scene->use_nodes && re->r.scemode & R_DOCOMP) { + if (ntree && re->r.scemode & R_DOCOMP) { /* checks if there are render-result nodes that need scene */ if ((re->r.scemode & R_SINGLE_LAYER) == 0) { do_render_compositor_scenes(re); @@ -1678,7 +1675,7 @@ static bool check_valid_compositing_camera(Scene *scene, Object *camera_override, ReportList *reports) { - if (scene->r.scemode & R_DOCOMP && scene->use_nodes) { + if (scene->r.scemode & R_DOCOMP && scene->compositing_node_group) { for (bNode *node : scene->compositing_node_group->all_nodes()) { if (node->type_legacy == CMP_NODE_R_LAYERS && !node->is_muted()) { Scene *sce = node->id ? (Scene *)node->id : scene; @@ -1859,13 +1856,8 @@ bool RE_is_rendering_allowed(Scene *scene, return false; } } - else if ((scemode & R_DOCOMP) && scene->use_nodes) { + else if (scemode & R_DOCOMP && scene->compositing_node_group) { /* Compositor */ - if (!scene->compositing_node_group) { - BKE_report(reports, RPT_ERROR, "No node tree in scene"); - return false; - } - if (!check_compositor_output(scene)) { BKE_report(reports, RPT_ERROR, "No render output node in scene"); return false; diff --git a/source/blender/sequencer/intern/render.cc b/source/blender/sequencer/intern/render.cc index c26ed829108..7acdb357c75 100644 --- a/source/blender/sequencer/intern/render.cc +++ b/source/blender/sequencer/intern/render.cc @@ -1416,7 +1416,7 @@ static ImBuf *seq_render_scene_strip(const RenderData *context, #if 0 /* UNUSED */ have_seq = (scene->r.scemode & R_DOSEQ) && scene->ed && scene->ed->seqbase.first; #endif - have_comp = (scene->r.scemode & R_DOCOMP) && scene->use_nodes && scene->compositing_node_group; + have_comp = (scene->r.scemode & R_DOCOMP) && scene->compositing_node_group; /* Get view layer for the strip. */ ViewLayer *view_layer = BKE_view_layer_default_render(scene);