diff options
author | Antonis Ryakiotakis <kalast@gmail.com> | 2022-02-07 21:37:15 +0300 |
---|---|---|
committer | Antonis Ryakiotakis <kalast@gmail.com> | 2022-02-07 21:37:15 +0300 |
commit | d8c05502272990173381bfd2590884bbc95aa5f5 (patch) | |
tree | 8bd65efacbe6484b838d4550597d0f4a54ddddd9 /release | |
parent | b64d551f3b2fa409b4eeefb641fc581eb6cd0bd6 (diff) | |
parent | fe1816f67fbc6aaf383ec77847d668367335d093 (diff) |
Merge branch 'master' into KTX_supportKTX_support
Diffstat (limited to 'release')
23 files changed, 159 insertions, 124 deletions
diff --git a/release/datafiles/locale b/release/datafiles/locale -Subproject 68f8874599d7fbac10fa332535450d8a78fafda +Subproject 050058417452bfba0cc9ae8692173eb02ac1ef3 diff --git a/release/scripts/addons b/release/scripts/addons -Subproject 0574f418a03e2dddfac8b402ce1fb8c33b6b25d +Subproject faa9fc7f98e19be54a715c24061185b04dff5b6 diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib -Subproject 7936dde9ece881d531b1a2ee6c45ddb56d30038 +Subproject 61e45814503f51963c91c51aaf764612e7c5dc7 diff --git a/release/scripts/modules/bl_i18n_utils/settings.py b/release/scripts/modules/bl_i18n_utils/settings.py index bdc345ee50a..d41db4e45b3 100644 --- a/release/scripts/modules/bl_i18n_utils/settings.py +++ b/release/scripts/modules/bl_i18n_utils/settings.py @@ -356,6 +356,7 @@ WARN_MSGID_NOT_CAPITALIZED_ALLOWED = { "y", "y = (Ax + B)", # Sub-strings. + "and AMD Radeon Pro 21.Q4 driver or newer", "available with", "brown fox", "can't save image while rendering", @@ -378,6 +379,7 @@ WARN_MSGID_NOT_CAPITALIZED_ALLOWED = { "image path can't be written to", "in memory to enable editing!", "insufficient content", + "into", "jumps over", "left", "local", @@ -387,6 +389,7 @@ WARN_MSGID_NOT_CAPITALIZED_ALLOWED = { "performance impact!", "right", "the lazy dog", + "to the top level of the tree", "unable to load movie clip", "unable to load text", "unable to open the file", diff --git a/release/scripts/modules/bl_i18n_utils/utils_spell_check.py b/release/scripts/modules/bl_i18n_utils/utils_spell_check.py index 62186655326..6a74c27b9c4 100644 --- a/release/scripts/modules/bl_i18n_utils/utils_spell_check.py +++ b/release/scripts/modules/bl_i18n_utils/utils_spell_check.py @@ -76,10 +76,12 @@ class SpellChecker: "tangency", "vertices", "wasn", # wasn't + "zig", "zag", # Brands etc. "htc", "huawei", + "radeon", "vive", "xbox", @@ -136,6 +138,7 @@ class SpellChecker: "filename", "filenames", "filepath", "filepaths", "forcefield", "forcefields", + "framerange", "fulldome", "fulldomes", "fullscreen", "gamepad", @@ -498,6 +501,7 @@ class SpellChecker: "framerate", "gimbal", "grayscale", + "icosahedron", "icosphere", "inpaint", "kerning", @@ -556,6 +560,7 @@ class SpellChecker: "bspline", "bweight", "colorband", + "crazyspace", "datablock", "datablocks", "despeckle", "depsgraph", @@ -730,6 +735,7 @@ class SpellChecker: "precisa", "px", "qmc", + "rdna", "rdp", "rgb", "rgba", "rhs", diff --git a/release/scripts/modules/rna_manual_reference.py b/release/scripts/modules/rna_manual_reference.py index 2983a326358..f0da4bac974 100644 --- a/release/scripts/modules/rna_manual_reference.py +++ b/release/scripts/modules/rna_manual_reference.py @@ -677,7 +677,6 @@ url_manual_mapping = ( ("bpy.ops.gpencil.stroke_merge_by_distance*", "grease_pencil/modes/edit/grease_pencil_menu.html#bpy-ops-gpencil-stroke-merge-by-distance"), ("bpy.ops.node.collapse_hide_unused_toggle*", "interface/controls/nodes/editing.html#bpy-ops-node-collapse-hide-unused-toggle"), ("bpy.ops.object.anim_transforms_to_deltas*", "scene_layout/object/editing/apply.html#bpy-ops-object-anim-transforms-to-deltas"), - ("bpy.ops.object.convert_proxy_to_override*", "files/linked_libraries/library_overrides.html#bpy-ops-object-convert-proxy-to-override"), ("bpy.ops.object.modifier_copy_to_selected*", "modeling/modifiers/introduction.html#bpy-ops-object-modifier-copy-to-selected"), ("bpy.ops.preferences.app_template_install*", "advanced/app_templates.html#bpy-ops-preferences-app-template-install"), ("bpy.types.actionposemarkers.active_index*", "animation/armatures/properties/pose_library.html#bpy-types-actionposemarkers-active-index"), @@ -1860,6 +1859,7 @@ url_manual_mapping = ( ("bpy.types.shadernodeemission*", "render/shader_nodes/shader/emission.html#bpy-types-shadernodeemission"), ("bpy.types.shadernodegeometry*", "render/shader_nodes/input/geometry.html#bpy-types-shadernodegeometry"), ("bpy.types.shadernodehairinfo*", "render/shader_nodes/input/hair_info.html#bpy-types-shadernodehairinfo"), + ("bpy.types.shadernodepointinfo*", "render/shader_nodes/input/point_info.html#bpy-types-shadernodepointinfo"), ("bpy.types.shadernodemaprange*", "render/shader_nodes/converter/map_range.html#bpy-types-shadernodemaprange"), ("bpy.types.shadernodergbcurve*", "modeling/geometry_nodes/color/rgb_curves.html#bpy-types-shadernodergbcurve"), ("bpy.types.shadernodeseparate*", "render/shader_nodes/converter/combine_separate.html#bpy-types-shadernodeseparate"), @@ -2139,7 +2139,6 @@ url_manual_mapping = ( ("bpy.ops.object.origin_set*", "scene_layout/object/origin.html#bpy-ops-object-origin-set"), ("bpy.ops.object.parent_set*", "scene_layout/object/editing/parent.html#bpy-ops-object-parent-set"), ("bpy.ops.object.pointcloud*", "modeling/point_cloud.html#bpy-ops-object-pointcloud"), - ("bpy.ops.object.proxy_make*", "files/linked_libraries/library_proxies.html#bpy-ops-object-proxy-make"), ("bpy.ops.object.select_all*", "scene_layout/object/selecting.html#bpy-ops-object-select-all"), ("bpy.ops.object.shade_flat*", "scene_layout/object/editing/shading.html#bpy-ops-object-shade-flat"), ("bpy.ops.pose.group_assign*", "animation/armatures/properties/bone_groups.html#bpy-ops-pose-group-assign"), diff --git a/release/scripts/modules/rna_xml.py b/release/scripts/modules/rna_xml.py index 7f7b273c42b..aa8841c5efe 100644 --- a/release/scripts/modules/rna_xml.py +++ b/release/scripts/modules/rna_xml.py @@ -298,7 +298,7 @@ def xml2rna( del value_xml_split tp_name = 'ARRAY' -# print(" %s.%s (%s) --- %s" % (type(value).__name__, attr, tp_name, subvalue_type)) + # print(" %s.%s (%s) --- %s" % (type(value).__name__, attr, tp_name, subvalue_type)) try: setattr(value, attr, value_xml_coerce) except ValueError: @@ -340,7 +340,6 @@ def xml2rna( else: # print(elems) - if len(elems) == 1: # sub node named by its type child_xml_real, = elems @@ -376,7 +375,6 @@ def _get_context_val(context, path): def xml_file_run(context, filepath, rna_map): - import xml.dom.minidom xml_nodes = xml.dom.minidom.parse(filepath) @@ -391,27 +389,25 @@ def xml_file_run(context, filepath, rna_map): value = _get_context_val(context, rna_path) if value is not Ellipsis and value is not None: - print(" loading XML: %r -> %r" % (filepath, rna_path)) + # print(" loading XML: %r -> %r" % (filepath, rna_path)) xml2rna(xml_node, root_rna=value) def xml_file_write(context, filepath, rna_map, *, skip_typemap=None): - - file = open(filepath, "w", encoding="utf-8") - fw = file.write - - fw("<bpy>\n") - - for rna_path, _xml_tag in rna_map: - # xml_tag is ignored, we get this from the rna - value = _get_context_val(context, rna_path) - rna2xml(fw, + with open(filepath, "w", encoding="utf-8") as file: + fw = file.write + fw("<bpy>\n") + + for rna_path, _xml_tag in rna_map: + # xml_tag is ignored, we get this from the rna + value = _get_context_val(context, rna_path) + rna2xml( + fw=fw, root_rna=value, method='ATTR', root_ident=" ", ident_val=" ", skip_typemap=skip_typemap, - ) + ) - fw("</bpy>\n") - file.close() + fw("</bpy>\n") diff --git a/release/scripts/presets/keyconfig/Blender.py b/release/scripts/presets/keyconfig/Blender.py index 1ac7626f926..417a3c39310 100644 --- a/release/scripts/presets/keyconfig/Blender.py +++ b/release/scripts/presets/keyconfig/Blender.py @@ -318,7 +318,8 @@ def load(): use_v3d_tab_menu=kc_prefs.use_v3d_tab_menu, use_v3d_shade_ex_pie=kc_prefs.use_v3d_shade_ex_pie, use_gizmo_drag=(is_select_left and kc_prefs.gizmo_action == 'DRAG'), - use_fallback_tool=(True if is_select_left else (kc_prefs.rmb_action == 'FALLBACK_TOOL')), + use_fallback_tool=True, + use_fallback_tool_rmb=(False if is_select_left else kc_prefs.rmb_action == 'FALLBACK_TOOL'), use_alt_tool_or_cursor=( (not use_mouse_emulate_3_button) and (kc_prefs.use_alt_tool if is_select_left else kc_prefs.use_alt_cursor) diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py index a006cd787ea..5367d9b33f9 100644 --- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py +++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py @@ -16,6 +16,16 @@ # # ##### END GPL LICENSE BLOCK ##### +# ------------------------------------------------------------------------------ +# Developer Notes +# +# - This script should run without Blender (no references to the `bpy` module for example). +# - All configuration must be passed into the `generate_keymaps` function (via `Params`). +# - Supporting some combinations of options is becoming increasingly complex, +# especially `Params.select_mouse` & `Params.use_fallback_tool_rmb`. +# To ensure changes don't unintentionally break other configurations, see: +# `source/tools/utils/blender_keyconfig_export_permutations.py --help` +# # ------------------------------------------------------------------------------ # Configurable Parameters @@ -48,6 +58,8 @@ class Params: "use_gizmo_drag", # Use the fallback tool instead of tweak for RMB select. "use_fallback_tool", + # Only set for RMB select. + "use_fallback_tool_rmb", # Use pie menu for tab by default (swap 'Tab/Ctrl-Tab'). "use_v3d_tab_menu", # Use extended pie menu for shading. @@ -65,15 +77,16 @@ class Params: "v3d_tilde_action", # Alt-MMB axis switching 'RELATIVE' or 'ABSOLUTE' axis switching. "v3d_alt_mmb_drag_action", - + # File selector actions on single click. "use_file_single_click", + # Convenience variables: # (derived from other settings). # - # This case needs to be checked often, - # Shorthand for: `(params.use_fallback_tool if params.select_mouse == 'RIGHTMOUSE' else False)`. - "use_fallback_tool_rmb", - # Shorthand for: `('CLICK' if params.use_fallback_tool_rmb else params.select_mouse_value)`. + # The fallback tool is activated on the same button as selection. + # Shorthand for: `(True if (select_mouse == 'LEFT') else self.use_fallback_tool_rmb)` + "use_fallback_tool_select_mouse", + # Shorthand for: `('CLICK' if self.use_fallback_tool_rmb else self.select_mouse_value)`. "select_mouse_value_fallback", # Shorthand for: `{"type": params.select_tweak, "value": 'ANY'}`. "select_tweak_event", @@ -103,6 +116,7 @@ class Params: use_select_all_toggle=False, use_gizmo_drag=True, use_fallback_tool=False, + use_fallback_tool_rmb=False, use_v3d_tab_menu=False, use_v3d_shade_ex_pie=False, use_v3d_mmb_pan=False, @@ -146,7 +160,6 @@ class Params: self.cursor_set_event = {"type": 'LEFTMOUSE', "value": 'CLICK'} self.cursor_tweak_event = None - self.use_fallback_tool = use_fallback_tool self.tool_modifier = {} else: # Left mouse select uses Click event for selection. This is a little @@ -169,7 +182,6 @@ class Params: self.cursor_set_event = {"type": 'RIGHTMOUSE', "value": 'PRESS', "shift": True} self.cursor_tweak_event = {"type": 'EVT_TWEAK_R', "value": 'ANY', "shift": True} - self.use_fallback_tool = True # Use the "tool" functionality for LMB select. if use_alt_tool_or_cursor: @@ -197,8 +209,11 @@ class Params: self.use_file_single_click = use_file_single_click + self.use_fallback_tool = use_fallback_tool + self.use_fallback_tool_rmb = use_fallback_tool_rmb + # Convenience variables: - self.use_fallback_tool_rmb = self.use_fallback_tool if select_mouse == 'RIGHT' else False + self.use_fallback_tool_select_mouse = True if (select_mouse == 'LEFT') else self.use_fallback_tool_rmb self.select_mouse_value_fallback = 'CLICK' if self.use_fallback_tool_rmb else self.select_mouse_value self.select_tweak_event = {"type": self.select_tweak, "value": 'ANY'} self.pie_value = 'CLICK_DRAG' if use_pie_click_drag else 'PRESS' @@ -1149,11 +1164,7 @@ def km_uv_editor(params): items.extend([ # Selection modes. *_template_items_uv_select_mode(params), - *_template_uv_select( - type=params.select_mouse, - value=('CLICK' if params.use_fallback_tool_rmb else params.select_mouse_value), - legacy=params.legacy, - ), + *_template_uv_select(type=params.select_mouse, value=params.select_mouse_value_fallback, legacy=params.legacy), ("uv.mark_seam", {"type": 'E', "value": 'PRESS', "ctrl": True}, None), ("uv.select_loop", {"type": params.select_mouse, "value": params.select_mouse_value, "alt": True}, None), @@ -6283,7 +6294,8 @@ def km_image_editor_tool_uv_select_box(params, *, fallback): *([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions_simple( "uv.select_box", # Don't use `tool_maybe_tweak_event`, see comment for this slot. - **(params.select_tweak_event if fallback else params.tool_tweak_event))), + **(params.select_tweak_event if (fallback and params.use_fallback_tool_select_mouse) else + params.tool_tweak_event))), ]}, ) @@ -6295,7 +6307,8 @@ def km_image_editor_tool_uv_select_circle(params, *, fallback): {"items": [ *([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions_simple( "uv.select_circle", - **(params.select_tweak_event if fallback else {"type": params.tool_mouse, "value": 'PRESS'}), + **(params.select_tweak_event if (fallback and params.use_fallback_tool_select_mouse) else + {"type": params.tool_mouse, "value": 'PRESS'}), properties=[("wait_for_input", False)])), # No selection fallback since this operates on press. ]}, @@ -6310,7 +6323,8 @@ def km_image_editor_tool_uv_select_lasso(params, *, fallback): {"items": [ *([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions_simple( "uv.select_lasso", - **(params.select_tweak_event if fallback else params.tool_tweak_event))), + **(params.select_tweak_event if (fallback and params.use_fallback_tool_select_mouse) else + params.tool_tweak_event))), ]}, ) @@ -6402,7 +6416,8 @@ def km_node_editor_tool_select_box(params, *, fallback): *([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions_simple( "node.select_box", # Don't use `tool_maybe_tweak_event`, see comment for this slot. - **(params.select_tweak_event if fallback else params.tool_tweak_event), + **(params.select_tweak_event if (fallback and params.use_fallback_tool_select_mouse) else + params.tool_tweak_event), properties=[("tweak", True)], )), ]}, @@ -6415,7 +6430,9 @@ def km_node_editor_tool_select_lasso(params, *, fallback): {"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'}, {"items": [ *([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions_simple( - "node.select_lasso", **(params.select_tweak_event if fallback else params.tool_tweak_event), + "node.select_lasso", + **(params.select_tweak_event if (fallback and params.use_fallback_tool_select_mouse) else + params.tool_tweak_event), properties=[("tweak", True)])) ]}, ) @@ -6430,7 +6447,7 @@ def km_node_editor_tool_select_circle(params, *, fallback): "node.select_circle", # Why circle select should be used on tweak? # So that RMB or Shift-RMB is still able to set an element as active. - type=params.select_tweak if fallback else params.tool_mouse, + type=params.select_tweak if (fallback and params.use_fallback_tool_select_mouse) else params.tool_mouse, value='ANY' if fallback else 'PRESS', properties=[("wait_for_input", False)])), ]}, @@ -6484,7 +6501,8 @@ def km_3d_view_tool_select_box(params, *, fallback): *([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions( "view3d.select_box", # Don't use `tool_maybe_tweak_event`, see comment for this slot. - **(params.select_tweak_event if fallback else params.tool_tweak_event))), + **(params.select_tweak_event if (fallback and params.use_fallback_tool_select_mouse) else + params.tool_tweak_event))), ]}, ) @@ -6498,7 +6516,7 @@ def km_3d_view_tool_select_circle(params, *, fallback): "view3d.select_circle", # Why circle select should be used on tweak? # So that RMB or Shift-RMB is still able to set an element as active. - type=params.select_tweak if fallback else params.tool_mouse, + type=params.select_tweak if (fallback and params.use_fallback_tool_select_mouse) else params.tool_mouse, value='ANY' if fallback else 'PRESS', properties=[("wait_for_input", False)])), ]}, @@ -6512,7 +6530,8 @@ def km_3d_view_tool_select_lasso(params, *, fallback): {"items": [ *([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions( "view3d.select_lasso", - **(params.select_tweak_event if fallback else params.tool_tweak_event))), + **(params.select_tweak_event if (fallback and params.use_fallback_tool_select_mouse) else + params.tool_tweak_event))), ]} ) @@ -7394,7 +7413,8 @@ def km_3d_view_tool_edit_gpencil_select_box(params, *, fallback): *([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions( "gpencil.select_box", # Don't use `tool_maybe_tweak_event`, see comment for this slot. - **(params.select_tweak_event if fallback else params.tool_tweak_event))), + **(params.select_tweak_event if (fallback and params.use_fallback_tool_select_mouse) else + params.tool_tweak_event))), ]}, ) @@ -7408,7 +7428,7 @@ def km_3d_view_tool_edit_gpencil_select_circle(params, *, fallback): "gpencil.select_circle", # Why circle select should be used on tweak? # So that RMB or Shift-RMB is still able to set an element as active. - type=params.select_tweak if fallback else params.tool_mouse, + type=params.select_tweak if (fallback and params.use_fallback_tool_select_mouse) else params.tool_mouse, value='ANY' if fallback else 'PRESS', properties=[("wait_for_input", False)])), ]}, @@ -7422,7 +7442,8 @@ def km_3d_view_tool_edit_gpencil_select_lasso(params, *, fallback): {"items": [ *([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions( "gpencil.select_lasso", - **(params.select_tweak_event if fallback else params.tool_tweak_event))), + **(params.select_tweak_event if (fallback and params.use_fallback_tool_select_mouse) else + params.tool_tweak_event))), ]} ) @@ -7573,7 +7594,8 @@ def km_sequencer_editor_tool_generic_select_box(params, *, fallback): # Don't use `tool_maybe_tweak_event`, see comment for this slot. *([] if (fallback and not params.use_fallback_tool) else _template_items_tool_select_actions_simple( "sequencer.select_box", - **(params.select_tweak_event if fallback else params.tool_tweak_event), + **(params.select_tweak_event if (fallback and params.use_fallback_tool_select_mouse) else + params.tool_tweak_event), properties=[("tweak", params.select_mouse == 'LEFTMOUSE')])), # RMB select can already set the frame, match the tweak tool. diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py index ce8bfa3b058..bb85ad8ca50 100644 --- a/release/scripts/startup/bl_operators/wm.py +++ b/release/scripts/startup/bl_operators/wm.py @@ -2961,93 +2961,75 @@ class WM_MT_splash_quick_setup(Menu): bl_label = "Quick Setup" def draw(self, context): - wm = context.window_manager - # prefs = context.preferences - layout = self.layout - layout.operator_context = 'EXEC_DEFAULT' layout.label(text="Quick Setup") - split = layout.split(factor=0.25) + split = layout.split(factor=0.14) # Left margin. split.label() - split = split.split(factor=2.0 / 3.0) + split = split.split(factor=0.73) # Content width. col = split.column() + col.use_property_split = True + col.use_property_decorate = False + + # Languages. if bpy.app.build_options.international: - sub = col.split(factor=0.35) - row = sub.row() - row.alignment = 'RIGHT' - row.label(text="Language") prefs = context.preferences - sub.prop(prefs.view, "language", text="") + col.prop(prefs.view, "language") + col.separator() - col.separator() + # Shortcuts. + wm = context.window_manager + kc = wm.keyconfigs.active + kc_prefs = kc.preferences - sub = col.split(factor=0.35) - row = sub.row() - row.alignment = 'RIGHT' - row.label(text="Shortcuts") - text = bpy.path.display_name(wm.keyconfigs.active.name) + sub = col.column(heading="Shortcuts") + text = bpy.path.display_name(kc.name) if not text: text = "Blender" sub.menu("USERPREF_MT_keyconfigs", text=text) - kc = wm.keyconfigs.active - kc_prefs = kc.preferences has_select_mouse = hasattr(kc_prefs, "select_mouse") if has_select_mouse: - sub = col.split(factor=0.35) - row = sub.row() - row.alignment = 'RIGHT' - row.label(text="Select With") - sub.row().prop(kc_prefs, "select_mouse", expand=True) - has_select_mouse = True + col.row().prop(kc_prefs, "select_mouse", text="Select With", expand=True) has_spacebar_action = hasattr(kc_prefs, "spacebar_action") if has_spacebar_action: - sub = col.split(factor=0.35) - row = sub.row() - row.alignment = 'RIGHT' - row.label(text="Spacebar") - sub.row().prop(kc_prefs, "spacebar_action", expand=True) - has_select_mouse = True + col.row().prop(kc_prefs, "spacebar_action", text="Spacebar") col.separator() - sub = col.split(factor=0.35) - row = sub.row() - row.alignment = 'RIGHT' - row.label(text="Theme") + # Themes. + sub = col.column(heading="Theme") label = bpy.types.USERPREF_MT_interface_theme_presets.bl_label if label == "Presets": label = "Blender Dark" sub.menu("USERPREF_MT_interface_theme_presets", text=label) - # Keep height constant + # Keep height constant. if not has_select_mouse: col.label() if not has_spacebar_action: col.label() - layout.label() + layout.separator(factor=2.0) - row = layout.row() + # Save settings buttons. + sub = layout.row() - sub = row.row() old_version = bpy.types.PREFERENCES_OT_copy_prev.previous_version() if bpy.types.PREFERENCES_OT_copy_prev.poll(context) and old_version: - sub.operator("preferences.copy_prev", text=iface_("Load %d.%d Settings", "Operator") % old_version) + sub.operator("preferences.copy_prev", text="Load %d.%d Settings" % old_version) sub.operator("wm.save_userpref", text="Save New Settings") else: sub.label() sub.label() sub.operator("wm.save_userpref", text="Next") - layout.separator() - layout.separator() + layout.separator(factor=2.4) class WM_MT_splash(Menu): diff --git a/release/scripts/startup/bl_ui/__init__.py b/release/scripts/startup/bl_ui/__init__.py index 1fb40ad8bc8..7c254596683 100644 --- a/release/scripts/startup/bl_ui/__init__.py +++ b/release/scripts/startup/bl_ui/__init__.py @@ -33,9 +33,9 @@ _modules = [ "properties_data_bone", "properties_data_camera", "properties_data_curve", + "properties_data_curves", "properties_data_empty", "properties_data_gpencil", - "properties_data_hair", "properties_data_light", "properties_data_lattice", "properties_data_mesh", diff --git a/release/scripts/startup/bl_ui/properties_data_armature.py b/release/scripts/startup/bl_ui/properties_data_armature.py index 22f3d1a9c50..2a6bd53bff5 100644 --- a/release/scripts/startup/bl_ui/properties_data_armature.py +++ b/release/scripts/startup/bl_ui/properties_data_armature.py @@ -149,7 +149,7 @@ class DATA_PT_bone_groups(ArmatureButtonsPanel, Panel): col.operator("pose.group_move", icon='TRIA_DOWN', text="").direction = 'DOWN' split = layout.split() - split.active = (ob.proxy is None) + split.active = True col = split.column() col.prop(group, "color_set") diff --git a/release/scripts/startup/bl_ui/properties_data_hair.py b/release/scripts/startup/bl_ui/properties_data_curves.py index 7f95fad9a9e..0b4bf0283ed 100644 --- a/release/scripts/startup/bl_ui/properties_data_hair.py +++ b/release/scripts/startup/bl_ui/properties_data_curves.py @@ -30,10 +30,10 @@ class DataButtonsPanel: @classmethod def poll(cls, context): engine = context.scene.render.engine - return hasattr(context, 'hair') and context.hair and (engine in cls.COMPAT_ENGINES) + return hasattr(context, 'curves') and context.curves and (engine in cls.COMPAT_ENGINES) -class DATA_PT_context_hair(DataButtonsPanel, Panel): +class DATA_PT_context_curves(DataButtonsPanel, Panel): bl_label = "" bl_options = {'HIDE_HEADER'} COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_WORKBENCH'} @@ -42,21 +42,21 @@ class DATA_PT_context_hair(DataButtonsPanel, Panel): layout = self.layout ob = context.object - hair = context.hair + curves = context.curves space = context.space_data if ob: layout.template_ID(ob, "data") - elif hair: + elif curves: layout.template_ID(space, "pin_id") -class HAIR_MT_add_attribute(Menu): +class CURVES_MT_add_attribute(Menu): bl_label = "Add Attribute" @staticmethod - def add_standard_attribute(layout, hair, name, data_type, domain): - exists = hair.attributes.get(name) is not None + def add_standard_attribute(layout, curves, name, data_type, domain): + exists = curves.attributes.get(name) is not None col = layout.column() col.enabled = not exists @@ -69,10 +69,10 @@ class HAIR_MT_add_attribute(Menu): def draw(self, context): layout = self.layout - hair = context.hair + curves = context.curves - self.add_standard_attribute(layout, hair, 'Radius', 'FLOAT', 'POINT') - self.add_standard_attribute(layout, hair, 'Color', 'FLOAT_COLOR', 'POINT') + self.add_standard_attribute(layout, curves, 'radius', 'FLOAT', 'POINT') + self.add_standard_attribute(layout, curves, 'color', 'FLOAT_COLOR', 'POINT') layout.separator() @@ -80,7 +80,7 @@ class HAIR_MT_add_attribute(Menu): layout.operator("geometry.attribute_add", text="Custom...") -class HAIR_UL_attributes(UIList): +class CURVES_UL_attributes(UIList): def draw_item(self, _context, layout, _data, attribute, _icon, _active_data, _active_propname, _index): data_type = attribute.bl_rna.properties['data_type'].enum_items[attribute.data_type] domain = attribute.bl_rna.properties['domain'].enum_items[attribute.domain] @@ -96,44 +96,44 @@ class HAIR_UL_attributes(UIList): sub.label(text=data_type.name) -class DATA_PT_hair_attributes(DataButtonsPanel, Panel): +class DATA_PT_CURVES_attributes(DataButtonsPanel, Panel): bl_label = "Attributes" COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_WORKBENCH'} def draw(self, context): - hair = context.hair + curves = context.curves layout = self.layout row = layout.row() col = row.column() col.template_list( - "HAIR_UL_attributes", + "CURVES_UL_attributes", "attributes", - hair, + curves, "attributes", - hair.attributes, + curves.attributes, "active_index", rows=3, ) col = row.column(align=True) - col.menu("HAIR_MT_add_attribute", icon='ADD', text="") + col.menu("CURVES_MT_add_attribute", icon='ADD', text="") col.operator("geometry.attribute_remove", icon='REMOVE', text="") -class DATA_PT_custom_props_hair(DataButtonsPanel, PropertyPanel, Panel): +class DATA_PT_custom_props_curves(DataButtonsPanel, PropertyPanel, Panel): COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_WORKBENCH'} _context_path = "object.data" - _property_type = bpy.types.Hair if hasattr(bpy.types, "Hair") else None + _property_type = bpy.types.Curves if hasattr(bpy.types, "Curves") else None classes = ( - DATA_PT_context_hair, - DATA_PT_hair_attributes, - DATA_PT_custom_props_hair, - HAIR_MT_add_attribute, - HAIR_UL_attributes, + DATA_PT_context_curves, + DATA_PT_CURVES_attributes, + DATA_PT_custom_props_curves, + CURVES_MT_add_attribute, + CURVES_UL_attributes, ) if __name__ == "__main__": # only for live edit. diff --git a/release/scripts/startup/bl_ui/space_dopesheet.py b/release/scripts/startup/bl_ui/space_dopesheet.py index 18dfa4da6c6..99edbe647e2 100644 --- a/release/scripts/startup/bl_ui/space_dopesheet.py +++ b/release/scripts/startup/bl_ui/space_dopesheet.py @@ -127,8 +127,8 @@ class DopesheetFilterPopoverBase: flow.prop(dopesheet, "show_lattices", text="Lattices") if bpy.data.metaballs: flow.prop(dopesheet, "show_metaballs", text="Metaballs") - if hasattr(bpy.data, "hairs") and bpy.data.hairs: - flow.prop(dopesheet, "show_hairs", text="Hairs") + if hasattr(bpy.data, "hair_curves") and bpy.data.hair_curves: + flow.prop(dopesheet, "show_hair_curves", text="Hair Curves") if hasattr(bpy.data, "pointclouds") and bpy.data.pointclouds: flow.prop(dopesheet, "show_pointclouds", text="Point Clouds") if bpy.data.volumes: diff --git a/release/scripts/startup/bl_ui/space_filebrowser.py b/release/scripts/startup/bl_ui/space_filebrowser.py index 731a220848e..50005a8f7f0 100644 --- a/release/scripts/startup/bl_ui/space_filebrowser.py +++ b/release/scripts/startup/bl_ui/space_filebrowser.py @@ -761,6 +761,15 @@ class ASSETBROWSER_PT_metadata_preview(asset_utils.AssetMetaDataPanel, Panel): col.operator("ed.lib_id_load_custom_preview", icon='FILEBROWSER', text="") col.separator() col.operator("ed.lib_id_generate_preview", icon='FILE_REFRESH', text="") + col.menu("ASSETBROWSER_MT_metadata_preview_menu", icon='DOWNARROW_HLT', text="") + + +class ASSETBROWSER_MT_metadata_preview_menu(bpy.types.Menu): + bl_label = "Preview" + + def draw(self, context): + layout = self.layout + layout.operator("ed.lib_id_generate_preview_from_object", text="Render Active Object") class ASSETBROWSER_PT_metadata_tags(asset_utils.AssetMetaDataPanel, Panel): @@ -840,6 +849,7 @@ classes = ( ASSETBROWSER_MT_view, ASSETBROWSER_MT_select, ASSETBROWSER_MT_edit, + ASSETBROWSER_MT_metadata_preview_menu, ASSETBROWSER_PT_metadata, ASSETBROWSER_PT_metadata_preview, ASSETBROWSER_PT_metadata_tags, diff --git a/release/scripts/startup/bl_ui/space_graph.py b/release/scripts/startup/bl_ui/space_graph.py index a9f2b9e9a36..db0020b7846 100644 --- a/release/scripts/startup/bl_ui/space_graph.py +++ b/release/scripts/startup/bl_ui/space_graph.py @@ -335,6 +335,7 @@ class GRAPH_MT_key_snap(Menu): layout.operator("graph.snap", text="Selection to Nearest Second").type = 'NEAREST_SECOND' layout.operator("graph.snap", text="Selection to Nearest Marker").type = 'NEAREST_MARKER' layout.operator("graph.snap", text="Flatten Handles").type = 'HORIZONTAL' + layout.operator("graph.equalize_handles", text="Equalize Handles").side = 'BOTH' layout.separator() layout.operator("graph.frame_jump", text="Cursor to Selection") layout.operator("graph.snap_cursor_value", text="Cursor Value to Selection") diff --git a/release/scripts/startup/bl_ui/space_nla.py b/release/scripts/startup/bl_ui/space_nla.py index 2db2b11a5f9..78c312fd03d 100644 --- a/release/scripts/startup/bl_ui/space_nla.py +++ b/release/scripts/startup/bl_ui/space_nla.py @@ -291,6 +291,9 @@ class NLA_MT_context_menu(Menu): layout.separator() + props = layout.operator("wm.call_panel", text="Rename...") + props.name = "TOPBAR_PT_name" + props.keep_open = False layout.operator("nla.duplicate", text="Duplicate").linked = False layout.operator("nla.duplicate", text="Linked Duplicate").linked = True diff --git a/release/scripts/startup/bl_ui/space_outliner.py b/release/scripts/startup/bl_ui/space_outliner.py index d85538a37e0..6cc80c088e0 100644 --- a/release/scripts/startup/bl_ui/space_outliner.py +++ b/release/scripts/startup/bl_ui/space_outliner.py @@ -448,7 +448,7 @@ class OUTLINER_PT_filter(Panel): if ( bpy.data.curves or bpy.data.metaballs or - (hasattr(bpy.data, "hairs") and bpy.data.hairs) or + (hasattr(bpy.data, "hair_curves") and bpy.data.hair_curves) or (hasattr(bpy.data, "pointclouds") and bpy.data.pointclouds) or bpy.data.volumes or bpy.data.lightprobes or diff --git a/release/scripts/startup/bl_ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py index 6035170f9df..9c77529229b 100644 --- a/release/scripts/startup/bl_ui/space_sequencer.py +++ b/release/scripts/startup/bl_ui/space_sequencer.py @@ -2028,6 +2028,9 @@ class SEQUENCER_PT_adjust_transform(SequencerButtonsPanel, Panel): layout.active = not strip.mute col = layout.column(align=True) + col.prop(strip.transform, "filter", text="Filter") + + col = layout.column(align=True) col.prop(strip.transform, "offset_x", text="Position X") col.prop(strip.transform, "offset_y", text="Y") diff --git a/release/scripts/startup/bl_ui/space_topbar.py b/release/scripts/startup/bl_ui/space_topbar.py index 99abc60db6f..ce854155b88 100644 --- a/release/scripts/startup/bl_ui/space_topbar.py +++ b/release/scripts/startup/bl_ui/space_topbar.py @@ -481,7 +481,7 @@ class TOPBAR_MT_file_export(Menu): bl_owner_use_filter = False def draw(self, _context): - self.layout.operator("wm.obj_export", text="Wavefront OBJ (.obj) - New") + self.layout.operator("wm.obj_export", text="Wavefront OBJ (.obj)") if bpy.app.build_options.collada: self.layout.operator("wm.collada_export", text="Collada (Default) (.dae)") @@ -832,6 +832,14 @@ class TOPBAR_PT_name(Panel): row = row_with_icon(layout, 'NODE') row.prop(item, "label", text="") found = True + elif space_type == 'NLA_EDITOR': + layout.label(text="NLA Strip Name") + item = next( + (strip for strip in context.selected_nla_strips if strip.active), None) + if item: + row = row_with_icon(layout, 'NLA') + row.prop(item, "name", text="") + found = True else: if mode == 'POSE' or (mode == 'WEIGHT_PAINT' and context.pose_object): layout.label(text="Bone Name") diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py index 0548486c786..26b4229690f 100644 --- a/release/scripts/startup/bl_ui/space_userpref.py +++ b/release/scripts/startup/bl_ui/space_userpref.py @@ -2295,7 +2295,7 @@ class USERPREF_PT_experimental_prototypes(ExperimentalPanel, Panel): def draw(self, context): self._draw_items( context, ( - ({"property": "use_new_hair_type"}, "T68981"), + ({"property": "use_new_curves_type"}, "T68981"), ({"property": "use_new_point_cloud_type"}, "T75717"), ({"property": "use_full_frame_compositor"}, "T88150"), ), @@ -2316,7 +2316,6 @@ class USERPREF_PT_experimental_debugging(ExperimentalPanel, Panel): context, ( ({"property": "use_undo_legacy"}, "T60695"), ({"property": "override_auto_resync"}, "T83811"), - ({"property": "proxy_to_override_auto_conversion"}, "T91671"), ({"property": "use_cycles_debug"}, None), ({"property": "use_geometry_nodes_legacy"}, "T91274"), ({"property": "show_asset_debug_info"}, None), diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index 5eca606216e..ea7a1885369 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -2148,8 +2148,8 @@ class VIEW3D_MT_add(Menu): layout.menu("VIEW3D_MT_surface_add", icon='OUTLINER_OB_SURFACE') layout.menu("VIEW3D_MT_metaball_add", text="Metaball", icon='OUTLINER_OB_META') layout.operator("object.text_add", text="Text", icon='OUTLINER_OB_FONT') - if context.preferences.experimental.use_new_hair_type: - layout.operator("object.hair_add", text="Hair", icon='OUTLINER_OB_HAIR') + if context.preferences.experimental.use_new_curves_type: + layout.operator("object.hair_curves_add", text="Hair Curves", icon='OUTLINER_OB_CURVES') if context.preferences.experimental.use_new_point_cloud_type: layout.operator("object.pointcloud_add", text="Point Cloud", icon='OUTLINER_OB_POINTCLOUD') layout.menu("VIEW3D_MT_volume_add", text="Volume", icon='OUTLINER_OB_VOLUME') @@ -2228,8 +2228,6 @@ class VIEW3D_MT_object_relations(Menu): layout.operator("object.make_override_library", text="Make Library Override...") - layout.operator("object.convert_proxy_to_override") - layout.operator("object.make_dupli_face") layout.separator() diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py index 92e5eb91da6..4b48f5f0680 100644 --- a/release/scripts/startup/nodeitems_builtins.py +++ b/release/scripts/startup/nodeitems_builtins.py @@ -181,6 +181,7 @@ def geometry_node_items(context): yield NodeItem("GeometryNodeConvexHull") yield NodeItem("GeometryNodeDeleteGeometry") yield NodeItem("GeometryNodeGeometryToInstance") + yield NodeItem("GeometryNodeMergeByDistance") yield NodeItem("GeometryNodeProximity") yield NodeItem("GeometryNodeJoinGeometry") yield NodeItem("GeometryNodeRaycast") @@ -390,6 +391,7 @@ shader_node_categories = [ NodeItem("ShaderNodeAmbientOcclusion"), NodeItem("ShaderNodeObjectInfo"), NodeItem("ShaderNodeHairInfo"), + NodeItem("ShaderNodePointInfo"), NodeItem("ShaderNodeVolumeInfo"), NodeItem("ShaderNodeParticleInfo"), NodeItem("ShaderNodeCameraData"), @@ -545,6 +547,8 @@ compositor_node_categories = [ NodeItem("CompositorNodeCombYUVA"), NodeItem("CompositorNodeSepYCCA"), NodeItem("CompositorNodeCombYCCA"), + NodeItem("CompositorNodeSeparateXYZ"), + NodeItem("CompositorNodeCombineXYZ"), NodeItem("CompositorNodeSwitchView"), NodeItem("CompositorNodeConvertColorSpace"), ]), |