diff options
author | Hans Goudey <h.goudey@me.com> | 2022-09-05 19:31:39 +0300 |
---|---|---|
committer | Hans Goudey <h.goudey@me.com> | 2022-09-05 19:31:39 +0300 |
commit | 4380e1f9006f8487e12af6601142c81633f0f476 (patch) | |
tree | c3792de5d298ea04432681db56a15b04c89cbe17 | |
parent | 456177d8be9ea28d1c5565fbe538435095f5b503 (diff) | |
parent | 63cfc8f9f6d623f33b50c5c07976af2b22845713 (diff) |
Merge branch 'master' into refactor-mesh-remove-pointersrefactor-mesh-remove-pointers
48 files changed, 220 insertions, 145 deletions
diff --git a/intern/cycles/blender/curves.cpp b/intern/cycles/blender/curves.cpp index 59e630eef63..6158ed78598 100644 --- a/intern/cycles/blender/curves.cpp +++ b/intern/cycles/blender/curves.cpp @@ -843,7 +843,7 @@ static float4 hair_point_as_float4(BL::FloatVectorAttribute b_attr_position, const int index) { float4 mP = float3_to_float4(get_float3(b_attr_position.data[index].vector())); - mP.w = b_attr_radius ? b_attr_radius->data[index].value() : 0.0f; + mP.w = b_attr_radius ? b_attr_radius->data[index].value() : 0.005f; return mP; } @@ -910,7 +910,7 @@ static void export_hair_curves(Scene *scene, for (int j = 0; j < num_points; j++) { const int point_offset = first_point_index + j; const float3 co = get_float3(b_attr_position.data[point_offset].vector()); - const float radius = b_attr_radius ? b_attr_radius->data[point_offset].value() : 0.0f; + const float radius = b_attr_radius ? b_attr_radius->data[point_offset].value() : 0.005f; curve_keys[point_offset] = co; curve_radius[point_offset] = radius; diff --git a/intern/cycles/kernel/light/light.h b/intern/cycles/kernel/light/light.h index 85478cd09c5..12a6f21b58d 100644 --- a/intern/cycles/kernel/light/light.h +++ b/intern/cycles/kernel/light/light.h @@ -200,8 +200,12 @@ ccl_device_inline bool light_sample(KernelGlobals kg, inplane = ls->P - inplane; } - ls->u = dot(inplane, axisu) * (1.0f / dot(axisu, axisu)) + 0.5f; - ls->v = dot(inplane, axisv) * (1.0f / dot(axisv, axisv)) + 0.5f; + const float light_u = dot(inplane, axisu) * (1.0f / dot(axisu, axisu)); + const float light_v = dot(inplane, axisv) * (1.0f / dot(axisv, axisv)); + + /* NOTE: Return barycentric coordinates in the same notation as Embree and OptiX. */ + ls->u = light_v + 0.5f; + ls->v = -light_u - light_v; ls->Ng = Ng; ls->D = normalize_len(ls->P - P, &ls->t); diff --git a/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py b/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py index dea538af39b..21ca38bff20 100644 --- a/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py +++ b/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py @@ -258,11 +258,12 @@ def dump_rna_messages(msgs, reports, settings, verbose=False): bl_rna_base_props = set() if bl_rna_base: bl_rna_base_props |= set(bl_rna_base.properties.values()) - for cls_base in cls.__bases__: - bl_rna_base = getattr(cls_base, "bl_rna", None) - if not bl_rna_base: - continue - bl_rna_base_props |= set(bl_rna_base.properties.values()) + if hasattr(cls, "__bases__"): + for cls_base in cls.__bases__: + bl_rna_base = getattr(cls_base, "bl_rna", None) + if not bl_rna_base: + continue + bl_rna_base_props |= set(bl_rna_base.properties.values()) props = sorted(bl_rna.properties, key=lambda p: p.identifier) for prop in props: @@ -450,6 +451,19 @@ def dump_rna_messages(msgs, reports, settings, verbose=False): process_msg(msgs, bpy.app.translations.contexts.operator_default, cat_str, "Generated operator category", reports, check_ctxt_rna, settings) + # Parse keymap preset preferences + for preset_filename in sorted( + os.listdir(os.path.join(settings.PRESETS_DIR, "keyconfig"))): + preset_path = os.path.join(settings.PRESETS_DIR, "keyconfig", preset_filename) + if not (os.path.isfile(preset_path) and preset_filename.endswith(".py")): + continue + preset_name, _ = os.path.splitext(preset_filename) + + bpy.utils.keyconfig_set(preset_path) + preset = bpy.data.window_managers[0].keyconfigs[preset_name] + if preset.preferences is not None: + walk_properties(preset.preferences) + # And parse keymaps! from bl_keymap_utils import keymap_hierarchy walk_keymap_hierarchy(keymap_hierarchy.generate(), "KM_HIERARCHY") diff --git a/release/scripts/modules/bl_i18n_utils/settings.py b/release/scripts/modules/bl_i18n_utils/settings.py index 05db4df7cd2..89aaa43cd52 100644 --- a/release/scripts/modules/bl_i18n_utils/settings.py +++ b/release/scripts/modules/bl_i18n_utils/settings.py @@ -544,6 +544,7 @@ CUSTOM_PY_UI_FILES = [ os.path.join("scripts", "startup", "bl_ui"), os.path.join("scripts", "startup", "bl_operators"), os.path.join("scripts", "modules", "rna_prop_ui.py"), + os.path.join("scripts", "presets", "keyconfig"), ] # An optional text file listing files to force include/exclude from py_xgettext process. diff --git a/release/scripts/modules/bpy_extras/io_utils.py b/release/scripts/modules/bpy_extras/io_utils.py index 0497d69162e..35b7d564a5e 100644 --- a/release/scripts/modules/bpy_extras/io_utils.py +++ b/release/scripts/modules/bpy_extras/io_utils.py @@ -21,6 +21,7 @@ from bpy.props import ( EnumProperty, StringProperty, ) +from bpy.app.translations import pgettext_data as data_ def _check_axis_conversion(op): @@ -56,7 +57,7 @@ class ExportHelper: if not self.filepath: blend_filepath = context.blend_data.filepath if not blend_filepath: - blend_filepath = "untitled" + blend_filepath = data_("untitled") else: blend_filepath = os.path.splitext(blend_filepath)[0] diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index b2fa8e4d64f..23c3b0191d4 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -5153,6 +5153,7 @@ class VIEW3D_MT_edit_gpencil_stroke(Menu): layout.operator("gpencil.stroke_subdivide", text="Subdivide").only_selected = False layout.menu("VIEW3D_MT_gpencil_simplify") layout.operator("gpencil.stroke_trim", text="Trim") + layout.operator("gpencil.stroke_outline", text="Outline") layout.separator() @@ -5174,18 +5175,15 @@ class VIEW3D_MT_edit_gpencil_stroke(Menu): layout.operator("gpencil.stroke_cyclical_set", text="Toggle Cyclic").type = 'TOGGLE' layout.operator_menu_enum("gpencil.stroke_caps_set", text="Toggle Caps", property="type") layout.operator("gpencil.stroke_flip", text="Switch Direction") - layout.prop(settings, "use_scale_thickness", text="Scale Thickness") layout.separator() layout.operator("gpencil.stroke_normalize", text="Normalize Thickness").mode = 'THICKNESS' layout.operator("gpencil.stroke_normalize", text="Normalize Opacity").mode = 'OPACITY' + layout.prop(settings, "use_scale_thickness", text="Scale Thickness") layout.separator() layout.operator("gpencil.reset_transform_fill", text="Reset Fill Transform") - layout.separator() - layout.operator("gpencil.stroke_outline", text="Outline") - class VIEW3D_MT_edit_gpencil_point(Menu): bl_label = "Point" diff --git a/source/blender/blenkernel/BKE_collection.h b/source/blender/blenkernel/BKE_collection.h index feb3dc7de80..4a729311b6a 100644 --- a/source/blender/blenkernel/BKE_collection.h +++ b/source/blender/blenkernel/BKE_collection.h @@ -94,7 +94,7 @@ struct Collection *BKE_collection_duplicate(struct Main *bmain, /* Master Collection for Scene */ #define BKE_SCENE_COLLECTION_NAME "Scene Collection" -struct Collection *BKE_collection_master_add(void); +struct Collection *BKE_collection_master_add(struct Scene *scene); /* Collection Objects */ @@ -296,7 +296,9 @@ void BKE_main_collections_parent_relations_rebuild(struct Main *bmain); /* .blend file I/O */ void BKE_collection_blend_write_nolib(struct BlendWriter *writer, struct Collection *collection); -void BKE_collection_blend_read_data(struct BlendDataReader *reader, struct Collection *collection); +void BKE_collection_blend_read_data(struct BlendDataReader *reader, + struct Collection *collection, + struct ID *owner_id); void BKE_collection_blend_read_lib(struct BlendLibReader *reader, struct Collection *collection); void BKE_collection_blend_read_expand(struct BlendExpander *expander, struct Collection *collection); diff --git a/source/blender/blenkernel/BKE_gpencil_geom.h b/source/blender/blenkernel/BKE_gpencil_geom.h index 88244ec9d64..cbaf118e803 100644 --- a/source/blender/blenkernel/BKE_gpencil_geom.h +++ b/source/blender/blenkernel/BKE_gpencil_geom.h @@ -401,6 +401,7 @@ void BKE_gpencil_stroke_set_random_color(struct bGPDstroke *gps); /** * Join two strokes using the shortest distance (reorder stroke if necessary). + * \param auto_flip: Flip the stroke if the join between two strokes is not end->start points. */ void BKE_gpencil_stroke_join(struct bGPDstroke *gps_a, struct bGPDstroke *gps_b, diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 8affbf0ca67..46303a4e19c 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -472,6 +472,11 @@ void ntreeSetTypes(const struct bContext *C, struct bNodeTree *ntree); struct bNodeTree *ntreeAddTree(struct Main *bmain, const char *name, const char *idname); +struct bNodeTree *ntreeAddTreeEmbedded(struct Main *bmain, + struct ID *owner_id, + const char *name, + const char *idname); + /* copy/free funcs, need to manage ID users */ /** @@ -540,7 +545,9 @@ void ntreeBlendWrite(struct BlendWriter *writer, struct bNodeTree *ntree); /** * \note `ntree` itself has been read! */ -void ntreeBlendReadData(struct BlendDataReader *reader, struct bNodeTree *ntree); +void ntreeBlendReadData(struct BlendDataReader *reader, + struct ID *owner_id, + struct bNodeTree *ntree); void ntreeBlendReadLib(struct BlendLibReader *reader, struct bNodeTree *ntree); void ntreeBlendReadExpand(struct BlendExpander *expander, struct bNodeTree *ntree); diff --git a/source/blender/blenkernel/intern/collection.c b/source/blender/blenkernel/intern/collection.c index caf59a9b363..572a0caa3c7 100644 --- a/source/blender/blenkernel/intern/collection.c +++ b/source/blender/blenkernel/intern/collection.c @@ -143,6 +143,9 @@ static void collection_foreach_id(ID *id, LibraryForeachIDData *data) { Collection *collection = (Collection *)id; + BKE_LIB_FOREACHID_PROCESS_ID( + data, collection->owner_id, IDWALK_CB_LOOPBACK | IDWALK_CB_NEVER_SELF); + LISTBASE_FOREACH (CollectionObject *, cob, &collection->gobject) { BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, cob->ob, IDWALK_CB_USER); } @@ -162,7 +165,7 @@ static void collection_foreach_id(ID *id, LibraryForeachIDData *data) } } -static ID *collection_owner_get(Main *bmain, ID *id, ID *owner_id_hint) +static ID *collection_owner_get(Main *bmain, ID *id, ID *UNUSED(owner_id_hint)) { if ((id->flag & LIB_EMBEDDED_DATA) == 0) { return id; @@ -171,20 +174,21 @@ static ID *collection_owner_get(Main *bmain, ID *id, ID *owner_id_hint) Collection *master_collection = (Collection *)id; BLI_assert((master_collection->flag & COLLECTION_IS_MASTER) != 0); + BLI_assert(master_collection->owner_id != NULL); - if (owner_id_hint != NULL && GS(owner_id_hint->name) == ID_SCE && - ((Scene *)owner_id_hint)->master_collection == master_collection) { - return owner_id_hint; - } - +#ifndef NDEBUG + bool is_owner_found = false; LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) { if (scene->master_collection == master_collection) { - return &scene->id; + BLI_assert(master_collection->owner_id == &scene->id); + BLI_assert(!is_owner_found); + is_owner_found = true; } } + BLI_assert(is_owner_found); +#endif - BLI_assert_msg(0, "Embedded collection with no owner. Critical Main inconsistency."); - return NULL; + return master_collection->owner_id; } void BKE_collection_blend_write_nolib(BlendWriter *writer, Collection *collection) @@ -233,8 +237,13 @@ void BKE_collection_compat_blend_read_data(BlendDataReader *reader, SceneCollect } #endif -void BKE_collection_blend_read_data(BlendDataReader *reader, Collection *collection) +void BKE_collection_blend_read_data(BlendDataReader *reader, Collection *collection, ID *owner_id) { + /* Special case for this pointer, do not rely on regular `lib_link` process here. Avoids needs + * for do_versioning, and ensures coherence of data in any case. */ + BLI_assert((collection->id.flag & LIB_EMBEDDED_DATA) != 0 || owner_id == NULL); + collection->owner_id = owner_id; + BLO_read_list(reader, &collection->gobject); BLO_read_list(reader, &collection->children); @@ -265,7 +274,7 @@ void BKE_collection_blend_read_data(BlendDataReader *reader, Collection *collect static void collection_blend_read_data(BlendDataReader *reader, ID *id) { Collection *collection = (Collection *)id; - BKE_collection_blend_read_data(reader, collection); + BKE_collection_blend_read_data(reader, collection, NULL); } static void lib_link_collection_data(BlendLibReader *reader, Library *lib, Collection *collection) @@ -849,14 +858,18 @@ Base *BKE_collection_or_layer_objects(const ViewLayer *view_layer, Collection *c /** \name Scene Master Collection * \{ */ -Collection *BKE_collection_master_add() +Collection *BKE_collection_master_add(Scene *scene) { + BLI_assert(scene != NULL && scene->master_collection == NULL); + /* Not an actual datablock, but owned by scene. */ Collection *master_collection = BKE_libblock_alloc( NULL, ID_GR, BKE_SCENE_COLLECTION_NAME, LIB_ID_CREATE_NO_MAIN); master_collection->id.flag |= LIB_EMBEDDED_DATA; + master_collection->owner_id = &scene->id; master_collection->flag |= COLLECTION_IS_MASTER; master_collection->color_tag = COLLECTION_COLOR_NONE; + return master_collection; } diff --git a/source/blender/blenkernel/intern/curves_geometry.cc b/source/blender/blenkernel/intern/curves_geometry.cc index 7c450b86d52..35b209179d3 100644 --- a/source/blender/blenkernel/intern/curves_geometry.cc +++ b/source/blender/blenkernel/intern/curves_geometry.cc @@ -740,11 +740,14 @@ Span<float3> CurvesGeometry::evaluated_tangents() const const IndexRange points = this->points_for_curve(curve_index); const IndexRange evaluated_points = this->evaluated_points_for_curve(curve_index); - if (handles_right[points.first()] != positions[points.first()]) { + const float epsilon = 1e-6f; + if (!math::almost_equal_relative( + handles_right[points.first()], positions[points.first()], epsilon)) { tangents[evaluated_points.first()] = math::normalize(handles_right[points.first()] - positions[points.first()]); } - if (handles_left[points.last()] != positions[points.last()]) { + if (!math::almost_equal_relative( + handles_left[points.last()], positions[points.last()], epsilon)) { tangents[evaluated_points.last()] = math::normalize(positions[points.last()] - handles_left[points.last()]); } diff --git a/source/blender/blenkernel/intern/gpencil_geom.cc b/source/blender/blenkernel/intern/gpencil_geom.cc index 9bf59df968e..9f231c8f5f2 100644 --- a/source/blender/blenkernel/intern/gpencil_geom.cc +++ b/source/blender/blenkernel/intern/gpencil_geom.cc @@ -3548,7 +3548,7 @@ void BKE_gpencil_stroke_join(bGPDstroke *gps_a, void BKE_gpencil_stroke_start_set(bGPdata *gpd, bGPDstroke *gps, int start_idx) { - if ((start_idx < 1) || (start_idx >= gps->totpoints)) { + if ((start_idx < 1) || (start_idx >= gps->totpoints) || (gps->totpoints < 2)) { return; } @@ -3558,8 +3558,8 @@ void BKE_gpencil_stroke_start_set(bGPdata *gpd, bGPDstroke *gps, int start_idx) } bGPDstroke *gps_b = BKE_gpencil_stroke_duplicate(gps, true, false); - BKE_gpencil_stroke_trim_points(gps_b, 0, start_idx - 0); - BKE_gpencil_stroke_trim_points(gps, start_idx, gps->totpoints - 1); + BKE_gpencil_stroke_trim_points(gps_b, 0, start_idx); + BKE_gpencil_stroke_trim_points(gps, start_idx + 1, gps->totpoints - 1); /* Join both strokes. */ BKE_gpencil_stroke_join(gps, gps_b, false, false, false, false); diff --git a/source/blender/blenkernel/intern/image_save.cc b/source/blender/blenkernel/intern/image_save.cc index 5ee1258c512..e65a94d5301 100644 --- a/source/blender/blenkernel/intern/image_save.cc +++ b/source/blender/blenkernel/intern/image_save.cc @@ -13,6 +13,8 @@ #include "BLI_string.h" #include "BLI_vector.hh" +#include "BLT_translation.h" + #include "DNA_image_types.h" #include "MEM_guardedalloc.h" @@ -173,7 +175,7 @@ bool BKE_image_save_options_init(ImageSaveOptions *opts, BLI_strncpy(opts->filepath, G.ima, sizeof(opts->filepath)); } else { - BLI_strncpy(opts->filepath, "//untitled", sizeof(opts->filepath)); + BLI_snprintf(opts->filepath, sizeof(opts->filepath), "//%s", DATA_("untitled")); BLI_path_abs(opts->filepath, BKE_main_blendfile_path(bmain)); } } diff --git a/source/blender/blenkernel/intern/linestyle.c b/source/blender/blenkernel/intern/linestyle.c index 12a661d139b..776fe06edf7 100644 --- a/source/blender/blenkernel/intern/linestyle.c +++ b/source/blender/blenkernel/intern/linestyle.c @@ -2041,9 +2041,7 @@ void BKE_linestyle_default_shader(const bContext *C, FreestyleLineStyle *linesty BLI_assert(linestyle->nodetree == NULL); - ntree = ntreeAddTree(NULL, "stroke_shader", "ShaderNodeTree"); - - linestyle->nodetree = ntree; + ntree = ntreeAddTreeEmbedded(NULL, &linestyle->id, "stroke_shader", "ShaderNodeTree"); uv_along_stroke = nodeAddStaticNode(C, ntree, SH_NODE_UVALONGSTROKE); uv_along_stroke->locx = 0.0f; diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c index 248d292664a..442b31ff21e 100644 --- a/source/blender/blenkernel/intern/material.c +++ b/source/blender/blenkernel/intern/material.c @@ -1962,8 +1962,8 @@ static void material_default_surface_init(Material *ma) { strcpy(ma->id.name, "MADefault Surface"); - bNodeTree *ntree = ntreeAddTree(NULL, "Shader Nodetree", ntreeType_Shader->idname); - ma->nodetree = ntree; + bNodeTree *ntree = ntreeAddTreeEmbedded( + NULL, &ma->id, "Shader Nodetree", ntreeType_Shader->idname); ma->use_nodes = true; bNode *principled = nodeAddStaticNode(NULL, ntree, SH_NODE_BSDF_PRINCIPLED); @@ -1990,8 +1990,8 @@ static void material_default_volume_init(Material *ma) { strcpy(ma->id.name, "MADefault Volume"); - bNodeTree *ntree = ntreeAddTree(NULL, "Shader Nodetree", ntreeType_Shader->idname); - ma->nodetree = ntree; + bNodeTree *ntree = ntreeAddTreeEmbedded( + NULL, &ma->id, "Shader Nodetree", ntreeType_Shader->idname); ma->use_nodes = true; bNode *principled = nodeAddStaticNode(NULL, ntree, SH_NODE_VOLUME_PRINCIPLED); @@ -2015,8 +2015,8 @@ static void material_default_holdout_init(Material *ma) { strcpy(ma->id.name, "MADefault Holdout"); - bNodeTree *ntree = ntreeAddTree(NULL, "Shader Nodetree", ntreeType_Shader->idname); - ma->nodetree = ntree; + bNodeTree *ntree = ntreeAddTreeEmbedded( + NULL, &ma->id, "Shader Nodetree", ntreeType_Shader->idname); ma->use_nodes = true; bNode *holdout = nodeAddStaticNode(NULL, ntree, SH_NODE_HOLDOUT); diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc index e1eaed71f37..3cb2b80813f 100644 --- a/source/blender/blenkernel/intern/node.cc +++ b/source/blender/blenkernel/intern/node.cc @@ -325,6 +325,8 @@ static void node_foreach_id(ID *id, LibraryForeachIDData *data) { bNodeTree *ntree = (bNodeTree *)id; + BKE_LIB_FOREACHID_PROCESS_ID(data, ntree->owner_id, IDWALK_CB_LOOPBACK); + BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, ntree->gpd, IDWALK_CB_USER); LISTBASE_FOREACH (bNode *, node, &ntree->nodes) { @@ -399,7 +401,7 @@ static void node_foreach_path(ID *id, BPathForeachPathData *bpath_data) } } -static ID *node_owner_get(Main *bmain, ID *id, ID *owner_id_hint) +static ID *node_owner_get(Main *UNUSED(bmain), ID *id, ID *UNUSED(owner_id_hint)) { if ((id->flag & LIB_EMBEDDED_DATA) == 0) { return id; @@ -408,30 +410,10 @@ static ID *node_owner_get(Main *bmain, ID *id, ID *owner_id_hint) // BLI_assert((id->tag & LIB_TAG_NO_MAIN) == 0); bNodeTree *ntree = reinterpret_cast<bNodeTree *>(id); + BLI_assert(ntree->owner_id != NULL); + BLI_assert(ntreeFromID(ntree->owner_id) == ntree); - if (owner_id_hint != nullptr && ntreeFromID(owner_id_hint) == ntree) { - return owner_id_hint; - } - - ListBase *lists[] = {&bmain->materials, - &bmain->lights, - &bmain->worlds, - &bmain->textures, - &bmain->scenes, - &bmain->linestyles, - &bmain->simulations, - nullptr}; - - for (int i = 0; lists[i] != nullptr; i++) { - LISTBASE_FOREACH (ID *, id_iter, lists[i]) { - if (ntreeFromID(id_iter) == ntree) { - return id_iter; - } - } - } - - BLI_assert_msg(0, "Embedded node tree with no owner. Critical Main inconsistency."); - return nullptr; + return ntree->owner_id; } static void write_node_socket_default_value(BlendWriter *writer, bNodeSocket *sock) @@ -667,8 +649,13 @@ static void direct_link_node_socket(BlendDataReader *reader, bNodeSocket *sock) sock->runtime = MEM_new<bNodeSocketRuntime>(__func__); } -void ntreeBlendReadData(BlendDataReader *reader, bNodeTree *ntree) +void ntreeBlendReadData(BlendDataReader *reader, ID *owner_id, bNodeTree *ntree) { + /* Special case for this pointer, do not rely on regular `lib_link` process here. Avoids needs + * for do_versioning, and ensures coherence of data in any case. */ + BLI_assert((ntree->id.flag & LIB_EMBEDDED_DATA) != 0 || owner_id == nullptr); + ntree->owner_id = owner_id; + /* NOTE: writing and reading goes in sync, for speed. */ ntree->is_updating = false; ntree->typeinfo = nullptr; @@ -830,7 +817,7 @@ void ntreeBlendReadData(BlendDataReader *reader, bNodeTree *ntree) static void ntree_blend_read_data(BlendDataReader *reader, ID *id) { bNodeTree *ntree = (bNodeTree *)id; - ntreeBlendReadData(reader, ntree); + ntreeBlendReadData(reader, nullptr, ntree); } static void lib_link_node_socket(BlendLibReader *reader, Library *lib, bNodeSocket *sock) @@ -2575,12 +2562,12 @@ void nodePositionPropagate(bNode *node) } } -bNodeTree *ntreeAddTree(Main *bmain, const char *name, const char *idname) +static bNodeTree *ntreeAddTree_do( + Main *bmain, ID *owner_id, const bool is_embedded, const char *name, const char *idname) { /* trees are created as local trees for compositor, material or texture nodes, * node groups and other tree types are created as library data. */ - const bool is_embedded = (bmain == nullptr); int flag = 0; if (is_embedded) { flag |= LIB_ID_CREATE_NO_MAIN; @@ -2588,7 +2575,15 @@ bNodeTree *ntreeAddTree(Main *bmain, const char *name, const char *idname) bNodeTree *ntree = (bNodeTree *)BKE_libblock_alloc(bmain, ID_NT, name, flag); BKE_libblock_init_empty(&ntree->id); if (is_embedded) { + BLI_assert(owner_id != NULL); ntree->id.flag |= LIB_EMBEDDED_DATA; + ntree->owner_id = owner_id; + bNodeTree **ntree_owner_ptr = BKE_ntree_ptr_from_id(owner_id); + BLI_assert(ntree_owner_ptr != NULL); + *ntree_owner_ptr = ntree; + } + else { + BLI_assert(owner_id == NULL); } BLI_strncpy(ntree->idname, idname, sizeof(ntree->idname)); @@ -2597,6 +2592,19 @@ bNodeTree *ntreeAddTree(Main *bmain, const char *name, const char *idname) return ntree; } +bNodeTree *ntreeAddTree(Main *bmain, const char *name, const char *idname) +{ + return ntreeAddTree_do(bmain, nullptr, false, name, idname); +} + +bNodeTree *ntreeAddTreeEmbedded(Main *UNUSED(bmain), + ID *owner_id, + const char *name, + const char *idname) +{ + return ntreeAddTree_do(nullptr, owner_id, true, name, idname); +} + bNodeTree *ntreeCopyTree_ex(const bNodeTree *ntree, Main *bmain, const bool do_id_user) { const int flag = do_id_user ? 0 : LIB_ID_CREATE_NO_USER_REFCOUNT | LIB_ID_CREATE_NO_MAIN; diff --git a/source/blender/blenkernel/intern/scene.cc b/source/blender/blenkernel/intern/scene.cc index 02f47a5ee35..71c77be5b46 100644 --- a/source/blender/blenkernel/intern/scene.cc +++ b/source/blender/blenkernel/intern/scene.cc @@ -216,7 +216,7 @@ static void scene_init_data(ID *id) } /* Master Collection */ - scene->master_collection = BKE_collection_master_add(); + scene->master_collection = BKE_collection_master_add(scene); BKE_view_layer_add(scene, "ViewLayer", nullptr, VIEWLAYER_ADD_NEW); } diff --git a/source/blender/blenkernel/intern/simulation.cc b/source/blender/blenkernel/intern/simulation.cc index 260d67de4d8..6afb698bcc0 100644 --- a/source/blender/blenkernel/intern/simulation.cc +++ b/source/blender/blenkernel/intern/simulation.cc @@ -51,8 +51,7 @@ static void simulation_init_data(ID *id) MEMCPY_STRUCT_AFTER(simulation, DNA_struct_default_get(Simulation), id); - bNodeTree *ntree = ntreeAddTree(nullptr, "Geometry Nodetree", ntreeType_Geometry->idname); - simulation->nodetree = ntree; + ntreeAddTreeEmbedded(nullptr, id, "Geometry Nodetree", ntreeType_Geometry->idname); } static void simulation_copy_data(Main *bmain, ID *id_dst, const ID *id_src, const int flag) diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index d178c8fcd4c..863f978daaf 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -2052,7 +2052,7 @@ static void direct_link_id_embedded_id(BlendDataReader *reader, (ID *)*nodetree, id_old != NULL ? (ID *)ntreeFromID(id_old) : NULL, 0); - ntreeBlendReadData(reader, *nodetree); + ntreeBlendReadData(reader, id, *nodetree); } if (GS(id->name) == ID_SCE) { @@ -2064,7 +2064,7 @@ static void direct_link_id_embedded_id(BlendDataReader *reader, &scene->master_collection->id, id_old != NULL ? &((Scene *)id_old)->master_collection->id : NULL, 0); - BKE_collection_blend_read_data(reader, scene->master_collection); + BKE_collection_blend_read_data(reader, scene->master_collection, &scene->id); } } } diff --git a/source/blender/blenloader/intern/versioning_280.c b/source/blender/blenloader/intern/versioning_280.c index 50ccd7384b0..e4dc8d006ae 100644 --- a/source/blender/blenloader/intern/versioning_280.c +++ b/source/blender/blenloader/intern/versioning_280.c @@ -367,7 +367,7 @@ static void do_version_scene_collection_to_collection(Main *bmain, Scene *scene) BLI_listbase_clear(&scene->view_layers); if (!scene->master_collection) { - scene->master_collection = BKE_collection_master_add(); + scene->master_collection = BKE_collection_master_add(scene); } /* Convert scene collections. */ @@ -411,7 +411,7 @@ static void do_version_layers_to_collections(Main *bmain, Scene *scene) /* Since we don't have access to FileData we check the (always valid) first * render layer instead. */ if (!scene->master_collection) { - scene->master_collection = BKE_collection_master_add(); + scene->master_collection = BKE_collection_master_add(scene); } if (scene->view_layers.first) { diff --git a/source/blender/draw/engines/eevee/eevee_shaders.c b/source/blender/draw/engines/eevee/eevee_shaders.c index e7b6cd636ae..04d1168a30d 100644 --- a/source/blender/draw/engines/eevee/eevee_shaders.c +++ b/source/blender/draw/engines/eevee/eevee_shaders.c @@ -1192,8 +1192,8 @@ Material *EEVEE_material_default_diffuse_get(void) if (!e_data.diffuse_mat) { Material *ma = BKE_id_new_nomain(ID_MA, "EEVEEE default diffuse"); - bNodeTree *ntree = ntreeAddTree(NULL, "Shader Nodetree", ntreeType_Shader->idname); - ma->nodetree = ntree; + bNodeTree *ntree = ntreeAddTreeEmbedded( + NULL, &ma->id, "Shader Nodetree", ntreeType_Shader->idname); ma->use_nodes = true; bNode *bsdf = nodeAddStaticNode(NULL, ntree, SH_NODE_BSDF_DIFFUSE); @@ -1219,8 +1219,8 @@ Material *EEVEE_material_default_glossy_get(void) if (!e_data.glossy_mat) { Material *ma = BKE_id_new_nomain(ID_MA, "EEVEEE default metal"); - bNodeTree *ntree = ntreeAddTree(NULL, "Shader Nodetree", ntreeType_Shader->idname); - ma->nodetree = ntree; + bNodeTree *ntree = ntreeAddTreeEmbedded( + NULL, &ma->id, "Shader Nodetree", ntreeType_Shader->idname); ma->use_nodes = true; bNode *bsdf = nodeAddStaticNode(NULL, ntree, SH_NODE_BSDF_GLOSSY); @@ -1248,8 +1248,8 @@ Material *EEVEE_material_default_error_get(void) if (!e_data.error_mat) { Material *ma = BKE_id_new_nomain(ID_MA, "EEVEEE default error"); - bNodeTree *ntree = ntreeAddTree(NULL, "Shader Nodetree", ntreeType_Shader->idname); - ma->nodetree = ntree; + bNodeTree *ntree = ntreeAddTreeEmbedded( + NULL, &ma->id, "Shader Nodetree", ntreeType_Shader->idname); ma->use_nodes = true; /* Use emission and output material to be compatible with both World and Material. */ diff --git a/source/blender/draw/engines/eevee/shaders/prepass_frag.glsl b/source/blender/draw/engines/eevee/shaders/prepass_frag.glsl index 15c68dc5829..87e944a2ac0 100644 --- a/source/blender/draw/engines/eevee/shaders/prepass_frag.glsl +++ b/source/blender/draw/engines/eevee/shaders/prepass_frag.glsl @@ -91,3 +91,17 @@ void main() } #endif } + +/* Passthrough. */ +float attr_load_temperature_post(float attr) +{ + return attr; +} +vec4 attr_load_color_post(vec4 attr) +{ + return attr; +} +vec4 attr_load_uniform(vec4 attr, const uint attr_hash) +{ + return attr; +} diff --git a/source/blender/draw/engines/eevee_next/eevee_material.cc b/source/blender/draw/engines/eevee_next/eevee_material.cc index 13efbd1bd1a..a92f96e8c70 100644 --- a/source/blender/draw/engines/eevee_next/eevee_material.cc +++ b/source/blender/draw/engines/eevee_next/eevee_material.cc @@ -72,10 +72,9 @@ bNodeTree *DefaultSurfaceNodeTree::nodetree_get(::Material *ma) MaterialModule::MaterialModule(Instance &inst) : inst_(inst) { { - bNodeTree *ntree = ntreeAddTree(nullptr, "Shader Nodetree", ntreeType_Shader->idname); - diffuse_mat = (::Material *)BKE_id_new_nomain(ID_MA, "EEVEE default diffuse"); - diffuse_mat->nodetree = ntree; + bNodeTree *ntree = ntreeAddTreeEmbedded( + nullptr, &diffuse_mat->id, "Shader Nodetree", ntreeType_Shader->idname); diffuse_mat->use_nodes = true; /* To use the forward pipeline. */ diffuse_mat->blend_method = MA_BM_BLEND; @@ -95,10 +94,9 @@ MaterialModule::MaterialModule(Instance &inst) : inst_(inst) nodeSetActive(ntree, output); } { - bNodeTree *ntree = ntreeAddTree(nullptr, "Shader Nodetree", ntreeType_Shader->idname); - glossy_mat = (::Material *)BKE_id_new_nomain(ID_MA, "EEVEE default metal"); - glossy_mat->nodetree = ntree; + bNodeTree *ntree = ntreeAddTreeEmbedded( + nullptr, &glossy_mat->id, "Shader Nodetree", ntreeType_Shader->idname); glossy_mat->use_nodes = true; /* To use the forward pipeline. */ glossy_mat->blend_method = MA_BM_BLEND; @@ -120,10 +118,9 @@ MaterialModule::MaterialModule(Instance &inst) : inst_(inst) nodeSetActive(ntree, output); } { - bNodeTree *ntree = ntreeAddTree(nullptr, "Shader Nodetree", ntreeType_Shader->idname); - error_mat_ = (::Material *)BKE_id_new_nomain(ID_MA, "EEVEE default error"); - error_mat_->nodetree = ntree; + bNodeTree *ntree = ntreeAddTreeEmbedded( + nullptr, &error_mat_->id, "Shader Nodetree", ntreeType_Shader->idname); error_mat_->use_nodes = true; /* Use emission and output material to be compatible with both World and Material. */ diff --git a/source/blender/draw/engines/external/external_engine.c b/source/blender/draw/engines/external/external_engine.c index b9c09e2bc4f..3f047d8de68 100644 --- a/source/blender/draw/engines/external/external_engine.c +++ b/source/blender/draw/engines/external/external_engine.c @@ -236,7 +236,11 @@ static void external_draw_scene_do_v3d(void *vedata) RegionView3D *rv3d = draw_ctx->rv3d; ARegion *region = draw_ctx->region; - DRW_state_reset_ex(DRW_STATE_DEFAULT & ~DRW_STATE_DEPTH_LESS_EQUAL); + DRW_state_reset_ex(DRW_STATE_WRITE_COLOR); + + /* The external engine can use the OpenGL rendering API directly, so make sure the state is + * already applied. */ + GPU_apply_state(); /* Create render engine. */ if (!rv3d->render_engine) { @@ -332,6 +336,12 @@ static void external_draw_scene_do_image(void *UNUSED(vedata)) BLI_assert(re != NULL); BLI_assert(engine != NULL); + DRW_state_reset_ex(DRW_STATE_WRITE_COLOR); + + /* The external engine can use the OpenGL rendering API directly, so make sure the state is + * already applied. */ + GPU_apply_state(); + const DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get(); /* Clear the depth buffer to the value used by the background overlay so that the overlay is not diff --git a/source/blender/draw/intern/DRW_gpu_wrapper.hh b/source/blender/draw/intern/DRW_gpu_wrapper.hh index d9122657144..890cd588527 100644 --- a/source/blender/draw/intern/DRW_gpu_wrapper.hh +++ b/source/blender/draw/intern/DRW_gpu_wrapper.hh @@ -859,7 +859,8 @@ class TextureFromPool : public Texture, NonMovable { * Dummy type to bind texture as image. * It is just a GPUTexture in disguise. */ -class Image {}; +class Image { +}; static inline Image *as_image(GPUTexture *tex) { diff --git a/source/blender/draw/intern/draw_debug.cc b/source/blender/draw/intern/draw_debug.cc index 9cb79d73812..b0662a42ea0 100644 --- a/source/blender/draw/intern/draw_debug.cc +++ b/source/blender/draw/intern/draw_debug.cc @@ -671,6 +671,8 @@ void DRW_debug_modelmat(const float modelmat[4][4]) return; } reinterpret_cast<blender::draw::DebugDraw *>(DST.debug)->modelmat_set(modelmat); +#else + UNUSED_VARS(modelmat); #endif } @@ -718,6 +720,8 @@ void DRW_debug_bbox(const BoundBox *bbox, const float color[4]) return; } reinterpret_cast<blender::draw::DebugDraw *>(DST.debug)->draw_bbox(*bbox, color); +#else + UNUSED_VARS(bbox, color); #endif } diff --git a/source/blender/editors/gpencil/gpencil_edit.c b/source/blender/editors/gpencil/gpencil_edit.c index 106f4acd6b7..120c806c727 100644 --- a/source/blender/editors/gpencil/gpencil_edit.c +++ b/source/blender/editors/gpencil/gpencil_edit.c @@ -4169,7 +4169,6 @@ static int gpencil_stroke_outline_exec(bContext *C, wmOperator *op) } } - if (changed) { /* notifiers */ DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY); diff --git a/source/blender/editors/interface/interface_templates.c b/source/blender/editors/interface/interface_templates.c index 651c28c1a59..0b72c358dc9 100644 --- a/source/blender/editors/interface/interface_templates.c +++ b/source/blender/editors/interface/interface_templates.c @@ -6358,8 +6358,10 @@ void uiTemplateInputStatus(uiLayout *layout, struct bContext *C) uiLayout *row = uiLayoutRow(col, true); uiLayoutSetAlignment(row, UI_LAYOUT_ALIGN_LEFT); - const char *msg = TIP_(WM_window_cursor_keymap_status_get(win, i, 0)); - const char *msg_drag = TIP_(WM_window_cursor_keymap_status_get(win, i, 1)); + const char *msg = CTX_TIP_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, + WM_window_cursor_keymap_status_get(win, i, 0)); + const char *msg_drag = CTX_TIP_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, + WM_window_cursor_keymap_status_get(win, i, 1)); if (msg || (msg_drag == NULL)) { uiItemL(row, msg ? msg : "", (ICON_MOUSE_LMB + i)); diff --git a/source/blender/editors/io/io_alembic.c b/source/blender/editors/io/io_alembic.c index a7e906b8109..dd35279e0d6 100644 --- a/source/blender/editors/io/io_alembic.c +++ b/source/blender/editors/io/io_alembic.c @@ -80,7 +80,7 @@ static int wm_alembic_export_invoke(bContext *C, wmOperator *op, const wmEvent * char filepath[FILE_MAX]; if (BKE_main_blendfile_path(bmain)[0] == '\0') { - BLI_strncpy(filepath, "untitled", sizeof(filepath)); + BLI_strncpy(filepath, DATA_("untitled"), sizeof(filepath)); } else { BLI_strncpy(filepath, BKE_main_blendfile_path(bmain), sizeof(filepath)); diff --git a/source/blender/editors/io/io_collada.c b/source/blender/editors/io/io_collada.c index c491e7a5815..6a5547021e4 100644 --- a/source/blender/editors/io/io_collada.c +++ b/source/blender/editors/io/io_collada.c @@ -43,7 +43,7 @@ static int wm_collada_export_invoke(bContext *C, wmOperator *op, const wmEvent * const char *blendfile_path = BKE_main_blendfile_path(bmain); if (blendfile_path[0] == '\0') { - BLI_strncpy(filepath, "untitled", sizeof(filepath)); + BLI_strncpy(filepath, DATA_("untitled"), sizeof(filepath)); } else { BLI_strncpy(filepath, blendfile_path, sizeof(filepath)); diff --git a/source/blender/editors/io/io_gpencil_export.c b/source/blender/editors/io/io_gpencil_export.c index 3f905dd7de0..7dfbf06f3c3 100644 --- a/source/blender/editors/io/io_gpencil_export.c +++ b/source/blender/editors/io/io_gpencil_export.c @@ -79,7 +79,7 @@ static void set_export_filepath(bContext *C, wmOperator *op, const char *extensi char filepath[FILE_MAX]; if (BKE_main_blendfile_path(bmain)[0] == '\0') { - BLI_strncpy(filepath, "untitled", sizeof(filepath)); + BLI_strncpy(filepath, DATA_("untitled"), sizeof(filepath)); } else { BLI_strncpy(filepath, BKE_main_blendfile_path(bmain), sizeof(filepath)); diff --git a/source/blender/editors/io/io_obj.c b/source/blender/editors/io/io_obj.c index c151baf13ef..615c992ebff 100644 --- a/source/blender/editors/io/io_obj.c +++ b/source/blender/editors/io/io_obj.c @@ -63,7 +63,7 @@ static int wm_obj_export_invoke(bContext *C, wmOperator *op, const wmEvent *UNUS char filepath[FILE_MAX]; if (BKE_main_blendfile_path(bmain)[0] == '\0') { - BLI_strncpy(filepath, "untitled", sizeof(filepath)); + BLI_strncpy(filepath, DATA_("untitled"), sizeof(filepath)); } else { BLI_strncpy(filepath, BKE_main_blendfile_path(bmain), sizeof(filepath)); diff --git a/source/blender/editors/io/io_usd.c b/source/blender/editors/io/io_usd.c index a59cdf60243..def7196d8ef 100644 --- a/source/blender/editors/io/io_usd.c +++ b/source/blender/editors/io/io_usd.c @@ -90,7 +90,7 @@ static int wm_usd_export_invoke(bContext *C, wmOperator *op, const wmEvent *UNUS const char *main_blendfile_path = BKE_main_blendfile_path(bmain); if (main_blendfile_path[0] == '\0') { - BLI_strncpy(filepath, "untitled", sizeof(filepath)); + BLI_strncpy(filepath, DATA_("untitled"), sizeof(filepath)); } else { BLI_strncpy(filepath, main_blendfile_path, sizeof(filepath)); diff --git a/source/blender/editors/space_node/node_edit.cc b/source/blender/editors/space_node/node_edit.cc index 5f92e514385..9167b96b76f 100644 --- a/source/blender/editors/space_node/node_edit.cc +++ b/source/blender/editors/space_node/node_edit.cc @@ -506,12 +506,12 @@ void ED_node_shader_default(const bContext *C, ID *id) } else if (ELEM(GS(id->name), ID_WO, ID_LA)) { /* Emission */ - bNodeTree *ntree = ntreeAddTree(nullptr, "Shader Nodetree", ntreeType_Shader->idname); + bNodeTree *ntree = ntreeAddTreeEmbedded( + nullptr, id, "Shader Nodetree", ntreeType_Shader->idname); bNode *shader, *output; if (GS(id->name) == ID_WO) { World *world = (World *)id; - world->nodetree = ntree; shader = nodeAddStaticNode(nullptr, ntree, SH_NODE_BACKGROUND); output = nodeAddStaticNode(nullptr, ntree, SH_NODE_OUTPUT_WORLD); @@ -525,9 +525,6 @@ void ED_node_shader_default(const bContext *C, ID *id) copy_v3_v3(((bNodeSocketValueRGBA *)color_sock->default_value)->value, &world->horr); } else { - Light *light = (Light *)id; - light->nodetree = ntree; - shader = nodeAddStaticNode(nullptr, ntree, SH_NODE_EMISSION); output = nodeAddStaticNode(nullptr, ntree, SH_NODE_OUTPUT_LIGHT); nodeAddLink(ntree, @@ -560,7 +557,8 @@ void ED_node_composit_default(const bContext *C, Scene *sce) return; } - sce->nodetree = ntreeAddTree(nullptr, "Compositing Nodetree", ntreeType_Composite->idname); + sce->nodetree = ntreeAddTreeEmbedded( + nullptr, &sce->id, "Compositing Nodetree", ntreeType_Composite->idname); sce->nodetree->chunksize = 256; sce->nodetree->edit_quality = NTREE_QUALITY_HIGH; @@ -593,7 +591,8 @@ void ED_node_texture_default(const bContext *C, Tex *tex) return; } - tex->nodetree = ntreeAddTree(nullptr, "Texture Nodetree", ntreeType_Texture->idname); + tex->nodetree = ntreeAddTreeEmbedded( + nullptr, &tex->id, "Texture Nodetree", ntreeType_Texture->idname); bNode *out = nodeAddStaticNode(C, tex->nodetree, TEX_NODE_OUTPUT); out->locx = 300.0f; diff --git a/source/blender/editors/space_node/node_ops.cc b/source/blender/editors/space_node/node_ops.cc index c936f07a594..3b3189983e2 100644 --- a/source/blender/editors/space_node/node_ops.cc +++ b/source/blender/editors/space_node/node_ops.cc @@ -111,7 +111,7 @@ void node_operatortypes() WM_operatortype_append(NODE_OT_cryptomatte_layer_remove); } -void node_keymap( wmKeyConfig *keyconf) +void node_keymap(wmKeyConfig *keyconf) { /* Entire Editor only ----------------- */ WM_keymap_ensure(keyconf, "Node Generic", SPACE_NODE, 0); diff --git a/source/blender/editors/space_sequencer/sequencer_draw.c b/source/blender/editors/space_sequencer/sequencer_draw.c index 0bacbde8240..bb027c99546 100644 --- a/source/blender/editors/space_sequencer/sequencer_draw.c +++ b/source/blender/editors/space_sequencer/sequencer_draw.c @@ -519,18 +519,6 @@ static void draw_seq_waveform_overlay( MEM_freeN(waveform_data); } -#if 0 -static size_t *waveform_append(WaveVizData *waveform_data, - vec2f pos, - const float value_min, - const float value_max, - const float y_mid, - const float y_scale, - const float rms, - const bool is_clipping, - const bool is_line_strip) -#endif - static void drawmeta_contents(Scene *scene, Sequence *seqm, float x1, diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index 7f23df4c94f..86dc9f566e5 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -1931,7 +1931,7 @@ static int sequencer_meta_toggle_exec(bContext *C, wmOperator *UNUSED(op)) SEQ_select_active_set(scene, meta_parent); } - // DEG_id_tag_update(&scene->id, ID_RECALC_SEQUENCER_STRIPS); + DEG_id_tag_update(&scene->id, ID_RECALC_SEQUENCER_STRIPS); WM_event_add_notifier(C, NC_SCENE | ND_SEQUENCER, scene); return OPERATOR_FINISHED; @@ -3093,7 +3093,7 @@ static int sequencer_export_subtitles_invoke(bContext *C, char filepath[FILE_MAX]; if (BKE_main_blendfile_path(bmain)[0] == '\0') { - BLI_strncpy(filepath, "untitled", sizeof(filepath)); + BLI_strncpy(filepath, DATA_("untitled"), sizeof(filepath)); } else { BLI_strncpy(filepath, BKE_main_blendfile_path(bmain), sizeof(filepath)); diff --git a/source/blender/editors/util/select_utils.c b/source/blender/editors/util/select_utils.c index 660afa4c3d7..b29afdb5a9f 100644 --- a/source/blender/editors/util/select_utils.c +++ b/source/blender/editors/util/select_utils.c @@ -10,6 +10,8 @@ #include "BLI_math.h" #include "BLI_utildefines.h" +#include "BLT_translation.h" + #include "DNA_windowmanager_types.h" #include "RNA_access.h" @@ -161,18 +163,18 @@ const char *ED_select_pick_get_name(wmOperatorType *UNUSED(ot), PointerRNA *ptr) ED_select_pick_params_from_operator(ptr, ¶ms); switch (params.sel_op) { case SEL_OP_ADD: - return "Select (Extend)"; + return CTX_N_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Select (Extend)"); case SEL_OP_SUB: - return "Select (Deselect)"; + return CTX_N_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Select (Deselect)"); case SEL_OP_XOR: - return "Select (Toggle)"; + return CTX_N_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Select (Toggle)"); case SEL_OP_AND: BLI_assert_unreachable(); ATTR_FALLTHROUGH; case SEL_OP_SET: break; } - return "Select"; + return CTX_N_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Select"); } const char *ED_select_circle_get_name(wmOperatorType *UNUSED(ot), PointerRNA *ptr) @@ -181,9 +183,9 @@ const char *ED_select_circle_get_name(wmOperatorType *UNUSED(ot), PointerRNA *pt const eSelectOp sel_op = RNA_enum_get(ptr, "mode"); switch (sel_op) { case SEL_OP_ADD: - return "Circle Select (Extend)"; + return CTX_N_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Circle Select (Extend)"); case SEL_OP_SUB: - return "Circle Select (Deselect)"; + return CTX_N_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Circle Select (Deselect)"); case SEL_OP_XOR: ATTR_FALLTHROUGH; case SEL_OP_AND: @@ -192,7 +194,7 @@ const char *ED_select_circle_get_name(wmOperatorType *UNUSED(ot), PointerRNA *pt case SEL_OP_SET: break; } - return "Circle Select"; + return CTX_N_(BLT_I18NCONTEXT_OPERATOR_DEFAULT, "Circle Select"); } /** \} */ diff --git a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp index fb51bdab172..0b035a08433 100644 --- a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp +++ b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp @@ -218,12 +218,12 @@ Material *BlenderStrokeRenderer::GetStrokeShader(Main *bmain, break; } } + ma->nodetree = ntree; } else { - ntree = ntreeAddTree(nullptr, "stroke_shader", "ShaderNodeTree"); + ntree = ntreeAddTreeEmbedded(nullptr, &ma->id, "stroke_shader", "ShaderNodeTree"); } - ma->nodetree = ntree; - ma->use_nodes = 1; + ma->use_nodes = true; ma->blend_method = MA_BM_HASHED; bNode *input_attr_color = nodeAddStaticNode(nullptr, ntree, SH_NODE_ATTRIBUTE); diff --git a/source/blender/gpu/intern/gpu_codegen.cc b/source/blender/gpu/intern/gpu_codegen.cc index f774f33e03d..b81345683b4 100644 --- a/source/blender/gpu/intern/gpu_codegen.cc +++ b/source/blender/gpu/intern/gpu_codegen.cc @@ -199,7 +199,8 @@ static std::ostream &operator<<(std::ostream &stream, const GPUOutput *output) } /* Trick type to change overload and keep a somewhat nice syntax. */ -struct GPUConstant : public GPUInput {}; +struct GPUConstant : public GPUInput { +}; /* Print data constructor (i.e: vec2(1.0f, 1.0f)). */ static std::ostream &operator<<(std::ostream &stream, const GPUConstant *input) diff --git a/source/blender/gpu/shaders/gpu_shader_2D_image_vert.glsl b/source/blender/gpu/shaders/gpu_shader_2D_image_vert.glsl index 0b5e3759dfb..8191fb6a8d6 100644 --- a/source/blender/gpu/shaders/gpu_shader_2D_image_vert.glsl +++ b/source/blender/gpu/shaders/gpu_shader_2D_image_vert.glsl @@ -10,6 +10,5 @@ out vec2 texCoord_interp; void main() { gl_Position = ModelViewProjectionMatrix * vec4(pos.xy, 0.0f, 1.0f); - gl_Position.z = 1.0; texCoord_interp = texCoord; } diff --git a/source/blender/io/collada/Materials.cpp b/source/blender/io/collada/Materials.cpp index b5d89d8d1cf..997da31b939 100644 --- a/source/blender/io/collada/Materials.cpp +++ b/source/blender/io/collada/Materials.cpp @@ -86,7 +86,7 @@ bNodeTree *MaterialNode::prepare_material_nodetree() return nullptr; } - material->nodetree = ntreeAddTree(nullptr, "Shader Nodetree", "ShaderNodeTree"); + ntreeAddTreeEmbedded(nullptr, &material->id, "Shader Nodetree", "ShaderNodeTree"); material->use_nodes = true; ntree = material->nodetree; return ntree; diff --git a/source/blender/io/collada/collada_utils.cpp b/source/blender/io/collada/collada_utils.cpp index 75842734b08..82c471a6524 100644 --- a/source/blender/io/collada/collada_utils.cpp +++ b/source/blender/io/collada/collada_utils.cpp @@ -1108,7 +1108,7 @@ static std::string bc_get_uvlayer_name(Mesh *me, int layer) static bNodeTree *prepare_material_nodetree(Material *ma) { if (ma->nodetree == nullptr) { - ma->nodetree = ntreeAddTree(nullptr, "Shader Nodetree", "ShaderNodeTree"); + ntreeAddTreeEmbedded(nullptr, &ma->id, "Shader Nodetree", "ShaderNodeTree"); ma->use_nodes = true; } return ma->nodetree; diff --git a/source/blender/io/usd/intern/usd_reader_material.cc b/source/blender/io/usd/intern/usd_reader_material.cc index 4b72a075106..3546beb022c 100644 --- a/source/blender/io/usd/intern/usd_reader_material.cc +++ b/source/blender/io/usd/intern/usd_reader_material.cc @@ -353,8 +353,7 @@ void USDMaterialReader::import_usd_preview(Material *mtl, * and output shaders. */ /* Add the node tree. */ - bNodeTree *ntree = ntreeAddTree(nullptr, "Shader Nodetree", "ShaderNodeTree"); - mtl->nodetree = ntree; + bNodeTree *ntree = ntreeAddTreeEmbedded(nullptr, &mtl->id, "Shader Nodetree", "ShaderNodeTree"); mtl->use_nodes = true; /* Create the Principled BSDF shader node. */ diff --git a/source/blender/io/wavefront_obj/importer/obj_import_mtl.cc b/source/blender/io/wavefront_obj/importer/obj_import_mtl.cc index 58d414a59ad..0922a71979e 100644 --- a/source/blender/io/wavefront_obj/importer/obj_import_mtl.cc +++ b/source/blender/io/wavefront_obj/importer/obj_import_mtl.cc @@ -380,7 +380,8 @@ bNodeTree *create_mtl_node_tree(Main *bmain, Material *mat, bool relative_paths) { - bNodeTree *ntree = ntreeAddTree(nullptr, "Shader Nodetree", ntreeType_Shader->idname); + bNodeTree *ntree = ntreeAddTreeEmbedded( + nullptr, &mat->id, "Shader Nodetree", ntreeType_Shader->idname); bNode *bsdf = add_node(ntree, SH_NODE_BSDF_PRINCIPLED, node_locx_bsdf, node_locy_top); bNode *output = add_node(ntree, SH_NODE_OUTPUT_MATERIAL, node_locx_output, node_locy_top); diff --git a/source/blender/makesdna/DNA_collection_types.h b/source/blender/makesdna/DNA_collection_types.h index 26011c990d4..a3e5eb4e944 100644 --- a/source/blender/makesdna/DNA_collection_types.h +++ b/source/blender/makesdna/DNA_collection_types.h @@ -46,6 +46,9 @@ enum eCollectionLineArt_Flags { typedef struct Collection { ID id; + /** The ID owning this node tree, in case it is an embedded one. */ + ID *owner_id; + /** CollectionObject. */ ListBase gobject; /** CollectionChild. */ diff --git a/source/blender/makesdna/DNA_node_types.h b/source/blender/makesdna/DNA_node_types.h index 07e9f5d8c52..0114988a0bc 100644 --- a/source/blender/makesdna/DNA_node_types.h +++ b/source/blender/makesdna/DNA_node_types.h @@ -535,6 +535,9 @@ typedef struct bNodeTree { /** Animation data (must be immediately after id for utilities to use it). */ struct AnimData *adt; + /** The ID owning this node tree, in case it is an embedded one. */ + ID *owner_id; + /** Runtime type information. */ struct bNodeTreeType *typeinfo; /** Runtime type identifier. */ diff --git a/source/blender/windowmanager/intern/wm_files.c b/source/blender/windowmanager/intern/wm_files.c index fb3da9dc7ec..13c1579d24b 100644 --- a/source/blender/windowmanager/intern/wm_files.c +++ b/source/blender/windowmanager/intern/wm_files.c @@ -3019,7 +3019,9 @@ void WM_OT_recover_auto_save(wmOperatorType *ot) static void wm_filepath_default(const Main *bmain, char *filepath) { if (bmain->filepath[0] == '\0') { - BLI_path_filename_ensure(filepath, FILE_MAX, "untitled.blend"); + char filename_untitled[FILE_MAXFILE]; + SNPRINTF(filename_untitled, "%s.blend", DATA_("untitled")); + BLI_path_filename_ensure(filepath, FILE_MAX, filename_untitled); } } @@ -3652,7 +3654,7 @@ static uiBlock *block_create__close_file_dialog(struct bContext *C, BLI_split_file_part(blendfile_path, filename, sizeof(filename)); } else { - STRNCPY(filename, "untitled.blend"); + SNPRINTF(filename, "%s.blend", DATA_("untitled")); } uiItemL(layout, filename, ICON_NONE); |