diff options
author | Jacques Lucke <jacques@blender.org> | 2020-03-30 13:04:42 +0300 |
---|---|---|
committer | Jacques Lucke <jacques@blender.org> | 2020-03-30 13:04:42 +0300 |
commit | cd5f9516db8e1a74b60038cf16be6a5a3b99b729 (patch) | |
tree | d1f55d08b660675c5751c48707aaa2e209be2c35 /release | |
parent | 8ce5c50411e81c4cac0c72097739633188415574 (diff) | |
parent | 513885a9911841aed4d039f5170171e039a74c68 (diff) |
Merge branch 'master' into functions
Diffstat (limited to 'release')
27 files changed, 285 insertions, 94 deletions
diff --git a/release/datafiles/LICENSE-bmonofont-i18n.ttf.txt b/release/datafiles/LICENSE-bmonofont-i18n.ttf.txt index d972108816b..20ed51c8252 100644 --- a/release/datafiles/LICENSE-bmonofont-i18n.ttf.txt +++ b/release/datafiles/LICENSE-bmonofont-i18n.ttf.txt @@ -8,6 +8,9 @@ Blender Mono I18n font includes glyphs imported from the following fonts: These were merged using FontForge in the above order. For each glyph, a license of the font from which it was imported is applied. +Feb 2020 - Cyrillic unicode range (specifically U+400-U+0525) reimported +from current version of DejaVu Sans Mono. + ---------------------------------------------------------------------- Summary of Copyrights and Licenses diff --git a/release/datafiles/LICENSE-droidsans.ttf.txt b/release/datafiles/LICENSE-droidsans.ttf.txt index 6711ad37338..66eca9ca715 100644 --- a/release/datafiles/LICENSE-droidsans.ttf.txt +++ b/release/datafiles/LICENSE-droidsans.ttf.txt @@ -12,6 +12,9 @@ Blender Main I18n font ("droidsans.ttf") includes glyphs imported from the follo These were merged using FontForge in (approximately) the above order. For each glyph, a license of the font from which it was imported is applied. +Feb 2020 - Cyrillic unicode range (specifically U+400-U+0525) reimported +from current version of DejaVu Sans + ---------------------------------------------------------------------- Summary of Copyrights and Licenses diff --git a/release/datafiles/bfont.ttf b/release/datafiles/bfont.ttf Binary files differdeleted file mode 100644 index 7cb06a988ed..00000000000 --- a/release/datafiles/bfont.ttf +++ /dev/null diff --git a/release/datafiles/bmonofont.ttf b/release/datafiles/bmonofont.ttf Binary files differdeleted file mode 100644 index 06235dce116..00000000000 --- a/release/datafiles/bmonofont.ttf +++ /dev/null diff --git a/release/datafiles/fonts/bmonofont-i18n.ttf b/release/datafiles/fonts/bmonofont-i18n.ttf Binary files differnew file mode 100644 index 00000000000..658ec68f36c --- /dev/null +++ b/release/datafiles/fonts/bmonofont-i18n.ttf diff --git a/release/datafiles/fonts/bmonofont-i18n.ttf.gz b/release/datafiles/fonts/bmonofont-i18n.ttf.gz Binary files differdeleted file mode 100644 index 2c3e00d1c75..00000000000 --- a/release/datafiles/fonts/bmonofont-i18n.ttf.gz +++ /dev/null diff --git a/release/datafiles/fonts/droidsans.ttf b/release/datafiles/fonts/droidsans.ttf Binary files differnew file mode 100644 index 00000000000..04b1ece64ee --- /dev/null +++ b/release/datafiles/fonts/droidsans.ttf diff --git a/release/datafiles/fonts/droidsans.ttf.gz b/release/datafiles/fonts/droidsans.ttf.gz Binary files differdeleted file mode 100644 index 858264142f1..00000000000 --- a/release/datafiles/fonts/droidsans.ttf.gz +++ /dev/null diff --git a/release/datafiles/locale b/release/datafiles/locale -Subproject 34d98762cef85b9c065f21a051d1dbe3bf2979b +Subproject ad82c4ce43ef2801ef51e75af1f9702992478b0 diff --git a/release/datafiles/userdef/userdef_default_theme.c b/release/datafiles/userdef/userdef_default_theme.c index 099b20ced8d..de3583db2bb 100644 --- a/release/datafiles/userdef/userdef_default_theme.c +++ b/release/datafiles/userdef/userdef_default_theme.c @@ -240,6 +240,9 @@ const bTheme U_theme_default = { .editor_outline = RGBA(0x1f1f1fff), .icon_alpha = 1.0f, .icon_saturation = 0.5f, + .transparent_checker_primary = RGBA(0x333333ff), + .transparent_checker_secondary = RGBA(0x262626ff), + .transparent_checker_size = 8, .widget_text_cursor = RGBA(0x3399e6ff), .xaxis = RGBA(0xff3352ff), .yaxis = RGBA(0x8bdc00ff), @@ -309,7 +312,7 @@ const bTheme U_theme_default = { .wire = RGBA(0x000000ff), .wire_edit = RGBA(0x000000ff), .select = RGBA(0xed5700ff), - .lamp = RGBA(0x00000028), + .lamp = RGBA(0x00000050), .speaker = RGBA(0x000000ff), .empty = RGBA(0x000000ff), .camera = RGBA(0x000000ff), diff --git a/release/scripts/addons b/release/scripts/addons -Subproject 47a32a5370d36942674621e5a03e57e8dd4986d +Subproject 8e6f485cf5b160c425d7da7c743879b20f3d6a9 diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib -Subproject 70b649775eeeebedb02c1c7b7aa996a7f629417 +Subproject 7077ff07384491d1f7630484995557f1c7302da diff --git a/release/scripts/modules/bpy/utils/__init__.py b/release/scripts/modules/bpy/utils/__init__.py index 3d36f3eb510..19450bb38ec 100644 --- a/release/scripts/modules/bpy/utils/__init__.py +++ b/release/scripts/modules/bpy/utils/__init__.py @@ -830,9 +830,13 @@ def register_tool(tool_cls, *, after=None, separator=False, group=False): context_descr = context_mode.replace("_", " ").title() from bpy import context wm = context.window_manager - kc = wm.keyconfigs.default + keyconfigs = wm.keyconfigs + kc_default = keyconfigs.default + # Note that Blender's default tools use the default key-config for both. + # We need to use the add-ons for 3rd party tools so reloading the key-map doesn't clear them. + kc = keyconfigs.addon if callable(keymap_data[0]): - cls._km_action_simple(kc, context_descr, tool_def.label, keymap_data) + cls._km_action_simple(kc_default, kc, context_descr, tool_def.label, keymap_data) return tool_def tool_converted = tool_from_class(tool_cls) @@ -955,12 +959,13 @@ def unregister_tool(tool_cls): if keymap_data is not None: from bpy import context wm = context.window_manager - kc = wm.keyconfigs.default - km = kc.keymaps.get(keymap_data[0]) - if km is None: - print("Warning keymap {keymap_data[0]!r} not found!") - else: - kc.keymaps.remove(km) + keyconfigs = wm.keyconfigs + for kc in (keyconfigs.default, keyconfigs.addon): + km = kc.keymaps.get(keymap_data[0]) + if km is None: + print(f"Warning keymap {keymap_data[0]!r} not found in {kc.name!r}!") + else: + kc.keymaps.remove(km) # ----------------------------------------------------------------------------- diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py index f1c7e1a0976..bef054a1f1d 100644 --- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py +++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py @@ -4575,7 +4575,6 @@ def km_armature(params): ("armature.extrude_forked", {"type": 'E', "value": 'PRESS', "shift": True}, None), ("armature.click_extrude", {"type": params.action_mouse, "value": 'CLICK', "ctrl": True}, None), ("armature.fill", {"type": 'F', "value": 'PRESS'}, None), - ("armature.merge", {"type": 'M', "value": 'PRESS', "alt": True}, None), ("armature.split", {"type": 'Y', "value": 'PRESS'}, None), ("armature.separate", {"type": 'P', "value": 'PRESS'}, None), # Set flags. diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py index 335a2a633cd..6e3b883aa8a 100644 --- a/release/scripts/startup/bl_operators/wm.py +++ b/release/scripts/startup/bl_operators/wm.py @@ -1147,22 +1147,26 @@ rna_property = StringProperty( rna_min = FloatProperty( name="Min", + description="Minimum value of the property", default=-10000.0, precision=3, ) rna_max = FloatProperty( name="Max", + description="Maximum value of the property", default=10000.0, precision=3, ) rna_use_soft_limits = BoolProperty( name="Use Soft Limits", + description="Limits the Property Value slider to a range, values outside the range must be inputed numerically", ) rna_is_overridable_library = BoolProperty( name="Is Library Overridable", + description="Allow the property to be overridden when the Data-Block is linked", default=False, ) @@ -1177,6 +1181,7 @@ rna_vector_subtype_items = ( class WM_OT_properties_edit(Operator): + """Edit the attributes of the property""" bl_idname = "wm.properties_edit" bl_label = "Edit Property" # register only because invoke_props_popup requires. @@ -1468,6 +1473,7 @@ class WM_OT_properties_edit(Operator): class WM_OT_properties_add(Operator): + """Add your own property to the data-block""" bl_idname = "wm.properties_add" bl_label = "Add Property" bl_options = {'UNDO', 'INTERNAL'} diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py index 46073e19fda..3a3752bebf5 100644 --- a/release/scripts/startup/bl_ui/properties_data_modifier.py +++ b/release/scripts/startup/bl_ui/properties_data_modifier.py @@ -1072,6 +1072,17 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): row.active = md.use_rim row.prop(md, "material_offset_rim", text="Rim") + col.separator() + + row = col.row(align=True) + row.label(text="Shell Vertex Group:") + row = col.row(align=True) + row.prop_search(md, "shell_vertex_group", ob, "vertex_groups", text="") + row = col.row(align=True) + row.label(text="Rim Vertex Group:") + row = col.row(align=True) + row.prop_search(md, "rim_vertex_group", ob, "vertex_groups", text="") + def SUBSURF(self, layout, ob, md): from bpy import context layout.row().prop(md, "subdivision_type", expand=True) @@ -1130,13 +1141,24 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): layout.label(text="Settings are inside the Physics tab") def SURFACE_DEFORM(self, layout, _ob, md): - col = layout.column() + split = layout.split() + col = split.column() col.active = not md.is_bound - col.prop(md, "target") - col.prop(md, "falloff") + col.label(text="Target:") + col.prop(md, "target", text="") - layout.separator() + col = split.column() + col.label(text="Vertex Group:") + row = col.row(align=True) + row.prop_search(md, "vertex_group", _ob, "vertex_groups", text="") + row.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT') + + split = layout.split() + col = split.column() + col.prop(md, "falloff") + col = split.column() + col.prop(md, "strength") col = layout.column() @@ -1173,11 +1195,27 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): col.label(text="From:") col.prop(md, "object_from", text="") - col.prop(md, "use_volume_preserve") - col = split.column() col.label(text="To:") col.prop(md, "object_to", text="") + + split = layout.split() + col = split.column() + obj = md.object_from + if obj and obj.type == 'ARMATURE': + col.label(text="Bone:") + col.prop_search(md, "bone_from", obj.data, "bones", text="") + + col = split.column() + obj = md.object_to + if obj and obj.type == 'ARMATURE': + col.label(text="Bone:") + col.prop_search(md, "bone_to", obj.data, "bones", text="") + + split = layout.split() + col = split.column() + col.prop(md, "use_volume_preserve") + col = split.column() row = col.row(align=True) row.prop_search(md, "vertex_group", ob, "vertex_groups", text="") row.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT') @@ -1350,7 +1388,9 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): layout.separator() - layout.prop(md, "falloff_type") + row = layout.row(align=True) + row.prop(md, "falloff_type") + row.prop(md, "invert_falloff", text="", icon='ARROW_LEFTRIGHT') if md.falloff_type == 'CURVE': layout.template_curve_mapping(md, "map_curve") @@ -1408,7 +1448,9 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): col.prop(md, "max_dist") layout.separator() - layout.prop(md, "falloff_type") + row = layout.row(align=True) + row.prop(md, "falloff_type") + row.prop(md, "invert_falloff", text="", icon='ARROW_LEFTRIGHT') # Common mask options layout.separator() diff --git a/release/scripts/startup/bl_ui/properties_material.py b/release/scripts/startup/bl_ui/properties_material.py index 0849437b680..ab70c4c25c0 100644 --- a/release/scripts/startup/bl_ui/properties_material.py +++ b/release/scripts/startup/bl_ui/properties_material.py @@ -74,7 +74,7 @@ class MATERIAL_PT_preview(MaterialButtonsPanel, Panel): class MATERIAL_PT_custom_props(MaterialButtonsPanel, PropertyPanel, Panel): - COMPAT_ENGINES = {'BLENDER_EEVEE', 'BLENDER_WORKBENCH'} + COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_EEVEE', 'BLENDER_WORKBENCH'} _context_path = "material" _property_type = bpy.types.Material diff --git a/release/scripts/startup/bl_ui/properties_material_gpencil.py b/release/scripts/startup/bl_ui/properties_material_gpencil.py index 6dff706e839..5d10a2cef4a 100644 --- a/release/scripts/startup/bl_ui/properties_material_gpencil.py +++ b/release/scripts/startup/bl_ui/properties_material_gpencil.py @@ -191,7 +191,6 @@ class MATERIAL_PT_gpencil_fillcolor(GPMaterialButtonsPanel, Panel): col.enabled = not gpcolor.lock col.prop(gpcolor, "fill_style", text="Style") - if gpcolor.fill_style == 'SOLID': col.prop(gpcolor, "fill_color", text="Base Color") @@ -200,20 +199,23 @@ class MATERIAL_PT_gpencil_fillcolor(GPMaterialButtonsPanel, Panel): col.prop(gpcolor, "fill_color", text="Base Color") col.prop(gpcolor, "mix_color", text="Secondary Color") - col.prop(gpcolor, "mix_factor", text="Blend in Fill Gradient", slider=True) + col.prop(gpcolor, "mix_factor", text="Blend", slider=True) col.prop(gpcolor, "flip", text="Flip Colors") col.prop(gpcolor, "texture_offset", text="Location") + + row = col.row() + row.enabled = gpcolor.gradient_type == 'LINEAR' + row.prop(gpcolor, "texture_angle", text="Rotation") + col.prop(gpcolor, "texture_scale", text="Scale") - if gpcolor.gradient_type == 'LINEAR': - col.prop(gpcolor, "texture_angle", text="Rotation") elif gpcolor.fill_style == 'TEXTURE': + col.prop(gpcolor, "fill_color", text="Base Color") + col.template_ID(gpcolor, "fill_image", open="image.open") - col.prop(gpcolor, "fill_color", text="Base Color") - col.prop(gpcolor, "texture_opacity", slider=True) - col.prop(gpcolor, "mix_factor", text="Blend in Fill Texture", slider=True) + col.prop(gpcolor, "mix_factor", text="Blend", slider=True) col.prop(gpcolor, "texture_offset", text="Location") col.prop(gpcolor, "texture_angle", text="Rotation") diff --git a/release/scripts/startup/bl_ui/properties_paint_common.py b/release/scripts/startup/bl_ui/properties_paint_common.py index 34afcc09407..6e0613874d1 100644 --- a/release/scripts/startup/bl_ui/properties_paint_common.py +++ b/release/scripts/startup/bl_ui/properties_paint_common.py @@ -626,6 +626,7 @@ def brush_settings(layout, context, brush, popover=False): if brush.sculpt_tool == 'POSE': layout.separator() + layout.prop(brush, "pose_origin_type") layout.prop(brush, "pose_offset") layout.prop(brush, "pose_smooth_iterations") layout.prop(brush, "pose_ik_segments") @@ -665,6 +666,14 @@ def brush_settings(layout, context, brush, popover=False): col.prop(brush, "use_multiplane_scrape_dynamic") col.prop(brush, "show_multiplane_scrape_planes_preview") + if brush.sculpt_tool == 'SMOOTH': + col = layout.column() + col.prop(brush, "smooth_deform_type") + if brush.smooth_deform_type == 'SURFACE': + col.prop(brush, "surface_smooth_shape_preservation") + col.prop(brush, "surface_smooth_current_vertex") + col.prop(brush, "surface_smooth_iterations") + if brush.sculpt_tool == 'MASK': layout.row().prop(brush, "mask_tool", expand=True) diff --git a/release/scripts/startup/bl_ui/properties_physics_common.py b/release/scripts/startup/bl_ui/properties_physics_common.py index 5397020a521..479782f1e3b 100644 --- a/release/scripts/startup/bl_ui/properties_physics_common.py +++ b/release/scripts/startup/bl_ui/properties_physics_common.py @@ -227,7 +227,7 @@ def point_cache_ui(self, cache, enabled, cachetype): col.operator("ptcache.bake", text="Bake").bake = True sub = col.row() - sub.enabled = (cache.is_frame_skip or cache.is_outdated) and enabled + sub.enabled = enabled sub.operator("ptcache.bake", text="Calculate To Frame").bake = False sub = col.column() diff --git a/release/scripts/startup/bl_ui/properties_physics_fluid.py b/release/scripts/startup/bl_ui/properties_physics_fluid.py index 8d8070bad7a..ba9e2110817 100644 --- a/release/scripts/startup/bl_ui/properties_physics_fluid.py +++ b/release/scripts/startup/bl_ui/properties_physics_fluid.py @@ -176,11 +176,12 @@ class PHYSICS_PT_settings(PhysicButtonsPanel, Panel): col.prop(domain, "time_scale", text="Time Scale") col.prop(domain, "cfl_condition", text="CFL Number") - col = flow.column(align=True) + col = flow.column() col.prop(domain, "use_adaptive_timesteps") - col.active = domain.use_adaptive_timesteps - col.prop(domain, "timesteps_max", text="Timesteps Maximum") - col.prop(domain, "timesteps_min", text="Minimum") + sub = col.column(align=True) + sub.active = domain.use_adaptive_timesteps + sub.prop(domain, "timesteps_max", text="Timesteps Maximum") + sub.prop(domain, "timesteps_min", text="Minimum") col.separator() @@ -194,6 +195,7 @@ class PHYSICS_PT_settings(PhysicButtonsPanel, Panel): col = flow.column() col.prop(domain, "clipping", text="Empty Space") + col.prop(domain, "delete_in_obstacle", text="Delete In Obstacle") if domain.cache_type == 'MODULAR': col.separator() @@ -272,7 +274,6 @@ class PHYSICS_PT_settings(PhysicButtonsPanel, Panel): col.prop(effector_settings, "use_effector", text="Use Effector") col.prop(effector_settings, "use_plane_init", text="Is Planar") - col.prop(effector_settings, "delete_in_obstacle", text="Delete In Obstacle") if effector_settings.effector_type == 'GUIDE': col.prop(effector_settings, "velocity_factor", text="Velocity Factor") @@ -471,21 +472,24 @@ class PHYSICS_PT_liquid(PhysicButtonsPanel, Panel): col = flow.column() col.prop(domain, "simulation_method", expand=False) col.prop(domain, "flip_ratio", text="FLIP Ratio") - row = col.row() - sub = row.column(align=True) - sub.prop(domain, "particle_radius", text="Particle Radius") - sub.prop(domain, "particle_number", text="Sampling") - sub.prop(domain, "particle_randomness", text="Randomness") + col = col.column(align=True) + col.prop(domain, "particle_radius", text="Particle Radius") + col.prop(domain, "particle_number", text="Sampling") + col.prop(domain, "particle_randomness", text="Randomness") col = flow.column() - row = col.row() - sub = row.column(align=True) - sub.prop(domain, "particle_max", text="Particles Maximum") - sub.prop(domain, "particle_min", text="Minimum") + col = col.column(align=True) + col.prop(domain, "particle_max", text="Particles Maximum") + col.prop(domain, "particle_min", text="Minimum") + + col.separator() + + col = col.column() col.prop(domain, "particle_band_width", text="Narrow Band Width") - row = col.row() - sub = row.column(align=True) - sub.prop(domain, "use_fractions", text="Fractional Obstacles") + + col = col.column() + col.prop(domain, "use_fractions", text="Fractional Obstacles") + sub = col.column() sub.active = domain.use_fractions sub.prop(domain, "fractions_threshold", text="Obstacle-Fluid Threshold") @@ -860,13 +864,15 @@ class PHYSICS_PT_particles(PhysicButtonsPanel, Panel): flow.enabled = not is_baking_any sndparticle_combined_export = domain.sndparticle_combined_export - row = flow.row() + col = flow.column() + row = col.row() row.enabled = sndparticle_combined_export in {'OFF', 'FOAM + BUBBLES'} row.prop(domain, "use_spray_particles", text="Spray") row.prop(domain, "use_foam_particles", text="Foam") row.prop(domain, "use_bubble_particles", text="Bubbles") - col = flow.column() + col.separator() + col.prop(domain, "sndparticle_combined_export") flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False) diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py index 3d4c70e0143..fd4859f3620 100644 --- a/release/scripts/startup/bl_ui/properties_render.py +++ b/release/scripts/startup/bl_ui/properties_render.py @@ -648,9 +648,6 @@ class RENDER_PT_simplify_viewport(RenderButtonsPanel, Panel): col = flow.column() col.prop(rd, "simplify_child_particles", text="Max Child Particles") - col = flow.column() - col.prop(rd, "use_simplify_smoke_highres", text="High-resolution Smoke") - class RENDER_PT_simplify_render(RenderButtonsPanel, Panel): bl_label = "Render" diff --git a/release/scripts/startup/bl_ui/space_toolsystem_common.py b/release/scripts/startup/bl_ui/space_toolsystem_common.py index 796c089906d..e0651dcac2b 100644 --- a/release/scripts/startup/bl_ui/space_toolsystem_common.py +++ b/release/scripts/startup/bl_ui/space_toolsystem_common.py @@ -449,19 +449,24 @@ class ToolSelectPanelHelper: return context.button_operator.name @classmethod - def _km_action_simple(cls, kc, context_descr, label, keymap_fn): + def _km_action_simple(cls, kc_default, kc, context_descr, label, keymap_fn): km_idname = f"{cls.keymap_prefix:s} {context_descr:s}, {label:s}" km = kc.keymaps.get(km_idname) + km_kwargs = dict(space_type=cls.bl_space_type, region_type='WINDOW', tool=True) if km is None: - km = kc.keymaps.new(km_idname, space_type=cls.bl_space_type, region_type='WINDOW', tool=True) + km = kc.keymaps.new(km_idname, **km_kwargs) keymap_fn[0](km) keymap_fn[0] = km.name + # Ensure we have a default key map, so the add-ons keymap is properly overlayed. + if kc_default is not kc: + kc_default.keymaps.new(km_idname, **km_kwargs) + @classmethod def register(cls): wm = bpy.context.window_manager # Write into defaults, users may modify in preferences. - kc = wm.keyconfigs.default + kc_default = wm.keyconfigs.default # Track which tool-group was last used for non-active groups. # Blender stores the active tool-group index. @@ -470,7 +475,7 @@ class ToolSelectPanelHelper: cls._tool_group_active = {} # ignore in background mode - if kc is None: + if kc_default is None: return for context_mode, tools in cls.tools_all(): @@ -482,7 +487,7 @@ class ToolSelectPanelHelper: for item in cls._tools_flatten_with_keymap(tools): keymap_data = item.keymap if callable(keymap_data[0]): - cls._km_action_simple(kc, context_descr, item.label, keymap_data) + cls._km_action_simple(kc_default, kc_default, context_descr, item.label, keymap_data) @classmethod def keymap_ui_hierarchy(cls, context_mode): diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py index 583d8ea44cf..cb3d2909205 100644 --- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py +++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py @@ -1031,6 +1031,9 @@ class _defs_sculpt: layout.prop(props, "strength") layout.prop(props, "deform_axis") layout.prop(props, "use_face_sets") + if (props.type == "SURFACE_SMOOTH"): + layout.prop(props, "surface_smooth_shape_preservation", expand=False) + layout.prop(props, "surface_smooth_current_vertex", expand=False) return dict( idname="builtin.mesh_filter", @@ -1472,6 +1475,17 @@ class _defs_gpencil_paint: class _defs_gpencil_edit: + def is_segment(context): + ts = context.scene.tool_settings + if context.mode == 'EDIT_GPENCIL': + return ts.gpencil_selectmode_edit == 'SEGMENT' + elif context.mode == 'SCULPT_GPENCIL': + return ts.use_gpencil_select_mask_segment + elif context.mode == 'VERTEX_GPENCIL': + return ts.use_gpencil_vertex_select_mask_segment + else: + return False + @ToolDef.from_fn def bend(): return dict( @@ -1485,7 +1499,8 @@ class _defs_gpencil_edit: @ToolDef.from_fn def select(): def draw_settings(context, layout, _tool): - layout.prop(context.tool_settings.gpencil_sculpt, "intersection_threshold") + if _defs_gpencil_edit.is_segment(context): + layout.prop(context.tool_settings.gpencil_sculpt, "intersection_threshold") return dict( idname="builtin.select", label="Tweak", @@ -1502,7 +1517,8 @@ class _defs_gpencil_edit: row = layout.row() row.use_property_split = False row.prop(props, "mode", text="", expand=True, icon_only=True) - layout.prop(context.tool_settings.gpencil_sculpt, "intersection_threshold") + if _defs_gpencil_edit.is_segment(context): + layout.prop(context.tool_settings.gpencil_sculpt, "intersection_threshold") return dict( idname="builtin.select_box", label="Select Box", @@ -1519,7 +1535,8 @@ class _defs_gpencil_edit: row = layout.row() row.use_property_split = False row.prop(props, "mode", text="", expand=True, icon_only=True) - layout.prop(context.tool_settings.gpencil_sculpt, "intersection_threshold") + if _defs_gpencil_edit.is_segment(context): + layout.prop(context.tool_settings.gpencil_sculpt, "intersection_threshold") return dict( idname="builtin.select_lasso", label="Select Lasso", @@ -1537,7 +1554,8 @@ class _defs_gpencil_edit: row.use_property_split = False row.prop(props, "mode", text="", expand=True, icon_only=True) layout.prop(props, "radius") - layout.prop(context.tool_settings.gpencil_sculpt, "intersection_threshold") + if _defs_gpencil_edit.is_segment(context): + layout.prop(context.tool_settings.gpencil_sculpt, "intersection_threshold") def draw_cursor(_context, tool, xy): from gpu_extras.presets import draw_circle_2d @@ -1901,6 +1919,8 @@ class IMAGE_PT_tools_active(ToolSelectPanelHelper, Panel): ], 'PAINT': [ _defs_texture_paint.generate_from_brushes, + None, + *_tools_annotate, ], } diff --git a/release/scripts/startup/bl_ui/space_topbar.py b/release/scripts/startup/bl_ui/space_topbar.py index 1f52323f540..40824cbeb52 100644 --- a/release/scripts/startup/bl_ui/space_topbar.py +++ b/release/scripts/startup/bl_ui/space_topbar.py @@ -207,7 +207,8 @@ class TOPBAR_MT_editor_menus(Menu): def draw(self, context): layout = self.layout - if context.area.show_menus: + # Allow calling this menu directly (this might not be a header area). + if getattr(context.area, "show_menus"): layout.menu("TOPBAR_MT_app", text="", icon='BLENDER') else: layout.menu("TOPBAR_MT_app", text="Blender") @@ -242,6 +243,10 @@ class TOPBAR_MT_app(Menu): layout.operator("preferences.app_template_install", text="Install Application Template...") + layout.separator() + + layout.menu("TOPBAR_MT_app_system") + class TOPBAR_MT_file_cleanup(Menu): bl_label = "Clean Up" @@ -441,6 +446,26 @@ class TOPBAR_MT_app_support(Menu): ).url = "https://store.blender.org" +# Include technical operators here which would otherwise have no way for users to access. +class TOPBAR_MT_app_system(Menu): + bl_label = "System" + + def draw(self, _context): + layout = self.layout + + layout.operator("script.reload") + + layout.separator() + + layout.operator("wm.memory_statistics") + layout.operator("wm.debug_menu") + layout.operator_menu_enum("wm.redraw_timer", "type") + + layout.separator() + + layout.operator("screen.spacedata_cleanup") + + class TOPBAR_MT_templates_more(Menu): bl_label = "Templates" @@ -827,6 +852,7 @@ classes = ( TOPBAR_MT_editor_menus, TOPBAR_MT_app, TOPBAR_MT_app_about, + TOPBAR_MT_app_system, TOPBAR_MT_app_support, TOPBAR_MT_file, TOPBAR_MT_file_new, diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py index 61d5c1ba36c..8d30e6b3651 100644 --- a/release/scripts/startup/bl_ui/space_userpref.py +++ b/release/scripts/startup/bl_ui/space_userpref.py @@ -897,6 +897,23 @@ class USERPREF_PT_theme_interface_styles(ThemePanel, CenterAlignMixIn, Panel): flow.prop(ui, "widget_emboss") +class USERPREF_PT_theme_interface_transparent_checker(ThemePanel, CenterAlignMixIn, Panel): + bl_label = "Transparent Checkerboard" + bl_options = {'DEFAULT_CLOSED'} + bl_parent_id = "USERPREF_PT_theme_user_interface" + + def draw_centered(self, context, layout): + theme = context.preferences.themes[0] + ui = theme.user_interface + + flow = layout.grid_flow( + row_major=False, columns=0, even_columns=True, even_rows=False, align=False) + + flow.prop(ui, "transparent_checker_primary") + flow.prop(ui, "transparent_checker_secondary") + flow.prop(ui, "transparent_checker_size") + + class USERPREF_PT_theme_interface_gizmos(ThemePanel, CenterAlignMixIn, Panel): bl_label = "Axis & Gizmo Colors" bl_options = {'DEFAULT_CLOSED'} @@ -2118,6 +2135,21 @@ class ExperimentalPanel: url_prefix = "https://developer.blender.org/" + def _draw_items(self, context, items): + prefs = context.preferences + experimental = prefs.experimental + + layout = self.layout + layout.use_property_split = True + layout.use_property_decorate = False + + for prop_keywords, task in items: + split = layout.split(factor=0.66) + col = split.split() + col.prop(experimental, **prop_keywords) + col = split.split() + col.operator("wm.url_open", text=task, icon='URL').url = self.url_prefix + task + """ # Example panel, leave it here so we always have a template to follow even # after the features are gone from the experimental panel. @@ -2126,46 +2158,34 @@ class USERPREF_PT_experimental_virtual_reality(ExperimentalPanel, Panel): bl_label = "Virtual Reality" def draw(self, context): - prefs = context.preferences - experimental = prefs.experimental + self._draw_items( + context, ( + ({"property": "use_virtual_reality_scene_inspection"}, "T71347"), + ({"property": "use_virtual_reality_immersive_drawing"}, "T71348"), + ) + ) +""" - layout = self.layout - layout.use_property_split = True - layout.use_property_decorate = False +class USERPREF_PT_experimental_ui(ExperimentalPanel, Panel): + bl_label = "UI" - task = "T71347" - split = layout.split(factor=0.66) - col = split.split() - col.prop(experimental, "use_virtual_reality_scene_inspection", text="Scene Inspection") - col = split.split() - col.operator("wm.url_open", text=task, icon='URL').url = self.url_prefix + task - - task = "T71348" - split = layout.split(factor=0.66) - col = split.column() - col.prop(experimental, "use_virtual_reality_immersive_drawing", text="Continuous Immersive Drawing") - col = split.column() - col.operator("wm.url_open", text=task, icon='URL').url = self.url_prefix + task -""" + def draw(self, context): + self._draw_items( + context, ( + ({"property": "use_menu_search"}, "T74157"), + ), + ) class USERPREF_PT_experimental_system(ExperimentalPanel, Panel): bl_label = "System" def draw(self, context): - prefs = context.preferences - experimental = prefs.experimental - - layout = self.layout - layout.use_property_split = True - layout.use_property_decorate = False - - task = "T60695" - split = layout.split(factor=0.66) - col = split.split() - col.prop(experimental, "use_undo_speedup") - col = split.split() - col.operator("wm.url_open", text=task, icon='URL').url = self.url_prefix + task + self._draw_items( + context, ( + ({"property": "use_undo_speedup"}, "T60695"), + ), + ) # ----------------------------------------------------------------------------- @@ -2220,6 +2240,7 @@ classes = ( USERPREF_PT_theme_interface_state, USERPREF_PT_theme_interface_styles, USERPREF_PT_theme_interface_gizmos, + USERPREF_PT_theme_interface_transparent_checker, USERPREF_PT_theme_interface_icons, USERPREF_PT_theme_text_style, USERPREF_PT_theme_bone_color_sets, @@ -2257,6 +2278,7 @@ classes = ( # Popovers. USERPREF_PT_ndof_settings, + USERPREF_PT_experimental_ui, USERPREF_PT_experimental_system, # Add dynamically generated editor theme panels last, diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index 6f58886fe5d..7fca7e9c271 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -393,7 +393,7 @@ class _draw_tool_settings_context_mode: }: # is_paint = False pass - elif tool.idname == "Cutter": + elif tool.idname == "builtin.cutter": row = layout.row(align=True) row.prop(context.tool_settings.gpencil_sculpt, "intersection_threshold") return False @@ -3139,6 +3139,13 @@ class VIEW3D_MT_face_sets(Menu): op = layout.operator("sculpt.face_sets_create", text='Face Set From Visible') op.mode = 'VISIBLE' + op = layout.operator("sculpt.face_sets_create", text='Face Set From Edit Mode Selection') + op.mode = 'SELECTION' + + layout.separator() + + layout.menu("VIEW3D_MT_face_sets_init", text="Init Face Sets") + layout.separator() op = layout.operator("sculpt.face_set_change_visibility", text='Invert Visible Face Sets') @@ -3173,6 +3180,37 @@ class VIEW3D_MT_sculpt_set_pivot(Menu): props = layout.operator("sculpt.set_pivot_position", text="Pivot to Surface Under Cursor") props.mode = 'SURFACE' +class VIEW3D_MT_face_sets_init(Menu): + bl_label = "Face Sets Init" + + def draw(self, _context): + layout = self.layout + + op = layout.operator("sculpt.face_sets_init", text='By Loose Parts') + op.mode = 'LOOSE_PARTS' + + op = layout.operator("sculpt.face_sets_init", text='By Materials') + op.mode = 'MATERIALS' + + op = layout.operator("sculpt.face_sets_init", text='By Normals') + op.mode = 'NORMALS' + + op = layout.operator("sculpt.face_sets_init", text='By UV Seams') + op.mode = 'UV_SEAMS' + + op = layout.operator("sculpt.face_sets_init", text='By Edge Creases') + op.mode = 'CREASES' + + op = layout.operator("sculpt.face_sets_init", text='By Edge Bevel Weight') + op.mode = 'BEVEL_WEIGHT' + + op = layout.operator("sculpt.face_sets_init", text='By Sharp Edges') + op.mode = 'SHARP_EDGES' + + op = layout.operator("sculpt.face_sets_init", text='By Face Maps') + op.mode = 'FACE_MAPS' + + class VIEW3D_MT_particle(Menu): bl_label = "Particle" @@ -3860,6 +3898,10 @@ class VIEW3D_MT_edit_mesh_extrude(Menu): for menu_id in self.extrude_options(context): self._extrude_funcs[menu_id](layout) + layout.separator() + + layout.operator("mesh.extrude_repeat") + class VIEW3D_MT_edit_mesh_vertices(Menu): bl_label = "Vertex" @@ -3890,6 +3932,7 @@ class VIEW3D_MT_edit_mesh_vertices(Menu): layout.operator("transform.vert_slide", text="Slide Vertices") layout.operator_context = 'EXEC_DEFAULT' layout.operator("mesh.vertices_smooth", text="Smooth Vertices").factor = 0.5 + layout.operator("mesh.vertices_smooth_laplacian", text="Smooth Vertices (Laplacian)") layout.operator_context = 'INVOKE_REGION_WIN' layout.separator() @@ -3959,6 +4002,7 @@ class VIEW3D_MT_edit_mesh_edges(Menu): layout.operator("mesh.extrude_edges_move", text="Extrude Edges") layout.operator("mesh.bevel", text="Bevel Edges").vertex_only = False layout.operator("mesh.bridge_edge_loops") + layout.operator("mesh.screw") layout.separator() @@ -4596,7 +4640,6 @@ class VIEW3D_MT_edit_armature(Menu): layout.operator("armature.extrude_forked") layout.operator("armature.duplicate_move") - layout.operator("armature.merge") layout.operator("armature.fill") layout.operator("armature.split") layout.operator("armature.separate") @@ -4670,7 +4713,6 @@ class VIEW3D_MT_armature_context_menu(Menu): # Remove layout.operator("armature.split") layout.operator("armature.separate") - layout.operator("armature.merge") layout.operator("armature.dissolve") layout.operator("armature.delete") @@ -7339,6 +7381,7 @@ classes = ( VIEW3D_MT_sculpt_set_pivot, VIEW3D_MT_mask, VIEW3D_MT_face_sets, + VIEW3D_MT_face_sets_init, VIEW3D_MT_particle, VIEW3D_MT_particle_context_menu, VIEW3D_MT_particle_showhide, |