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);