diff options
Diffstat (limited to 'release/scripts')
17 files changed, 106 insertions, 69 deletions
diff --git a/release/scripts/addons b/release/scripts/addons -Subproject f2a08d80ccd3c13af304525778df3905f95bd44 +Subproject b3c179b2869d86c44a4b29e2c638ce2a596a820 diff --git a/release/scripts/freestyle/modules/parameter_editor.py b/release/scripts/freestyle/modules/parameter_editor.py index 65eee93c871..ed5b57af689 100644 --- a/release/scripts/freestyle/modules/parameter_editor.py +++ b/release/scripts/freestyle/modules/parameter_editor.py @@ -166,7 +166,7 @@ class ScalarBlendModifier(StrokeShader): v1 = facm * v1 + fac * v1 / v2 if v2 != 0.0 else v1 elif self.blend_type == 'DIFFERENCE': v1 = facm * v1 + fac * abs(v1 - v2) - elif self.blend_type == 'MININUM': + elif self.blend_type == 'MINIMUM': v1 = min(fac * v2, v1) elif self.blend_type == 'MAXIMUM': v1 = max(fac * v2, v1) diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py index dbc93cb6caa..543742709ef 100644 --- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py +++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py @@ -2147,7 +2147,7 @@ def km_file_browser(params): ("file.next", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True}, None), # The two refresh operators have polls excluding each other (so only one is available depending on context). ("file.refresh", {"type": 'R', "value": 'PRESS'}, None), - ("file.asset_library_refresh", {"type": 'R', "value": 'PRESS'}, None), + ("asset.library_refresh", {"type": 'R', "value": 'PRESS'}, None), ("file.parent", {"type": 'P', "value": 'PRESS'}, None), ("file.previous", {"type": 'BACK_SPACE', "value": 'PRESS'}, None), ("file.next", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True}, None), @@ -7557,7 +7557,7 @@ def km_sequencer_editor_tool_generic_select(params, *, fallback): params, "sequencer.select", "sequencer.cursor_set", extend="toggle")), *([] if (not params.use_fallback_tool_rmb) else _template_sequencer_preview_select( - type=params.select_mouse, value=params.select_mouse_value_fallback, legacy=params.legacy)), + type=params.select_mouse, value=params.select_mouse_value, legacy=params.legacy)), # Ignored for preview. *_template_items_change_frame(params), ]}, diff --git a/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py b/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py index 37cd554e872..3019322d340 100644 --- a/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py +++ b/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py @@ -1229,7 +1229,7 @@ def km_file_browser(params): ("file.next", {"type": 'RIGHT_ARROW', "value": 'PRESS', "ctrl": True}, None), # The two refresh operators have polls excluding each other (so only one is available depending on context). ("file.refresh", {"type": 'R', "value": 'PRESS', "ctrl": True}, None), - ("file.asset_library_refresh", {"type": 'R', "value": 'PRESS', "ctrl": True}, None), + ("asset.library_refresh", {"type": 'R', "value": 'PRESS', "ctrl": True}, None), ("file.previous", {"type": 'BACK_SPACE', "value": 'PRESS'}, None), ("file.next", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True}, None), ("wm.context_toggle", {"type": 'H', "value": 'PRESS'}, @@ -1276,7 +1276,7 @@ def km_file_browser_main(params): ("file.mouse_execute", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None), # The two refresh operators have polls excluding each other (so only one is available depending on context). ("file.refresh", {"type": 'R', "value": 'PRESS', "ctrl": True}, None), - ("file.asset_library_refresh", {"type": 'R', "value": 'PRESS', "ctrl": True}, None), + ("asset.library_refresh", {"type": 'R', "value": 'PRESS', "ctrl": True}, None), ("file.select", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None), ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK'}, {"properties": [("open", False), ("deselect_all", True)]}), diff --git a/release/scripts/startup/bl_operators/assets.py b/release/scripts/startup/bl_operators/assets.py index 58f02201905..32e63f77b23 100644 --- a/release/scripts/startup/bl_operators/assets.py +++ b/release/scripts/startup/bl_operators/assets.py @@ -142,14 +142,8 @@ class ASSET_OT_open_containing_blend_file(Operator): if returncode: self.report({'WARNING'}, "Blender sub-process exited with error code %d" % returncode) - # TODO(Sybren): Replace this with a generic "reload assets" operator - # that can run outside of the Asset Browser context. - if bpy.ops.file.refresh.poll(): - bpy.ops.file.refresh() - if bpy.ops.asset.list_refresh.poll(): - bpy.ops.asset.list_refresh() - if bpy.ops.file.asset_library_refresh.poll(): - bpy.ops.file.asset_library_refresh() + if bpy.ops.asset.library_refresh.poll(): + bpy.ops.asset.library_refresh() self.cancel(context) return {'FINISHED'} diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py index d9ea991f976..a2f482d1a55 100644 --- a/release/scripts/startup/bl_operators/wm.py +++ b/release/scripts/startup/bl_operators/wm.py @@ -2970,7 +2970,7 @@ class WM_MT_splash_quick_setup(Menu): 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="Load %d.%d Settings" % old_version) + sub.operator("preferences.copy_prev", text=iface_("Load %d.%d Settings", "Operator") % old_version) sub.operator("wm.save_userpref", text="Save New Settings") else: sub.label() diff --git a/release/scripts/startup/bl_ui/properties_data_camera.py b/release/scripts/startup/bl_ui/properties_data_camera.py index b56182bb637..edd0623d8fe 100644 --- a/release/scripts/startup/bl_ui/properties_data_camera.py +++ b/release/scripts/startup/bl_ui/properties_data_camera.py @@ -110,6 +110,14 @@ class DATA_PT_lens(CameraButtonsPanel, Panel): sub = col.column(align=True) sub.prop(ccam, "longitude_min", text="Longitude Min") sub.prop(ccam, "longitude_max", text="Max") + elif ccam.panorama_type == 'FISHEYE_LENS_POLYNOMIAL': + col.prop(ccam, "fisheye_fov") + col.prop(ccam, "fisheye_polynomial_k0", text="K0") + col.prop(ccam, "fisheye_polynomial_k1", text="K1") + col.prop(ccam, "fisheye_polynomial_k2", text="K2") + col.prop(ccam, "fisheye_polynomial_k3", text="K3") + col.prop(ccam, "fisheye_polynomial_k4", text="K4") + elif engine in {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_WORKBENCH'}: if cam.lens_unit == 'MILLIMETERS': col.prop(cam, "lens") diff --git a/release/scripts/startup/bl_ui/space_dopesheet.py b/release/scripts/startup/bl_ui/space_dopesheet.py index 9b8f1cfeb0d..3c90e0c96cc 100644 --- a/release/scripts/startup/bl_ui/space_dopesheet.py +++ b/release/scripts/startup/bl_ui/space_dopesheet.py @@ -539,6 +539,39 @@ class DOPESHEET_MT_key_transform(Menu): layout.operator("transform.transform", text="Scale").mode = 'TIME_SCALE' +class DopesheetActionPanelBase: + bl_region_type = 'UI' + bl_label = "Action" + + @classmethod + def draw_generic_panel(cls, context, layout, action): + layout.label(text=action.name, icon='ACTION') + + layout.prop(action, "use_frame_range") + + col = layout.column() + col.active = action.use_frame_range + + row = col.row(align=True) + row.prop(action, "frame_start", text="Start") + row.prop(action, "frame_end", text="End") + + col.prop(action, "use_cyclic") + + +class DOPESHEET_PT_action(DopesheetActionPanelBase, Panel): + bl_space_type = 'DOPESHEET_EDITOR' + bl_category = "Item" + + @classmethod + def poll(cls, context): + return bool(context.selected_visible_actions) + + def draw(self, context): + action = context.selected_visible_actions[0] + self.draw_generic_panel(context, self.layout, action) + + ####################################### # Grease Pencil Editing @@ -792,6 +825,7 @@ classes = ( DOPESHEET_MT_snap_pie, DOPESHEET_MT_view_pie, DOPESHEET_PT_filters, + DOPESHEET_PT_action, DOPESHEET_PT_gpencil_mode, DOPESHEET_PT_gpencil_layer_masks, DOPESHEET_PT_gpencil_layer_transform, diff --git a/release/scripts/startup/bl_ui/space_filebrowser.py b/release/scripts/startup/bl_ui/space_filebrowser.py index f601c795660..e33cf8d6cfb 100644 --- a/release/scripts/startup/bl_ui/space_filebrowser.py +++ b/release/scripts/startup/bl_ui/space_filebrowser.py @@ -404,7 +404,13 @@ class FILEBROWSER_PT_advanced_filter(Panel): def is_option_region_visible(context, space): - if not space.active_operator: + from bpy_extras.asset_utils import SpaceAssetInfo + + if SpaceAssetInfo.is_asset_browser(space): + pass + # For the File Browser, there must be an operator for there to be options + # (irrelevant for the Asset Browser). + elif not space.active_operator: return False for region in context.area.regions: @@ -701,7 +707,7 @@ class ASSETBROWSER_PT_metadata(asset_utils.AssetBrowserPanel, Panel): asset_file_handle = context.asset_file_handle if asset_file_handle is None: - layout.label(text="No asset selected", icon='INFO') + layout.label(text="No active asset", icon='INFO') return asset_library_ref = context.asset_library_ref @@ -793,7 +799,7 @@ class ASSETBROWSER_MT_context_menu(AssetBrowserMenu, Menu): st = context.space_data params = st.params - layout.operator("file.asset_library_refresh") + layout.operator("asset.library_refresh") layout.separator() diff --git a/release/scripts/startup/bl_ui/space_nla.py b/release/scripts/startup/bl_ui/space_nla.py index 9507d8296a9..62c02799a9f 100644 --- a/release/scripts/startup/bl_ui/space_nla.py +++ b/release/scripts/startup/bl_ui/space_nla.py @@ -22,6 +22,7 @@ from bpy.types import Header, Menu, Panel from bpy.app.translations import contexts as i18n_contexts from bl_ui.space_dopesheet import ( DopesheetFilterPopoverBase, + DopesheetActionPanelBase, dopesheet_filter, ) @@ -66,6 +67,21 @@ class NLA_PT_filters(DopesheetFilterPopoverBase, Panel): DopesheetFilterPopoverBase.draw_standard_filters(context, layout) +class NLA_PT_action(DopesheetActionPanelBase, Panel): + bl_space_type = 'NLA_EDITOR' + bl_category = "Strip" + bl_options = {'DEFAULT_CLOSED'} + + @classmethod + def poll(cls, context): + strip = context.active_nla_strip + return strip and strip.type == 'CLIP' and strip.action + + def draw(self, context): + action = context.active_nla_strip.action + self.draw_generic_panel(context, self.layout, action) + + class NLA_MT_editor_menus(Menu): bl_idname = "NLA_MT_editor_menus" bl_label = "" @@ -316,6 +332,7 @@ classes = ( NLA_MT_context_menu, NLA_MT_channel_context_menu, NLA_PT_filters, + NLA_PT_action, ) if __name__ == "__main__": # only for live edit. diff --git a/release/scripts/startup/bl_ui/space_node.py b/release/scripts/startup/bl_ui/space_node.py index 2b3f0cfbf7c..9bf812e036d 100644 --- a/release/scripts/startup/bl_ui/space_node.py +++ b/release/scripts/startup/bl_ui/space_node.py @@ -719,8 +719,13 @@ class NODE_PT_overlay(Panel): col.separator() + col.prop(overlay, "show_context_path", text="Context Path") col.prop(snode, "show_annotation", text="Annotations") + if snode.tree_type == 'GeometryNodeTree': + col.separator() + col.prop(overlay, "show_timing", text="Timings") + class NODE_UL_interface_sockets(bpy.types.UIList): def draw_item(self, context, layout, _data, item, icon, _active_data, _active_propname, _index): diff --git a/release/scripts/startup/bl_ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py index 401ff9b64c2..a2ec5075a4d 100644 --- a/release/scripts/startup/bl_ui/space_sequencer.py +++ b/release/scripts/startup/bl_ui/space_sequencer.py @@ -41,7 +41,7 @@ def _space_view_types(st): view_type = st.view_type return ( view_type in {'SEQUENCER', 'SEQUENCER_PREVIEW'}, - view_type in {'PREVIEW', 'SEQUENCER_PREVIEW'}, + view_type == 'PREVIEW', ) @@ -196,10 +196,6 @@ class SEQUENCER_HT_header(Header): row = layout.row(align=True) row.prop(sequencer_tool_settings, "overlap_mode", text="") - if st.view_type == 'SEQUENCER_PREVIEW': - row = layout.row(align=True) - row.prop(sequencer_tool_settings, "pivot_point", text="", icon_only=True) - if st.view_type in {'SEQUENCER', 'SEQUENCER_PREVIEW'}: row = layout.row(align=True) row.prop(tool_settings, "use_snap_sequencer", text="") @@ -248,7 +244,8 @@ class SEQUENCER_MT_editor_menus(Menu): layout.menu("SEQUENCER_MT_strip") - layout.menu("SEQUENCER_MT_image") + if st.view_type in {'SEQUENCER', 'PREVIEW'}: + layout.menu("SEQUENCER_MT_image") class SEQUENCER_PT_gizmo_display(Panel): @@ -576,10 +573,6 @@ class SEQUENCER_MT_select(Menu): st = context.space_data has_sequencer, has_preview = _space_view_types(st) - # FIXME: this doesn't work for both preview + window region. - if has_preview: - layout.operator_context = 'INVOKE_REGION_PREVIEW' - layout.operator("sequencer.select_all", text="All").action = 'SELECT' layout.operator("sequencer.select_all", text="None").action = 'DESELECT' layout.operator("sequencer.select_all", text="Invert").action = 'INVERT' @@ -821,7 +814,6 @@ class SEQUENCER_MT_strip_transform(Menu): else: layout.operator_context = 'INVOKE_REGION_WIN' - # FIXME: mixed preview/sequencer views. if has_preview: layout.operator("transform.translate", text="Move") layout.operator("transform.rotate", text="Rotate") @@ -917,12 +909,6 @@ class SEQUENCER_MT_strip(Menu): st = context.space_data has_sequencer, has_preview = _space_view_types(st) - # FIXME: this doesn't work for both preview + window region. - if has_preview: - layout.operator_context = 'INVOKE_REGION_PREVIEW' - else: - layout.operator_context = 'INVOKE_REGION_WIN' - layout.menu("SEQUENCER_MT_strip_transform") layout.separator() diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py index 2253dfa5f5d..889155f1858 100644 --- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py +++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py @@ -3153,14 +3153,7 @@ class SEQUENCER_PT_tools_active(ToolSelectPanelHelper, Panel): ], 'SEQUENCER_PREVIEW': [ *_tools_select, - _defs_sequencer_generic.cursor, None, - _defs_sequencer_generic.translate, - _defs_sequencer_generic.rotate, - _defs_sequencer_generic.scale, - _defs_sequencer_generic.transform, - None, - _defs_sequencer_generic.sample, *_tools_annotate, None, _defs_sequencer_generic.blade, diff --git a/release/scripts/startup/bl_ui/space_topbar.py b/release/scripts/startup/bl_ui/space_topbar.py index 518979a5ef3..3137ac43549 100644 --- a/release/scripts/startup/bl_ui/space_topbar.py +++ b/release/scripts/startup/bl_ui/space_topbar.py @@ -588,7 +588,7 @@ class TOPBAR_MT_edit(Menu): layout.separator() - layout.operator("ed.undo_history", text="Undo History...") + layout.menu("TOPBAR_MT_undo_history") layout.separator() diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py index 5032256e4d1..6dbb964e771 100644 --- a/release/scripts/startup/bl_ui/space_userpref.py +++ b/release/scripts/startup/bl_ui/space_userpref.py @@ -596,9 +596,11 @@ class USERPREF_PT_system_cycles_devices(SystemPanel, CenterAlignMixIn, Panel): @classmethod def poll(cls, _context): - # No GPU rendering on macOS currently. + # No GPU rendering on macOS x86_64 currently. + import platform import sys - return bpy.app.build_options.cycles and sys.platform != "darwin" + return bpy.app.build_options.cycles and \ + (sys.platform != "darwin" or platform.machine() == "arm64") def draw_centered(self, context, layout): prefs = context.preferences @@ -1818,7 +1820,7 @@ class USERPREF_PT_addons(AddOnPanel, Panel): bl_options = {'HIDE_HEADER'} _support_icon_mapping = { - 'OFFICIAL': 'FILE_BLEND', + 'OFFICIAL': 'BLENDER', 'COMMUNITY': 'COMMUNITY', 'TESTING': 'EXPERIMENTAL', } @@ -1868,11 +1870,6 @@ class USERPREF_PT_addons(AddOnPanel, Panel): if p ) - # Development option for 2.8x, don't show users bundled addons - # unless they have been updated for 2.8x. - # Developers can turn them on with '--debug' - show_official_27x_addons = bpy.app.debug - # collect the categories that can be filtered on addons = [ (mod, addon_utils.module_bl_info(mod)) @@ -1949,15 +1946,6 @@ class USERPREF_PT_addons(AddOnPanel, Panel): ): continue - # Skip 2.7x add-ons included with Blender, unless in debug mode. - is_addon_27x = info.get("blender", (0,)) < (2, 80) - if ( - is_addon_27x and - (not show_official_27x_addons) and - (not mod.__file__.startswith(addon_user_dirs)) - ): - continue - # Addon UI Code col_box = col.column() box = col_box.box() @@ -1980,13 +1968,7 @@ class USERPREF_PT_addons(AddOnPanel, Panel): sub.active = is_enabled sub.label(text="%s: %s" % (info["category"], info["name"])) - # WARNING: 2.8x exception, may be removed - # use disabled state for old add-ons, chances are they are broken. - if is_addon_27x: - sub.label(text="Upgrade to 2.8x required") - sub.label(icon='ERROR') - # Remove code above after 2.8x migration is complete. - elif info["warning"]: + if info["warning"]: sub.label(icon='ERROR') # icon showing support level. diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py index acc3d933b85..01850676519 100644 --- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py +++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py @@ -689,7 +689,9 @@ class VIEW3D_PT_tools_brush_stroke_smooth_stroke(Panel, View3DPaintPanel, Smooth class VIEW3D_PT_tools_weight_gradient(Panel, View3DPaintPanel): - bl_context = ".weightpaint" # dot on purpose (access from topbar) + # dont give context on purpose to not show this in the generic header toolsettings + # this is added only in the gradient tool's ToolDef + #bl_context = ".weightpaint" # dot on purpose (access from topbar) bl_label = "Falloff" bl_options = {'DEFAULT_CLOSED'} diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py index 34f447a7108..c8ddd86a195 100644 --- a/release/scripts/startup/nodeitems_builtins.py +++ b/release/scripts/startup/nodeitems_builtins.py @@ -111,13 +111,13 @@ def curve_node_items(context): yield NodeItem("GeometryNodeTrimCurve") yield NodeItemCustom(draw=lambda self, layout, context: layout.separator()) yield NodeItem("GeometryNodeInputCurveHandlePositions") - yield NodeItem("GeometryNodeCurveParameter") yield NodeItem("GeometryNodeInputTangent") yield NodeItem("GeometryNodeInputCurveTilt") yield NodeItem("GeometryNodeCurveEndpointSelection") yield NodeItem("GeometryNodeCurveHandleTypeSelection") yield NodeItem("GeometryNodeInputSplineCyclic") yield NodeItem("GeometryNodeSplineLength") + yield NodeItem("GeometryNodeSplineParameter") yield NodeItem("GeometryNodeInputSplineResolution") yield NodeItemCustom(draw=lambda self, layout, context: layout.separator()) yield NodeItem("GeometryNodeSetCurveRadius") @@ -141,6 +141,7 @@ def mesh_node_items(context): yield NodeItem("GeometryNodeLegacySubdivisionSurface", poll=geometry_nodes_legacy_poll) yield NodeItemCustom(draw=lambda self, layout, context: layout.separator()) + yield NodeItem("GeometryNodeDualMesh") yield NodeItem("GeometryNodeMeshBoolean") yield NodeItem("GeometryNodeMeshToCurve") yield NodeItem("GeometryNodeMeshToPoints") @@ -149,7 +150,13 @@ def mesh_node_items(context): yield NodeItem("GeometryNodeSubdivisionSurface") yield NodeItem("GeometryNodeTriangulate") yield NodeItemCustom(draw=lambda self, layout, context: layout.separator()) + yield NodeItem("GeometryNodeInputMeshEdgeNeighbors") + yield NodeItem("GeometryNodeInputMeshEdgeVertices") + yield NodeItem("GeometryNodeInputMeshFaceArea") + yield NodeItem("GeometryNodeInputMeshFaceNeighbors") + yield NodeItem("GeometryNodeInputMeshIsland") yield NodeItem("GeometryNodeInputShadeSmooth") + yield NodeItem("GeometryNodeInputMeshVertexNeighbors") yield NodeItemCustom(draw=lambda self, layout, context: layout.separator()) yield NodeItem("GeometryNodeSetShadeSmooth") @@ -169,6 +176,7 @@ def geometry_node_items(context): yield NodeItem("GeometryNodeBoundBox") yield NodeItem("GeometryNodeConvexHull") yield NodeItem("GeometryNodeDeleteGeometry") + yield NodeItem("GeometryNodeGeometryToInstance") yield NodeItem("GeometryNodeProximity") yield NodeItem("GeometryNodeJoinGeometry") yield NodeItem("GeometryNodeRaycast") @@ -207,6 +215,7 @@ def geometry_input_node_items(context): yield NodeItem("GeometryNodeInputNormal") yield NodeItem("GeometryNodeInputPosition") yield NodeItem("GeometryNodeInputRadius") + yield NodeItem("GeometryNodeInputSceneTime") # Custom Menu for Material Nodes def geometry_material_node_items(context): @@ -675,6 +684,7 @@ geometry_node_categories = [ NodeItem("GeometryNodeAttributeRemove", poll=geometry_nodes_legacy_poll), NodeItem("GeometryNodeCaptureAttribute"), + NodeItem("GeometryNodeAttributeDomainSize"), NodeItem("GeometryNodeAttributeStatistic"), NodeItem("GeometryNodeAttributeTransfer"), ]), @@ -749,7 +759,7 @@ geometry_node_categories = [ NodeItem("ShaderNodeMath"), NodeItem("FunctionNodeBooleanMath"), NodeItem("FunctionNodeRotateEuler"), - NodeItem("FunctionNodeCompareFloats"), + NodeItem("FunctionNodeCompare"), NodeItem("FunctionNodeFloatToInt"), NodeItem("GeometryNodeSwitch"), NodeItem("FunctionNodeRandomValue"), |