Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacques Lucke <jacques@blender.org>2020-03-30 13:04:42 +0300
committerJacques Lucke <jacques@blender.org>2020-03-30 13:04:42 +0300
commitcd5f9516db8e1a74b60038cf16be6a5a3b99b729 (patch)
treed1f55d08b660675c5751c48707aaa2e209be2c35 /release
parent8ce5c50411e81c4cac0c72097739633188415574 (diff)
parent513885a9911841aed4d039f5170171e039a74c68 (diff)
Merge branch 'master' into functions
Diffstat (limited to 'release')
-rw-r--r--release/datafiles/LICENSE-bmonofont-i18n.ttf.txt3
-rw-r--r--release/datafiles/LICENSE-droidsans.ttf.txt3
-rw-r--r--release/datafiles/bfont.ttfbin194320 -> 0 bytes
-rw-r--r--release/datafiles/bmonofont.ttfbin314980 -> 0 bytes
-rw-r--r--release/datafiles/fonts/bmonofont-i18n.ttfbin0 -> 5571264 bytes
-rw-r--r--release/datafiles/fonts/bmonofont-i18n.ttf.gzbin2686344 -> 0 bytes
-rw-r--r--release/datafiles/fonts/droidsans.ttfbin0 -> 5695208 bytes
-rw-r--r--release/datafiles/fonts/droidsans.ttf.gzbin2436926 -> 0 bytes
m---------release/datafiles/locale0
-rw-r--r--release/datafiles/userdef/userdef_default_theme.c5
m---------release/scripts/addons0
m---------release/scripts/addons_contrib0
-rw-r--r--release/scripts/modules/bpy/utils/__init__.py21
-rw-r--r--release/scripts/presets/keyconfig/keymap_data/blender_default.py1
-rw-r--r--release/scripts/startup/bl_operators/wm.py6
-rw-r--r--release/scripts/startup/bl_ui/properties_data_modifier.py58
-rw-r--r--release/scripts/startup/bl_ui/properties_material.py2
-rw-r--r--release/scripts/startup/bl_ui/properties_material_gpencil.py16
-rw-r--r--release/scripts/startup/bl_ui/properties_paint_common.py9
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_common.py2
-rw-r--r--release/scripts/startup/bl_ui/properties_physics_fluid.py44
-rw-r--r--release/scripts/startup/bl_ui/properties_render.py3
-rw-r--r--release/scripts/startup/bl_ui/space_toolsystem_common.py15
-rw-r--r--release/scripts/startup/bl_ui/space_toolsystem_toolbar.py28
-rw-r--r--release/scripts/startup/bl_ui/space_topbar.py28
-rw-r--r--release/scripts/startup/bl_ui/space_userpref.py86
-rw-r--r--release/scripts/startup/bl_ui/space_view3d.py49
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
deleted file mode 100644
index 7cb06a988ed..00000000000
--- a/release/datafiles/bfont.ttf
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/bmonofont.ttf b/release/datafiles/bmonofont.ttf
deleted file mode 100644
index 06235dce116..00000000000
--- a/release/datafiles/bmonofont.ttf
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/fonts/bmonofont-i18n.ttf b/release/datafiles/fonts/bmonofont-i18n.ttf
new file mode 100644
index 00000000000..658ec68f36c
--- /dev/null
+++ b/release/datafiles/fonts/bmonofont-i18n.ttf
Binary files differ
diff --git a/release/datafiles/fonts/bmonofont-i18n.ttf.gz b/release/datafiles/fonts/bmonofont-i18n.ttf.gz
deleted file mode 100644
index 2c3e00d1c75..00000000000
--- a/release/datafiles/fonts/bmonofont-i18n.ttf.gz
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/fonts/droidsans.ttf b/release/datafiles/fonts/droidsans.ttf
new file mode 100644
index 00000000000..04b1ece64ee
--- /dev/null
+++ b/release/datafiles/fonts/droidsans.ttf
Binary files differ
diff --git a/release/datafiles/fonts/droidsans.ttf.gz b/release/datafiles/fonts/droidsans.ttf.gz
deleted file mode 100644
index 858264142f1..00000000000
--- a/release/datafiles/fonts/droidsans.ttf.gz
+++ /dev/null
Binary files differ
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,