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:
Diffstat (limited to 'release/scripts')
m---------release/scripts/addons0
m---------release/scripts/addons_contrib0
-rw-r--r--release/scripts/freestyle/styles/apriori_density.py4
-rw-r--r--release/scripts/modules/bl_app_override/__init__.py8
-rw-r--r--release/scripts/modules/bl_i18n_utils/bl_extract_messages.py7
-rwxr-xr-xrelease/scripts/modules/bl_i18n_utils/utils_rtl.py32
-rw-r--r--release/scripts/modules/bl_keymap_utils/io.py2
-rw-r--r--release/scripts/modules/bpy_extras/image_utils.py37
-rw-r--r--release/scripts/modules/bpy_extras/io_utils.py71
-rw-r--r--release/scripts/modules/bpy_extras/node_shader_utils.py62
-rw-r--r--release/scripts/modules/bpy_extras/view3d_utils.py44
-rw-r--r--release/scripts/modules/bpy_types.py94
-rw-r--r--release/scripts/modules/console/complete_import.py2
-rw-r--r--release/scripts/modules/rna_info.py2
-rw-r--r--release/scripts/modules/rna_manual_reference.py189
-rw-r--r--release/scripts/modules/rna_prop_ui.py7
-rw-r--r--release/scripts/presets/interface_theme/blender_light.xml65
-rw-r--r--release/scripts/presets/keyconfig/blender.py10
-rw-r--r--release/scripts/presets/keyconfig/blender_27x.py10
-rw-r--r--release/scripts/presets/keyconfig/industry_compatible.py46
-rw-r--r--release/scripts/presets/keyconfig/keymap_data/blender_default.py179
-rw-r--r--release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py100
-rw-r--r--release/scripts/startup/bl_operators/add_mesh_torus.py12
-rw-r--r--release/scripts/startup/bl_operators/clip.py14
-rw-r--r--release/scripts/startup/bl_operators/freestyle.py8
-rw-r--r--release/scripts/startup/bl_operators/mask.py2
-rw-r--r--release/scripts/startup/bl_operators/presets.py6
-rw-r--r--release/scripts/startup/bl_operators/rigidbody.py2
-rw-r--r--release/scripts/startup/bl_operators/sequencer.py229
-rw-r--r--release/scripts/startup/bl_operators/userpref.py2
-rw-r--r--release/scripts/startup/bl_operators/uvcalc_smart_project.py24
-rw-r--r--release/scripts/startup/bl_operators/wm.py458
-rw-r--r--release/scripts/startup/bl_ui/properties_constraint.py15
-rw-r--r--release/scripts/startup/bl_ui/properties_data_bone.py6
-rw-r--r--release/scripts/startup/bl_ui/properties_data_camera.py4
-rw-r--r--release/scripts/startup/bl_ui/properties_data_empty.py1
-rw-r--r--release/scripts/startup/bl_ui/properties_data_gpencil.py8
-rw-r--r--release/scripts/startup/bl_ui/properties_data_lattice.py7
-rw-r--r--release/scripts/startup/bl_ui/properties_data_light.py14
-rw-r--r--release/scripts/startup/bl_ui/properties_data_mesh.py26
-rw-r--r--release/scripts/startup/bl_ui/properties_data_modifier.py22
-rw-r--r--release/scripts/startup/bl_ui/properties_grease_pencil_common.py85
-rw-r--r--release/scripts/startup/bl_ui/properties_material.py51
-rw-r--r--release/scripts/startup/bl_ui/properties_material_gpencil.py12
-rw-r--r--release/scripts/startup/bl_ui/properties_object.py12
-rw-r--r--release/scripts/startup/bl_ui/properties_particle.py107
-rw-r--r--release/scripts/startup/bl_ui/properties_render.py32
-rw-r--r--release/scripts/startup/bl_ui/properties_scene.py2
-rw-r--r--release/scripts/startup/bl_ui/space_clip.py9
-rw-r--r--release/scripts/startup/bl_ui/space_console.py3
-rw-r--r--release/scripts/startup/bl_ui/space_filebrowser.py326
-rw-r--r--release/scripts/startup/bl_ui/space_image.py4
-rw-r--r--release/scripts/startup/bl_ui/space_info.py9
-rw-r--r--release/scripts/startup/bl_ui/space_sequencer.py34
-rw-r--r--release/scripts/startup/bl_ui/space_time.py15
-rw-r--r--release/scripts/startup/bl_ui/space_toolsystem_toolbar.py52
-rw-r--r--release/scripts/startup/bl_ui/space_topbar.py7
-rw-r--r--release/scripts/startup/bl_ui/space_userpref.py82
-rw-r--r--release/scripts/startup/bl_ui/space_view3d.py448
-rw-r--r--release/scripts/startup/bl_ui/space_view3d_toolbar.py130
-rw-r--r--release/scripts/startup/nodeitems_builtins.py1
61 files changed, 2438 insertions, 814 deletions
diff --git a/release/scripts/addons b/release/scripts/addons
-Subproject 4a66c4e0b80f5483c8434554c615a56fef71d62
+Subproject eb9bab0e7153fda8de113af9e3c54eca74c986e
diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib
-Subproject 80e2be8ff8e23dad3487d4ceef82ce7067cee41
+Subproject d9ed9d4d064c74c86e2767cd4be32d602a0ee31
diff --git a/release/scripts/freestyle/styles/apriori_density.py b/release/scripts/freestyle/styles/apriori_density.py
index 1de2c4c0334..ad5e610e422 100644
--- a/release/scripts/freestyle/styles/apriori_density.py
+++ b/release/scripts/freestyle/styles/apriori_density.py
@@ -41,8 +41,8 @@ Operators.select(AndUP1D(QuantitativeInvisibilityUP1D(0), pyHighViewMapDensityUP
bpred = TrueBP1D()
upred = AndUP1D(QuantitativeInvisibilityUP1D(0), pyHighViewMapDensityUP1D(0.0007,5))
Operators.bidirectional_chain(ChainPredicateIterator(upred, bpred), NotUP1D(QuantitativeInvisibilityUP1D(0)))
-shaders_list = [
+shaders_list = [
ConstantThicknessShader(2),
ConstantColorShader(0.0, 0.0, 0.0, 1.0)
- ]
+]
Operators.create(TrueUP1D(), shaders_list)
diff --git a/release/scripts/modules/bl_app_override/__init__.py b/release/scripts/modules/bl_app_override/__init__.py
index 2104b10bf85..112fe040f0c 100644
--- a/release/scripts/modules/bl_app_override/__init__.py
+++ b/release/scripts/modules/bl_app_override/__init__.py
@@ -90,7 +90,7 @@ def ui_draw_filter_register(
ret = real_func(*args, **kw)
else:
if ui_test is None:
- UILayout.__getattribute__(self, "label")("")
+ UILayout.__getattribute__(self, "label")(text="")
else:
assert(ui_test is True)
# may need to be set
@@ -111,7 +111,7 @@ def ui_draw_filter_register(
ret = real_func(*args, **kw)
else:
if ui_test is None:
- UILayout.__getattribute__(self, "label")("")
+ UILayout.__getattribute__(self, "label")(text="")
else:
assert(ui_test is True)
ret = None
@@ -131,7 +131,7 @@ def ui_draw_filter_register(
ret = real_func(*args, **kw)
else:
if ui_test is None:
- UILayout.__getattribute__(self, "label")("")
+ UILayout.__getattribute__(self, "label")(text="")
else:
assert(ui_test is True)
ret = None
@@ -151,7 +151,7 @@ def ui_draw_filter_register(
ret = real_func(*args, **kw)
else:
if ui_test is None:
- real_func("")
+ real_func(text="")
else:
assert(ui_test is True)
ret = None
diff --git a/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py b/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py
index fdd36589d4d..4aaa30a0508 100644
--- a/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py
+++ b/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py
@@ -838,7 +838,12 @@ def dump_messages(do_messages, do_checks, settings):
# For now, enable all official addons, before extracting msgids.
addons = utils.enable_addons(support={"OFFICIAL"})
# Note this is not needed if we have been started with factory settings, but just in case...
- utils.enable_addons(support={"COMMUNITY", "TESTING"}, disable=True)
+ # XXX This is not working well, spent a whole day trying to understand *why* we still have references of
+ # those removed calsses in things like `bpy.types.OperatorProperties.__subclasses__()`
+ # (could not even reproduce it from regular py console in Blender with UI...).
+ # For some reasons, cleanup does not happen properly, *and* we have no way to tell which class is valid
+ # and which has been unregistered. So for now, just go for the dirty, easy way: do not disable add-ons. :(
+ # ~ utils.enable_addons(support={"COMMUNITY", "TESTING"}, disable=True)
reports = _gen_reports(_gen_check_ctxt(settings) if do_checks else None)
diff --git a/release/scripts/modules/bl_i18n_utils/utils_rtl.py b/release/scripts/modules/bl_i18n_utils/utils_rtl.py
index 11d1da068b4..1a71bb735bc 100755
--- a/release/scripts/modules/bl_i18n_utils/utils_rtl.py
+++ b/release/scripts/modules/bl_i18n_utils/utils_rtl.py
@@ -37,29 +37,29 @@ import ctypes
import re
-#define FRIBIDI_MASK_NEUTRAL 0x00000040L /* Is neutral */
+#define FRIBIDI_MASK_NEUTRAL 0x00000040L /* Is neutral */
FRIBIDI_PAR_ON = 0x00000040
-#define FRIBIDI_FLAG_SHAPE_MIRRORING 0x00000001
-#define FRIBIDI_FLAG_REORDER_NSM 0x00000002
+#define FRIBIDI_FLAG_SHAPE_MIRRORING 0x00000001
+#define FRIBIDI_FLAG_REORDER_NSM 0x00000002
-#define FRIBIDI_FLAG_SHAPE_ARAB_PRES 0x00000100
-#define FRIBIDI_FLAG_SHAPE_ARAB_LIGA 0x00000200
-#define FRIBIDI_FLAG_SHAPE_ARAB_CONSOLE 0x00000400
+#define FRIBIDI_FLAG_SHAPE_ARAB_PRES 0x00000100
+#define FRIBIDI_FLAG_SHAPE_ARAB_LIGA 0x00000200
+#define FRIBIDI_FLAG_SHAPE_ARAB_CONSOLE 0x00000400
-#define FRIBIDI_FLAG_REMOVE_BIDI 0x00010000
-#define FRIBIDI_FLAG_REMOVE_JOINING 0x00020000
-#define FRIBIDI_FLAG_REMOVE_SPECIALS 0x00040000
+#define FRIBIDI_FLAG_REMOVE_BIDI 0x00010000
+#define FRIBIDI_FLAG_REMOVE_JOINING 0x00020000
+#define FRIBIDI_FLAG_REMOVE_SPECIALS 0x00040000
-#define FRIBIDI_FLAGS_DEFAULT ( \
-# FRIBIDI_FLAG_SHAPE_MIRRORING | \
-# FRIBIDI_FLAG_REORDER_NSM | \
-# FRIBIDI_FLAG_REMOVE_SPECIALS )
+#define FRIBIDI_FLAGS_DEFAULT ( \
+# FRIBIDI_FLAG_SHAPE_MIRRORING | \
+# FRIBIDI_FLAG_REORDER_NSM | \
+# FRIBIDI_FLAG_REMOVE_SPECIALS )
-#define FRIBIDI_FLAGS_ARABIC ( \
-# FRIBIDI_FLAG_SHAPE_ARAB_PRES | \
-# FRIBIDI_FLAG_SHAPE_ARAB_LIGA )
+#define FRIBIDI_FLAGS_ARABIC ( \
+# FRIBIDI_FLAG_SHAPE_ARAB_PRES | \
+# FRIBIDI_FLAG_SHAPE_ARAB_LIGA )
FRIBIDI_FLAG_SHAPE_MIRRORING = 0x00000001
FRIBIDI_FLAG_REORDER_NSM = 0x00000002
diff --git a/release/scripts/modules/bl_keymap_utils/io.py b/release/scripts/modules/bl_keymap_utils/io.py
index 2ff30cf4d52..a93e86bc0a1 100644
--- a/release/scripts/modules/bl_keymap_utils/io.py
+++ b/release/scripts/modules/bl_keymap_utils/io.py
@@ -80,7 +80,7 @@ def _kmi_properties_to_lines_recursive(level, properties, lines):
from bpy.types import OperatorProperties
def string_value(value):
- if isinstance(value, (str, bool, int)):
+ if isinstance(value, (str, bool, int, set)):
return repr(value)
elif isinstance(value, float):
return repr_f32(value)
diff --git a/release/scripts/modules/bpy_extras/image_utils.py b/release/scripts/modules/bpy_extras/image_utils.py
index 03864d652e4..f4d34de5037 100644
--- a/release/scripts/modules/bpy_extras/image_utils.py
+++ b/release/scripts/modules/bpy_extras/image_utils.py
@@ -24,17 +24,18 @@ __all__ = (
# limited replacement for BPyImage.comprehensiveImageLoad
-def load_image(imagepath,
- dirname="",
- place_holder=False,
- recursive=False,
- ncase_cmp=True,
- convert_callback=None,
- verbose=False,
- relpath=None,
- check_existing=False,
- force_reload=False,
- ):
+def load_image(
+ imagepath,
+ dirname="",
+ place_holder=False,
+ recursive=False,
+ ncase_cmp=True,
+ convert_callback=None,
+ verbose=False,
+ relpath=None,
+ check_existing=False,
+ force_reload=False,
+):
"""
Return an image from the file path with options to search multiple paths
and return a placeholder if its not found.
@@ -161,15 +162,17 @@ def load_image(imagepath,
variants = [imagepath]
if dirname:
- variants += [os.path.join(dirname, imagepath),
- os.path.join(dirname, bpy.path.basename(imagepath)),
- ]
+ variants += [
+ os.path.join(dirname, imagepath),
+ os.path.join(dirname, bpy.path.basename(imagepath)),
+ ]
for filepath_test in variants:
if ncase_cmp:
- ncase_variants = (filepath_test,
- bpy.path.resolve_ncase(filepath_test),
- )
+ ncase_variants = (
+ filepath_test,
+ bpy.path.resolve_ncase(filepath_test),
+ )
else:
ncase_variants = (filepath_test, )
diff --git a/release/scripts/modules/bpy_extras/io_utils.py b/release/scripts/modules/bpy_extras/io_utils.py
index 96b9596a57d..380b63066ef 100644
--- a/release/scripts/modules/bpy_extras/io_utils.py
+++ b/release/scripts/modules/bpy_extras/io_utils.py
@@ -44,10 +44,11 @@ from bpy.props import (
def _check_axis_conversion(op):
if hasattr(op, "axis_forward") and hasattr(op, "axis_up"):
- return axis_conversion_ensure(op,
- "axis_forward",
- "axis_up",
- )
+ return axis_conversion_ensure(
+ op,
+ "axis_forward",
+ "axis_up",
+ )
return False
@@ -93,10 +94,12 @@ class ExportHelper:
if check_extension is not None:
filepath = self.filepath
if os.path.basename(filepath):
- filepath = bpy.path.ensure_ext(filepath,
- self.filename_ext
- if check_extension
- else "")
+ filepath = bpy.path.ensure_ext(
+ filepath,
+ self.filename_ext
+ if check_extension
+ else "",
+ )
if filepath != self.filepath:
self.filepath = filepath
@@ -134,8 +137,10 @@ def orientation_helper(axis_forward='Y', axis_up='Z'):
def _update_axis_forward(self, _context):
if self.axis_forward[-1] == self.axis_up[-1]:
- self.axis_up = (self.axis_up[0:-1] +
- 'XYZ'[('XYZ'.index(self.axis_up[-1]) + 1) % 3])
+ self.axis_up = (
+ self.axis_up[0:-1] +
+ 'XYZ'[('XYZ'.index(self.axis_up[-1]) + 1) % 3]
+ )
cls.__annotations__['axis_forward'] = EnumProperty(
name="Forward",
@@ -153,8 +158,10 @@ def orientation_helper(axis_forward='Y', axis_up='Z'):
def _update_axis_up(self, _context):
if self.axis_up[-1] == self.axis_forward[-1]:
- self.axis_forward = (self.axis_forward[0:-1] +
- 'XYZ'[('XYZ'.index(self.axis_forward[-1]) + 1) % 3])
+ self.axis_forward = (
+ self.axis_forward[0:-1] +
+ 'XYZ'[('XYZ'.index(self.axis_forward[-1]) + 1) % 3]
+ )
cls.__annotations__['axis_up'] = EnumProperty(
name="Up",
@@ -405,14 +412,15 @@ path_reference_mode = EnumProperty(
)
-def path_reference(filepath,
- base_src,
- base_dst,
- mode='AUTO',
- copy_subdir="",
- copy_set=None,
- library=None,
- ):
+def path_reference(
+ filepath,
+ base_src,
+ base_dst,
+ mode='AUTO',
+ copy_subdir="",
+ copy_set=None,
+ library=None,
+):
"""
Return a filepath relative to a destination directory, for use with
exporters.
@@ -540,22 +548,29 @@ def unique_name(key, name, name_dict, name_max=-1, clean_func=None, sep="."):
if name_new is None:
count = 1
name_dict_values = name_dict.values()
- name_new = name_new_orig = (name if clean_func is None
- else clean_func(name))
+ name_new = name_new_orig = (
+ name if clean_func is None
+ else clean_func(name)
+ )
if name_max == -1:
while name_new in name_dict_values:
- name_new = "%s%s%03d" % (name_new_orig, sep, count)
+ name_new = "%s%s%03d" % (
+ name_new_orig,
+ sep,
+ count,
+ )
count += 1
else:
name_new = name_new[:name_max]
while name_new in name_dict_values:
count_str = "%03d" % count
- name_new = "%.*s%s%s" % (name_max - (len(count_str) + 1),
- name_new_orig,
- sep,
- count_str,
- )
+ name_new = "%.*s%s%s" % (
+ name_max - (len(count_str) + 1),
+ name_new_orig,
+ sep,
+ count_str,
+ )
count += 1
name_dict[key] = name_new
diff --git a/release/scripts/modules/bpy_extras/node_shader_utils.py b/release/scripts/modules/bpy_extras/node_shader_utils.py
index 0eac9794930..4ca3e675c37 100644
--- a/release/scripts/modules/bpy_extras/node_shader_utils.py
+++ b/release/scripts/modules/bpy_extras/node_shader_utils.py
@@ -619,10 +619,6 @@ class ShaderImageTextureWrapper():
self.translation = tex.translation
self.rotation = tex.rotation
self.scale = tex.scale
- self.use_min = tex.use_min
- self.use_max = tex.use_max
- self.min = tex.min
- self.max = tex.max
tex.is_readonly = is_readonly_back
@@ -750,70 +746,36 @@ class ShaderImageTextureWrapper():
def translation_get(self):
- return self.node_mapping.translation if self.node_mapping is not None else Vector((0.0, 0.0, 0.0))
+ if self.node_mapping is None:
+ return Vector((0.0, 0.0, 0.0))
+ return self.node_mapping.inputs['Location'].default_value
@_set_check
def translation_set(self, translation):
- self.node_mapping.translation = translation
+ self.node_mapping.inputs['Location'].default_value = translation
translation = property(translation_get, translation_set)
def rotation_get(self):
- return self.node_mapping.rotation if self.node_mapping is not None else Vector((0.0, 0.0, 0.0))
+ if self.node_mapping is None:
+ return Vector((0.0, 0.0, 0.0))
+ return self.node_mapping.inputs['Rotation'].default_value
@_set_check
def rotation_set(self, rotation):
- self.node_mapping.rotation = rotation
+ self.node_mapping.inputs['Rotation'].default_value = rotation
rotation = property(rotation_get, rotation_set)
def scale_get(self):
- return self.node_mapping.scale if self.node_mapping is not None else Vector((1.0, 1.0, 1.0))
+ if self.node_mapping is None:
+ return Vector((0.0, 0.0, 0.0))
+ return self.node_mapping.inputs['Scale'].default_value
@_set_check
def scale_set(self, scale):
- self.node_mapping.scale = scale
+ self.node_mapping.inputs['Scale'].default_value = scale
scale = property(scale_get, scale_set)
-
-
- def use_min_get(self):
- return self.node_mapping.use_min if self.node_mapping is not None else False
-
- @_set_check
- def use_min_set(self, use_min):
- self.node_mapping.use_min = use_min
-
- use_min = property(use_min_get, use_min_set)
-
-
- def use_max_get(self):
- return self.node_mapping.use_max if self.node_mapping is not None else False
-
- @_set_check
- def use_max_set(self, use_max):
- self.node_mapping.use_max = use_max
-
- use_max = property(use_max_get, use_max_set)
-
-
- def min_get(self):
- return self.node_mapping.min if self.node_mapping is not None else Vector((0.0, 0.0, 0.0))
-
- @_set_check
- def min_set(self, min):
- self.node_mapping.min = min
-
- min = property(min_get, min_set)
-
-
- def max_get(self):
- return self.node_mapping.max if self.node_mapping is not None else Vector((0.0, 0.0, 0.0))
-
- @_set_check
- def max_set(self, max):
- self.node_mapping.max = max
-
- max = property(max_get, max_set)
diff --git a/release/scripts/modules/bpy_extras/view3d_utils.py b/release/scripts/modules/bpy_extras/view3d_utils.py
index a2e394b270f..9e4958802f1 100644
--- a/release/scripts/modules/bpy_extras/view3d_utils.py
+++ b/release/scripts/modules/bpy_extras/view3d_utils.py
@@ -47,10 +47,11 @@ def region_2d_to_vector_3d(region, rv3d, coord):
if rv3d.is_perspective:
persinv = rv3d.perspective_matrix.inverted()
- out = Vector(((2.0 * coord[0] / region.width) - 1.0,
- (2.0 * coord[1] / region.height) - 1.0,
- -0.5
- ))
+ out = Vector((
+ (2.0 * coord[0] / region.width) - 1.0,
+ (2.0 * coord[1] / region.height) - 1.0,
+ -0.5
+ ))
w = out.dot(persinv[3].xyz) + persinv[3][3]
@@ -99,9 +100,11 @@ def region_2d_to_origin_3d(region, rv3d, coord, clamp=None):
dx = (2.0 * coord[0] / region.width) - 1.0
dy = (2.0 * coord[1] / region.height) - 1.0
persinv = persmat.inverted()
- origin_start = ((persinv.col[0].xyz * dx) +
- (persinv.col[1].xyz * dy) +
- persinv.translation)
+ origin_start = (
+ (persinv.col[0].xyz * dx) +
+ (persinv.col[1].xyz * dy) +
+ persinv.translation
+ )
if clamp != 0.0:
if rv3d.view_perspective != 'CAMERA':
@@ -149,17 +152,19 @@ def region_2d_to_location_3d(region, rv3d, coord, depth_location):
from mathutils.geometry import intersect_line_plane
viewinv = rv3d.view_matrix.inverted()
view_vec = viewinv.col[2].copy()
- return intersect_line_plane(origin_start,
- origin_end,
- depth_location,
- view_vec, 1,
- )
+ return intersect_line_plane(
+ origin_start,
+ origin_end,
+ depth_location,
+ view_vec, 1,
+ )
else:
from mathutils.geometry import intersect_point_line
- return intersect_point_line(depth_location,
- origin_start,
- origin_end,
- )[0]
+ return intersect_point_line(
+ depth_location,
+ origin_start,
+ origin_end,
+ )[0]
def location_3d_to_region_2d(region, rv3d, coord, default=None):
@@ -184,8 +189,9 @@ def location_3d_to_region_2d(region, rv3d, coord, default=None):
width_half = region.width / 2.0
height_half = region.height / 2.0
- return Vector((width_half + width_half * (prj.x / prj.w),
- height_half + height_half * (prj.y / prj.w),
- ))
+ return Vector((
+ width_half + width_half * (prj.x / prj.w),
+ height_half + height_half * (prj.y / prj.w),
+ ))
else:
return default
diff --git a/release/scripts/modules/bpy_types.py b/release/scripts/modules/bpy_types.py
index eca79795269..29470895079 100644
--- a/release/scripts/modules/bpy_types.py
+++ b/release/scripts/modules/bpy_types.py
@@ -60,12 +60,14 @@ class Library(bpy_types.ID):
# See: readblenentry.c, IDTYPE_FLAGS_ISLINKABLE,
# we could make this an attribute in rna.
- attr_links = ("actions", "armatures", "brushes", "cameras",
- "curves", "grease_pencils", "collections", "images",
- "lights", "lattices", "materials", "metaballs",
- "meshes", "node_groups", "objects", "scenes",
- "sounds", "speakers", "textures", "texts",
- "fonts", "worlds")
+ attr_links = (
+ "actions", "armatures", "brushes", "cameras",
+ "curves", "grease_pencils", "collections", "images",
+ "lights", "lattices", "materials", "metaballs",
+ "meshes", "node_groups", "objects", "scenes",
+ "sounds", "speakers", "textures", "texts",
+ "fonts", "worlds",
+ )
return tuple(id_block
for attr in attr_links
@@ -90,11 +92,13 @@ class Texture(bpy_types.ID):
def users_object_modifier(self):
"""Object modifiers that use this texture"""
import bpy
- return tuple(obj for obj in bpy.data.objects if
- self in [mod.texture
- for mod in obj.modifiers
- if mod.type == 'DISPLACE']
- )
+ return tuple(
+ obj for obj in bpy.data.objects if
+ self in [
+ mod.texture
+ for mod in obj.modifiers
+ if mod.type == 'DISPLACE']
+ )
class Collection(bpy_types.ID):
@@ -122,10 +126,15 @@ class Object(bpy_types.ID):
def users_collection(self):
"""The collections this object is in. Warning: takes O(len(bpy.data.collections) + len(bpy.data.scenes)) time."""
import bpy
- return tuple(collection for collection in bpy.data.collections
- if self in collection.objects[:]) + \
- tuple(scene.collection for scene in bpy.data.scenes
- if self in scene.collection.objects[:])
+ return (
+ tuple(
+ collection for collection in bpy.data.collections
+ if self in collection.objects[:]
+ ) + tuple(
+ scene.collection for scene in bpy.data.scenes
+ if self in scene.collection.objects[:]
+ )
+ )
@property
def users_scene(self):
@@ -252,18 +261,6 @@ class _GenericBone:
return (self.head + self.tail) * 0.5
@property
- def length(self):
- """
- The distance from head to tail,
- when set the head is moved to fit the length.
- """
- return self.vector.length
-
- @length.setter
- def length(self, value):
- self.tail = self.head + ((self.tail - self.head).normalized() * value)
-
- @property
def vector(self):
"""
The direction this bone is pointing.
@@ -483,18 +480,20 @@ class MeshLoopTriangle(StructRNA):
"""The midpoint of the face."""
face_verts = self.vertices[:]
mesh_verts = self.id_data.vertices
- return (mesh_verts[face_verts[0]].co +
- mesh_verts[face_verts[1]].co +
- mesh_verts[face_verts[2]].co
- ) / 3.0
+ return (
+ mesh_verts[face_verts[0]].co +
+ mesh_verts[face_verts[1]].co +
+ mesh_verts[face_verts[2]].co
+ ) / 3.0
@property
def edge_keys(self):
verts = self.vertices[:]
- return (ord_ind(verts[0], verts[1]),
- ord_ind(verts[1], verts[2]),
- ord_ind(verts[2], verts[0]),
- )
+ return (
+ ord_ind(verts[0], verts[1]),
+ ord_ind(verts[1], verts[2]),
+ ord_ind(verts[2], verts[0]),
+ )
class MeshPolygon(StructRNA):
@@ -862,15 +861,15 @@ class Menu(StructRNA, _GenericUI, metaclass=RNAMeta):
# collect paths
files = []
for directory in searchpaths:
- files.extend(
- [(f, os.path.join(directory, f))
+ files.extend([
+ (f, os.path.join(directory, f))
for f in os.listdir(directory)
if (not f.startswith("."))
if ((filter_ext is None) or
(filter_ext(os.path.splitext(f)[1])))
if ((filter_path is None) or
(filter_path(f)))
- ])
+ ])
files.sort()
@@ -928,11 +927,13 @@ class Menu(StructRNA, _GenericUI, metaclass=RNAMeta):
ext_valid = getattr(self, "preset_extensions", {".py", ".xml"})
props_default = getattr(self, "preset_operator_defaults", None)
add_operator = getattr(self, "preset_add_operator", None)
- self.path_menu(bpy.utils.preset_paths(self.preset_subdir),
- self.preset_operator,
- props_default=props_default,
- filter_ext=lambda ext: ext.lower() in ext_valid,
- add_operator=add_operator)
+ self.path_menu(
+ bpy.utils.preset_paths(self.preset_subdir),
+ self.preset_operator,
+ props_default=props_default,
+ filter_ext=lambda ext: ext.lower() in ext_valid,
+ add_operator=add_operator,
+ )
@classmethod
def draw_collapsible(cls, context, layout):
@@ -967,9 +968,10 @@ class NodeSocket(StructRNA, metaclass=RNAMetaPropGroup):
@property
def links(self):
"""List of node links from or to this socket. Warning: takes O(len(nodetree.links)) time."""
- return tuple(link for link in self.id_data.links
- if (link.from_socket == self or
- link.to_socket == self))
+ return tuple(
+ link for link in self.id_data.links
+ if (link.from_socket == self or
+ link.to_socket == self))
class NodeSocketInterface(StructRNA, metaclass=RNAMetaPropGroup):
diff --git a/release/scripts/modules/console/complete_import.py b/release/scripts/modules/console/complete_import.py
index ff3099d7285..6f51f6b691b 100644
--- a/release/scripts/modules/console/complete_import.py
+++ b/release/scripts/modules/console/complete_import.py
@@ -178,7 +178,7 @@ def complete(line):
words = line.split(' ')
if len(words) == 3 and words[0] == 'from':
return ['import ']
- if len(words) < 3 and (words[0] in ['import', 'from']):
+ if len(words) < 3 and (words[0] in {'import', 'from'}):
if len(words) == 1:
return get_root_modules()
mod = words[1].split('.')
diff --git a/release/scripts/modules/rna_info.py b/release/scripts/modules/rna_info.py
index 6f51dcf3aeb..8a46246cf91 100644
--- a/release/scripts/modules/rna_info.py
+++ b/release/scripts/modules/rna_info.py
@@ -542,7 +542,7 @@ def BuildRNAInfo():
# Use for faster lookups
# use rna_struct.identifier as the key for each dict
rna_struct_dict = {} # store identifier:rna lookups
- rna_full_path_dict = {} # store the result of full_rna_struct_path(rna_struct)
+ rna_full_path_dict = {} # store the result of full_rna_struct_path(rna_struct)
rna_children_dict = {} # store all rna_structs nested from here
rna_references_dict = {} # store a list of rna path strings that reference this type
# rna_functions_dict = {} # store all functions directly in this type (not inherited)
diff --git a/release/scripts/modules/rna_manual_reference.py b/release/scripts/modules/rna_manual_reference.py
index a09f1f2285f..1f01523534f 100644
--- a/release/scripts/modules/rna_manual_reference.py
+++ b/release/scripts/modules/rna_manual_reference.py
@@ -37,12 +37,24 @@ if LANG is not None:
url_manual_mapping = (
("bpy.types.cyclesobjectsettings.use_adaptive_subdivision*", "render/cycles/object_settings/adaptive_subdiv.html#bpy-types-cyclesobjectsettings-use-adaptive-subdivision"),
+ ("bpy.types.rendersettings_simplify_gpencil_view_modifier*", "render/cycles/render_settings/simplify.html#bpy-types-rendersettings-simplify-gpencil-view-modifier"),
+ ("bpy.types.brushgpencilsettings.use_settings_stabilizer*", "grease_pencil/modes/draw/tool_settings/brushes/draw_brush.html#bpy-types-brushgpencilsettings-use-settings-stabilizer"),
+ ("bpy.types.gpencilsculptsettings.use_multiframe_falloff*", "grease_pencil/multiframe.html#bpy-types-gpencilsculptsettings-use-multiframe-falloff"),
+ ("bpy.types.rendersettings_simplify_gpencil_remove_lines*", "render/cycles/render_settings/simplify.html#bpy-types-rendersettings-simplify-gpencil-remove-lines"),
+ ("bpy.types.toolsettings.use_transform_pivot_point_align*", "scene_layout/object/editing/transform/control/options.html#bpy-types-toolsettings-use-transform-pivot-point-align"),
("bpy.types.cyclesrendersettings.offscreen_dicing_scale*", "render/cycles/render_settings/subdivision.html#bpy-types-cyclesrendersettings-offscreen-dicing-scale"),
("bpy.types.linestylegeometrymodifier_backbonestretcher*", "render/freestyle/parameter_editor/line_style/modifiers/geometry/backbone_stretcher.html#bpy-types-linestylegeometrymodifier-backbonestretcher"),
("bpy.types.linestylegeometrymodifier_sinusdisplacement*", "render/freestyle/parameter_editor/line_style/modifiers/geometry/sinus_displacement.html#bpy-types-linestylegeometrymodifier-sinusdisplacement"),
("bpy.types.linestylegeometrymodifier_polygonalization*", "render/freestyle/parameter_editor/line_style/modifiers/geometry/polygonization.html#bpy-types-linestylegeometrymodifier-polygonalization"),
("bpy.types.cyclesrendersettings.distance_cull_margin*", "render/cycles/render_settings/simplify.html#bpy-types-cyclesrendersettings-distance-cull-margin"),
+ ("bpy.types.materialgpencilstyle.use_fill_texture_mix*", "grease_pencil/materials/grease_pencil_shader.html#bpy-types-materialgpencilstyle-use-fill-texture-mix"),
+ ("bpy.types.rendersettings_simplify_gpencil_shader_fx*", "render/cycles/render_settings/simplify.html#bpy-types-rendersettings-simplify-gpencil-shader-fx"),
+ ("bpy.types.rendersettings_simplify_gpencil_view_fill*", "render/cycles/render_settings/simplify.html#bpy-types-rendersettings-simplify-gpencil-view-fill"),
+ ("bpy.types.brushgpencilsettings.use_jitter_pressure*", "grease_pencil/modes/draw/tool_settings/brushes/draw_brush.html#bpy-types-brushgpencilsettings-use-jitter-pressure"),
+ ("bpy.types.brushgpencilsettings.use_settings_random*", "grease_pencil/modes/draw/tool_settings/brushes/draw_brush.html#bpy-types-brushgpencilsettings-use-settings-random"),
("bpy.types.linestylegeometrymodifier_simplification*", "render/freestyle/parameter_editor/line_style/modifiers/geometry/simplification.html#bpy-types-linestylegeometrymodifier-simplification"),
+ ("bpy.types.materialgpencilstyle.use_overlap_strokes*", "grease_pencil/materials/grease_pencil_shader.html#bpy-types-materialgpencilstyle-use-overlap-strokes"),
+ ("bpy.types.toolsettings.use_gpencil_weight_data_add*", "grease_pencil/modes/draw/introduction.html#bpy-types-toolsettings-use-gpencil-weight-data-add"),
("bpy.types.cyclesrendersettings.camera_cull_margin*", "render/cycles/render_settings/simplify.html#bpy-types-cyclesrendersettings-camera-cull-margin"),
("bpy.types.linestylegeometrymodifier_perlinnoise1d*", "render/freestyle/parameter_editor/line_style/modifiers/geometry/perlin_noise_1d.html#bpy-types-linestylegeometrymodifier-perlinnoise1d"),
("bpy.types.linestylegeometrymodifier_perlinnoise2d*", "render/freestyle/parameter_editor/line_style/modifiers/geometry/perlin_noise_2d.html#bpy-types-linestylegeometrymodifier-perlinnoise2d"),
@@ -51,38 +63,69 @@ url_manual_mapping = (
("bpy.types.linestylegeometrymodifier_guidinglines*", "render/freestyle/parameter_editor/line_style/modifiers/geometry/guiding_lines.html#bpy-types-linestylegeometrymodifier-guidinglines"),
("bpy.types.linestylegeometrymodifier_spatialnoise*", "render/freestyle/parameter_editor/line_style/modifiers/geometry/spatial_noise.html#bpy-types-linestylegeometrymodifier-spatialnoise"),
("bpy.types.linestylethicknessmodifier_calligraphy*", "render/freestyle/parameter_editor/line_style/modifiers/thickness/calligraphy.html#bpy-types-linestylethicknessmodifier-calligraphy"),
+ ("bpy.types.rendersettings_simplify_gpencil_onplay*", "render/cycles/render_settings/simplify.html#bpy-types-rendersettings-simplify-gpencil-onplay"),
+ ("bpy.types.toolsettings.use_gpencil_draw_additive*", "grease_pencil/modes/draw/introduction.html#bpy-types-toolsettings-use-gpencil-draw-additive"),
+ ("bpy.types.toolsettings.use_transform_data_origin*", "scene_layout/object/editing/transform/control/options.html#bpy-types-toolsettings-use-transform-data-origin"),
("bpy.types.cyclesrendersettings.max_subdivisions*", "render/cycles/render_settings/subdivision.html#bpy-types-cyclesrendersettings-max-subdivisions"),
("bpy.types.linestyle*modifier_distancefromcamera*", "render/freestyle/parameter_editor/line_style/modifiers/color/distance_from_camera.html#bpy-types-linestyle-modifier-distancefromcamera"),
("bpy.types.linestyle*modifier_distancefromobject*", "render/freestyle/parameter_editor/line_style/modifiers/color/distance_from_object.html#bpy-types-linestyle-modifier-distancefromobject"),
("bpy.types.linestylegeometrymodifier_2dtransform*", "render/freestyle/parameter_editor/line_style/modifiers/geometry/2d_transform.html#bpy-types-linestylegeometrymodifier-2dtransform"),
("bpy.types.linestylegeometrymodifier_beziercurve*", "render/freestyle/parameter_editor/line_style/modifiers/geometry/bezier_curve.html#bpy-types-linestylegeometrymodifier-beziercurve"),
+ ("bpy.types.rendersettings_simplify_gpencil_blend*", "render/cycles/render_settings/simplify.html#bpy-types-rendersettings-simplify-gpencil-blend"),
+ ("bpy.types.toolsettings.gpencil_stroke_placement*", "grease_pencil/modes/draw/stroke_placement.html#bpy-types-toolsettings-gpencil-stroke-placement"),
("bpy.types.cyclesrendersettings.use_camera_cull*", "render/cycles/render_settings/simplify.html#bpy-types-cyclesrendersettings-use-camera-cull"),
("bpy.types.linestylegeometrymodifier_tipremover*", "render/freestyle/parameter_editor/line_style/modifiers/geometry/tip_remover.html#bpy-types-linestylegeometrymodifier-tipremover"),
+ ("bpy.types.rendersettings_simplify_gpencil_tint*", "render/cycles/render_settings/simplify.html#bpy-types-rendersettings-simplify-gpencil-tint"),
+ ("bpy.types.toolsettings.use_gpencil_draw_onback*", "grease_pencil/modes/draw/introduction.html#bpy-types-toolsettings-use-gpencil-draw-onback"),
("bpy.types.cyclesmaterialsettings.displacement*", "render/cycles/material_settings.html#bpy-types-cyclesmaterialsettings-displacement"),
("bpy.types.linestylegeometrymodifier_blueprint*", "render/freestyle/parameter_editor/line_style/modifiers/geometry/blueprint.html#bpy-types-linestylegeometrymodifier-blueprint"),
+ ("bpy.types.materialgpencilstyle.alignment_mode*", "grease_pencil/materials/grease_pencil_shader.html#bpy-types-materialgpencilstyle-alignment-mode"),
("bpy.types.rendersettings.simplify_subdivision*", "render/cycles/render_settings/simplify.html#bpy-types-rendersettings-simplify-subdivision"),
+ ("bpy.ops.object.vertex_group_copy_to_selected*", "modeling/meshes/properties/vertex_groups/vertex_groups.html#bpy-ops-object-vertex-group-copy-to-selected"),
("bpy.types.cyclesrendersettings.dicing_camera*", "render/cycles/render_settings/subdivision.html#bpy-types-cyclesrendersettings-dicing-camera"),
("bpy.types.cyclesrendersettings.texture_limit*", "render/cycles/render_settings/simplify.html#bpy-types-cyclesrendersettings-texture-limit"),
+ ("bpy.types.gpencilsculptguide.reference_point*", "grease_pencil/modes/draw/guides.html#bpy-types-gpencilsculptguide-reference-point"),
("bpy.types.linestylegeometrymodifier_2doffset*", "render/freestyle/parameter_editor/line_style/modifiers/geometry/2d_offset.html#bpy-types-linestylegeometrymodifier-2doffset"),
("bpy.types.linestylegeometrymodifier_sampling*", "render/freestyle/parameter_editor/line_style/modifiers/geometry/sampling.html#bpy-types-linestylegeometrymodifier-sampling"),
("bpy.types.cyclesrendersettings.*dicing_rate*", "render/cycles/render_settings/subdivision.html#bpy-types-cyclesrendersettings-dicing-rate"),
+ ("bpy.types.materialgpencilstyle.stroke_style*", "grease_pencil/materials/grease_pencil_shader.html#bpy-types-materialgpencilstyle-stroke-style"),
("bpy.types.rendersettings.use_file_extension*", "render/output/settings.html#bpy-types-rendersettings-use-file-extension"),
("bpy.types.spaceview3d.transform_orientation*", "scene_layout/object/editing/transform/control/orientations.html#bpy-types-spaceview3d-transform-orientation"),
("bpy.ops.object.constraint_add_with_targets*", "animation/constraints/interface/adding_removing.html#bpy-ops-object-constraint-add-with-targets"),
+ ("bpy.ops.object.vertex_group_copy_to_linked*", "modeling/meshes/properties/vertex_groups/vertex_groups.html#bpy-ops-object-vertex-group-copy-to-linked"),
("bpy.types.cyclesobjectsettings.dicing_rate*", "render/cycles/object_settings/adaptive_subdiv.html#bpy-types-cyclesobjectsettings-dicing-rate"),
+ ("bpy.types.materialgpencilstyle.show_stroke*", "grease_pencil/materials/grease_pencil_shader.html#bpy-types-materialgpencilstyle-show-stroke"),
("bpy.types.posebone.use_ik_rotation_control*", "animation/armatures/posing/bone_constraints/inverse_kinematics/introduction.html#bpy-types-posebone-use-ik-rotation-control"),
("bpy.ops.constraint.disable_keep_transform*", "animation/constraints/interface/common.html#bpy-ops-constraint-disable-keep-transform"),
+ ("bpy.ops.object.vertex_group_normalize_all*", "sculpt_paint/weight_paint/editing.html#bpy-ops-object-vertex-group-normalize-all"),
+ ("bpy.types.brushgpencilsettings.pen_jitter*", "grease_pencil/modes/draw/tool_settings/brushes/draw_brush.html#bpy-types-brushgpencilsettings-pen-jitter"),
+ ("bpy.types.gpencillayer.use_onion_skinning*", "grease_pencil/properties/layers.html#bpy-types-gpencillayer-use-onion-skinning"),
+ ("bpy.types.gpencilsculptguide.use_snapping*", "grease_pencil/modes/draw/guides.html#bpy-types-gpencilsculptguide-use-snapping"),
+ ("bpy.types.gpencilsculptsettings.lock_axis*", "grease_pencil/modes/draw/drawing_planes.html#bpy-types-gpencilsculptsettings-lock-axis"),
("bpy.types.imagepaint.use_backface_culling*", "sculpt_paint/texture_paint/tool_settings/options.html#bpy-types-imagepaint-use-backface-culling"),
("bpy.types.linestyle*modifier_curvature_3d*", "render/freestyle/parameter_editor/line_style/modifiers/color/curvature_3d.html#bpy-types-linestyle-modifier-curvature-3d"),
+ ("bpy.types.materialgpencilstyle.fill_color*", "grease_pencil/materials/grease_pencil_shader.html#bpy-types-materialgpencilstyle-fill-color"),
+ ("bpy.types.materialgpencilstyle.fill_style*", "grease_pencil/materials/grease_pencil_shader.html#bpy-types-materialgpencilstyle-fill-style"),
+ ("bpy.types.materialgpencilstyle.mix_factor*", "grease_pencil/materials/grease_pencil_shader.html#bpy-types-materialgpencilstyle-mix-factor"),
("bpy.types.rendersettings.use_render_cache*", "render/output/settings.html#bpy-types-rendersettings-use-render-cache"),
+ ("bpy.types.rendersettings_simplify_gpencil*", "render/cycles/render_settings/simplify.html#bpy-types-rendersettings-simplify-gpencil"),
("bpy.types.sceneeevee.use_taa_reprojection*", "render/eevee/render_settings/sampling.html#bpy-types-sceneeevee-use-taa-reprojection"),
+ ("bpy.types.sequenceeditor.use_overlay_lock*", "video_editing/preview/properties.html#bpy-types-sequenceeditor-use-overlay-lock"),
+ ("bpy.types.toolsettings.gpencil_selectmode*", "grease_pencil/selecting.html#bpy-types-toolsettings-gpencil-selectmode"),
+ ("bpy.ops.gpencil.active_frames_delete_all*", "grease_pencil/animation/tools.html#bpy-ops-gpencil-active-frames-delete-all"),
+ ("bpy.ops.gpencil.stroke_merge_by_distance*", "grease_pencil/modes/edit/grease_pencil_menu.html#bpy-ops-gpencil-stroke-merge-by-distance"),
("bpy.ops.object.anim_transforms_to_deltas*", "scene_layout/object/editing/transform/clear_apply.html#bpy-ops-object-anim-transforms-to-deltas"),
+ ("bpy.types.brushgpencilsettings.uv_random*", "grease_pencil/modes/draw/tool_settings/brushes/draw_brush.html#bpy-types-brushgpencilsettings-uv-random"),
("bpy.types.compositornodeplanetrackdeform*", "compositing/types/distort/plane_track_deform.html#bpy-types-compositornodeplanetrackdeform"),
("bpy.types.linestyle*modifier_alongstroke*", "render/freestyle/parameter_editor/line_style/modifiers/color/along_stroke.html#bpy-types-linestyle-modifier-alongstroke"),
("bpy.types.linestyle*modifier_creaseangle*", "render/freestyle/parameter_editor/line_style/modifiers/color/crease_angle.html#bpy-types-linestyle-modifier-creaseangle"),
("bpy.types.linestylecolormodifier_tangent*", "render/freestyle/parameter_editor/line_style/modifiers/color/tangent.html#bpy-types-linestylecolormodifier-tangent"),
+ ("bpy.types.materialgpencilstyle.mix_color*", "grease_pencil/materials/grease_pencil_shader.html#bpy-types-materialgpencilstyle-mix-color"),
+ ("bpy.types.materialgpencilstyle.show_fill*", "grease_pencil/materials/grease_pencil_shader.html#bpy-types-materialgpencilstyle-show-fill"),
("bpy.types.rendersettings.use_placeholder*", "render/output/settings.html#bpy-types-rendersettings-use-placeholder"),
("bpy.types.shadernodesubsurfacescattering*", "render/shader_nodes/shader/sss.html#bpy-types-shadernodesubsurfacescattering"),
+ ("bpy.ops.object.vertex_group_limit_total*", "sculpt_paint/weight_paint/editing.html#bpy-ops-object-vertex-group-limit-total"),
+ ("bpy.ops.object.vertex_group_remove_from*", "modeling/meshes/properties/vertex_groups/vertex_groups.html#bpy-ops-object-vertex-group-remove-from"),
("bpy.types.compositornodecolorcorrection*", "compositing/types/color/color_correction.html#bpy-types-compositornodecolorcorrection"),
("bpy.types.compositornodemoviedistortion*", "compositing/types/distort/movie_distortion.html#bpy-types-compositornodemoviedistortion"),
("bpy.types.ffmpegsettings.audio_channels*", "scene_layout/scene/properties.html#bpy-types-ffmpegsettings-audio-channels"),
@@ -96,14 +139,21 @@ url_manual_mapping = (
("bpy.types.compositornodedoubleedgemask*", "compositing/types/matte/double_edge_mask.html#bpy-types-compositornodedoubleedgemask"),
("bpy.types.ffmpegsettings.audio_mixrate*", "scene_layout/scene/properties.html#bpy-types-ffmpegsettings-audio-mixrate"),
("bpy.types.material.preview_render_type*", "render/materials/preview.html#bpy-types-material-preview-render-type"),
+ ("bpy.types.materialgpencilstyle.pattern*", "grease_pencil/materials/grease_pencil_shader.html#bpy-types-materialgpencilstyle-pattern"),
+ ("bpy.types.materialgpencilstyle.texture*", "grease_pencil/materials/grease_pencil_shader.html#bpy-types-materialgpencilstyle-texture"),
("bpy.types.rendersettings.use_overwrite*", "render/output/settings.html#bpy-types-rendersettings-use-overwrite"),
("bpy.types.sceneeevee.volumetric_shadow*", "render/eevee/render_settings/volumetrics.html#bpy-types-sceneeevee-volumetric-shadow"),
("bpy.types.shadernodebsdfhairprincipled*", "render/shader_nodes/shader/hair_principled.html#bpy-types-shadernodebsdfhairprincipled"),
("bpy.types.shadernodevectordisplacement*", "render/shader_nodes/vector/vector_displacement.html#bpy-types-shadernodevectordisplacement"),
("bpy.types.spacegrapheditor.show_cursor*", "editors/graph_editor/fcurves/properties.html#bpy-types-spacegrapheditor-show-cursor"),
("bpy.types.spaceimageeditor.show_repeat*", "editors/image/view_tab.html#bpy-types-spaceimageeditor-show-repeat"),
+ ("bpy.ops.curve.normals_make_consistent*", "modeling/curves/editing/control_points.html#bpy-ops-curve-normals-make-consistent"),
+ ("bpy.ops.gpencil.stroke_simplify_fixed*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-stroke-simplify-fixed"),
+ ("bpy.ops.object.gpencil_modifier_apply*", "grease_pencil/modifiers/introduction.html#bpy-ops-object-gpencil-modifier-apply"),
+ ("bpy.ops.object.vertex_group_normalize*", "sculpt_paint/weight_paint/editing.html#bpy-ops-object-vertex-group-normalize"),
("bpy.ops.object.visual_transform_apply*", "scene_layout/object/editing/transform/clear_apply.html#bpy-ops-object-visual-transform-apply"),
("bpy.types.brush.texture_overlay_alpha*", "sculpt_paint/brush/display.html#bpy-types-brush-texture-overlay-alpha"),
+ ("bpy.types.brushgpencilsettings.random*", "grease_pencil/modes/draw/tool_settings/brushes/draw_brush.html#bpy-types-brushgpencilsettings-random"),
("bpy.types.compositornodebilateralblur*", "compositing/types/filter/bilateral_blur.html#bpy-types-compositornodebilateralblur"),
("bpy.types.compositornodedistancematte*", "compositing/types/matte/distance_key.html#bpy-types-compositornodedistancematte"),
("bpy.types.imagepaint.screen_grab_size*", "sculpt_paint/texture_paint/tool_settings/options.html#bpy-types-imagepaint-screen-grab-size"),
@@ -111,8 +161,12 @@ url_manual_mapping = (
("bpy.types.particlesettingstextureslot*", "physics/particles/texture_influence.html#bpy-types-particlesettingstextureslot"),
("bpy.types.posebone.ik_rotation_weight*", "animation/armatures/posing/bone_constraints/inverse_kinematics/introduction.html#bpy-types-posebone-ik-rotation-weight"),
("bpy.types.sceneeevee.volumetric_light*", "render/eevee/render_settings/volumetrics.html#bpy-types-sceneeevee-volumetric-light"),
+ ("bpy.types.sequenceeditor.show_overlay*", "video_editing/preview/properties.html#bpy-types-sequenceeditor-show-overlay"),
+ ("bpy.types.spline.radius_interpolation*", "modeling/curves/properties/active_spline.html#bpy-types-spline-radius-interpolation"),
+ ("bpy.ops.gpencil.interpolate_sequence*", "grease_pencil/animation/tools.html#bpy-ops-gpencil-interpolate-sequence"),
("bpy.ops.mesh.normals_make_consistent*", "modeling/meshes/editing/normals.html#bpy-ops-mesh-normals-make-consistent"),
("bpy.ops.object.duplicate_move_linked*", "scene_layout/object/editing/duplication.html#bpy-ops-object-duplicate-move-linked"),
+ ("bpy.ops.object.vertex_group_quantize*", "sculpt_paint/weight_paint/editing.html#bpy-ops-object-vertex-group-quantize"),
("bpy.ops.view3d.localview_remove_from*", "editors/3dview/navigate/views.html#bpy-ops-view3d-localview-remove-from"),
("bpy.types.brush.cursor_overlay_alpha*", "sculpt_paint/brush/display.html#bpy-types-brush-cursor-overlay-alpha"),
("bpy.types.brush.topology_rake_factor*", "sculpt_paint/sculpting/tool_settings/dyntopo.html#bpy-types-brush-topology-rake-factor"),
@@ -121,15 +175,23 @@ url_manual_mapping = (
("bpy.types.compositornodekeyingscreen*", "compositing/types/matte/keying_screen.html#bpy-types-compositornodekeyingscreen"),
("bpy.types.dynamicpaintcanvassettings*", "physics/dynamic_paint/canvas.html#bpy-types-dynamicpaintcanvassettings"),
("bpy.types.fmodifierfunctiongenerator*", "editors/graph_editor/fcurves/modifiers.html#bpy-types-fmodifierfunctiongenerator"),
+ ("bpy.types.gpencillayer.use_solo_mode*", "grease_pencil/properties/layers.html#bpy-types-gpencillayer-use-solo-mode"),
+ ("bpy.types.greasepencil.use_multiedit*", "grease_pencil/multiframe.html#bpy-types-greasepencil-use-multiedit"),
+ ("bpy.types.materialgpencilstyle.color*", "grease_pencil/materials/grease_pencil_shader.html#bpy-types-materialgpencilstyle-color"),
("bpy.types.movietrackingstabilization*", "movie_clip/tracking/clip/properties/stabilization/index.html#bpy-types-movietrackingstabilization"),
("bpy.types.object.display_bounds_type*", "scene_layout/object/properties/display.html#bpy-types-object-display-bounds-type"),
("bpy.types.shadernodeambientocclusion*", "render/shader_nodes/input/ao.html#bpy-types-shadernodeambientocclusion"),
("bpy.types.shadernodevolumeabsorption*", "render/shader_nodes/shader/volume_absorption.html#bpy-types-shadernodevolumeabsorption"),
("bpy.types.shadernodevolumeprincipled*", "render/shader_nodes/shader/volume_principled.html#bpy-types-shadernodevolumeprincipled"),
("bpy.types.toolsettings.use_uv_sculpt*", "modeling/meshes/editing/uv/uv_sculpt.html#bpy-types-toolsettings-use-uv-sculpt"),
+ ("bpy.ops.gpencil.interpolate_reverse*", "grease_pencil/animation/interpolation.html#bpy-ops-gpencil-interpolate-reverse"),
+ ("bpy.ops.gpencil.set_active_material*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-set-active-material"),
+ ("bpy.ops.gpencil.stroke_change_color*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-stroke-change-color"),
+ ("bpy.ops.gpencil.stroke_cyclical_set*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-stroke-cyclical-set"),
("bpy.ops.mesh.set_normals_from_faces*", "modeling/meshes/editing/normals.html#bpy-ops-mesh-set-normals-from-faces"),
("bpy.ops.object.duplicates_make_real*", "scene_layout/object/editing/transform/clear_apply.html#bpy-ops-object-duplicates-make-real"),
("bpy.ops.object.transforms_to_deltas*", "scene_layout/object/editing/transform/clear_apply.html#bpy-ops-object-transforms-to-deltas"),
+ ("bpy.ops.sequencer.view_ghost_border*", "video_editing/preview/properties.html#bpy-ops-sequencer-view-ghost-border"),
("bpy.types.brush.use_primary_overlay*", "sculpt_paint/brush/display.html#bpy-types-brush-use-primary-overlay"),
("bpy.types.compositornodechromamatte*", "compositing/types/matte/chroma_key.html#bpy-types-compositornodechromamatte"),
("bpy.types.compositornodedilateerode*", "compositing/types/filter/dilate_erode.html#bpy-types-compositornodedilateerode"),
@@ -137,6 +199,8 @@ url_manual_mapping = (
("bpy.types.compositornodesplitviewer*", "compositing/types/output/split_viewer.html#bpy-types-compositornodesplitviewer"),
("bpy.types.curve.use_uv_as_generated*", "editors/uv/generated_uvs.html#bpy-types-curve-use-uv-as-generated"),
("bpy.types.dynamicpaintbrushsettings*", "physics/dynamic_paint/brush.html#bpy-types-dynamicpaintbrushsettings"),
+ ("bpy.types.materialgpencilstyle.flip*", "grease_pencil/materials/grease_pencil_shader.html#bpy-types-materialgpencilstyle-flip"),
+ ("bpy.types.materialgpencilstyle.mode*", "grease_pencil/materials/grease_pencil_shader.html#bpy-types-materialgpencilstyle-mode"),
("bpy.types.rendersettings.use_border*", "render/output/settings.html#bpy-types-rendersettings-use-border"),
("bpy.types.sceneeevee.bokeh_max_size*", "render/eevee/render_settings/depth_of_field.html#bpy-types-sceneeevee-bokeh-max-size"),
("bpy.types.shadernodebsdfanisotropic*", "render/shader_nodes/shader/anisotropic.html#bpy-types-shadernodebsdfanisotropic"),
@@ -149,8 +213,13 @@ url_manual_mapping = (
("bpy.ops.node.read_fullsamplelayers*", "interface/controls/nodes/editing.html#bpy-ops-node-read-fullsamplelayers"),
("bpy.ops.object.datalayout_transfer*", "modeling/meshes/editing/data_transfer.html#bpy-ops-object-datalayout-transfer"),
("bpy.ops.object.randomize_transform*", "scene_layout/object/editing/transform/tools.html#bpy-ops-object-randomize-transform"),
+ ("bpy.ops.object.vertex_group_invert*", "sculpt_paint/weight_paint/editing.html#bpy-ops-object-vertex-group-invert"),
("bpy.ops.object.vertex_group_levels*", "sculpt_paint/weight_paint/editing.html#bpy-ops-object-vertex-group-levels"),
+ ("bpy.ops.object.vertex_group_mirror*", "sculpt_paint/weight_paint/editing.html#bpy-ops-object-vertex-group-mirror"),
+ ("bpy.ops.object.vertex_group_remove*", "modeling/meshes/properties/vertex_groups/vertex_groups.html#bpy-ops-object-vertex-group-remove"),
+ ("bpy.ops.object.vertex_group_smooth*", "sculpt_paint/weight_paint/editing.html#bpy-ops-object-vertex-group-smooth"),
("bpy.ops.sequencer.crossfade_sounds*", "video_editing/sequencer/strips/transitions/cross.html#bpy-ops-sequencer-crossfade-sounds"),
+ ("bpy.ops.sequencer.export_subtitles*", "video_editing/preview/introduction.html#bpy-ops-sequencer-export-subtitles"),
("bpy.ops.transform.edge_bevelweight*", "modeling/meshes/editing/edges.html#bpy-ops-transform-edge-bevelweight"),
("bpy.ops.wm.previews_batch_generate*", "files/blend/previews.html#bpy-ops-wm-previews-batch-generate"),
("bpy.types.brush.use_cursor_overlay*", "sculpt_paint/brush/display.html#bpy-types-brush-use-cursor-overlay"),
@@ -173,12 +242,17 @@ url_manual_mapping = (
("bpy.types.shadernodebsdfrefraction*", "render/shader_nodes/shader/refraction.html#bpy-types-shadernodebsdfrefraction"),
("bpy.types.shadernodeoutputmaterial*", "render/shader_nodes/output/material.html#bpy-types-shadernodeoutputmaterial"),
("bpy.types.shadernodetexenvironment*", "render/shader_nodes/textures/environment.html#bpy-types-shadernodetexenvironment"),
+ ("bpy.types.subdividegpencilmodifier*", "grease_pencil/modifiers/generate/subdivide.html#bpy-types-subdividegpencilmodifier"),
+ ("bpy.types.thicknessgpencilmodifier*", "grease_pencil/modifiers/deform/thickness.html#bpy-types-thicknessgpencilmodifier"),
("bpy.types.transformcacheconstraint*", "animation/constraints/transform/transform_cache.html#bpy-types-transformcacheconstraint"),
("bpy.types.userpreferencesfilepaths*", "editors/preferences/file_paths.html#bpy-types-userpreferencesfilepaths"),
("bpy.types.vertexweighteditmodifier*", "modeling/modifiers/modify/weight_edit.html#bpy-types-vertexweighteditmodifier"),
("bpy.ops.curve.match_texture_space*", "editors/uv/generated_uvs.html#bpy-ops-curve-match-texture-space"),
("bpy.ops.font.text_paste_from_file*", "modeling/texts/selecting_editing.html#bpy-ops-font-text-paste-from-file"),
+ ("bpy.ops.gpencil.frame_clean_loose*", "grease_pencil/modes/edit/grease_pencil_menu.html#bpy-ops-gpencil-frame-clean-loose"),
+ ("bpy.ops.object.vertex_group_clean*", "sculpt_paint/weight_paint/editing.html#bpy-ops-object-vertex-group-clean"),
("bpy.ops.render.play-rendered-anim*", "render/output/animation_player.html#bpy-ops-render-play-rendered-anim"),
+ ("bpy.types.armaturegpencilmodifier*", "grease_pencil/modifiers/deform/armature.html#bpy-types-armaturegpencilmodifier"),
("bpy.types.camera.show_composition*", "render/cameras.html#bpy-types-camera-show-composition"),
("bpy.types.compositornodealphaover*", "compositing/types/color/alpha_over.html#bpy-types-compositornodealphaover"),
("bpy.types.compositornodebokehblur*", "compositing/types/filter/bokeh_blur.html#bpy-types-compositornodebokehblur"),
@@ -194,6 +268,9 @@ url_manual_mapping = (
("bpy.types.compositornodetranslate*", "compositing/types/distort/translate.html#bpy-types-compositornodetranslate"),
("bpy.types.fluidsimulationmodifier*", "physics/fluid/index.html#bpy-types-fluidsimulationmodifier"),
("bpy.types.freestylemodulesettings*", "render/freestyle/python.html#bpy-types-freestylemodulesettings"),
+ ("bpy.types.gpencillayer.blend_mode*", "grease_pencil/properties/layers.html#bpy-types-gpencillayer-blend-mode"),
+ ("bpy.types.gpencillayer.mask_layer*", "grease_pencil/properties/layers.html#bpy-types-gpencillayer-mask-layer"),
+ ("bpy.types.gpencilsculptguide.type*", "grease_pencil/modes/draw/guides.html#bpy-types-gpencilsculptguide-type"),
("bpy.types.laplaciandeformmodifier*", "modeling/modifiers/deform/laplacian_deform.html#bpy-types-laplaciandeformmodifier"),
("bpy.types.laplaciansmoothmodifier*", "modeling/modifiers/deform/laplacian_smooth.html#bpy-types-laplaciansmoothmodifier"),
("bpy.types.limitdistanceconstraint*", "animation/constraints/transform/limit_distance.html#bpy-types-limitdistanceconstraint"),
@@ -204,9 +281,16 @@ url_manual_mapping = (
("bpy.types.shadernodeeeveespecular*", "render/shader_nodes/shader/specular_bsdf.html#bpy-types-shadernodeeeveespecular"),
("bpy.types.shadernodehuesaturation*", "render/shader_nodes/color/hue_saturation.html#bpy-types-shadernodehuesaturation"),
("bpy.types.shadernodevolumescatter*", "render/shader_nodes/shader/volume_scatter.html#bpy-types-shadernodevolumescatter"),
+ ("bpy.types.simplifygpencilmodifier*", "grease_pencil/modifiers/generate/simplify.html#bpy-types-simplifygpencilmodifier"),
("bpy.types.spacegrapheditor.cursor*", "editors/graph_editor/introduction.html#bpy-types-spacegrapheditor-cursor"),
("bpy.types.vertexweightmixmodifier*", "modeling/modifiers/modify/weight_mix.html#bpy-types-vertexweightmixmodifier"),
+ ("bpy.ops.gpencil.frame_clean_fill*", "grease_pencil/modes/edit/grease_pencil_menu.html#bpy-ops-gpencil-frame-clean-fill"),
+ ("bpy.ops.gpencil.stroke_subdivide*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-stroke-subdivide"),
("bpy.ops.object.constraints_clear*", "animation/constraints/interface/adding_removing.html#bpy-ops-object-constraints-clear"),
+ ("bpy.ops.object.vertex_group_copy*", "modeling/meshes/properties/vertex_groups/vertex_groups.html#bpy-ops-object-vertex-group-copy"),
+ ("bpy.ops.object.vertex_group_lock*", "modeling/meshes/properties/vertex_groups/vertex_groups.html#bpy-ops-object-vertex-group-lock"),
+ ("bpy.ops.object.vertex_group_move*", "modeling/meshes/properties/vertex_groups/vertex_groups.html#bpy-ops-object-vertex-group-move"),
+ ("bpy.ops.object.vertex_group_sort*", "modeling/meshes/properties/vertex_groups/vertex_groups.html#bpy-ops-object-vertex-group-sort"),
("bpy.ops.uv.average_islands_scale*", "modeling/meshes/editing/uv/layout.html#bpy-ops-uv-average-islands-scale"),
("bpy.ops.view3d.edit_mesh_extrude*", "modeling/meshes/editing/duplicating/extrude.html#bpy-ops-view3d-edit-mesh-extrude"),
("bpy.types.brightcontrastmodifier*", "video_editing/sequencer/properties/modifiers.html#bpy-types-brightcontrastmodifier"),
@@ -228,18 +312,31 @@ url_manual_mapping = (
("bpy.types.copyrotationconstraint*", "animation/constraints/transform/copy_rotation.html#bpy-types-copyrotationconstraint"),
("bpy.types.cyclesmaterialsettings*", "render/cycles/material_settings.html#bpy-types-cyclesmaterialsettings"),
("bpy.types.imagepaint.use_occlude*", "sculpt_paint/texture_paint/tool_settings/options.html#bpy-types-imagepaint-use-occlude"),
+ ("bpy.types.latticegpencilmodifier*", "grease_pencil/modifiers/deform/lattice.html#bpy-types-latticegpencilmodifier"),
("bpy.types.mesh.auto_smooth_angle*", "modeling/meshes/structure.html#bpy-types-mesh-auto-smooth-angle"),
("bpy.types.objectsolverconstraint*", "animation/constraints/motion_tracking/object_solver.html#bpy-types-objectsolverconstraint"),
+ ("bpy.types.opacitygpencilmodifier*", "grease_pencil/modifiers/color/opacity.html#bpy-types-opacitygpencilmodifier"),
("bpy.types.particlesystemmodifier*", "physics/particles/index.html#bpy-types-particlesystemmodifier"),
("bpy.types.sceneeevee.motion_blur*", "render/eevee/render_settings/motion_blur.html#bpy-types-sceneeevee-motion-blur"),
("bpy.types.sceneeevee.taa_samples*", "render/eevee/render_settings/sampling.html#bpy-types-sceneeevee-taa-samples"),
+ ("bpy.types.sequenceeditor.overlay*", "video_editing/preview/properties.html#bpy-types-sequenceeditor-overlay"),
("bpy.types.shadernodedisplacement*", "render/shader_nodes/vector/displacement.html#bpy-types-shadernodedisplacement"),
("bpy.types.shadernodelightfalloff*", "render/shader_nodes/color/light_falloff.html#bpy-types-shadernodelightfalloff"),
("bpy.types.shadernodeparticleinfo*", "render/shader_nodes/input/particle_info.html#bpy-types-shadernodeparticleinfo"),
("bpy.types.weightednormalmodifier*", "modeling/modifiers/modify/weighted_normal.html#bpy-types-weightednormalmodifier"),
+ ("bpy.ops.curve.spline_weight_set*", "modeling/curves/editing/other.html#bpy-ops-curve-spline-weight-set"),
+ ("bpy.ops.gpencil.blank_frame_add*", "grease_pencil/animation/tools.html#bpy-ops-gpencil-blank-frame-add"),
+ ("bpy.ops.gpencil.frame_duplicate*", "grease_pencil/animation/tools.html#bpy-ops-gpencil-frame-duplicate"),
+ ("bpy.ops.gpencil.stroke_caps_set*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-stroke-caps-set"),
+ ("bpy.ops.gpencil.stroke_separate*", "grease_pencil/modes/edit/grease_pencil_menu.html#bpy-ops-gpencil-stroke-separate"),
+ ("bpy.ops.gpencil.stroke_simplify*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-stroke-simplify"),
("bpy.ops.object.constraints_copy*", "animation/constraints/interface/adding_removing.html#bpy-ops-object-constraints-copy"),
+ ("bpy.ops.object.gpencil_modifier*", "grease_pencil/modifiers/index.html#bpy-ops-object-gpencil-modifier"),
("bpy.ops.object.make_single_user*", "scene_layout/object/editing/duplication.html#bpy-ops-object-make-single-user"),
("bpy.ops.object.select_hierarchy*", "scene_layout/object/selecting.html#bpy-ops-object-select-hierarchy"),
+ ("bpy.ops.object.vertex_group_add*", "modeling/meshes/properties/vertex_groups/vertex_groups.html#bpy-ops-object-vertex-group-add"),
+ ("bpy.ops.object.vertex_group_fix*", "sculpt_paint/weight_paint/editing.html#bpy-ops-object-vertex-group-fix"),
+ ("bpy.ops.paint.weight_from_bones*", "sculpt_paint/weight_paint/editing.html#bpy-ops-paint-weight-from-bones"),
("bpy.ops.screen.screen_full_area*", "interface/window_system/areas.html#bpy-ops-screen-screen-full-area"),
("bpy.ops.transform.rotate_normal*", "modeling/meshes/editing/normals.html#bpy-ops-transform-rotate-normal"),
("bpy.ops.transform.shrink_fatten*", "modeling/meshes/editing/transform/shrink-fatten.html#bpy-ops-transform-shrink-fatten"),
@@ -258,8 +355,12 @@ url_manual_mapping = (
("bpy.types.dampedtrackconstraint*", "animation/constraints/tracking/damped_track.html#bpy-types-dampedtrackconstraint"),
("bpy.types.distortednoisetexture*", "render/materials/legacy_textures/types/distorted_noise.html#bpy-types-distortednoisetexture"),
("bpy.types.followtrackconstraint*", "animation/constraints/motion_tracking/follow_track.html#bpy-types-followtrackconstraint"),
+ ("bpy.types.gpencilsculptsettings*", "grease_pencil/properties/index.html#bpy-types-gpencilsculptsettings"),
("bpy.types.lockedtrackconstraint*", "animation/constraints/tracking/locked_track.html#bpy-types-lockedtrackconstraint"),
+ ("bpy.types.material.blend_method*", "render/eevee/materials/settings.html#bpy-types-material-blend-method"),
+ ("bpy.types.mirrorgpencilmodifier*", "grease_pencil/modifiers/generate/mirror.html#bpy-types-mirrorgpencilmodifier"),
("bpy.types.obstaclefluidsettings*", "physics/fluid/types/obstacle.html#bpy-types-obstaclefluidsettings"),
+ ("bpy.types.offsetgpencilmodifier*", "grease_pencil/modifiers/deform/offset.html#bpy-types-offsetgpencilmodifier"),
("bpy.types.particlefluidsettings*", "physics/particles/emitter/physics/fluid.html#bpy-types-particlefluidsettings"),
("bpy.types.sceneeevee.volumetric*", "render/eevee/render_settings/volumetrics.html#bpy-types-sceneeevee-volumetric"),
("bpy.types.shadernodebsdfdiffuse*", "render/shader_nodes/shader/diffuse.html#bpy-types-shadernodebsdfdiffuse"),
@@ -269,14 +370,22 @@ url_manual_mapping = (
("bpy.types.shadernodetexgradient*", "render/shader_nodes/textures/gradient.html#bpy-types-shadernodetexgradient"),
("bpy.types.shadernodetexmusgrave*", "render/shader_nodes/textures/musgrave.html#bpy-types-shadernodetexmusgrave"),
("bpy.types.shadernodevectorcurve*", "render/shader_nodes/vector/curves.html#bpy-types-shadernodevectorcurve"),
+ ("bpy.types.smoothgpencilmodifier*", "grease_pencil/modifiers/deform/smooth.html#bpy-types-smoothgpencilmodifier"),
+ ("bpy.types.spline.use_endpoint_u*", "modeling/curves/properties/active_spline.html#bpy-types-spline-use-endpoint-u"),
("bpy.types.userpreferencessystem*", "editors/preferences/system.html#bpy-types-userpreferencessystem"),
+ ("bpy.ops.curve.switch_direction*", "modeling/curves/editing/segments.html#bpy-ops-curve-switch-direction"),
+ ("bpy.ops.gpencil.duplicate_move*", "grease_pencil/modes/edit/grease_pencil_menu.html#bpy-ops-gpencil-duplicate-move"),
+ ("bpy.ops.gpencil.stroke_arrange*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-stroke-arrange"),
("bpy.ops.mesh.bridge-edge-loops*", "modeling/meshes/editing/edges.html#bpy-ops-mesh-bridge-edge-loops"),
("bpy.ops.object.paths_calculate*", "animation/motion_paths.html#bpy-ops-object-paths-calculate"),
("bpy.ops.object.transform_apply*", "scene_layout/object/editing/transform/clear_apply.html#bpy-ops-object-transform-apply"),
("bpy.ops.outliner.lib_operation*", "files/linked_libraries.html#bpy-ops-outliner-lib-operation"),
("bpy.ops.screen.region_quadview*", "editors/3dview/navigate/views.html#bpy-ops-screen-region-quadview"),
("bpy.ops.uv.follow_active_quads*", "modeling/meshes/editing/uv/unwrapping/mapping_types.html#bpy-ops-uv-follow-active-quads"),
+ ("bpy.types.arraygpencilmodifier*", "grease_pencil/modifiers/generate/array.html#bpy-types-arraygpencilmodifier"),
+ ("bpy.types.buildgpencilmodifier*", "grease_pencil/modifiers/generate/build.html#bpy-types-buildgpencilmodifier"),
("bpy.types.colorbalancemodifier*", "video_editing/sequencer/properties/modifiers.html#bpy-types-colorbalancemodifier"),
+ ("bpy.types.colorgpencilmodifier*", "grease_pencil/modifiers/color/hue_saturation.html#bpy-types-colorgpencilmodifier"),
("bpy.types.compositornodefilter*", "compositing/types/filter/filter_node.html#bpy-types-compositornodefilter"),
("bpy.types.compositornodehuesat*", "compositing/types/color/hue_saturation.html#bpy-types-compositornodehuesat"),
("bpy.types.compositornodeidmask*", "compositing/types/converter/id_mask.html#bpy-types-compositornodeidmask"),
@@ -294,8 +403,10 @@ url_manual_mapping = (
("bpy.types.ffmpegsettings.audio*", "render/output/file_formats.html#bpy-types-ffmpegsettings-audio"),
("bpy.types.followpathconstraint*", "animation/constraints/relationship/follow_path.html#bpy-types-followpathconstraint"),
("bpy.types.gaussianblursequence*", "video_editing/sequencer/strips/effects/blur.html#bpy-types-gaussianblursequence"),
+ ("bpy.types.gpencillayer.opacity*", "grease_pencil/properties/layers.html#bpy-types-gpencillayer-opacity"),
("bpy.types.image.display_aspect*", "editors/image/view_tab.html#bpy-types-image-display-aspect"),
("bpy.types.limitscaleconstraint*", "animation/constraints/transform/limit_scale.html#bpy-types-limitscaleconstraint"),
+ ("bpy.types.materialgpencilstyle*", "grease_pencil/materials/index.html#bpy-types-materialgpencilstyle"),
("bpy.types.mesh.use_auto_smooth*", "modeling/meshes/structure.html#bpy-types-mesh-use-auto-smooth"),
("bpy.types.outflowfluidsettings*", "physics/fluid/types/flow.html#bpy-types-outflowfluidsettings"),
("bpy.types.scene.background_set*", "scene_layout/scene/properties.html#bpy-types-scene-background-set"),
@@ -318,16 +429,24 @@ url_manual_mapping = (
("bpy.types.unifiedpaintsettings*", "sculpt_paint/texture_paint/tool_settings/options.html#bpy-types-unifiedpaintsettings"),
("bpy.types.userpreferencesinput*", "editors/preferences/input.html#bpy-types-userpreferencesinput"),
("bpy.types.whitebalancemodifier*", "video_editing/sequencer/properties/modifiers.html#bpy-types-whitebalancemodifier"),
+ ("bpy.ops.curve.handle_type_set*", "modeling/curves/editing/control_points.html#bpy-ops-curve-handle-type-set"),
+ ("bpy.ops.curve.spline_type_set*", "modeling/curves/editing/curve.html#bpy-ops-curve-spline-type-set"),
+ ("bpy.ops.gpencil.move_to_layer*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-move-to-layer"),
+ ("bpy.ops.gpencil.stroke_sample*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-stroke-sample"),
+ ("bpy.ops.gpencil.stroke_smooth*", "grease_pencil/modes/edit/point_menu.html#bpy-ops-gpencil-stroke-smooth"),
("bpy.ops.mesh.smoothen_normals*", "modeling/meshes/editing/normals.html#bpy-ops-mesh-smoothen-normals"),
("bpy.ops.object.duplicate_move*", "scene_layout/object/editing/duplication.html#bpy-ops-object-duplicate-move"),
+ ("bpy.ops.object.hook_add_selob*", "modeling/meshes/editing/vertices.html#bpy-ops-object-hook-add-selob"),
("bpy.ops.object.select_by_type*", "scene_layout/object/selecting.html#bpy-ops-object-select-by-type"),
("bpy.ops.object.select_grouped*", "scene_layout/object/selecting.html#bpy-ops-object-select-grouped"),
("bpy.ops.object.select_pattern*", "scene_layout/object/selecting.html#bpy-ops-object-select-pattern"),
("bpy.ops.screen.repeat_history*", "interface/undo_redo.html#bpy-ops-screen-repeat-history"),
("bpy.ops.sequencer.refresh_all*", "video_editing/sequencer/navigating.html#bpy-ops-sequencer-refresh-all"),
+ ("bpy.ops.surface.primitive*add*", "modeling/surfaces/primitives.html#bpy-ops-surface-primitive-add"),
("bpy.ops.transform.edge_crease*", "modeling/meshes/editing/edges.html#bpy-ops-transform-edge-crease"),
("bpy.ops.uv.seams_from_islands*", "modeling/meshes/editing/uv/unwrapping/seams.html#bpy-ops-uv-seams-from-islands"),
("bpy.types.brush.icon_filepath*", "sculpt_paint/brush/display.html#bpy-types-brush-icon-filepath"),
+ ("bpy.types.brush.smooth_stroke*", "grease_pencil/modes/draw/tool_settings/brushes/draw_brush.html#bpy-types-brush-smooth-stroke"),
("bpy.types.camera.display_size*", "render/cameras.html#bpy-types-camera-display-size"),
("bpy.types.compositornodedblur*", "compositing/types/filter/directional_blur.html#bpy-types-compositornodedblur"),
("bpy.types.compositornodegamma*", "compositing/types/color/gamma.html#bpy-types-compositornodegamma"),
@@ -340,11 +459,13 @@ url_manual_mapping = (
("bpy.types.copyscaleconstraint*", "animation/constraints/transform/copy_scale.html#bpy-types-copyscaleconstraint"),
("bpy.types.cyclesworldsettings*", "render/cycles/world_settings.html#bpy-types-cyclesworldsettings"),
("bpy.types.domainfluidsettings*", "physics/fluid/types/domain.html#bpy-types-domainfluidsettings"),
+ ("bpy.types.hookgpencilmodifier*", "grease_pencil/modifiers/deform/hook.html#bpy-types-hookgpencilmodifier"),
("bpy.types.imageformatsettings*", "files/media/image_formats.html#bpy-types-imageformatsettings"),
("bpy.types.inflowfluidsettings*", "physics/fluid/types/flow.html#bpy-types-inflowfluidsettings"),
("bpy.types.kinematicconstraint*", "animation/constraints/tracking/ik_solver.html#bpy-types-kinematicconstraint"),
("bpy.types.mesh.use_paint_mask*", "sculpt_paint/brush/introduction.html#bpy-types-mesh-use-paint-mask"),
("bpy.types.movietrackingcamera*", "movie_clip/tracking/clip/properties/camera_data.html#bpy-types-movietrackingcamera"),
+ ("bpy.types.noisepencilmodifier*", "grease_pencil/modifiers/deform/noise.html#bpy-types-noisepencilmodifier"),
("bpy.types.object.display_type*", "scene_layout/object/properties/display.html#bpy-types-object-display-type"),
("bpy.types.particledupliweight*", "physics/particles/emitter/vertex_groups.html#bpy-types-particledupliweight"),
("bpy.types.poseboneconstraints*", "animation/armatures/posing/bone_constraints/index.html#bpy-types-poseboneconstraints"),
@@ -359,9 +480,14 @@ url_manual_mapping = (
("bpy.types.shadernodewireframe*", "render/shader_nodes/input/wireframe.html#bpy-types-shadernodewireframe"),
("bpy.types.smokedomainsettings*", "physics/smoke/types/domain.html#bpy-types-smokedomainsettings"),
("bpy.types.spacesequenceeditor*", "video_editing/index.html#bpy-types-spacesequenceeditor"),
+ ("bpy.types.spline.resolution_u*", "modeling/curves/properties/active_spline.html#bpy-types-spline-resolution-u"),
+ ("bpy.types.spline.use_bezier_u*", "modeling/curves/properties/active_spline.html#bpy-types-spline-use-bezier-u"),
+ ("bpy.types.spline.use_cyclic_u*", "modeling/curves/properties/active_spline.html#bpy-types-spline-use-cyclic-u"),
("bpy.types.stretchtoconstraint*", "animation/constraints/tracking/stretch_to.html#bpy-types-stretchtoconstraint"),
("bpy.types.texturenodecurvergb*", "editors/texture_node/types/color/rgb_curves.html#bpy-types-texturenodecurvergb"),
("bpy.types.texturenodevaltorgb*", "editors/texture_node/types/converter/rgb_to_bw.html#bpy-types-texturenodevaltorgb"),
+ ("bpy.types.timegpencilmodifier*", "grease_pencil/modifiers/deform/time_offset.html#bpy-types-timegpencilmodifier"),
+ ("bpy.types.tintgpencilmodifier*", "grease_pencil/modifiers/color/tint.html#bpy-types-tintgpencilmodifier"),
("bpy.types.transformconstraint*", "animation/constraints/transform/transformation.html#bpy-types-transformconstraint"),
("bpy.types.triangulatemodifier*", "modeling/modifiers/generate/triangulate.html#bpy-types-triangulatemodifier"),
("bpy.types.userpreferencesedit*", "editors/preferences/editing.html#bpy-types-userpreferencesedit"),
@@ -369,6 +495,12 @@ url_manual_mapping = (
("bpy.types.windowmanager.addon*", "editors/preferences/addons.html#bpy-types-windowmanager-addon"),
("bpy.ops.anim.keyframe_delete*", "animation/keyframes/editing.html#bpy-ops-anim-keyframe-delete"),
("bpy.ops.anim.keyframe_insert*", "animation/keyframes/editing.html#bpy-ops-anim-keyframe-insert"),
+ ("bpy.ops.console.autocomplete*", "editors/python_console.html#bpy-ops-console-autocomplete"),
+ ("bpy.ops.curve.dissolve_verts*", "modeling/curves/editing/curve.html#bpy-ops-curve-dissolve-verts"),
+ ("bpy.ops.curve.duplicate_move*", "modeling/curves/editing/curve.html#bpy-ops-curve-duplicate-move"),
+ ("bpy.ops.gpencil.extrude_move*", "grease_pencil/modes/edit/point_menu.html#bpy-ops-gpencil-extrude-move"),
+ ("bpy.ops.gpencil.stroke_merge*", "grease_pencil/modes/edit/point_menu.html#bpy-ops-gpencil-stroke-merge"),
+ ("bpy.ops.gpencil.stroke_split*", "grease_pencil/modes/edit/grease_pencil_menu.html#bpy-ops-gpencil-stroke-split"),
("bpy.ops.mesh.average_normals*", "modeling/meshes/editing/normals.html#bpy-ops-mesh-average-normals"),
("bpy.ops.mesh.vertices_smooth*", "modeling/meshes/editing/transform/smooth.html#bpy-ops-mesh-vertices-smooth"),
("bpy.ops.node.read_viewlayers*", "interface/controls/nodes/editing.html#bpy-ops-node-read-viewlayers"),
@@ -392,11 +524,14 @@ url_manual_mapping = (
("bpy.types.compositornodemask*", "compositing/types/input/mask.html#bpy-types-compositornodemask"),
("bpy.types.compositornodemath*", "compositing/types/converter/math.html#bpy-types-compositornodemath"),
("bpy.types.compositornodetime*", "compositing/types/input/time.html#bpy-types-compositornodetime"),
+ ("bpy.types.curve.resolution_u*", "modeling/curves/properties/shape.html#bpy-types-curve-resolution-u"),
+ ("bpy.types.curve.resolution_v*", "modeling/surfaces/properties/shape.html#bpy-types-curve-resolution-v"),
("bpy.types.curvepaintsettings*", "modeling/curves/editing/other.html#bpy-types-curvepaintsettings"),
("bpy.types.fluidfluidsettings*", "physics/fluid/types/fluid_object.html#bpy-types-fluidfluidsettings"),
("bpy.types.fmodifiergenerator*", "editors/graph_editor/fcurves/modifiers.html#bpy-types-fmodifiergenerator"),
("bpy.types.freestylelinestyle*", "render/freestyle/parameter_editor/line_style/index.html#bpy-types-freestylelinestyle"),
("bpy.types.gammacrosssequence*", "video_editing/sequencer/strips/transitions/cross.html#bpy-types-gammacrosssequence"),
+ ("bpy.types.gpencilsculptguide*", "grease_pencil/modes/draw/guides.html#bpy-types-gpencilsculptguide"),
("bpy.types.huecorrectmodifier*", "video_editing/sequencer/properties/modifiers.html#bpy-types-huecorrectmodifier"),
("bpy.types.imagepaint.stencil*", "sculpt_paint/texture_paint/tool_settings/mask.html#bpy-types-imagepaint-stencil"),
("bpy.types.meshdeformmodifier*", "modeling/modifiers/deform/mesh_deform.html#bpy-types-meshdeformmodifier"),
@@ -410,6 +545,7 @@ url_manual_mapping = (
("bpy.types.shadernodeemission*", "render/shader_nodes/shader/emission.html#bpy-types-shadernodeemission"),
("bpy.types.shadernodegeometry*", "render/shader_nodes/input/geometry.html#bpy-types-shadernodegeometry"),
("bpy.types.shadernodehairinfo*", "render/shader_nodes/input/hair_info.html#bpy-types-shadernodehairinfo"),
+ ("bpy.types.shadernodemaprange*", "render/shader_nodes/converter/map_range.html#bpy-types-shadernodemaprange"),
("bpy.types.shadernodergbcurve*", "render/shader_nodes/color/rgb_curves.html#bpy-types-shadernodergbcurve"),
("bpy.types.shadernodeseparate*", "render/shader_nodes/converter/combine_separate.html#bpy-types-shadernodeseparate"),
("bpy.types.shadernodetexbrick*", "render/shader_nodes/textures/brick.html#bpy-types-shadernodetexbrick"),
@@ -421,7 +557,14 @@ url_manual_mapping = (
("bpy.types.splineikconstraint*", "animation/constraints/tracking/spline_ik.html#bpy-types-splineikconstraint"),
("bpy.types.texturenodetexture*", "editors/texture_node/types/input/texture.html#bpy-types-texturenodetexture"),
("bpy.ops.anim.keyframe_clear*", "animation/keyframes/editing.html#bpy-ops-anim-keyframe-clear"),
+ ("bpy.ops.curve.cyclic_toggle*", "modeling/curves/editing/curve.html#bpy-ops-curve-cyclic-toggle"),
("bpy.ops.curve.primitive*add*", "modeling/curves/primitives.html#bpy-ops-curve-primitive-add"),
+ ("bpy.ops.curve.smooth_radius*", "modeling/curves/editing/control_points.html#bpy-ops-curve-smooth-radius"),
+ ("bpy.ops.curve.smooth_weight*", "modeling/curves/editing/control_points.html#bpy-ops-curve-smooth-weight"),
+ ("bpy.ops.gpencil.interpolate*", "grease_pencil/animation/tools.html#bpy-ops-gpencil-interpolate"),
+ ("bpy.ops.gpencil.stroke_flip*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-stroke-flip"),
+ ("bpy.ops.gpencil.stroke_join*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-stroke-join"),
+ ("bpy.ops.gpencil.stroke_trim*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-stroke-trim"),
("bpy.ops.mesh.duplicate_move*", "modeling/meshes/editing/duplicating/duplicate.html#bpy-ops-mesh-duplicate-move"),
("bpy.ops.mesh.extrude_region*", "modeling/meshes/editing/duplicating/extrude.html#bpy-ops-mesh-extrude-region"),
("bpy.ops.object.parent_clear*", "scene_layout/object/properties/relations/parents.html#bpy-ops-object-parent-clear"),
@@ -444,6 +587,8 @@ url_manual_mapping = (
("bpy.types.edgesplitmodifier*", "modeling/modifiers/generate/edge_split.html#bpy-types-edgesplitmodifier"),
("bpy.types.fmodifierenvelope*", "editors/graph_editor/fcurves/modifiers.html#bpy-types-fmodifierenvelope"),
("bpy.types.freestylesettings*", "render/freestyle/view_layer.html#bpy-types-freestylesettings"),
+ ("bpy.types.gpencillayer.hide*", "grease_pencil/properties/layers.html#bpy-types-gpencillayer-hide"),
+ ("bpy.types.gpencillayer.lock*", "grease_pencil/properties/layers.html#bpy-types-gpencillayer-lock"),
("bpy.types.imagepaint.dither*", "sculpt_paint/texture_paint/tool_settings/options.html#bpy-types-imagepaint-dither"),
("bpy.types.mesh.texture_mesh*", "editors/uv/generated_uvs.html#bpy-types-mesh-texture-mesh"),
("bpy.types.mesh.use_mirror_x*", "modeling/meshes/editing/mesh_options.html#bpy-types-mesh-use-mirror-x"),
@@ -462,6 +607,7 @@ url_manual_mapping = (
("bpy.types.shadernodetexwave*", "render/shader_nodes/textures/wave.html#bpy-types-shadernodetexwave"),
("bpy.types.smokecollsettings*", "physics/smoke/types/collision.html#bpy-types-smokecollsettings"),
("bpy.types.smokeflowsettings*", "physics/smoke/types/flow_object.html#bpy-types-smokeflowsettings"),
+ ("bpy.types.spline.use_smooth*", "modeling/curves/properties/active_spline.html#bpy-types-spline-use-smooth"),
("bpy.types.texturenodebricks*", "editors/texture_node/types/patterns/bricks.html#bpy-types-texturenodebricks"),
("bpy.types.texturenodemixrgb*", "editors/texture_node/types/color/mix_rgb.html#bpy-types-texturenodemixrgb"),
("bpy.types.texturenodeoutput*", "editors/texture_node/types/output/output.html#bpy-types-texturenodeoutput"),
@@ -470,6 +616,8 @@ url_manual_mapping = (
("bpy.types.uvprojectmodifier*", "modeling/modifiers/modify/uv_project.html#bpy-types-uvprojectmodifier"),
("bpy.types.wireframemodifier*", "modeling/modifiers/generate/wireframe.html#bpy-types-wireframemodifier"),
("bpy.types.worldmistsettings*", "render/cycles/world_settings.html#bpy-types-worldmistsettings"),
+ ("bpy.ops.curve.extrude_move*", "modeling/curves/editing/control_points.html#bpy-ops-curve-extrude-move"),
+ ("bpy.ops.curve.make_segment*", "modeling/curves/editing/control_points.html#bpy-ops-curve-make-segment"),
("bpy.ops.mesh.loopcut_slide*", "modeling/meshes/editing/subdividing/loop.html#bpy-ops-mesh-loopcut-slide"),
("bpy.ops.mesh.merge_normals*", "modeling/meshes/editing/normals.html#bpy-ops-mesh-merge-normals"),
("bpy.ops.mesh.normals_tools*", "modeling/meshes/editing/normals.html#bpy-ops-mesh-normals-tools"),
@@ -504,6 +652,8 @@ url_manual_mapping = (
("bpy.types.sceneeevee.bloom*", "render/eevee/render_settings/bloom.html#bpy-types-sceneeevee-bloom"),
("bpy.types.scenerenderlayer*", "render/layers/layers.html#bpy-types-scenerenderlayer"),
("bpy.types.sequencemodifier*", "video_editing/sequencer/properties/modifiers.html#bpy-types-sequencemodifier"),
+ ("bpy.types.shaderfxcolorize*", "grease_pencil/visual_effects/colorize.html#bpy-types-shaderfxcolorize"),
+ ("bpy.types.shaderfxpixelate*", "grease_pencil/visual_effects/pixelate.html#bpy-types-shaderfxpixelate"),
("bpy.types.shadernodeinvert*", "render/shader_nodes/color/invert.html#bpy-types-shadernodeinvert"),
("bpy.types.shadernodemixrgb*", "render/shader_nodes/color/mix.html#bpy-types-shadernodemixrgb"),
("bpy.types.shadernodenormal*", "render/shader_nodes/vector/normal.html#bpy-types-shadernodenormal"),
@@ -519,6 +669,8 @@ url_manual_mapping = (
("bpy.types.subtractsequence*", "video_editing/sequencer/strips/effects/subtract.html#bpy-types-subtractsequence"),
("bpy.types.texturenodegroup*", "editors/texture_node/types/groups.html#bpy-types-texturenodegroup"),
("bpy.types.texturenodeimage*", "editors/texture_node/types/input/image.html#bpy-types-texturenodeimage"),
+ ("bpy.ops.curve.smooth_tilt*", "modeling/curves/editing/control_points.html#bpy-ops-curve-smooth-tilt"),
+ ("bpy.ops.gpencil.reproject*", "grease_pencil/modes/edit/grease_pencil_menu.html#bpy-ops-gpencil-reproject"),
("bpy.ops.mesh.flip_normals*", "modeling/meshes/editing/normals.html#bpy-ops-mesh-flip-normals"),
("bpy.ops.object.lightprobe*", "render/eevee/lightprobes/index.html#bpy-ops-object-lightprobe"),
("bpy.ops.object.make_links*", "scene_layout/object/editing/duplication.html#bpy-ops-object-make-links"),
@@ -552,6 +704,7 @@ url_manual_mapping = (
("bpy.types.rigidbodyobject*", "physics/rigid_body/index.html#bpy-types-rigidbodyobject"),
("bpy.types.sceneeevee.gtao*", "render/eevee/render_settings/ambient_occlusion.html#bpy-types-sceneeevee-gtao"),
("bpy.types.shadernodebevel*", "render/shader_nodes/input/bevel.html#bpy-types-shadernodebevel"),
+ ("bpy.types.shadernodeclamp*", "render/shader_nodes/converter/clamp.html#bpy-types-shadernodeclamp"),
("bpy.types.shadernodegamma*", "render/shader_nodes/color/gamma.html#bpy-types-shadernodegamma"),
("bpy.types.shadernodegroup*", "render/shader_nodes/groups.html#bpy-types-shadernodegroup"),
("bpy.types.shadernodeuvmap*", "render/shader_nodes/input/uv_map.html#bpy-types-shadernodeuvmap"),
@@ -562,6 +715,10 @@ url_manual_mapping = (
("bpy.types.subsurfmodifier*", "modeling/modifiers/generate/subdivision_surface.html#bpy-types-subsurfmodifier"),
("bpy.types.texturenodemath*", "editors/texture_node/types/converter/math.html#bpy-types-texturenodemath"),
("bpy.types.userpreferences*", "editors/preferences/index.html#bpy-types-userpreferences"),
+ ("bpy.ops.curve.select_row*", "modeling/surfaces/selecting.html#bpy-ops-curve-select-row"),
+ ("bpy.ops.curve.tilt_clear*", "modeling/curves/editing/control_points.html#bpy-ops-curve-tilt-clear"),
+ ("bpy.ops.curve.vertex_add*", "modeling/curves/editing/other.html#bpy-ops-curve-vertex-add"),
+ ("bpy.ops.gpencil.dissolve*", "grease_pencil/modes/edit/grease_pencil_menu.html#bpy-ops-gpencil-dissolve"),
("bpy.ops.graph.frame_jump*", "editors/graph_editor/fcurves/properties.html#bpy-ops-graph-frame-jump"),
("bpy.ops.mesh.edge_rotate*", "modeling/meshes/editing/edges.html#bpy-ops-mesh-edge-rotate"),
("bpy.ops.object.hide_view*", "scene_layout/object/editing/introduction.html#bpy-ops-object-hide-view"),
@@ -586,9 +743,11 @@ url_manual_mapping = (
("bpy.types.rigidbodyworld*", "physics/rigid_body/world.html#bpy-types-rigidbodyworld"),
("bpy.types.sceneeevee.ssr*", "render/eevee/render_settings/screen_space_reflections.html#bpy-types-sceneeevee-ssr"),
("bpy.types.sceneeevee.sss*", "render/eevee/render_settings/subsurface_scattering.html#bpy-types-sceneeevee-sss"),
+ ("bpy.types.shaderfxshadow*", "grease_pencil/visual_effects/shadow.html#bpy-types-shaderfxshadow"),
("bpy.types.shadernodebump*", "render/shader_nodes/vector/bump.html#bpy-types-shadernodebump"),
("bpy.types.shadernodemath*", "render/shader_nodes/converter/math.html#bpy-types-shadernodemath"),
("bpy.types.smoothmodifier*", "modeling/modifiers/deform/smooth.html#bpy-types-smoothmodifier"),
+ ("bpy.types.spline.order_u*", "modeling/curves/properties/active_spline.html#bpy-types-spline-order-u"),
("bpy.types.timelinemarker*", "animation/markers.html#bpy-types-timelinemarker"),
("bpy.types.usersolidlight*", "editors/preferences/lights.html#bpy-types-usersolidlight"),
("bpy.types.uvwarpmodifier*", "modeling/modifiers/modify/uv_warp.html#bpy-types-uvwarpmodifier"),
@@ -596,6 +755,7 @@ url_manual_mapping = (
("bpy.types.walknavigation*", "editors/3dview/navigate/walk_fly.html#bpy-types-walknavigation"),
("bpy.ops.*.select_circle*", "interface/selecting.html#bpy-ops-select-circle"),
("bpy.ops.anim.keying_set*", "animation/keyframes/keying_sets.html#bpy-ops-anim-keying-set"),
+ ("bpy.ops.curve.subdivide*", "modeling/curves/editing/segments.html#bpy-ops-curve-subdivide"),
("bpy.ops.ed.undo_history*", "interface/undo_redo.html#bpy-ops-ed-undo-history"),
("bpy.ops.mesh.edge_split*", "modeling/meshes/editing/edges.html#bpy-ops-mesh-edge-split"),
("bpy.ops.mesh.mark_sharp*", "modeling/meshes/editing/edges.html#bpy-ops-mesh-mark-sharp"),
@@ -606,6 +766,7 @@ url_manual_mapping = (
("bpy.ops.uv.cube_project*", "modeling/meshes/editing/uv/unwrapping/mapping_types.html#bpy-ops-uv-cube-project"),
("bpy.ops.uv.pack_islands*", "modeling/meshes/editing/uv/layout.html#bpy-ops-uv-pack-islands"),
("bpy.ops.wm.app_template*", "advanced/app_templates.html#bpy-ops-wm-app-template"),
+ ("bpy.ops.wm.batch_rename*", "files/blend/rename.html#bpy-ops-wm-batch-rename"),
("bpy.ops.wm.redraw_timer*", "advanced/operators.html#bpy-ops-wm-redraw-timer"),
("bpy.types.*light.shadow*", "render/eevee/lighting.html#bpy-types-light-shadow"),
("bpy.types.armaturebones*", "animation/armatures/bones/index.html#bpy-types-armaturebones"),
@@ -634,6 +795,8 @@ url_manual_mapping = (
("bpy.types.scenesequence*", "video_editing/sequencer/strips/scene.html#bpy-types-scenesequence"),
("bpy.types.screwmodifier*", "modeling/modifiers/generate/screw.html#bpy-types-screwmodifier"),
("bpy.types.sequenceproxy*", "video_editing/sequencer/properties/proxy_cache.html#bpy-types-sequenceproxy"),
+ ("bpy.types.shaderfxlight*", "grease_pencil/visual_effects/light.html#bpy-types-shaderfxlight"),
+ ("bpy.types.shaderfxswirl*", "grease_pencil/visual_effects/swirl.html#bpy-types-shaderfxswirl"),
("bpy.types.shadernodergb*", "render/shader_nodes/input/rgb.html#bpy-types-shadernodergb"),
("bpy.types.smokemodifier*", "physics/smoke/index.html#bpy-types-smokemodifier"),
("bpy.types.soundsequence*", "video_editing/sequencer/strips/sound.html#bpy-types-soundsequence"),
@@ -642,16 +805,24 @@ url_manual_mapping = (
("bpy.types.stuccitexture*", "render/materials/legacy_textures/types/stucci.html#bpy-types-stuccitexture"),
("bpy.types.windowmanager*", "interface/index.html#bpy-types-windowmanager"),
("bpy.ops.*.select_lasso*", "interface/selecting.html#bpy-ops-select-lasso"),
+ ("bpy.ops.curve.decimate*", "modeling/curves/editing/curve.html#bpy-ops-curve-decimate"),
+ ("bpy.ops.curve.separate*", "modeling/curves/editing/curve.html#bpy-ops-curve-separate"),
+ ("bpy.ops.gpencil.delete*", "grease_pencil/modes/edit/grease_pencil_menu.html#bpy-ops-gpencil-delete"),
+ ("bpy.ops.gpencil.select*", "grease_pencil/selecting.html#bpy-ops-gpencil-select"),
("bpy.ops.mesh.mark_seam*", "modeling/meshes/editing/edges.html#bpy-ops-mesh-mark-seam"),
("bpy.ops.mesh.subdivide*", "modeling/meshes/editing/subdividing/subdivide.html#bpy-ops-mesh-subdivide"),
("bpy.ops.object.convert*", "scene_layout/object/editing/introduction.html#bpy-ops-object-convert"),
+ ("bpy.ops.object.gpencil*", "grease_pencil/index.html#bpy-ops-object-gpencil"),
("bpy.ops.object.speaker*", "render/output/audio/speaker.html#bpy-ops-object-speaker"),
("bpy.ops.transform.bend*", "modeling/meshes/editing/transform/bend.html#bpy-ops-transform-bend"),
+ ("bpy.ops.transform.tilt*", "modeling/curves/editing/control_points.html#bpy-ops-transform-tilt"),
+ ("bpy.ops.wm.search_menu*", "interface/controls/templates/operator_search.html#bpy-ops-wm-search-menu"),
("bpy.types.bakesettings*", "render/cycles/baking.html#bpy-types-bakesettings"),
("bpy.types.blendtexture*", "render/materials/legacy_textures/types/blend.html#bpy-types-blendtexture"),
("bpy.types.castmodifier*", "modeling/modifiers/deform/cast.html#bpy-types-castmodifier"),
("bpy.types.colormanaged*", "render/color_management.html#bpy-types-colormanaged"),
("bpy.types.glowsequence*", "video_editing/sequencer/strips/effects/glow.html#bpy-types-glowsequence"),
+ ("bpy.types.gpencillayer*", "grease_pencil/properties/layers.html#bpy-types-gpencillayer"),
("bpy.types.hookmodifier*", "modeling/modifiers/deform/hooks.html#bpy-types-hookmodifier"),
("bpy.types.latticepoint*", "animation/lattice.html#bpy-types-latticepoint"),
("bpy.types.magictexture*", "render/materials/legacy_textures/types/magic.html#bpy-types-magictexture"),
@@ -664,6 +835,10 @@ url_manual_mapping = (
("bpy.types.object.scale*", "scene_layout/object/properties/transforms.html#bpy-types-object-scale"),
("bpy.types.particleedit*", "physics/particles/mode.html#bpy-types-particleedit"),
("bpy.types.scene.camera*", "scene_layout/scene/properties.html#bpy-types-scene-camera"),
+ ("bpy.types.shaderfxblur*", "grease_pencil/visual_effects/blur.html#bpy-types-shaderfxblur"),
+ ("bpy.types.shaderfxflip*", "grease_pencil/visual_effects/flip.html#bpy-types-shaderfxflip"),
+ ("bpy.types.shaderfxglow*", "grease_pencil/visual_effects/glow.html#bpy-types-shaderfxglow"),
+ ("bpy.types.shaderfxwave*", "grease_pencil/visual_effects/wave_distortion.html#bpy-types-shaderfxwave"),
("bpy.types.skinmodifier*", "modeling/modifiers/generate/skin.html#bpy-types-skinmodifier"),
("bpy.types.spaceconsole*", "editors/python_console.html#bpy-types-spaceconsole"),
("bpy.types.textsequence*", "video_editing/sequencer/strips/text.html#bpy-types-textsequence"),
@@ -673,7 +848,9 @@ url_manual_mapping = (
("bpy.types.warpmodifier*", "modeling/modifiers/deform/warp.html#bpy-types-warpmodifier"),
("bpy.types.wavemodifier*", "modeling/modifiers/deform/wave.html#bpy-types-wavemodifier"),
("bpy.types.wipesequence*", "video_editing/sequencer/strips/transitions/wipe.html#bpy-types-wipesequence"),
+ ("bpy.ops.gpencil.paste*", "grease_pencil/modes/edit/grease_pencil_menu.html#bpy-ops-gpencil-paste"),
("bpy.ops.image.project*", "sculpt_paint/texture_paint/tool_settings/options.html#bpy-ops-image-project"),
+ ("bpy.ops.mesh.decimate*", "modeling/meshes/editing/cleanup.html#bpy-ops-mesh-decimate"),
("bpy.ops.object.*clear*", "scene_layout/object/editing/transform/clear_apply.html#bpy-ops-object-clear"),
("bpy.ops.object.delete*", "scene_layout/object/editing/introduction.html#bpy-ops-object-delete"),
("bpy.ops.screen.header*", "interface/window_system/regions.html#bpy-ops-screen-header"),
@@ -690,11 +867,16 @@ url_manual_mapping = (
("bpy.types.particlekey*", "physics/particles/emitter/physics/keyed.html#bpy-types-particlekey"),
("bpy.types.posebone.ik*", "animation/armatures/posing/bone_constraints/inverse_kinematics/introduction.html#bpy-types-posebone-ik"),
("bpy.types.renderlayer*", "render/layers/layers.html#bpy-types-renderlayer"),
+ ("bpy.types.shaderfxrim*", "grease_pencil/visual_effects/rim.html#bpy-types-shaderfxrim"),
("bpy.types.spaceview3d*", "editors/3dview/index.html#bpy-types-spaceview3d"),
("bpy.types.uipopupmenu*", "interface/controls/buttons/menus.html#bpy-types-uipopupmenu"),
("bpy.types.vertexpaint*", "sculpt_paint/vertex_paint/index.html#bpy-types-vertexpaint"),
("bpy.types.woodtexture*", "render/materials/legacy_textures/types/wood.html#bpy-types-woodtexture"),
("bpy.ops.*.select_box*", "interface/selecting.html#bpy-ops-select-box"),
+ ("bpy.ops.curve.delete*", "modeling/curves/editing/curve.html#bpy-ops-curve-delete"),
+ ("bpy.ops.curve.reveal*", "modeling/curves/editing/curve.html#bpy-ops-curve-reveal"),
+ ("bpy.ops.curve.smooth*", "modeling/curves/editing/control_points.html#bpy-ops-curve-smooth"),
+ ("bpy.ops.gpencil.copy*", "grease_pencil/modes/edit/grease_pencil_menu.html#bpy-ops-gpencil-copy"),
("bpy.ops.object.align*", "scene_layout/object/editing/transform/tools.html#bpy-ops-object-align"),
("bpy.ops.object.empty*", "modeling/empties.html#bpy-ops-object-empty"),
("bpy.ops.object.quick*", "physics/introduction.html#bpy-ops-object-quick"),
@@ -713,6 +895,7 @@ url_manual_mapping = (
("bpy.types.renderview*", "render/output/multiview/index.html#bpy-types-renderview"),
("bpy.types.sceneeevee*", "render/eevee/index.html#bpy-types-sceneeevee"),
("bpy.types.vectorfont*", "modeling/texts/index.html#bpy-types-vectorfont"),
+ ("bpy.ops.curve.split*", "modeling/curves/editing/curve.html#bpy-ops-curve-split"),
("bpy.ops.mesh.bisect*", "modeling/meshes/editing/subdividing/bisect.html#bpy-ops-mesh-bisect"),
("bpy.ops.object.join*", "scene_layout/object/editing/introduction.html#bpy-ops-object-join"),
("bpy.ops.object.text*", "modeling/texts/index.html#bpy-ops-object-text"),
@@ -734,6 +917,8 @@ url_manual_mapping = (
("bpy.ops.collection*", "scene_layout/collections/collections.html#bpy-ops-collection"),
("bpy.ops.constraint*", "animation/constraints/index.html#bpy-ops-constraint"),
("bpy.ops.curve.draw*", "modeling/curves/editing/other.html#bpy-ops-curve-draw"),
+ ("bpy.ops.curve.hide*", "modeling/curves/editing/curve.html#bpy-ops-curve-hide"),
+ ("bpy.ops.curve.spin*", "modeling/surfaces/editing/surface.html#bpy-ops-curve-spin"),
("bpy.ops.mesh.knife*", "modeling/meshes/editing/subdividing/knife.html#bpy-ops-mesh-knife"),
("bpy.ops.mesh.noise*", "modeling/meshes/editing/transform/noise.html#bpy-ops-mesh-noise"),
("bpy.ops.mesh.screw*", "modeling/meshes/editing/duplicating/screw.html#bpy-ops-mesh-screw"),
@@ -751,6 +936,7 @@ url_manual_mapping = (
("bpy.types.nodetree*", "interface/controls/nodes/parts.html#bpy-types-nodetree"),
("bpy.types.particle*", "physics/particles/index.html#bpy-types-particle"),
("bpy.types.sequence*", "video_editing/index.html#bpy-types-sequence"),
+ ("bpy.types.shaderfx*", "grease_pencil/visual_effects/index.html#bpy-types-shaderfx"),
("bpy.types.shapekey*", "animation/shape_keys/index.html#bpy-types-shapekey"),
("bpy.types.spacenla*", "editors/nla/index.html#bpy-types-spacenla"),
("bpy.types.sunlight*", "render/lights/light_object.html#bpy-types-sunlight"),
@@ -758,6 +944,7 @@ url_manual_mapping = (
("bpy.ops.rigidbody*", "physics/rigid_body/index.html#bpy-ops-rigidbody"),
("bpy.ops.sequencer*", "video_editing/index.html#bpy-ops-sequencer"),
("bpy.ops.transform*", "scene_layout/object/editing/transform/index.html#bpy-ops-transform"),
+ ("bpy.ops.uv.select*", "editors/uv/selecting.html#bpy-ops-uv-select"),
("bpy.ops.uv.stitch*", "modeling/meshes/editing/uv/layout.html#bpy-ops-uv-stitch"),
("bpy.ops.uv.unwrap*", "modeling/meshes/editing/uv/unwrapping/mapping_types.html#bpy-ops-uv-unwrap"),
("bpy.types.animviz*", "animation/motion_paths.html#bpy-types-animviz"),
@@ -783,6 +970,7 @@ url_manual_mapping = (
("bpy.types.render*", "render/index.html#bpy-types-render"),
("bpy.types.sculpt*", "sculpt_paint/sculpting/index.html#bpy-types-sculpt"),
("bpy.types.shader*", "render/shader_nodes/shader/index.html#bpy-types-shader"),
+ ("bpy.types.spline*", "modeling/curves/properties/active_spline.html#bpy-types-spline"),
("bpy.types.window*", "interface/index.html#bpy-types-window"),
("bpy.ops.buttons*", "interface/index.html#bpy-ops-buttons"),
("bpy.ops.console*", "editors/python_console.html#bpy-ops-console"),
@@ -795,6 +983,7 @@ url_manual_mapping = (
("bpy.ops.surface*", "modeling/surfaces/index.html#bpy-ops-surface"),
("bpy.ops.texture*", "render/materials/legacy_textures/index.html#bpy-ops-texture"),
("bpy.ops.uv.weld*", "modeling/meshes/editing/uv/layout.html#bpy-ops-uv-weld"),
+ ("bpy.ops.wm.tool*", "interface/tool_system.html#bpy-ops-wm-tool"),
("bpy.types.addon*", "editors/preferences/addons.html#bpy-types-addon"),
("bpy.types.brush*", "sculpt_paint/brush/brush.html#bpy-types-brush"),
("bpy.types.curve*", "modeling/curves/index.html#bpy-types-curve"),
diff --git a/release/scripts/modules/rna_prop_ui.py b/release/scripts/modules/rna_prop_ui.py
index 2ff6c3fc1b0..202fd865723 100644
--- a/release/scripts/modules/rna_prop_ui.py
+++ b/release/scripts/modules/rna_prop_ui.py
@@ -231,13 +231,15 @@ def draw(layout, context, context_member, property_type, use_edit=True):
if rna_item.id_data.library is not None:
use_edit = False
+ is_lib_override = rna_item.id_data.override_library and rna_item.id_data.override_library.reference
assert(isinstance(rna_item, property_type))
items = rna_item.items()
items.sort()
- if use_edit:
+ # TODO: Allow/support adding new custom props to overrides.
+ if use_edit and not is_lib_override:
row = layout.row()
props = row.operator("wm.properties_add", text="Add")
props.data_path = context_member
@@ -303,6 +305,9 @@ def draw(layout, context, context_member, property_type, use_edit=True):
if use_edit:
row = split.row(align=True)
+ # Do not allow editing of overridden properties (we cannot use a poll function of the operators here
+ # since they's have no access to the specific property...).
+ row.enabled = not(is_lib_override and key in rna_item.id_data.override_library.reference)
if not is_rna:
props = row.operator("wm.properties_edit", text="Edit")
assign_props(props, val_draw, key)
diff --git a/release/scripts/presets/interface_theme/blender_light.xml b/release/scripts/presets/interface_theme/blender_light.xml
index 49b01ec3309..dee7d2d2c59 100644
--- a/release/scripts/presets/interface_theme/blender_light.xml
+++ b/release/scripts/presets/interface_theme/blender_light.xml
@@ -22,16 +22,17 @@
icon_object_data="#00d4a3ff"
icon_modifier="#84b8ffff"
icon_shading="#ea7581ff"
+ icon_folder="#e3c16eff"
icon_border_intensity="0.85"
>
<wcol_regular>
<ThemeWidgetColors
- outline="#999999"
- inner="#c0c0c0ff"
+ outline="#b8b8b8"
+ inner="#dbdbdbff"
inner_sel="#668cccff"
item="#191919ff"
text="#1a1a1a"
- text_sel="#000000"
+ text_sel="#ffffff"
show_shaded="FALSE"
shadetop="0"
shadedown="-5"
@@ -41,7 +42,7 @@
</wcol_regular>
<wcol_tool>
<ThemeWidgetColors
- outline="#c7c7c7"
+ outline="#b8b8b8"
inner="#dbdbdbff"
inner_sel="#5680c2ff"
item="#191919ff"
@@ -56,7 +57,7 @@
</wcol_tool>
<wcol_toolbar_item>
<ThemeWidgetColors
- outline="#808080"
+ outline="#363636"
inner="#434343ff"
inner_sel="#5680c2ff"
item="#ffffff8f"
@@ -71,11 +72,11 @@
</wcol_toolbar_item>
<wcol_radio>
<ThemeWidgetColors
- outline="#373737"
- inner="#595959ff"
+ outline="#3b3b3b"
+ inner="#3b3b3bff"
inner_sel="#5680c2e6"
item="#ffffffff"
- text="#e6e6e6"
+ text="#d9d9d9"
text_sel="#ffffff"
show_shaded="FALSE"
shadetop="5"
@@ -92,7 +93,7 @@
item="#5680c2ff"
text="#dddddd"
text_sel="#ffffff"
- show_shaded="FALSE"
+ show_shaded="TRUE"
shadetop="-8"
shadedown="0"
roundness="0.4"
@@ -102,14 +103,14 @@
<wcol_option>
<ThemeWidgetColors
outline="#373737"
- inner="#666666ff"
- inner_sel="#5680c2e6"
+ inner="#3c3c3cff"
+ inner_sel="#5680c2ff"
item="#ffffffff"
text="#1a1a1a"
text_sel="#000000"
- show_shaded="FALSE"
- shadetop="0"
- shadedown="-15"
+ show_shaded="TRUE"
+ shadetop="-5"
+ shadedown="0"
roundness="0.4"
>
</ThemeWidgetColors>
@@ -137,8 +138,8 @@
item="#80b1ffff"
text="#1a1a1a"
text_sel="#ffffff"
- show_shaded="FALSE"
- shadetop="-10"
+ show_shaded="TRUE"
+ shadetop="3"
shadedown="0"
roundness="0.4"
>
@@ -146,14 +147,14 @@
</wcol_num>
<wcol_numslider>
<ThemeWidgetColors
- outline="#999999"
- inner="#3c3c3cff"
- inner_sel="#333333ff"
- item="#5680c2ff"
- text="#ffffff"
- text_sel="#ffffff"
+ outline="#b8b8b8"
+ inner="#999999ff"
+ inner_sel="#999999ff"
+ item="#e6e6e6ff"
+ text="#1a1a1a"
+ text_sel="#000000"
show_shaded="TRUE"
- shadetop="-4"
+ shadetop="-3"
shadedown="0"
roundness="0.4"
>
@@ -206,12 +207,12 @@
</wcol_pulldown>
<wcol_menu_back>
<ThemeWidgetColors
- outline="#19191a"
- inner="#1f1f1fef"
- inner_sel="#585858ff"
+ outline="#a6a6a6"
+ inner="#c0c0c0ff"
+ inner_sel="#cdcdcdff"
item="#727272ff"
- text="#a5a5a5"
- text_sel="#ffffff"
+ text="#1a1a1a"
+ text_sel="#1a1a1a"
show_shaded="FALSE"
shadetop="25"
shadedown="-20"
@@ -255,7 +256,7 @@
inner="#00000000"
inner_sel="#5680c2e6"
item="#ffffff8f"
- text="#e6e6e6"
+ text="#1a1a1a"
text_sel="#ffffff"
show_shaded="FALSE"
shadetop="38"
@@ -298,8 +299,8 @@
<ThemeWidgetColors
outline="#e6e6e6"
inner="#00000000"
- inner_sel="#446599ff"
- item="#80b1ffff"
+ inner_sel="#808080ff"
+ item="#1a1a1aff"
text="#1a1a1a"
text_sel="#ffffff"
show_shaded="FALSE"
@@ -542,7 +543,7 @@
button_text="#000000"
button_text_hi="#ffffff"
navigation_bar="#00000000"
- execution_buts="#00000000"
+ execution_buts="#999999e6"
tab_active="#6697e6"
tab_inactive="#cccccc"
tab_back="#999999ff"
diff --git a/release/scripts/presets/keyconfig/blender.py b/release/scripts/presets/keyconfig/blender.py
index 60684be9163..8a7689d6d60 100644
--- a/release/scripts/presets/keyconfig/blender.py
+++ b/release/scripts/presets/keyconfig/blender.py
@@ -5,15 +5,15 @@ from bpy.props import (
EnumProperty,
)
-dirname, filename = os.path.split(__file__)
-idname = os.path.splitext(filename)[0]
+DIRNAME, FILENAME = os.path.split(__file__)
+IDNAME = os.path.splitext(FILENAME)[0]
def update_fn(_self, _context):
load()
class Prefs(bpy.types.KeyConfigPreferences):
- bl_idname = idname
+ bl_idname = IDNAME
select_mouse: EnumProperty(
name="Select Mouse",
@@ -154,7 +154,7 @@ class Prefs(bpy.types.KeyConfigPreferences):
col.prop(self, "use_v3d_shade_ex_pie")
-blender_default = bpy.utils.execfile(os.path.join(dirname, "keymap_data", "blender_default.py"))
+blender_default = bpy.utils.execfile(os.path.join(DIRNAME, "keymap_data", "blender_default.py"))
def load():
@@ -163,7 +163,7 @@ def load():
from bl_keymap_utils.io import keyconfig_init_from_data
prefs = context.preferences
- kc = context.window_manager.keyconfigs.new(idname)
+ kc = context.window_manager.keyconfigs.new(IDNAME)
kc_prefs = kc.preferences
keyconfig_data = blender_default.generate_keymaps(
diff --git a/release/scripts/presets/keyconfig/blender_27x.py b/release/scripts/presets/keyconfig/blender_27x.py
index 052f5dd706a..4ce77f46213 100644
--- a/release/scripts/presets/keyconfig/blender_27x.py
+++ b/release/scripts/presets/keyconfig/blender_27x.py
@@ -4,15 +4,15 @@ from bpy.props import (
EnumProperty,
)
-dirname, filename = os.path.split(__file__)
-idname = os.path.splitext(filename)[0]
+DIRNAME, FILENAME = os.path.split(__file__)
+IDNAME = os.path.splitext(FILENAME)[0]
def update_fn(_self, _context):
load()
class Prefs(bpy.types.KeyConfigPreferences):
- bl_idname = idname
+ bl_idname = IDNAME
select_mouse: EnumProperty(
name="Select Mouse",
@@ -39,7 +39,7 @@ class Prefs(bpy.types.KeyConfigPreferences):
split.column()
-blender_default = bpy.utils.execfile(os.path.join(dirname, "keymap_data", "blender_default.py"))
+blender_default = bpy.utils.execfile(os.path.join(DIRNAME, "keymap_data", "blender_default.py"))
def load():
from sys import platform
@@ -47,7 +47,7 @@ def load():
from bl_keymap_utils.io import keyconfig_init_from_data
prefs = context.preferences
- kc = context.window_manager.keyconfigs.new(idname)
+ kc = context.window_manager.keyconfigs.new(IDNAME)
kc_prefs = kc.preferences
keyconfig_data = blender_default.generate_keymaps(
diff --git a/release/scripts/presets/keyconfig/industry_compatible.py b/release/scripts/presets/keyconfig/industry_compatible.py
index 3f9ce98c7e5..09a43452e93 100644
--- a/release/scripts/presets/keyconfig/industry_compatible.py
+++ b/release/scripts/presets/keyconfig/industry_compatible.py
@@ -1,52 +1,18 @@
import os
import bpy
-# ------------------------------------------------------------------------------
-# Operators needed by this keymap to function
-
-# Selection Modes
-
-class IC_KEYMAP_OT_mesh_select_mode(bpy.types.Operator):
- bl_idname = "ic_keymap.mesh_select_mode"
- bl_label = "Switch to Vertex, Edge or Face Mode from any mode"
- bl_options = {'UNDO'}
-
- type: bpy.props.EnumProperty(
- name="Mode",
- items=(
- ('VERT', "Vertex", "Switcth to Vertex Mode From any Mode"),
- ('EDGE', "Edge", "Switcth to Edge Mode From any Mode"),
- ('FACE', "Face", "Switcth to Face Mode From any Mode"),
- ),
- )
-
- @classmethod
- def poll(cls, context):
- return (context.active_object is not None) and (context.object.type == 'MESH')
-
- def execute(self, context):
- bpy.ops.object.mode_set(mode='EDIT')
- bpy.ops.mesh.select_mode(type=self.type)
-
- return{'FINISHED'}
-
-
-classes = (
- IC_KEYMAP_OT_mesh_select_mode,
-)
-
# ------------------------------------------------------------------------------
# Keymap
-dirname, filename = os.path.split(__file__)
-idname = os.path.splitext(filename)[0]
+DIRNAME, FILENAME = os.path.split(__file__)
+IDNAME = os.path.splitext(FILENAME)[0]
def update_fn(_self, _context):
load()
-industry_compatible = bpy.utils.execfile(os.path.join(dirname, "keymap_data", "industry_compatible_data.py"))
+industry_compatible = bpy.utils.execfile(os.path.join(DIRNAME, "keymap_data", "industry_compatible_data.py"))
def load():
@@ -55,7 +21,7 @@ def load():
prefs = bpy.context.preferences
- kc = bpy.context.window_manager.keyconfigs.new(idname)
+ kc = bpy.context.window_manager.keyconfigs.new(IDNAME)
params = industry_compatible.Params(use_mouse_emulate_3_button=prefs.inputs.use_mouse_emulate_3_button)
keyconfig_data = industry_compatible.generate_keymaps(params)
@@ -66,8 +32,4 @@ def load():
keyconfig_init_from_data(kc, keyconfig_data)
if __name__ == "__main__":
- # XXX, no way to unregister
- for cls in classes:
- bpy.utils.register_class(cls)
-
load()
diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
index 203b9ced317..ddf7accc2b2 100644
--- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py
+++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
@@ -409,6 +409,7 @@ def km_window(params):
items.extend([
("wm.doc_view_manual_ui_context", {"type": 'F1', "value": 'PRESS'}, None),
op_panel("TOPBAR_PT_name", {"type": 'F2', "value": 'PRESS'}, [("keep_open", False)]),
+ ("wm.batch_rename", {"type": 'F2', "value": 'PRESS', "alt": True}, None),
("wm.search_menu", {"type": 'F3', "value": 'PRESS'}, None),
op_menu("TOPBAR_MT_file_context_menu", {"type": 'F4', "value": 'PRESS'}),
])
@@ -1058,9 +1059,10 @@ def km_view3d(params):
("view3d.view_axis", {"type": 'NDOF_BUTTON_TOP', "value": 'PRESS', "shift": True},
{"properties": [("type", 'TOP'), ("align_active", True)]}),
# Selection.
- *(("view3d.select",
- {"type": params.select_mouse, "value": params.select_mouse_value, **{m: True for m in mods}},
- {"properties": [(c, True) for c in props]},
+ *((
+ "view3d.select",
+ {"type": params.select_mouse, "value": params.select_mouse_value, **{m: True for m in mods}},
+ {"properties": [(c, True) for c in props]},
) for props, mods in (
(("deselect_all",) if not params.legacy else (), ()),
(("toggle",), ("shift",)),
@@ -1585,6 +1587,11 @@ def km_image(params):
("image.clear_render_border", {"type": 'B', "value": 'PRESS', "ctrl": True, "alt": True}, None),
])
+ if params.legacy:
+ items.extend([
+ ("image.view_center_cursor", {"type": 'HOME', "value": 'PRESS', "alt": True}, None),
+ ])
+
return keymap
@@ -1761,7 +1768,7 @@ def km_info(params):
return keymap
-def km_file_browser(_params):
+def km_file_browser(params):
items = []
keymap = (
"File Browser",
@@ -1770,6 +1777,11 @@ def km_file_browser(_params):
)
items.extend([
+ *_template_space_region_type_toggle(
+ toolbar_key={"type": 'T', "value": 'PRESS'},
+ ),
+ ("screen.region_toggle", {"type": 'N', "value": 'PRESS'},
+ {"properties": [("region_type", 'TOOL_PROPS')]}),
("file.parent", {"type": 'UP_ARROW', "value": 'PRESS', "alt": True}, None),
("file.previous", {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True}, None),
("file.next", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True}, None),
@@ -1779,10 +1791,23 @@ def km_file_browser(_params):
("file.next", {"type": 'BACK_SPACE', "value": 'PRESS', "shift": True}, None),
("wm.context_toggle", {"type": 'H', "value": 'PRESS'},
{"properties": [("data_path", 'space_data.params.show_hidden')]}),
- ("file.directory_new", {"type": 'I', "value": 'PRESS'}, None),
+ ("file.directory_new", {"type": 'I', "value": 'PRESS'},
+ {"properties": [("confirm", False)]}),
("file.smoothscroll", {"type": 'TIMER1', "value": 'ANY', "any": True}, None),
- ("file.bookmark_toggle", {"type": 'T', "value": 'PRESS'}, None),
("file.bookmark_add", {"type": 'B', "value": 'PRESS', "ctrl": True}, None),
+ ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS'},
+ {"properties": [("increment", 1)]}),
+ ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True},
+ {"properties": [("increment", 10)]}),
+ ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True},
+ {"properties": [("increment", 100)]}),
+ ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS'},
+ {"properties": [("increment", -1)]}),
+ ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True},
+ {"properties": [("increment", -10)]}),
+ ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True},
+ {"properties": [("increment", -100)]}),
+ op_menu("FILEBROWSER_MT_context_menu", params.context_menu_event),
])
return keymap
@@ -1800,17 +1825,13 @@ def km_file_browser_main(params):
("file.execute", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'},
{"properties": [("need_active", True)]}),
("file.refresh", {"type": 'NUMPAD_PERIOD', "value": 'PRESS'}, None),
- ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK'}, None),
- ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True},
+ ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK'},
+ {"properties": [("open", False), ("deselect_all", not params.legacy)]}),
+ ("file.select", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
+ ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True},
{"properties": [("extend", True)]}),
- ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True},
+ ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True},
{"properties": [("extend", True), ("fill", True)]}),
- ("file.select", {"type": 'RIGHTMOUSE', "value": 'CLICK'},
- {"properties": [("open", False)]}),
- ("file.select", {"type": 'RIGHTMOUSE', "value": 'CLICK', "shift": True},
- {"properties": [("extend", True), ("open", False)]}),
- ("file.select", {"type": 'RIGHTMOUSE', "value": 'CLICK', "alt": True},
- {"properties": [("extend", True), ("fill", True), ("open", False)]}),
("file.select_walk", {"type": 'UP_ARROW', "value": 'PRESS'},
{"properties": [("direction", 'UP')]}),
("file.select_walk", {"type": 'UP_ARROW', "value": 'PRESS', "shift": True},
@@ -1842,20 +1863,10 @@ def km_file_browser_main(params):
("file.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY'}, None),
("file.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY', "shift": True},
{"properties": [("mode", 'ADD')]}),
- ("file.rename", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, None),
+ ("file.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY', "ctrl": True},
+ {"properties": [("mode", 'SUB')]}),
("file.highlight", {"type": 'MOUSEMOVE', "value": 'ANY', "any": True}, None),
- ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS'},
- {"properties": [("increment", 1)]}),
- ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True},
- {"properties": [("increment", 10)]}),
- ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True},
- {"properties": [("increment", 100)]}),
- ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS'},
- {"properties": [("increment", -1)]}),
- ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True},
- {"properties": [("increment", -10)]}),
- ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True},
- {"properties": [("increment", -100)]}),
+ ("file.sort_column_ui_context", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
])
return keymap
@@ -2428,10 +2439,10 @@ def km_sequencer(params):
{"properties": [("mode", 'TIME_EXTEND')]}),
("marker.add", {"type": 'M', "value": 'PRESS'}, None),
("marker.rename", {"type": 'M', "value": 'PRESS', "ctrl": True}, None),
- ("sequencer.select",{"type": 'LEFT_BRACKET', "value": 'PRESS'},
- {"properties": [("left_right", 'LEFT'), ("linked_time", True)]}),
- ("sequencer.select",{"type": 'RIGHT_BRACKET', "value": 'PRESS'},
- {"properties": [("left_right", 'RIGHT'), ("linked_time", True)]}),
+ ("sequencer.select", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
+ {"properties": [("left_right", 'LEFT'), ("linked_time", True)]}),
+ ("sequencer.select", {"type": 'RIGHT_BRACKET', "value": 'PRESS'},
+ {"properties": [("left_right", 'RIGHT'), ("linked_time", True)]}),
])
return keymap
@@ -2652,13 +2663,12 @@ def km_clip_editor(params):
("clip.hide_tracks", {"type": 'H', "value": 'PRESS', "shift": True},
{"properties": [("unselected", True)]}),
("clip.hide_tracks_clear", {"type": 'H', "value": 'PRESS', "alt": True}, None),
- ("clip.slide_plane_marker", {"type": params.action_mouse, "value": 'PRESS'}, None),
+ ("clip.slide_plane_marker", {"type": 'LEFTMOUSE', "value": 'CLICK_DRAG'}, None),
("clip.keyframe_insert", {"type": 'I', "value": 'PRESS'}, None),
("clip.keyframe_delete", {"type": 'I', "value": 'PRESS', "alt": True}, None),
("clip.join_tracks", {"type": 'J', "value": 'PRESS', "ctrl": True}, None),
op_menu("CLIP_MT_tracking_context_menu", params.context_menu_event),
- ("wm.context_toggle", {"type": 'L', "value": 'PRESS'},
- {"properties": [("data_path", 'space_data.lock_selection')]}),
+ ("clip.lock_selection_toggle", {"type": 'L', "value": 'PRESS'}, None),
("wm.context_toggle", {"type": 'D', "value": 'PRESS', "alt": True},
{"properties": [("data_path", 'space_data.show_disabled')]}),
("wm.context_toggle", {"type": 'S', "value": 'PRESS', "alt": True},
@@ -2681,6 +2691,11 @@ def km_clip_editor(params):
("clip.paste_tracks", {"type": 'V', "value": 'PRESS', "ctrl": True}, None),
])
+ if params.legacy:
+ items.extend([
+ ("clip.view_center_cursor", {"type": 'HOME', "value": 'PRESS', "alt": True}, None),
+ ])
+
return keymap
@@ -2948,13 +2963,6 @@ def km_grease_pencil(_params):
# Erase
("gpencil.annotate", {"type": 'RIGHTMOUSE', "value": 'PRESS', "key_modifier": 'D'},
{"properties": [("mode", 'ERASER'), ("wait_for_input", False)]}),
-
- # Add blank frame (B because it's easy to reach from D).
- ("gpencil.blank_frame_add", {"type": 'B', "value": 'PRESS', "key_modifier": 'D'}, None),
- # Delete active frame - for easier video tutorials/review sessions.
- # This works even when not in edit mode.
- ("gpencil.active_frames_delete_all", {"type": 'X', "value": 'PRESS', "key_modifier": 'D'}, None),
- ("gpencil.active_frames_delete_all", {"type": 'DEL', "value": 'PRESS', "key_modifier": 'D'}, None),
])
return keymap
@@ -3037,6 +3045,8 @@ def km_grease_pencil_stroke_edit_mode(params):
op_menu("VIEW3D_MT_edit_gpencil_delete", {"type": 'DEL', "value": 'PRESS'}),
("gpencil.dissolve", {"type": 'X', "value": 'PRESS', "ctrl": True}, None),
("gpencil.dissolve", {"type": 'DEL', "value": 'PRESS', "ctrl": True}, None),
+ # Animation menu
+ ("gpencil.blank_frame_add", {"type": 'I', "value": 'PRESS', "shift": True}, None),
("gpencil.active_frames_delete_all", {"type": 'X', "value": 'PRESS', "shift": True}, None),
("gpencil.active_frames_delete_all", {"type": 'DEL', "value": 'PRESS', "shift": True}, None),
# Context menu
@@ -3068,7 +3078,7 @@ def km_grease_pencil_stroke_edit_mode(params):
# Isolate layer
("gpencil.layer_isolate", {"type": 'NUMPAD_ASTERIX', "value": 'PRESS'}, None),
# Move to layer
- ("gpencil.move_to_layer", {"type": 'M', "value": 'PRESS'}, None),
+ op_menu("GPENCIL_MT_move_to_layer", {"type": 'M', "value": 'PRESS'}),
# Transform tools
("transform.translate", {"type": 'G', "value": 'PRESS'}, None),
("transform.translate", {"type": params.select_tweak, "value": 'ANY'}, None),
@@ -3125,6 +3135,19 @@ def km_grease_pencil_stroke_paint_mode(params):
op_panel("VIEW3D_PT_gpencil_draw_context_menu", params.context_menu_event),
# Draw delete menu
op_menu("GPENCIL_MT_gpencil_draw_delete", {"type": 'X', "value": 'PRESS'}),
+ # Animation menu
+ ("gpencil.blank_frame_add", {"type": 'I', "value": 'PRESS', "shift": True}, None),
+ ("gpencil.active_frames_delete_all", {"type": 'X', "value": 'PRESS', "shift": True}, None),
+ ("gpencil.active_frames_delete_all", {"type": 'DEL', "value": 'PRESS', "shift": True}, None),
+ # Interpolation
+ ("gpencil.interpolate", {"type": 'E', "value": 'PRESS', "ctrl": True, "alt": True}, None),
+ ("gpencil.interpolate_sequence", {"type": 'E', "value": 'PRESS', "shift": True, "ctrl": True}, None),
+ # Show/hide
+ ("gpencil.reveal", {"type": 'H', "value": 'PRESS', "alt": True}, None),
+ ("gpencil.hide", {"type": 'H', "value": 'PRESS'},
+ {"properties": [("unselected", False)]}),
+ ("gpencil.hide", {"type": 'H', "value": 'PRESS', "shift": True},
+ {"properties": [("unselected", True)]}),
])
return keymap
@@ -3154,7 +3177,7 @@ def km_grease_pencil_stroke_paint_draw_brush(params):
("gpencil.draw", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True},
{"properties": [("mode", 'ERASER'), ("wait_for_input", False)]}),
# Constrain Guides Speedlines
- # Freehand
+ # Freehand
("gpencil.draw", {"type": 'O', "value": 'PRESS'}, None),
("gpencil.draw", {"type": 'J', "value": 'PRESS'}, None),
("gpencil.draw", {"type": 'J', "value": 'PRESS', "alt": True}, None),
@@ -3166,11 +3189,11 @@ def km_grease_pencil_stroke_paint_draw_brush(params):
("gpencil.draw", {"type": 'L', "value": 'PRESS', "alt": True}, None),
("gpencil.draw", {"type": 'L', "value": 'PRESS', "ctrl": True}, None),
("gpencil.draw", {"type": 'V', "value": 'PRESS'}, None),
- # Mirror or flip
+ # Mirror or flip
("gpencil.draw", {"type": 'M', "value": 'PRESS'}, None),
- # Mode
+ # Mode
("gpencil.draw", {"type": 'C', "value": 'PRESS'}, None),
- # Set reference point
+ # Set reference point
("gpencil.draw", {"type": 'C', "value": 'PRESS', "alt": True}, None),
# Tablet Mappings for Drawing ------------------ */
# For now, only support direct drawing using the eraser, as most users using a tablet
@@ -3266,7 +3289,7 @@ def km_grease_pencil_stroke_sculpt_mode(params):
return keymap
-def km_grease_pencil_stroke_weight_mode(params):
+def km_grease_pencil_stroke_weight_mode(_params):
items = []
keymap = (
"Grease Pencil Stroke Weight Mode",
@@ -3463,6 +3486,8 @@ def km_object_mode(params):
("object.duplicate_move", {"type": 'D', "value": 'PRESS', "shift": True}, None),
("object.duplicate_move_linked", {"type": 'D', "value": 'PRESS', "alt": True}, None),
("object.join", {"type": 'J', "value": 'PRESS', "ctrl": True}, None),
+ ("wm.context_toggle", {"type": 'PERIOD', "value": 'PRESS', "ctrl": True},
+ {"properties": [("data_path", 'tool_settings.use_transform_data_origin')]}),
("anim.keyframe_insert_menu", {"type": 'I', "value": 'PRESS'}, None),
("anim.keyframe_delete_v3d", {"type": 'I', "value": 'PRESS', "alt": True}, None),
("anim.keying_set_active_set", {"type": 'I', "value": 'PRESS', "shift": True, "ctrl": True, "alt": True}, None),
@@ -3834,9 +3859,16 @@ def km_sculpt(params):
("paint.mask_lasso_gesture", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "ctrl": True}, None),
("wm.context_toggle", {"type": 'M', "value": 'PRESS', "ctrl": True},
{"properties": [("data_path", 'scene.tool_settings.sculpt.show_mask')]}),
+ ("sculpt.mask_expand", {"type": 'A', "value": 'PRESS', "shift": True},
+ {"properties": [("use_normals", False), ("keep_previous_mask", False), ("invert", True), ("smooth_iterations", 2)]}),
+ ("sculpt.mask_expand", {"type": 'A', "value": 'PRESS', "shift": True, 'alt': True},
+ {"properties": [("use_normals", True), ("keep_previous_mask", True), ("invert", False), ("smooth_iterations", 0)]}),
# Dynamic topology
("sculpt.dynamic_topology_toggle", {"type": 'D', "value": 'PRESS', "ctrl": True}, None),
("sculpt.set_detail_size", {"type": 'D', "value": 'PRESS', "shift": True}, None),
+ # Remesh
+ ("object.voxel_remesh", {"type": 'R', "value": 'PRESS', "ctrl": True}, None),
+ ("object.quadriflow_remesh", {"type": 'R', "value": 'PRESS', "ctrl": True, "alt": True}, None),
# Brush properties
("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
{"properties": [("scalar", 0.9)]}),
@@ -3886,6 +3918,7 @@ def km_sculpt(params):
{"properties": [("data_path", 'tool_settings.sculpt.brush.use_smooth_stroke')]}),
op_menu("VIEW3D_MT_angle_control", {"type": 'R', "value": 'PRESS'}),
op_panel("VIEW3D_PT_sculpt_context_menu", params.context_menu_event),
+ op_menu_pie("VIEW3D_MT_sculpt_mask_edit_pie", {"type" : 'A', "value": 'PRESS'})
])
if params.legacy:
@@ -5006,7 +5039,7 @@ def km_image_editor_tool_uv_cursor(params):
def km_image_editor_tool_uv_select(params):
return (
- "Image Editor Tool: Uv, Select",
+ "Image Editor Tool: Uv, Tweak",
{"space_type": 'IMAGE_EDITOR', "region_type": 'WINDOW'},
{"items": _template_items_tool_select(params, "uv.select", "uv.cursor_set")},
)
@@ -5093,7 +5126,7 @@ def km_image_editor_tool_uv_scale(params):
def km_node_editor_tool_select(params):
return (
- "Node Tool: Select",
+ "Node Tool: Tweak",
{"space_type": 'NODE_EDITOR', "region_type": 'WINDOW'},
{"items": [
("node.select", {"type": params.select_mouse, "value": 'PRESS'},
@@ -5157,7 +5190,7 @@ def km_3d_view_tool_cursor(params):
def km_3d_view_tool_select(params):
return (
- "3D View Tool: Select",
+ "3D View Tool: Tweak",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": _template_items_tool_select(params, "view3d.select", "view3d.cursor3d")},
)
@@ -5452,11 +5485,11 @@ def km_3d_view_tool_edit_mesh_poly_build(params):
"3D View Tool: Edit Mesh, Poly Build",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("mesh.polybuild_face_at_cursor_move", {"type": params.tool_mouse, "value": 'PRESS'},
+ ("mesh.polybuild_extrude_at_cursor_move", {"type": params.tool_mouse, "value": 'PRESS'},
{"properties": [("TRANSFORM_OT_translate", [("release_confirm", True)])]}),
- ("mesh.polybuild_split_at_cursor_move", {"type": params.tool_mouse, "value": 'PRESS', "ctrl": True},
+ ("mesh.polybuild_face_at_cursor_move", {"type": params.tool_mouse, "value": 'PRESS', "ctrl": True},
{"properties": [("TRANSFORM_OT_translate", [("release_confirm", True)])]}),
- ("mesh.polybuild_dissolve_at_cursor", {"type": params.tool_mouse, "value": 'CLICK', "alt": True}, None),
+ ("mesh.polybuild_delete_at_cursor", {"type": params.tool_mouse, "value": 'CLICK', "shift": True}, None),
]},
)
@@ -5553,8 +5586,17 @@ def km_3d_view_tool_edit_mesh_shear(params):
"3D View Tool: Edit Mesh, Shear",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": [
- ("transform.shear", {"type": params.tool_tweak, "value": 'ANY'},
- {"properties": [("release_confirm", True)]}),
+ ("transform.shear",
+ {"type": params.tool_tweak, "value": 'NORTH'},
+ {"properties": [("release_confirm", True), ("orient_axis_ortho", 'Y')]}),
+ ("transform.shear",
+ {"type": params.tool_tweak, "value": 'SOUTH'},
+ {"properties": [("release_confirm", True), ("orient_axis_ortho", 'Y')]}),
+
+ # Use as fallback to catch diagonals too.
+ ("transform.shear",
+ {"type": params.tool_tweak, "value": 'ANY'},
+ {"properties": [("release_confirm", True), ("orient_axis_ortho", 'X')]}),
]},
)
@@ -5695,6 +5737,15 @@ def km_3d_view_tool_sculpt_lasso_mask(params):
]},
)
+def km_3d_view_tool_sculpt_mesh_filter(params):
+ return (
+ "3D View Tool: Sculpt, Mesh Filter",
+ {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
+ {"items": [
+ ("sculpt.mesh_filter", {"type": params.tool_tweak, "value": 'ANY'},
+ None)
+ ]},
+ )
def km_3d_view_tool_paint_weight_sample_weight(params):
return (
@@ -5821,7 +5872,7 @@ def km_3d_view_tool_paint_gpencil_cutter(params):
def km_3d_view_tool_edit_gpencil_select(params):
return (
- "3D View Tool: Edit Gpencil, Select",
+ "3D View Tool: Edit Gpencil, Tweak",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": _template_items_tool_select(params, "gpencil.select", "view3d.cursor3d")},
)
@@ -5854,6 +5905,16 @@ def km_3d_view_tool_edit_gpencil_select_lasso(params):
)
+def km_3d_view_tool_edit_gpencil_extrude(params):
+ return (
+ "3D View Tool: Edit Gpencil, Extrude",
+ {"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
+ {"items": [
+ ("gpencil.extrude_move", {"type": params.tool_tweak, "value": 'ANY'}, None),
+ ]},
+ )
+
+
def km_3d_view_tool_edit_gpencil_radius(params):
return (
"3D View Tool: Edit Gpencil, Radius",
@@ -5916,7 +5977,7 @@ def km_3d_view_tool_sculpt_gpencil_paint(_params):
def km_3d_view_tool_sculpt_gpencil_select(params):
return (
- "3D View Tool: Sculpt Gpencil, Select",
+ "3D View Tool: Sculpt Gpencil, Tweak",
{"space_type": 'VIEW_3D', "region_type": 'WINDOW'},
{"items": _template_items_tool_select(params, "gpencil.select", "view3d.cursor3d")},
)
@@ -6136,6 +6197,7 @@ def generate_keymaps(params=None):
km_3d_view_tool_sculpt_box_hide(params),
km_3d_view_tool_sculpt_box_mask(params),
km_3d_view_tool_sculpt_lasso_mask(params),
+ km_3d_view_tool_sculpt_mesh_filter(params),
km_3d_view_tool_paint_weight_sample_weight(params),
km_3d_view_tool_paint_weight_sample_vertex_group(params),
km_3d_view_tool_paint_weight_gradient(params),
@@ -6149,6 +6211,7 @@ def generate_keymaps(params=None):
km_3d_view_tool_edit_gpencil_select_box(params),
km_3d_view_tool_edit_gpencil_select_circle(params),
km_3d_view_tool_edit_gpencil_select_lasso(params),
+ km_3d_view_tool_edit_gpencil_extrude(params),
km_3d_view_tool_edit_gpencil_radius(params),
km_3d_view_tool_edit_gpencil_bend(params),
km_3d_view_tool_edit_gpencil_shear(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 20f496adea9..5ce79936836 100644
--- a/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py
+++ b/release/scripts/presets/keyconfig/keymap_data/industry_compatible_data.py
@@ -182,6 +182,8 @@ def km_window(params):
)
items.extend([
+ ("wm.batch_rename", {"type": 'RET', "value": 'PRESS', "alt": True}, None),
+
# File operations
("wm.read_homefile", {"type": 'N', "value": 'PRESS', "ctrl": True}, None),
op_menu("TOPBAR_MT_file_open_recent", {"type": 'O', "value": 'PRESS', "shift": True, "ctrl": True}),
@@ -1169,16 +1171,33 @@ def km_file_browser(params):
items.extend([
("file.parent", {"type": 'UP_ARROW', "value": 'PRESS', "alt": True}, None),
+ ("file.parent", {"type": 'UP_ARROW', "value": 'PRESS', "ctrl": True}, None),
("file.previous", {"type": 'LEFT_ARROW', "value": 'PRESS', "alt": True}, None),
+ ("file.previous", {"type": 'LEFT_ARROW', "value": 'PRESS', "ctrl": True}, None),
("file.next", {"type": 'RIGHT_ARROW', "value": 'PRESS', "alt": True}, None),
- ("file.refresh", {"type": 'R', "value": 'PRESS'}, None),
- ("file.parent", {"type": 'P', "value": 'PRESS'}, None),
+ ("file.next", {"type": 'RIGHT_ARROW', "value": 'PRESS', "ctrl": True}, None),
+ ("file.refresh", {"type": 'R', "value": 'PRESS', "ctrl": True}, None),
("wm.context_toggle", {"type": 'H', "value": 'PRESS'},
{"properties": [("data_path", 'space_data.params.show_hidden')]}),
- ("file.directory_new", {"type": 'I', "value": 'PRESS'}, None),
+ ("file.directory_new", {"type": 'I', "value": 'PRESS'},
+ {"properties": [("confirm", False)]}),
("file.smoothscroll", {"type": 'TIMER1', "value": 'ANY', "any": True}, None),
- ("file.bookmark_toggle", {"type": 'T', "value": 'PRESS'}, None),
+ ("wm.context_toggle", {"type": 'T', "value": 'PRESS'},
+ {"properties": [("data_path", 'space_data.show_region_toolbar')]}),
("file.bookmark_add", {"type": 'B', "value": 'PRESS', "ctrl": True}, None),
+ ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS'},
+ {"properties": [("increment", 1)]}),
+ ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True},
+ {"properties": [("increment", 10)]}),
+ ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True},
+ {"properties": [("increment", 100)]}),
+ ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS'},
+ {"properties": [("increment", -1)]}),
+ ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True},
+ {"properties": [("increment", -10)]}),
+ ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True},
+ {"properties": [("increment", -100)]}),
+ op_menu("FILEBROWSER_MT_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}),
])
return keymap
@@ -1196,13 +1215,13 @@ def km_file_browser_main(params):
("file.execute", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'},
{"properties": [("need_active", True)]}),
("file.refresh", {"type": 'R', "value": 'PRESS', "ctrl": True}, None),
- ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK'}, None),
- ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True},
+ ("file.select", {"type": 'LEFTMOUSE', "value": 'DOUBLE_CLICK'}, None),
+ ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK'},
+ {"properties": [("open", False), ("deselect_all", True)]}),
+ ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "ctrl": True},
{"properties": [("extend", True)]}),
- ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True, "ctrl": True},
+ ("file.select", {"type": 'LEFTMOUSE', "value": 'CLICK', "shift": True,},
{"properties": [("extend", True), ("fill", True)]}),
- ("file.select", {"type": 'RIGHTMOUSE', "value": 'CLICK'},
- {"properties": [("open", False)]}),
("file.select", {"type": 'RIGHTMOUSE', "value": 'CLICK', "shift": True},
{"properties": [("extend", True), ("open", False)]}),
("file.select", {"type": 'RIGHTMOUSE', "value": 'CLICK', "alt": True},
@@ -1239,18 +1258,7 @@ def km_file_browser_main(params):
("file.select_box", {"type": 'EVT_TWEAK_L', "value": 'ANY', "shift": True},
{"properties": [("mode", 'ADD')]}),
("file.highlight", {"type": 'MOUSEMOVE', "value": 'ANY', "any": True}, None),
- ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS'},
- {"properties": [("increment", 1)]}),
- ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "shift": True},
- {"properties": [("increment", 10)]}),
- ("file.filenum", {"type": 'NUMPAD_PLUS', "value": 'PRESS', "ctrl": True},
- {"properties": [("increment", 100)]}),
- ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS'},
- {"properties": [("increment", -1)]}),
- ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "shift": True},
- {"properties": [("increment", -10)]}),
- ("file.filenum", {"type": 'NUMPAD_MINUS', "value": 'PRESS', "ctrl": True},
- {"properties": [("increment", -100)]}),
+ ("file.sort_column_ui_context", {"type": 'LEFTMOUSE', "value": 'PRESS', "any": True}, None),
])
return keymap
@@ -2207,22 +2215,6 @@ def km_grease_pencil(_params):
)
items.extend([
- # Draw
- ("gpencil.annotate", {"type": 'LEFTMOUSE', "value": 'PRESS', "key_modifier": 'D'},
- {"properties": [("mode", 'DRAW'), ("wait_for_input", False)]}),
- # Draw - straight lines
- ("gpencil.annotate", {"type": 'LEFTMOUSE', "value": 'PRESS', "alt": True, "key_modifier": 'D'},
- {"properties": [("mode", 'DRAW_STRAIGHT'), ("wait_for_input", False)]}),
- # Draw - poly lines
- ("gpencil.annotate", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True, "alt": True, "key_modifier": 'D'},
- {"properties": [("mode", 'DRAW_POLY'), ("wait_for_input", False)]}),
- # Erase
- ("gpencil.annotate", {"type": 'RIGHTMOUSE', "value": 'PRESS', "key_modifier": 'D'},
- {"properties": [("mode", 'ERASER'), ("wait_for_input", False)]}),
-
- # Add blank frame (B because it's easy to reach from D).
- ("gpencil.blank_frame_add", {"type": 'B', "value": 'PRESS', "key_modifier": 'D'}, None),
- # Delete active frame - for easier video tutorials/review sessions.
# This works even when not in edit mode.
("gpencil.active_frames_delete_all", {"type": 'BACK_SPACE', "value": 'PRESS', "key_modifier": 'D'}, None),
("gpencil.active_frames_delete_all", {"type": 'DEL', "value": 'PRESS', "key_modifier": 'D'}, None),
@@ -2872,6 +2864,14 @@ def km_image_paint(params):
{"properties": [("data_path", 'tool_settings.image_paint.brush.use_smooth_stroke')]}),
op_menu("VIEW3D_MT_angle_control", {"type": 'R', "value": 'PRESS'}),
op_panel("VIEW3D_PT_paint_texture_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}),
+ # Tools
+ ("paint.brush_select", {"type": 'D', "value": 'PRESS'},
+ {"properties": [("image_tool", 'DRAW')]}),
+ ("paint.brush_select", {"type": 'B', "value": 'PRESS'},
+ {"properties": [("image_tool", 'SOFTEN')]}),
+ ("paint.brush_select", {"type": 'G', "value": 'PRESS'},
+ {"properties": [("image_tool", 'FILL')]}),
+ op_tool("builtin.select_box", {"type": 'Q', "value": 'PRESS'}),
])
return keymap
@@ -2914,6 +2914,12 @@ def km_vertex_paint(params):
{"properties": [("data_path", 'tool_settings.vertex_paint.brush.use_smooth_stroke')]}),
op_menu("VIEW3D_MT_angle_control", {"type": 'R', "value": 'PRESS'}),
op_panel("VIEW3D_PT_paint_vertex_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}),
+ # Tools
+ ("paint.brush_select", {"type": 'D', "value": 'PRESS'},
+ {"properties": [("vertex_tool", 'DRAW')]}),
+ ("paint.brush_select", {"type": 'B', "value": 'PRESS'},
+ {"properties": [("vertex_tool", 'BLUR')]}),
+ op_tool("builtin.select_box", {"type": 'Q', "value": 'PRESS'}),
])
return keymap
@@ -2929,7 +2935,6 @@ def km_weight_paint(params):
items.extend([
("paint.weight_paint", {"type": 'LEFTMOUSE', "value": 'PRESS'}, None),
- ("paint.weight_sample", {"type": 'I', "value": 'PRESS'}, None),
("paint.weight_sample_group", {"type": 'LEFTMOUSE', "value": 'PRESS', "shift": True}, None),
("brush.scale_size", {"type": 'LEFT_BRACKET', "value": 'PRESS'},
{"properties": [("scalar", 0.9)]}),
@@ -2945,6 +2950,13 @@ def km_weight_paint(params):
op_panel("VIEW3D_PT_paint_weight_context_menu", {"type": 'RIGHTMOUSE', "value": 'PRESS'}),
# Bone selection for combined weight paint + pose mode.
("view3d.select", {"type": 'LEFTMOUSE', "value": 'PRESS', "ctrl": True}, None),
+ # Tools
+ ("paint.brush_select", {"type": 'D', "value": 'PRESS'},
+ {"properties": [("weight_tool", 'DRAW')]}),
+ ("paint.brush_select", {"type": 'B', "value": 'PRESS'},
+ {"properties": [("weight_tool", 'BLUR')]}),
+ op_tool("builtin.sample_weight", {"type": 'I', "value": 'PRESS'}),
+ op_tool("builtin.select_box", {"type": 'Q', "value": 'PRESS'}),
])
return keymap
@@ -3377,12 +3389,12 @@ def km_object_non_modal(params):
items.extend([
- ("ic_keymap.mesh_select_mode",{"type": 'ONE', "value": 'PRESS'},
- {"properties": [("type", 'VERT')]}),
- ("ic_keymap.mesh_select_mode",{"type": 'TWO', "value": 'PRESS'},
- {"properties": [("type", 'EDGE')]}),
- ("ic_keymap.mesh_select_mode",{"type": 'THREE', "value": 'PRESS'},
- {"properties": [("type", 'FACE')]}),
+ ("object.mode_set_with_submode",{"type": 'ONE', "value": 'PRESS'},
+ {"properties": [("mode", 'EDIT'), ("mesh_select_mode", {'VERT'})]}),
+ ("object.mode_set_with_submode",{"type": 'TWO', "value": 'PRESS'},
+ {"properties": [("mode", 'EDIT'), ("mesh_select_mode", {'EDGE'})]}),
+ ("object.mode_set_with_submode",{"type": 'THREE', "value": 'PRESS'},
+ {"properties": [("mode", 'EDIT'), ("mesh_select_mode", {'FACE'})]}),
("object.mode_set",{"type": 'ONE', "value": 'PRESS'},
{"properties": [("mode", 'EDIT')]}),
("object.mode_set",{"type": 'FOUR', "value": 'PRESS'},
diff --git a/release/scripts/startup/bl_operators/add_mesh_torus.py b/release/scripts/startup/bl_operators/add_mesh_torus.py
index bd727ec3e83..0f95371d4c5 100644
--- a/release/scripts/startup/bl_operators/add_mesh_torus.py
+++ b/release/scripts/startup/bl_operators/add_mesh_torus.py
@@ -125,7 +125,7 @@ def add_uvs(mesh, minor_seg, major_seg):
class AddTorus(Operator, object_utils.AddObjectHelper):
- """Add a torus mesh"""
+ """Construct a torus mesh"""
bl_idname = "mesh.primitive_torus_add"
bl_label = "Add Torus"
bl_options = {'REGISTER', 'UNDO', 'PRESET'}
@@ -252,10 +252,12 @@ class AddTorus(Operator, object_utils.AddObjectHelper):
self.major_radius = self.abso_minor_rad + extra_helper
self.minor_radius = extra_helper
- verts_loc, faces = add_torus(self.major_radius,
- self.minor_radius,
- self.major_segments,
- self.minor_segments)
+ verts_loc, faces = add_torus(
+ self.major_radius,
+ self.minor_radius,
+ self.major_segments,
+ self.minor_segments,
+ )
mesh = bpy.data.meshes.new(data_("Torus"))
diff --git a/release/scripts/startup/bl_operators/clip.py b/release/scripts/startup/bl_operators/clip.py
index e857d8547a7..fcde95a48fe 100644
--- a/release/scripts/startup/bl_operators/clip.py
+++ b/release/scripts/startup/bl_operators/clip.py
@@ -39,6 +39,17 @@ def CLIP_spaces_walk(context, all_screens, tarea, tspace, callback, *args):
def CLIP_set_viewport_background(context, clip, clip_user):
+
+ def check_camera_has_distortion(tracking_camera):
+ if tracking_camera.distortion_model == 'POLYNOMIAL':
+ return not all(k == 0 for k in (tracking_camera.k1,
+ tracking_camera.k2,
+ tracking_camera.k3))
+ elif tracking_camera.distortion_model == 'DIVISION':
+ return not all(k == 0 for k in (tracking_camera.division_k1,
+ tracking_camera.division_k2))
+ return False
+
def set_background(cam, clip, user):
bgpic = None
@@ -53,7 +64,8 @@ def CLIP_set_viewport_background(context, clip, clip_user):
bgpic.source = 'MOVIE_CLIP'
bgpic.clip = clip
bgpic.clip_user.proxy_render_size = user.proxy_render_size
- bgpic.clip_user.use_render_undistorted = True
+ if check_camera_has_distortion(clip.tracking.camera):
+ bgpic.clip_user.use_render_undistorted = True
bgpic.use_camera_clip = False
cam.show_background_images = True
diff --git a/release/scripts/startup/bl_operators/freestyle.py b/release/scripts/startup/bl_operators/freestyle.py
index 3d619f97e6e..baac3556fb2 100644
--- a/release/scripts/startup/bl_operators/freestyle.py
+++ b/release/scripts/startup/bl_operators/freestyle.py
@@ -106,24 +106,24 @@ class SCENE_OT_freestyle_fill_range_by_selection(bpy.types.Operator):
m.range_max = max_dist
return {'FINISHED'}
# Find selected mesh objects
- selection = [ob for ob in scene.objects if ob.select_get() and ob.type == 'MESH' and ob.name != source.name]
+ selection = [ob for ob in scene.objects if ob.select_get() and ob.type == 'MESH' and ob.name != ref.name]
if selection:
# Compute the min/max distance from the reference to mesh vertices
min_dist = sys.float_info.max
max_dist = -min_dist
if m.type == 'DISTANCE_FROM_CAMERA':
for ob in selection:
- ob_to_cam = matrix_to_camera * ob.matrix_world
+ ob_to_cam = matrix_to_camera @ ob.matrix_world
for vert in ob.data.vertices:
# dist in the camera space
- dist = (ob_to_cam * vert.co).length
+ dist = (ob_to_cam @ vert.co).length
min_dist = min(dist, min_dist)
max_dist = max(dist, max_dist)
elif m.type == 'DISTANCE_FROM_OBJECT':
for ob in selection:
for vert in ob.data.vertices:
# dist in the world space
- dist = (ob.matrix_world * vert.co - target_location).length
+ dist = (ob.matrix_world @ vert.co - target_location).length
min_dist = min(dist, min_dist)
max_dist = max(dist, max_dist)
# Fill the Range Min/Max entries with the computed distances
diff --git a/release/scripts/startup/bl_operators/mask.py b/release/scripts/startup/bl_operators/mask.py
index 68f926c636b..2635f535b0b 100644
--- a/release/scripts/startup/bl_operators/mask.py
+++ b/release/scripts/startup/bl_operators/mask.py
@@ -20,7 +20,7 @@
from bpy.types import Menu
from bpy.app.translations import contexts as i18n_contexts
-
+
class MASK_MT_add(Menu):
bl_idname = "MASK_MT_add"
diff --git a/release/scripts/startup/bl_operators/presets.py b/release/scripts/startup/bl_operators/presets.py
index 097b93ea9ca..661a7bd4aea 100644
--- a/release/scripts/startup/bl_operators/presets.py
+++ b/release/scripts/startup/bl_operators/presets.py
@@ -670,9 +670,9 @@ class AddPresetGpencilMaterial(AddPresetBase, Operator):
"gpcolor.stroke_image",
"gpcolor.pixel_size",
"gpcolor.use_stroke_pattern",
- "gpcolor.use_stroke_texture_mix",
- "gpcolor.mix_stroke_factor",
- "gpcolor.alignment_mode",
+ "gpcolor.use_stroke_texture_mix",
+ "gpcolor.mix_stroke_factor",
+ "gpcolor.alignment_mode",
"gpcolor.fill_style",
"gpcolor.fill_color",
"gpcolor.fill_image",
diff --git a/release/scripts/startup/bl_operators/rigidbody.py b/release/scripts/startup/bl_operators/rigidbody.py
index f16f97ab156..4c014ff7ac4 100644
--- a/release/scripts/startup/bl_operators/rigidbody.py
+++ b/release/scripts/startup/bl_operators/rigidbody.py
@@ -89,7 +89,7 @@ class CopyRigidbodySettings(Operator):
class BakeToKeyframes(Operator):
'''Bake rigid body transformations of selected objects to keyframes'''
bl_idname = "rigidbody.bake_to_keyframes"
- bl_label = "Bake To Keyframes"
+ bl_label = "Bake to Keyframes"
bl_options = {'REGISTER', 'UNDO'}
frame_start: IntProperty(
diff --git a/release/scripts/startup/bl_operators/sequencer.py b/release/scripts/startup/bl_operators/sequencer.py
index b1152157cf8..ab87dc47075 100644
--- a/release/scripts/startup/bl_operators/sequencer.py
+++ b/release/scripts/startup/bl_operators/sequencer.py
@@ -136,8 +136,237 @@ class SequencerDeinterlaceSelectedMovies(Operator):
return {'FINISHED'}
+class SequencerFadesClear(Operator):
+ """Removes fade animation from selected sequences"""
+ bl_idname = "sequencer.fades_clear"
+ bl_label = "Clear Fades"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ @classmethod
+ def poll(cls, context):
+ return context.scene and context.scene.sequence_editor and context.scene.sequence_editor.active_strip
+
+ def execute(self, context):
+ fcurves = context.scene.animation_data.action.fcurves
+ fcurve_map = {
+ curve.data_path: curve
+ for curve in fcurves
+ if curve.data_path.startswith("sequence_editor.sequences_all")
+ }
+ for sequence in context.selected_sequences:
+ animated_property = "volume" if hasattr(sequence, "volume") else "blend_alpha"
+ data_path = sequence.path_from_id() + "." + animated_property
+ curve = fcurve_map.get(data_path)
+ if curve:
+ fcurves.remove(curve)
+ setattr(sequence, animated_property, 1.0)
+
+ return {'FINISHED'}
+
+
+class SequencerFadesAdd(Operator):
+ """Adds or updates a fade animation for either visual or audio strips"""
+ bl_idname = "sequencer.fades_add"
+ bl_label = "Add Fades"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ duration_seconds: bpy.props.FloatProperty(
+ name="Fade Duration",
+ description="Duration of the fade in seconds",
+ default=1.0,
+ min=0.01)
+ type: bpy.props.EnumProperty(
+ items=(
+ ('IN_OUT', 'Fade In And Out', 'Fade selected strips in and out'),
+ ('IN', 'Fade In', 'Fade in selected strips'),
+ ('OUT', 'Fade Out', 'Fade out selected strips'),
+ ('CURSOR_FROM', 'From Playhead', 'Fade from the time cursor to the end of overlapping sequences'),
+ ('CURSOR_TO', 'To Playhead', 'Fade from the start of sequences under the time cursor to the current frame'),
+ ),
+ name="Fade type",
+ description="Fade in, out, both in and out, to, or from the playhead. Default is both in and out",
+ default='IN_OUT')
+
+ @classmethod
+ def poll(cls, context):
+ # Can't use context.selected_sequences as it can have an impact on performances
+ return context.scene and context.scene.sequence_editor and context.scene.sequence_editor.active_strip
+
+ def execute(self, context):
+ from math import floor
+
+ # We must create a scene action first if there's none
+ scene = context.scene
+ if not scene.animation_data:
+ scene.animation_data_create()
+ if not scene.animation_data.action:
+ action = bpy.data.actions.new(scene.name + "Action")
+ scene.animation_data.action = action
+
+ sequences = context.selected_sequences
+ if self.type in {'CURSOR_TO', 'CURSOR_FROM'}:
+ sequences = [
+ s for s in sequences
+ if s.frame_final_start < context.scene.frame_current < s.frame_final_end
+ ]
+
+ max_duration = min(sequences, key=lambda s: s.frame_final_duration).frame_final_duration
+ max_duration = floor(max_duration / 2.0) if self.type == 'IN_OUT' else max_duration
+
+ faded_sequences = []
+ for sequence in sequences:
+ duration = self.calculate_fade_duration(context, sequence)
+ duration = min(duration, max_duration)
+ if not self.is_long_enough(sequence, duration):
+ continue
+
+ animated_property = 'volume' if hasattr(sequence, 'volume') else 'blend_alpha'
+ fade_fcurve = self.fade_find_or_create_fcurve(context, sequence, animated_property)
+ fades = self.calculate_fades(sequence, fade_fcurve, animated_property, duration)
+ self.fade_animation_clear(fade_fcurve, fades)
+ self.fade_animation_create(fade_fcurve, fades)
+ faded_sequences.append(sequence)
+
+ sequence_string = "sequence" if len(faded_sequences) == 1 else "sequences"
+ self.report({'INFO'}, "Added fade animation to {} {}.".format(len(faded_sequences), sequence_string))
+ return {'FINISHED'}
+
+ def calculate_fade_duration(self, context, sequence):
+ frame_current = context.scene.frame_current
+ duration = 0.0
+ if self.type == 'CURSOR_TO':
+ duration = abs(frame_current - sequence.frame_final_start)
+ elif self.type == 'CURSOR_FROM':
+ duration = abs(sequence.frame_final_end - frame_current)
+ else:
+ duration = calculate_duration_frames(context, self.duration_seconds)
+ return max(1, duration)
+
+ def is_long_enough(self, sequence, duration=0.0):
+ minimum_duration = duration * 2 if self.type == 'IN_OUT' else duration
+ return sequence.frame_final_duration >= minimum_duration
+
+ def calculate_fades(self, sequence, fade_fcurve, animated_property, duration):
+ """
+ Returns a list of Fade objects
+ """
+ fades = []
+ if self.type in {'IN', 'IN_OUT', 'CURSOR_TO'}:
+ fade = Fade(sequence, fade_fcurve, 'IN', animated_property, duration)
+ fades.append(fade)
+ if self.type in {'OUT', 'IN_OUT', 'CURSOR_FROM'}:
+ fade = Fade(sequence, fade_fcurve, 'OUT', animated_property, duration)
+ fades.append(fade)
+ return fades
+
+ def fade_find_or_create_fcurve(self, context, sequence, animated_property):
+ """
+ Iterates over all the fcurves until it finds an fcurve with a data path
+ that corresponds to the sequence.
+ Returns the matching FCurve or creates a new one if the function can't find a match.
+ """
+ fade_fcurve = None
+ fcurves = context.scene.animation_data.action.fcurves
+ searched_data_path = sequence.path_from_id(animated_property)
+ for fcurve in fcurves:
+ if fcurve.data_path == searched_data_path:
+ fade_fcurve = fcurve
+ break
+ if not fade_fcurve:
+ fade_fcurve = fcurves.new(data_path=searched_data_path)
+ return fade_fcurve
+
+ def fade_animation_clear(self, fade_fcurve, fades):
+ """
+ Removes existing keyframes in the fades' time range, in fast mode, without
+ updating the fcurve
+ """
+ keyframe_points = fade_fcurve.keyframe_points
+ for fade in fades:
+ for keyframe in keyframe_points:
+ # The keyframe points list doesn't seem to always update as the
+ # operator re-runs Leading to trying to remove nonexistent keyframes
+ try:
+ if fade.start.x < keyframe.co[0] <= fade.end.x:
+ keyframe_points.remove(keyframe, fast=True)
+ except Exception:
+ pass
+ fade_fcurve.update()
+
+ def fade_animation_create(self, fade_fcurve, fades):
+ """
+ Inserts keyframes in the fade_fcurve in fast mode using the Fade objects.
+ Updates the fcurve after having inserted all keyframes to finish the animation.
+ """
+ keyframe_points = fade_fcurve.keyframe_points
+ for fade in fades:
+ for point in (fade.start, fade.end):
+ keyframe_points.insert(frame=point.x, value=point.y, options={'FAST'})
+ fade_fcurve.update()
+ # The graph editor and the audio waveforms only redraw upon "moving" a keyframe
+ keyframe_points[-1].co = keyframe_points[-1].co
+
+
+class Fade:
+ # Data structure to represent fades.
+ __slots__ = (
+ "type",
+ "animated_property",
+ "duration",
+ "max_value",
+ "start",
+ "end",
+ )
+
+ def __init__(self, sequence, fade_fcurve, type, animated_property, duration):
+ from mathutils import Vector
+ self.type = type
+ self.animated_property = animated_property
+ self.duration = duration
+ self.max_value = self.calculate_max_value(sequence, fade_fcurve)
+
+ if type == 'IN':
+ self.start = Vector((sequence.frame_final_start, 0.0))
+ self.end = Vector((sequence.frame_final_start + self.duration, self.max_value))
+ elif type == 'OUT':
+ self.start = Vector((sequence.frame_final_end - self.duration, self.max_value))
+ self.end = Vector((sequence.frame_final_end, 0.0))
+
+ def calculate_max_value(self, sequence, fade_fcurve):
+ """
+ Returns the maximum Y coordinate the fade animation should use for a given sequence
+ Uses either the sequence's value for the animated property, or the next keyframe after the fade
+ """
+ max_value = 0.0
+
+ if not fade_fcurve.keyframe_points:
+ max_value = getattr(sequence, self.animated_property, 1.0)
+ else:
+ if self.type == 'IN':
+ fade_end = sequence.frame_final_start + self.duration
+ keyframes = (k for k in fade_fcurve.keyframe_points if k.co[0] >= fade_end)
+ if self.type == 'OUT':
+ fade_start = sequence.frame_final_end - self.duration
+ keyframes = (k for k in reversed(fade_fcurve.keyframe_points) if k.co[0] <= fade_start)
+ try:
+ max_value = next(keyframes).co[1]
+ except StopIteration:
+ pass
+
+ return max_value if max_value > 0.0 else 1.0
+
+ def __repr__(self):
+ return "Fade {}: {} to {}".format(self.type, self.start, self.end)
+
+
+def calculate_duration_frames(context, duration_seconds):
+ return round(duration_seconds * context.scene.render.fps / context.scene.render.fps_base)
+
+
classes = (
SequencerCrossfadeSounds,
SequencerCutMulticam,
SequencerDeinterlaceSelectedMovies,
+ SequencerFadesClear,
+ SequencerFadesAdd,
)
diff --git a/release/scripts/startup/bl_operators/userpref.py b/release/scripts/startup/bl_operators/userpref.py
index 6ec6855296c..b052f333d2a 100644
--- a/release/scripts/startup/bl_operators/userpref.py
+++ b/release/scripts/startup/bl_operators/userpref.py
@@ -537,7 +537,7 @@ class PREFERENCES_OT_addon_refresh(Operator):
class PREFERENCES_OT_addon_install(Operator):
"""Install an add-on"""
bl_idname = "preferences.addon_install"
- bl_label = "Install Add-on from File..."
+ bl_label = "Install Add-on"
overwrite: BoolProperty(
name="Overwrite",
diff --git a/release/scripts/startup/bl_operators/uvcalc_smart_project.py b/release/scripts/startup/bl_operators/uvcalc_smart_project.py
index fdf74c420a9..4e61874b440 100644
--- a/release/scripts/startup/bl_operators/uvcalc_smart_project.py
+++ b/release/scripts/startup/bl_operators/uvcalc_smart_project.py
@@ -55,10 +55,10 @@ def pointInTri2D(v, v1, v2, v3):
x= key[i]
y= key[i+1]
- if xmax<x: xmax= x
- if ymax<y: ymax= y
- if xmin>x: xmin= x
- if ymin>y: ymin= y
+ if xmax<x: xmax= x
+ if ymax<y: ymax= y
+ if xmin>x: xmin= x
+ if ymin>y: ymin= y
x= v.x
y= v.y
@@ -169,7 +169,7 @@ def island2Edge(island):
# Its okay to leave the length in there.
# for e in length_sorted_edges:
- # e.pop(2)
+ # e.pop(2)
# return edges and unique points
return length_sorted_edges, [v.to_3d() for v in unique_points.values()]
@@ -410,7 +410,7 @@ def mergeUvIslands(islandList):
elif Intersect == 0: # No intersection?? Place it.
# Progress
removedCount += 1
-# XXX Window.DrawProgressBar(0.0, 'Merged: %i islands, Ctrl to finish early.' % removedCount)
+# XXX Window.DrawProgressBar(0.0, 'Merged: %i islands, Ctrl to finish early.' % removedCount)
# Move faces into new island and offset
targetIsland[0].extend(sourceIsland[0])
@@ -485,7 +485,7 @@ def getUvIslands(faceGroups, me):
islandList = []
-# XXX Window.DrawProgressBar(0.0, 'Splitting %d projection groups into UV islands:' % len(faceGroups))
+# XXX Window.DrawProgressBar(0.0, 'Splitting %d projection groups into UV islands:' % len(faceGroups))
# print '\tSplitting %d projection groups into UV islands:' % len(faceGroups),
# Find grouped faces
@@ -552,7 +552,7 @@ def getUvIslands(faceGroups, me):
break
# if not ok will stop looping
-# XXX Window.DrawProgressBar(0.1, 'Optimizing Rotation for %i UV Islands' % len(islandList))
+# XXX Window.DrawProgressBar(0.1, 'Optimizing Rotation for %i UV Islands' % len(islandList))
for island in islandList:
optiRotateUvIsland(island)
@@ -562,7 +562,7 @@ def getUvIslands(faceGroups, me):
def packIslands(islandList):
if USER_FILL_HOLES:
- # XXX Window.DrawProgressBar(0.1, 'Merging Islands (Ctrl: skip merge)...')
+ # XXX Window.DrawProgressBar(0.1, 'Merging Islands (Ctrl: skip merge)...')
mergeUvIslands(islandList) # Modify in place
# Now we have UV islands, we need to pack them.
@@ -611,18 +611,18 @@ def packIslands(islandList):
# with the islands.
# print '\tPacking UV Islands...'
-# XXX Window.DrawProgressBar(0.7, "Packing %i UV Islands..." % len(packBoxes) )
+# XXX Window.DrawProgressBar(0.7, "Packing %i UV Islands..." % len(packBoxes) )
# time1 = time.time()
packWidth, packHeight = geometry.box_pack_2d(packBoxes)
# print 'Box Packing Time:', time.time() - time1
- # if len(pa ckedLs) != len(islandList):
+ # if len(packedLs) != len(islandList):
# raise ValueError("Packed boxes differs from original length")
# print '\tWriting Packed Data to faces'
-# XXX Window.DrawProgressBar(0.8, "Writing Packed Data to faces")
+# XXX Window.DrawProgressBar(0.8, "Writing Packed Data to faces")
# Sort by ID, so there in sync again
islandIdx = len(islandList)
diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py
index bf1c79e766f..cb9af88f45f 100644
--- a/release/scripts/startup/bl_operators/wm.py
+++ b/release/scripts/startup/bl_operators/wm.py
@@ -25,6 +25,7 @@ from bpy.types import (
)
from bpy.props import (
BoolProperty,
+ CollectionProperty,
EnumProperty,
FloatProperty,
IntProperty,
@@ -79,6 +80,10 @@ rna_module_prop = StringProperty(
def context_path_validate(context, data_path):
+ # Silently ignore invalid data paths created by T65397.
+ if "(null)" in data_path:
+ return Ellipsis
+
try:
value = eval("context.%s" % data_path) if data_path else Ellipsis
except AttributeError as ex:
@@ -1174,6 +1179,7 @@ rna_vector_subtype_items = (
('QUATERNION', "Quaternion Rotation", "Quaternion rotation (affects NLA blending)"),
)
+
class WM_OT_properties_edit(Operator):
bl_idname = "wm.properties_edit"
bl_label = "Edit Property"
@@ -1763,6 +1769,456 @@ class WM_OT_toolbar(Operator):
return {'FINISHED'}
+class BatchRenameAction(bpy.types.PropertyGroup):
+ # category: StringProperty()
+ type: EnumProperty(
+ name="Operation",
+ items=(
+ ('REPLACE', "Find/Replace", "Replace text in the name"),
+ ('SET', "Set Name", "Set a new name or prefix/suffix the existing one"),
+ ('STRIP', "Strip Characters", "Strip leading/trailing text from the name"),
+ ('CASE', "Change Case", "Change case of each name"),
+ ),
+ )
+
+ # We could split these into sub-properties, however it's not so important.
+
+ # type: 'SET'.
+ set_name: StringProperty(name="Name")
+ set_method: EnumProperty(
+ name="Method",
+ items=(
+ ('NEW', "New", ""),
+ ('PREFIX', "Prefix", ""),
+ ('SUFFIX', "Suffix", ""),
+ ),
+ default='SUFFIX',
+ )
+
+ # type: 'STRIP'.
+ strip_chars: EnumProperty(
+ name="Strip Characters",
+ options={'ENUM_FLAG'},
+ items=(
+ ('SPACE', "Spaces", ""),
+ ('DIGIT', "Digits", ""),
+ ('PUNCT', "Punctuation", ""),
+ ),
+ )
+
+ # type: 'STRIP'.
+ strip_part: EnumProperty(
+ name="Strip Part",
+ options={'ENUM_FLAG'},
+ items=(
+ ('START', "Start", ""),
+ ('END', "End", ""),
+ ),
+ )
+
+ # type: 'REPLACE'.
+ replace_src: StringProperty(name="Find")
+ replace_dst: StringProperty(name="Replace")
+ replace_match_case: BoolProperty(name="Case Sensitive")
+ use_replace_regex_src: BoolProperty(
+ name="Regular Expression Find",
+ description="Use regular expressions to match text in the 'Find' field"
+ )
+ use_replace_regex_dst: BoolProperty(
+ name="Regular Expression Replace",
+ description="Use regular expression for the replacement text (supporting groups)"
+ )
+
+ # type: 'CASE'.
+ case_method: EnumProperty(
+ name="Case",
+ items=(
+ ('UPPER', "Upper Case", ""),
+ ('LOWER', "Lower Case", ""),
+ ('TITLE', "Title Case", ""),
+ ),
+ )
+
+ # Weak, add/remove as properties.
+ op_add: BoolProperty()
+ op_remove: BoolProperty()
+
+
+class WM_OT_batch_rename(Operator):
+ bl_idname = "wm.batch_rename"
+ bl_label = "Batch Rename"
+
+ bl_options = {'UNDO'}
+
+ data_type: EnumProperty(
+ name="Type",
+ items=(
+ ('OBJECT', "Objects", ""),
+ ('MATERIAL', "Materials", ""),
+ None,
+ # Enum identifiers are compared with 'object.type'.
+ ('MESH', "Meshes", ""),
+ ('CURVE', "Curves", ""),
+ ('META', "Meta Balls", ""),
+ ('ARMATURE', "Armatures", ""),
+ ('LATTICE', "Lattices", ""),
+ ('GPENCIL', "Grease Pencils", ""),
+ ('CAMERA', "Cameras", ""),
+ ('SPEAKER', "Speakers", ""),
+ ('LIGHT_PROBE', "Light Probes", ""),
+ None,
+ ('BONE', "Bones", ""),
+ ('NODE', "Nodes", ""),
+ ('SEQUENCE_STRIP', "Sequence Strips", ""),
+ ),
+ description="Type of data to rename",
+ )
+
+ data_source: EnumProperty(
+ name="Source",
+ items=(
+ ('SELECT', "Selected", ""),
+ ('ALL', "All", ""),
+ ),
+ )
+
+ actions: CollectionProperty(type=BatchRenameAction)
+
+ @staticmethod
+ def _data_from_context(context, data_type, only_selected, check_context=False):
+
+ mode = context.mode
+ scene = context.scene
+ space = context.space_data
+ space_type = None if (space is None) else space.type
+
+ data = None
+ if space_type == 'SEQUENCE_EDITOR':
+ data_type_test = 'SEQUENCE_STRIP'
+ if check_context:
+ return data_type_test
+ if data_type == data_type_test:
+ data = (
+ # TODO, we don't have access to seqbasep, this won't work when inside metas.
+ [seq for seq in context.scene.sequence_editor.sequences_all if seq.select]
+ if only_selected else
+ context.scene.sequence_editor.sequences_all,
+ "name",
+ "Strip(s)",
+ )
+ elif space_type == 'NODE_EDITOR':
+ data_type_test = 'NODE'
+ if check_context:
+ return data_type_test
+ if data_type == data_type_test:
+ data = (
+ context.selected_nodes
+ if only_selected else
+ list(space.node_tree.nodes),
+ "name",
+ "Node(s)",
+ )
+ else:
+ if mode == 'POSE' or (mode == 'WEIGHT_PAINT' and context.pose_object):
+ data_type_test = 'BONE'
+ if check_context:
+ return data_type_test
+ if data_type == data_type_test:
+ data = (
+ [pchan.bone for pchan in context.selected_pose_bones]
+ if only_selected else
+ [pchan.bone for ob in context.objects_in_mode_unique_data for pbone in ob.pose.bones],
+ "name",
+ "Bone(s)",
+ )
+ elif mode == 'EDIT_ARMATURE':
+ data_type_test = 'BONE'
+ if check_context:
+ return data_type_test
+ if data_type == data_type_test:
+ data = (
+ context.selected_editable_bones
+ if only_selected else
+ [ebone for ob in context.objects_in_mode_unique_data for ebone in ob.data.edit_bones],
+ "name",
+ "Edit Bone(s)",
+ )
+
+ if check_context:
+ return 'OBJECT'
+
+ object_data_type_attrs_map = {
+ 'MESH': ("meshes", "Mesh(es)"),
+ 'CURVE': ("curves", "Curve(s)"),
+ 'META': ("metaballs", "MetaBall(s)"),
+ 'ARMATURE': ("armatures", "Armature(s)"),
+ 'LATTICE': ("lattices", "Lattice(s)"),
+ 'GPENCIL': ("grease_pencils", "Grease Pencil(s)"),
+ 'CAMERA': ("cameras", "Camera(s)"),
+ 'SPEAKER': ("speakers", "Speaker(s)"),
+ 'LIGHT_PROBE': ("light_probes", "LightProbe(s)"),
+ }
+
+ # Finish with space types.
+ if data is None:
+
+ if data_type == 'OBJECT':
+ data = (
+ context.selected_editable_objects
+ if only_selected else
+ [id for id in bpy.data.objects if id.library is None],
+ "name",
+ "Object(s)",
+ )
+ elif data_type == 'MATERIAL':
+ data = (
+ tuple(set(
+ slot.material
+ for ob in context.selected_objects
+ for slot in ob.material_slots
+ if slot.material is not None
+ ))
+ if only_selected else
+ [id for id in bpy.data.materials if id.library is None],
+ "name",
+ "Material(s)",
+ )
+ elif data_type in object_data_type_attrs_map.keys():
+ attr, descr = object_data_type_attrs_map[data_type]
+ data = (
+ tuple(set(
+ id
+ for ob in context.selected_objects
+ if ob.type == data_type
+ for id in (ob.data,)
+ if id is not None and id.library is None
+ ))
+ if only_selected else
+ [id for id in getattr(bpy.data, attr) if id.library is None],
+ "name",
+ descr,
+ )
+
+
+ return data
+
+ @staticmethod
+ def _apply_actions(actions, name):
+ import string
+ import re
+
+ for action in actions:
+ ty = action.type
+ if ty == 'SET':
+ text = action.set_name
+ method = action.set_method
+ if method == 'NEW':
+ name = text
+ elif method == 'PREFIX':
+ name = text + name
+ elif method == 'SUFFIX':
+ name = name + text
+ else:
+ assert(0)
+
+ elif ty == 'STRIP':
+ chars = action.strip_chars
+ chars_strip = (
+ "{:s}{:s}{:s}"
+ ).format(
+ string.punctuation if 'PUNCT' in chars else "",
+ string.digits if 'DIGIT' in chars else "",
+ " " if 'SPACE' in chars else "",
+ )
+ part = action.strip_part
+ if 'START' in part:
+ name = name.lstrip(chars_strip)
+ if 'END' in part:
+ name = name.rstrip(chars_strip)
+
+ elif ty == 'REPLACE':
+ if action.use_replace_regex_src:
+ replace_src = action.replace_src
+ if action.use_replace_regex_dst:
+ replace_dst = action.replace_dst
+ else:
+ replace_dst = re.escape(action.replace_dst)
+ else:
+ replace_src = re.escape(action.replace_src)
+ replace_dst = re.escape(action.replace_dst)
+ name = re.sub(
+ replace_src,
+ replace_dst,
+ name,
+ flags=(
+ 0 if action.replace_match_case else
+ re.IGNORECASE
+ ),
+ )
+ elif ty == 'CASE':
+ method = action.case_method
+ if method == 'UPPER':
+ name = name.upper()
+ elif method == 'LOWER':
+ name = name.lower()
+ elif method == 'TITLE':
+ name = name.title()
+ else:
+ assert(0)
+ else:
+ assert(0)
+ return name
+
+ def _data_update(self, context):
+ only_selected = self.data_source == 'SELECT'
+
+ self._data = self._data_from_context(context, self.data_type, only_selected)
+ if self._data is None:
+ self.data_type = self._data_from_context(context, None, False, check_context=True)
+ self._data = self._data_from_context(context, self.data_type, only_selected)
+
+ self._data_source_prev = self.data_source
+ self._data_type_prev = self.data_type
+
+ def draw(self, context):
+ import re
+
+ layout = self.layout
+
+ split = layout.split(factor=0.5)
+ split.label(text="Data Type:")
+ split.prop(self, "data_type", text="")
+
+ split = layout.split(factor=0.5)
+ split.label(text="Rename {:d} {:s}:".format(len(self._data[0]), self._data[2]))
+ split.row().prop(self, "data_source", expand=True)
+
+ for action in self.actions:
+ box = layout.box()
+
+ row = box.row(align=True)
+ row.prop(action, "type", text="")
+ row.prop(action, "op_add", text="", icon='ADD')
+ row.prop(action, "op_remove", text="", icon='REMOVE')
+
+ ty = action.type
+ if ty == 'SET':
+ box.prop(action, "set_method")
+ box.prop(action, "set_name")
+ elif ty == 'STRIP':
+ box.row().prop(action, "strip_chars")
+ box.row().prop(action, "strip_part")
+ elif ty == 'REPLACE':
+
+ row = box.row(align=True)
+ re_error_src = None
+ if action.use_replace_regex_src:
+ try:
+ re.compile(action.replace_src)
+ except Exception as ex:
+ re_error_src = str(ex)
+ row.alert = True
+ row.prop(action, "replace_src")
+ row.prop(action, "use_replace_regex_src", text="", icon='SORTBYEXT')
+ if re_error_src is not None:
+ box.label(text=re_error_src)
+
+ re_error_dst = None
+ row = box.row(align=True)
+ if action.use_replace_regex_src:
+ if action.use_replace_regex_dst:
+ if re_error_src is None:
+ try:
+ re.sub(action.replace_src, action.replace_dst, "")
+ except Exception as ex:
+ re_error_dst = str(ex)
+ row.alert = True
+
+ row.prop(action, "replace_dst")
+ rowsub = row.row(align=True)
+ rowsub.active = action.use_replace_regex_src
+ rowsub.prop(action, "use_replace_regex_dst", text="", icon='SORTBYEXT')
+ if re_error_dst is not None:
+ box.label(text=re_error_dst)
+
+ row = box.row()
+ row.prop(action, "replace_match_case")
+ elif ty == 'CASE':
+ box.row().prop(action, "case_method", expand=True)
+
+ def check(self, context):
+ changed = False
+ for i, action in enumerate(self.actions):
+ if action.op_add:
+ action.op_add = False
+ self.actions.add()
+ if i + 2 != len(self.actions):
+ self.actions.move(len(self.actions) - 1, i + 1)
+ changed = True
+ break
+ if action.op_remove:
+ action.op_remove = False
+ if len(self.actions) > 1:
+ self.actions.remove(i)
+ changed = True
+ break
+
+ if (
+ (self._data_source_prev != self.data_source) or
+ (self._data_type_prev != self.data_type)
+ ):
+ self._data_update(context)
+ changed = True
+
+ return changed
+
+ def execute(self, context):
+ import re
+
+ seq, attr, descr = self._data
+
+ actions = self.actions
+
+ # Sanitize actions.
+ for action in actions:
+ if action.use_replace_regex_src:
+ try:
+ re.compile(action.replace_src)
+ except Exception as ex:
+ self.report({'ERROR'}, "Invalid regular expression (find): " + str(ex))
+ return {'CANCELLED'}
+
+ if action.use_replace_regex_dst:
+ try:
+ re.sub(action.replace_src, action.replace_dst, "")
+ except Exception as ex:
+ self.report({'ERROR'}, "Invalid regular expression (replace): " + str(ex))
+ return {'CANCELLED'}
+
+ total_len = 0
+ change_len = 0
+ for item in seq:
+ name_src = getattr(item, attr)
+ name_dst = self._apply_actions(actions, name_src)
+ if name_src != name_dst:
+ setattr(item, attr, name_dst)
+ change_len += 1
+ total_len += 1
+
+ self.report({'INFO'}, "Renamed {:d} of {:d} {:s}".format(change_len, total_len, descr))
+
+ return {'FINISHED'}
+
+ def invoke(self, context, event):
+
+ self._data_update(context)
+
+ if not self.actions:
+ self.actions.add()
+ wm = context.window_manager
+ return wm.invoke_props_dialog(self, width=400)
+
+
class WM_MT_splash(Menu):
bl_label = "Splash"
@@ -1979,5 +2435,7 @@ classes = (
WM_OT_tool_set_by_id,
WM_OT_tool_set_by_index,
WM_OT_toolbar,
+ BatchRenameAction,
+ WM_OT_batch_rename,
WM_MT_splash,
)
diff --git a/release/scripts/startup/bl_ui/properties_constraint.py b/release/scripts/startup/bl_ui/properties_constraint.py
index 6fa953574cb..dce2d2f2758 100644
--- a/release/scripts/startup/bl_ui/properties_constraint.py
+++ b/release/scripts/startup/bl_ui/properties_constraint.py
@@ -370,6 +370,8 @@ class ConstraintButtonsPanel:
def COPY_ROTATION(self, _context, layout, con):
self.target_template(layout, con)
+ layout.prop(con, "euler_order", text="Order")
+
split = layout.split()
col = split.column()
@@ -390,7 +392,7 @@ class ConstraintButtonsPanel:
sub.active = con.use_z
sub.prop(con, "invert_z", text="Invert")
- layout.prop(con, "use_offset")
+ layout.prop(con, "mix_mode", text="Mix")
self.space_template(layout, con)
@@ -430,6 +432,7 @@ class ConstraintButtonsPanel:
row.prop(con, "use_z", text="Z")
layout.prop(con, "power")
+ layout.prop(con, "use_make_uniform")
row = layout.row()
row.prop(con, "use_offset")
@@ -456,6 +459,8 @@ class ConstraintButtonsPanel:
def COPY_TRANSFORMS(self, _context, layout, con):
self.target_template(layout, con)
+ layout.prop(con, "mix_mode", text="Mix")
+
self.space_template(layout, con)
# def SCRIPT(self, context, layout, con):
@@ -684,6 +689,9 @@ class ConstraintButtonsPanel:
col.row().label(text="Source:")
col.row().prop(con, "map_from", expand=True)
+ if con.map_from == 'ROTATION':
+ layout.prop(con, "from_rotation_mode", text="Mode")
+
split = layout.split()
ext = "" if con.map_from == 'LOCATION' else "_rot" if con.map_from == 'ROTATION' else "_scale"
@@ -726,6 +734,9 @@ class ConstraintButtonsPanel:
col.label(text="Destination:")
col.row().prop(con, "map_to", expand=True)
+ if con.map_to == 'ROTATION':
+ layout.prop(con, "to_euler_order", text="Order")
+
split = layout.split()
ext = "" if con.map_to == 'LOCATION' else "_rot" if con.map_to == 'ROTATION' else "_scale"
@@ -750,6 +761,8 @@ class ConstraintButtonsPanel:
sub.prop(con, "to_min_z" + ext, text="Min")
sub.prop(con, "to_max_z" + ext, text="Max")
+ layout.prop(con, "mix_mode" + ext, text="Mix")
+
self.space_template(layout, con)
def SHRINKWRAP(self, _context, layout, con):
diff --git a/release/scripts/startup/bl_ui/properties_data_bone.py b/release/scripts/startup/bl_ui/properties_data_bone.py
index 8b691ddcc2a..c50b9414667 100644
--- a/release/scripts/startup/bl_ui/properties_data_bone.py
+++ b/release/scripts/startup/bl_ui/properties_data_bone.py
@@ -232,11 +232,13 @@ class BONE_PT_relations(BoneButtonsPanel, Panel):
sub = col.column()
sub.active = (bone.parent is not None)
sub.prop(bone, "use_connect")
- sub.prop(bone, "use_inherit_rotation")
- sub.prop(bone, "use_inherit_scale")
sub = col.column()
sub.active = (not bone.parent or not bone.use_connect)
sub.prop(bone, "use_local_location")
+ sub = col.column()
+ sub.active = (bone.parent is not None)
+ sub.prop(bone, "use_inherit_rotation")
+ sub.prop(bone, "inherit_scale")
class BONE_PT_display(BoneButtonsPanel, Panel):
diff --git a/release/scripts/startup/bl_ui/properties_data_camera.py b/release/scripts/startup/bl_ui/properties_data_camera.py
index 32e99910d71..eef70056be8 100644
--- a/release/scripts/startup/bl_ui/properties_data_camera.py
+++ b/release/scripts/startup/bl_ui/properties_data_camera.py
@@ -289,7 +289,7 @@ class DATA_PT_camera_background_image(CameraButtonsPanel, Panel):
elif bg.source == 'MOVIE_CLIP' and bg.clip:
row.prop(bg.clip, "name", text="", emboss=False)
elif bg.source and bg.use_camera_clip:
- row.label(text="Camera Clip")
+ row.label(text="Active Clip")
else:
row.label(text="Not Set")
@@ -329,7 +329,7 @@ class DATA_PT_camera_background_image(CameraButtonsPanel, Panel):
sub.template_image_stereo_3d(bg.image.stereo_3d_format)
elif bg.source == 'MOVIE_CLIP':
- box.prop(bg, "use_camera_clip")
+ box.prop(bg, "use_camera_clip", text="Active Clip")
column = box.column()
column.active = not bg.use_camera_clip
diff --git a/release/scripts/startup/bl_ui/properties_data_empty.py b/release/scripts/startup/bl_ui/properties_data_empty.py
index 6650aef61aa..4ce87b85410 100644
--- a/release/scripts/startup/bl_ui/properties_data_empty.py
+++ b/release/scripts/startup/bl_ui/properties_data_empty.py
@@ -60,6 +60,7 @@ class DATA_PT_empty(DataButtonsPanel, Panel):
col.row().prop(ob, "empty_image_side", text="Side", expand=True)
col.prop(ob, "show_empty_image_orthographic", text="Display Orthographic")
col.prop(ob, "show_empty_image_perspective", text="Display Perspective")
+ col.prop(ob, "show_empty_image_only_axis_aligned")
class DATA_PT_empty_image(DataButtonsPanel, Panel):
diff --git a/release/scripts/startup/bl_ui/properties_data_gpencil.py b/release/scripts/startup/bl_ui/properties_data_gpencil.py
index ca814f9c8da..751af892778 100644
--- a/release/scripts/startup/bl_ui/properties_data_gpencil.py
+++ b/release/scripts/startup/bl_ui/properties_data_gpencil.py
@@ -127,7 +127,7 @@ class DATA_PT_gpencil_layers(DataButtonsPanel, Panel):
row = layout.row()
layer_rows = 7
-
+
col = row.column()
col.template_list("GPENCIL_UL_layer", "", gpd, "layers", gpd.layers, "active_index",
rows=layer_rows, sort_reverse=True, sort_lock=True)
@@ -152,13 +152,13 @@ class DATA_PT_gpencil_layers(DataButtonsPanel, Panel):
sub = col.column(align=True)
sub.operator("gpencil.layer_isolate", icon='LOCKED', text="").affect_visibility = False
sub.operator("gpencil.layer_isolate", icon='RESTRICT_VIEW_ON', text="").affect_visibility = True
-
+
# Layer main properties
- row = layout.row()
+ row = layout.row()
col = layout.column(align=True)
if gpl:
-
+
layout = self.layout
layout.use_property_split = True
layout.use_property_decorate = True
diff --git a/release/scripts/startup/bl_ui/properties_data_lattice.py b/release/scripts/startup/bl_ui/properties_data_lattice.py
index 330844440d0..2193fbb9ffd 100644
--- a/release/scripts/startup/bl_ui/properties_data_lattice.py
+++ b/release/scripts/startup/bl_ui/properties_data_lattice.py
@@ -43,13 +43,10 @@ class DATA_PT_context_lattice(DataButtonsPanel, Panel):
lat = context.lattice
space = context.space_data
- split = layout.split(factor=0.65)
if ob:
- split.template_ID(ob, "data")
- split.separator()
+ layout.template_ID(ob, "data")
elif lat:
- split.template_ID(space, "pin_id")
- split.separator()
+ layout.template_ID(space, "pin_id")
class DATA_PT_lattice(DataButtonsPanel, Panel):
diff --git a/release/scripts/startup/bl_ui/properties_data_light.py b/release/scripts/startup/bl_ui/properties_data_light.py
index 376b7561739..6f730cf3307 100644
--- a/release/scripts/startup/bl_ui/properties_data_light.py
+++ b/release/scripts/startup/bl_ui/properties_data_light.py
@@ -175,17 +175,10 @@ class DATA_PT_EEVEE_shadow(DataButtonsPanel, Panel):
col = layout.column()
sub = col.column(align=True)
- sub.prop(light, "shadow_buffer_clip_start", text="Clip Start")
- if light.type == 'SUN':
- sub.prop(light, "shadow_buffer_clip_end", text="End")
-
- col.prop(light, "shadow_buffer_soft", text="Softness")
-
- col.separator()
+ if light.type != 'SUN':
+ sub.prop(light, "shadow_buffer_clip_start", text="Clip Start")
col.prop(light, "shadow_buffer_bias", text="Bias")
- col.prop(light, "shadow_buffer_exp", text="Exponent")
- col.prop(light, "shadow_buffer_bleed_bias", text="Bleed Bias")
class DATA_PT_EEVEE_shadow_cascaded_shadow_map(DataButtonsPanel, Panel):
@@ -245,7 +238,6 @@ class DATA_PT_EEVEE_shadow_contact(DataButtonsPanel, Panel):
col.active = light.use_shadow and light.use_contact_shadow
col.prop(light, "contact_shadow_distance", text="Distance")
- col.prop(light, "contact_shadow_soft_size", text="Softness")
col.prop(light, "contact_shadow_bias", text="Bias")
col.prop(light, "contact_shadow_thickness", text="Thickness")
@@ -335,8 +327,8 @@ classes = (
DATA_PT_EEVEE_light,
DATA_PT_EEVEE_light_distance,
DATA_PT_EEVEE_shadow,
- DATA_PT_EEVEE_shadow_contact,
DATA_PT_EEVEE_shadow_cascaded_shadow_map,
+ DATA_PT_EEVEE_shadow_contact,
DATA_PT_area,
DATA_PT_spot,
DATA_PT_falloff_curve,
diff --git a/release/scripts/startup/bl_ui/properties_data_mesh.py b/release/scripts/startup/bl_ui/properties_data_mesh.py
index 47c90199031..51f24007271 100644
--- a/release/scripts/startup/bl_ui/properties_data_mesh.py
+++ b/release/scripts/startup/bl_ui/properties_data_mesh.py
@@ -72,8 +72,8 @@ class MESH_MT_shape_key_context_menu(Menu):
layout.separator()
layout.operator("object.shape_key_remove", icon='X', text="Delete All Shape Keys").all = True
layout.separator()
- layout.operator("object.shape_key_move", icon='TRIA_UP_BAR', text="Move To Top").type = 'TOP'
- layout.operator("object.shape_key_move", icon='TRIA_DOWN_BAR', text="Move To Bottom").type = 'BOTTOM'
+ layout.operator("object.shape_key_move", icon='TRIA_UP_BAR', text="Move to Top").type = 'TOP'
+ layout.operator("object.shape_key_move", icon='TRIA_DOWN_BAR', text="Move to Bottom").type = 'BOTTOM'
class MESH_UL_vgroups(UIList):
@@ -459,6 +459,7 @@ class DATA_PT_vertex_colors(MeshButtonsPanel, Panel):
col.operator("mesh.vertex_color_add", icon='ADD', text="")
col.operator("mesh.vertex_color_remove", icon='REMOVE', text="")
+
class DATA_PT_remesh(MeshButtonsPanel, Panel):
bl_label = "Remesh"
bl_options = {'DEFAULT_CLOSED'}
@@ -467,14 +468,22 @@ class DATA_PT_remesh(MeshButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
layout.use_property_split = True
- col = layout.column()
+ layout.use_property_decorate = False
+ row = layout.row()
mesh = context.mesh
- col.prop(mesh, "remesh_voxel_size")
- col.prop(mesh, "remesh_smooth_normals")
- col.prop(mesh, "remesh_preserve_paint_mask")
- col.operator("object.voxel_remesh", text="Voxel Remesh")
-
+ row.prop(mesh, "remesh_mode", text="Mode", expand=True)
+ col = layout.column()
+ if (mesh.remesh_mode == 'VOXEL'):
+ col.prop(mesh, "remesh_voxel_size")
+ col.prop(mesh, "remesh_voxel_adaptivity")
+ col.prop(mesh, "remesh_fix_poles")
+ col.prop(mesh, "remesh_smooth_normals")
+ col.prop(mesh, "remesh_preserve_volume")
+ col.prop(mesh, "remesh_preserve_paint_mask")
+ col.operator("object.voxel_remesh", text="Voxel Remesh")
+ else:
+ col.operator("object.quadriflow_remesh", text="QuadriFlow Remesh")
class DATA_PT_customdata(MeshButtonsPanel, Panel):
bl_label = "Geometry Data"
@@ -484,6 +493,7 @@ class DATA_PT_customdata(MeshButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
layout.use_property_split = True
+ layout.use_property_decorate = False
obj = context.object
me = context.mesh
diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py
index 47c911821fc..124fe77cb52 100644
--- a/release/scripts/startup/bl_ui/properties_data_modifier.py
+++ b/release/scripts/startup/bl_ui/properties_data_modifier.py
@@ -1783,7 +1783,7 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
col.label(text="Material:")
row = col.row(align=True)
-
+
row.prop_search(md, "material", gpd, "materials", text="", icon='SHADING_TEXTURE')
row.prop(md, "invert_materials", text="", icon='ARROW_LEFTRIGHT')
row = layout.row(align=True)
@@ -2012,15 +2012,19 @@ class DATA_PT_gpencil_modifiers(ModifierButtonsPanel, Panel):
col.prop(md, "factor")
row = layout.row()
- row.prop(md, "create_materials")
- row.prop(md, "modify_color")
+ row.prop(md, "opacity_mode", text="Mode")
- col = layout.column()
- col.separator()
- 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", text="", icon='ARROW_LEFTRIGHT')
+ if md.opacity_mode == 'MATERIAL':
+ row = layout.row()
+ row.prop(md, "create_materials")
+ row.prop(md, "modify_color", text="Change")
+ else:
+ col = layout.column()
+ col.separator()
+ 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", text="", icon='ARROW_LEFTRIGHT')
col = layout.column()
col.separator()
diff --git a/release/scripts/startup/bl_ui/properties_grease_pencil_common.py b/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
index 6f089f93f00..ca9c518f443 100644
--- a/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
+++ b/release/scripts/startup/bl_ui/properties_grease_pencil_common.py
@@ -169,8 +169,8 @@ class GreasePencilStrokeEditPanel:
layout.label(text="Edit:")
row = layout.row(align=True)
row.operator("gpencil.copy", text="Copy")
- row.operator("gpencil.paste", text="Paste").type = 'COPY'
- row.operator("gpencil.paste", text="Paste & Merge").type = 'MERGE'
+ row.operator("gpencil.paste", text="Paste").type = 'ACTIVE'
+ row.operator("gpencil.paste", text="Paste by Layer").type = 'LAYER'
col = layout.column(align=True)
col.operator("gpencil.delete")
@@ -311,7 +311,7 @@ class GreasePencilAppearancePanel:
layout.prop(gp_settings, "use_cursor", text="Show Brush")
if brush.gpencil_tool == 'DRAW':
- layout.prop(gp_settings, "show_lasso", text="Show fill color while drawing")
+ layout.prop(gp_settings, "show_lasso", text="Show Fill Color While Drawing")
if brush.gpencil_tool == 'FILL':
layout.prop(brush, "cursor_color_add", text="Color")
@@ -507,8 +507,9 @@ class GPENCIL_MT_pie_tools_more(Menu):
# gpd = context.gpencil_data
col = pie.column(align=True)
- col.operator("gpencil.copy", icon='COPYDOWN', text="Copy")
- col.operator("gpencil.paste", icon='PASTEDOWN', text="Paste")
+ col.operator("gpencil.copy", text="Copy", icon='COPYDOWN')
+ col.operator("gpencil.paste", text="Paste", icon='PASTEDOWN').type = 'ACTIVE'
+ col.operator("gpencil.paste", text="Paste by Layer").type = 'LAYER'
col = pie.column(align=True)
col.operator("gpencil.select_more", icon='ADD')
@@ -590,31 +591,65 @@ class GPENCIL_MT_snap(Menu):
layout.operator("view3d.snap_cursor_to_grid", text="Cursor to Grid")
+class GPENCIL_MT_move_to_layer(Menu):
+ bl_label = "Move to Layer"
+
+ def draw(self, context):
+ layout = self.layout
+ gpd = context.gpencil_data
+ if gpd:
+ gpl_active = context.active_gpencil_layer
+ tot_layers = len(gpd.layers)
+ i = tot_layers - 1
+ while(i >= 0):
+ gpl = gpd.layers[i]
+ if gpl.info == gpl_active.info:
+ icon = 'GREASEPENCIL'
+ else:
+ icon = 'NONE'
+ layout.operator("gpencil.move_to_layer", text=gpl.info, icon=icon).layer = i
+ i -= 1
+
+ layout.separator()
+
+ layout.operator("gpencil.layer_add", text="New Layer", icon='ADD')
+
+
class GPENCIL_MT_gpencil_draw_delete(Menu):
- bl_label = "GPencil Draw Delete"
+ bl_label = "Delete"
def draw(self, _context):
layout = self.layout
layout.operator_context = 'INVOKE_REGION_WIN'
- layout.operator("gpencil.active_frames_delete_all", text="Delete Frame")
+ layout.operator("gpencil.delete", text="Delete Active Keyframe (Active Layer)").type = 'FRAME'
+ layout.operator("gpencil.active_frames_delete_all", text="Delete Active Keyframes (All Layers)")
class GPENCIL_MT_cleanup(Menu):
bl_label = "Clean Up"
def draw(self, _context):
+
+ ob = _context.active_object
+
layout = self.layout
+
layout.operator("gpencil.frame_clean_loose", text="Delete Loose Points")
- layout.operator("gpencil.stroke_merge_by_distance", text="Merge by Distance")
+
+ if ob.mode != 'PAINT_GPENCIL':
+ layout.operator("gpencil.stroke_merge_by_distance", text="Merge by Distance")
+
layout.separator()
layout.operator("gpencil.frame_clean_fill", text="Boundary Strokes").mode = 'ACTIVE'
layout.operator("gpencil.frame_clean_fill", text="Boundary Strokes all Frames").mode = 'ALL'
- layout.separator()
- layout.operator("gpencil.reproject")
+ if ob.mode != 'PAINT_GPENCIL':
+ layout.separator()
+
+ layout.operator("gpencil.reproject")
class GPENCIL_UL_annotation_layer(UIList):
@@ -857,7 +892,8 @@ class GreasePencilMaterialsPanel:
if is_view3d and brush is not None:
gp_settings = brush.gpencil_settings
if gp_settings.use_material_pin is False:
- ma = ob.material_slots[ob.active_material_index].material
+ if ob.active_material_index > 0:
+ ma = ob.material_slots[ob.active_material_index].material
else:
ma = gp_settings.material
@@ -914,6 +950,32 @@ class GPENCIL_UL_layer(UIList):
icon_value=icon,
)
+class GreasePencilSimplifyPanel:
+
+ def draw_header(self, context):
+ rd = context.scene.render
+ self.layout.prop(rd, "simplify_gpencil", text="")
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
+ rd = context.scene.render
+
+ layout.active = rd.simplify_gpencil
+
+ col = layout.column()
+ col.prop(rd, "simplify_gpencil_onplay", text="Playback Only")
+ col.prop(rd, "simplify_gpencil_view_modifier", text="Modifiers")
+ col.prop(rd, "simplify_gpencil_shader_fx", text="ShaderFX")
+ col.prop(rd, "simplify_gpencil_blend", text="Layers Blending")
+ col.prop(rd, "simplify_gpencil_tint", text="Layers Tinting")
+
+ col.prop(rd, "simplify_gpencil_view_fill")
+ sub = col.column()
+ sub.active = rd.simplify_gpencil_view_fill
+ sub.prop(rd, "simplify_gpencil_remove_lines", text="Lines")
classes = (
GPENCIL_MT_pie_tool_palette,
@@ -923,6 +985,7 @@ classes = (
GPENCIL_MT_snap,
GPENCIL_MT_cleanup,
+ GPENCIL_MT_move_to_layer,
GPENCIL_MT_gpencil_draw_delete,
diff --git a/release/scripts/startup/bl_ui/properties_material.py b/release/scripts/startup/bl_ui/properties_material.py
index f3c34cf4660..0849437b680 100644
--- a/release/scripts/startup/bl_ui/properties_material.py
+++ b/release/scripts/startup/bl_ui/properties_material.py
@@ -202,33 +202,47 @@ class EEVEE_MATERIAL_PT_volume(MaterialButtonsPanel, Panel):
panel_node_draw(layout, mat.node_tree, 'OUTPUT_MATERIAL', "Volume")
+def draw_material_settings(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
+ mat = context.material
+
+ layout.prop(mat, "use_backface_culling")
+ layout.prop(mat, "blend_method")
+ layout.prop(mat, "shadow_method")
+
+ row = layout.row()
+ row.active = ((mat.blend_method == 'CLIP') or (mat.shadow_method == 'CLIP'))
+ row.prop(mat, "alpha_threshold")
+
+ if mat.blend_method not in {'OPAQUE', 'CLIP', 'HASHED'}:
+ layout.prop(mat, "show_transparent_back")
+
+ layout.prop(mat, "use_screen_refraction")
+ layout.prop(mat, "refraction_depth")
+ layout.prop(mat, "use_sss_translucency")
+ layout.prop(mat, "pass_index")
+
+
class EEVEE_MATERIAL_PT_settings(MaterialButtonsPanel, Panel):
bl_label = "Settings"
bl_context = "material"
COMPAT_ENGINES = {'BLENDER_EEVEE'}
def draw(self, context):
- layout = self.layout
- layout.use_property_split = True
- layout.use_property_decorate = False
-
- mat = context.material
-
- layout.prop(mat, "use_backface_culling")
- layout.prop(mat, "blend_method")
- layout.prop(mat, "shadow_method")
+ draw_material_settings(self, context)
- row = layout.row()
- row.active = ((mat.blend_method == 'CLIP') or (mat.shadow_method == 'CLIP'))
- row.prop(mat, "alpha_threshold")
- if mat.blend_method not in {'OPAQUE', 'CLIP', 'HASHED'}:
- layout.prop(mat, "show_transparent_back")
+class EEVEE_MATERIAL_PT_viewport_settings(MaterialButtonsPanel, Panel):
+ bl_label = "Settings"
+ bl_context = "material"
+ bl_parent_id = "MATERIAL_PT_viewport"
+ COMPAT_ENGINES = {'BLENDER_RENDER'}
- layout.prop(mat, "use_screen_refraction")
- layout.prop(mat, "refraction_depth")
- layout.prop(mat, "use_sss_translucency")
- layout.prop(mat, "pass_index")
+ def draw(self, context):
+ draw_material_settings(self, context)
class MATERIAL_PT_viewport(MaterialButtonsPanel, Panel):
@@ -263,6 +277,7 @@ classes = (
EEVEE_MATERIAL_PT_volume,
EEVEE_MATERIAL_PT_settings,
MATERIAL_PT_viewport,
+ EEVEE_MATERIAL_PT_viewport_settings,
MATERIAL_PT_custom_props,
)
diff --git a/release/scripts/startup/bl_ui/properties_material_gpencil.py b/release/scripts/startup/bl_ui/properties_material_gpencil.py
index 2deff845994..02aec00edf6 100644
--- a/release/scripts/startup/bl_ui/properties_material_gpencil.py
+++ b/release/scripts/startup/bl_ui/properties_material_gpencil.py
@@ -48,6 +48,7 @@ class GPENCIL_MT_color_context_menu(Menu):
layout.operator("object.material_slot_remove_unused")
+
class GPENCIL_UL_matslots(UIList):
def draw_item(self, _context, layout, _data, item, icon, _active_data, _active_propname, _index):
slot = item
@@ -164,6 +165,7 @@ class MATERIAL_PT_gpencil_strokecolor(GPMaterialButtonsPanel, Panel):
if gpcolor.mode == 'LINE' and gpcolor.stroke_style != 'TEXTURE':
col.prop(gpcolor, "use_overlap_strokes")
+
class MATERIAL_PT_gpencil_fillcolor(GPMaterialButtonsPanel, Panel):
bl_label = "Fill"
bl_parent_id = 'MATERIAL_PT_gpencil_surface'
@@ -218,7 +220,7 @@ class MATERIAL_PT_gpencil_fillcolor(GPMaterialButtonsPanel, Panel):
col.template_ID(gpcolor, "fill_image", open="image.open")
if gpcolor.fill_style == 'TEXTURE':
- col.prop(gpcolor, "use_fill_pattern", text="Use As Stencil Mask")
+ col.prop(gpcolor, "use_fill_pattern", text="Use as Stencil Mask")
if gpcolor.use_fill_pattern is True:
col.prop(gpcolor, "fill_color", text="Color")
@@ -229,7 +231,7 @@ class MATERIAL_PT_gpencil_fillcolor(GPMaterialButtonsPanel, Panel):
col.prop(gpcolor, "texture_clamp", text="Clip Image")
if gpcolor.use_fill_pattern is False:
- col.prop(gpcolor, "use_fill_texture_mix", text="Mix With Color")
+ col.prop(gpcolor, "use_fill_texture_mix", text="Mix with Color")
if gpcolor.use_fill_texture_mix is True:
col.prop(gpcolor, "fill_color", text="Mix Color")
@@ -274,7 +276,8 @@ class MATERIAL_PT_gpencil_material_presets(PresetPanel, Panel):
preset_add_operator = "scene.gpencil_material_preset_add"
-classes = (GPENCIL_UL_matslots,
+classes = (
+ GPENCIL_UL_matslots,
GPENCIL_MT_color_context_menu,
MATERIAL_PT_gpencil_slots,
MATERIAL_PT_gpencil_preview,
@@ -283,7 +286,8 @@ classes = (GPENCIL_UL_matslots,
MATERIAL_PT_gpencil_strokecolor,
MATERIAL_PT_gpencil_fillcolor,
MATERIAL_PT_gpencil_options,
- MATERIAL_PT_gpencil_custom_props,)
+ MATERIAL_PT_gpencil_custom_props,
+)
if __name__ == "__main__": # only for live edit.
from bpy.utils import register_class
diff --git a/release/scripts/startup/bl_ui/properties_object.py b/release/scripts/startup/bl_ui/properties_object.py
index 7424c090764..d2ba047e07e 100644
--- a/release/scripts/startup/bl_ui/properties_object.py
+++ b/release/scripts/startup/bl_ui/properties_object.py
@@ -109,20 +109,18 @@ class OBJECT_PT_delta_transform(ObjectButtonsPanel, Panel):
ob = context.object
- col = flow.column()
- col.prop(ob, "delta_location")
+ col = layout.column()
+ col.prop(ob, "delta_location", text="Location")
- col = flow.column()
rotation_mode = ob.rotation_mode
if rotation_mode == 'QUATERNION':
col.prop(ob, "delta_rotation_quaternion", text="Rotation")
elif rotation_mode == 'AXIS_ANGLE':
- col.label(text="Not for Axis-Angle")
+ pass
else:
- col.prop(ob, "delta_rotation_euler", text="Delta Rotation")
+ col.prop(ob, "delta_rotation_euler", text="Rotation")
- col = flow.column()
- col.prop(ob, "delta_scale")
+ col.prop(ob, "delta_scale", text="Scale")
class OBJECT_PT_relations(ObjectButtonsPanel, Panel):
diff --git a/release/scripts/startup/bl_ui/properties_particle.py b/release/scripts/startup/bl_ui/properties_particle.py
index ebbf278c5e7..076b1f2592c 100644
--- a/release/scripts/startup/bl_ui/properties_particle.py
+++ b/release/scripts/startup/bl_ui/properties_particle.py
@@ -960,10 +960,10 @@ class PARTICLE_PT_physics_relations(ParticleButtonsPanel, Panel):
#col.alert = key.valid
col.prop(key, "object")
col.prop(key, "system", text="System")
-
- col.active = psys.use_keyed_timing
- col.prop(key, "time")
- col.prop(key, "duration")
+ sub = col.column(align=True)
+ sub.active = psys.use_keyed_timing
+ sub.prop(key, "time")
+ sub.prop(key, "duration")
elif part.physics_type == 'BOIDS':
sub = layout.column()
# doesn't work yet
@@ -1091,14 +1091,13 @@ class PARTICLE_PT_physics_integration(ParticleButtonsPanel, Panel):
col.prop(part, "integrator")
col.prop(part, "timestep")
- sub = col.row()
- sub.prop(part, "subframes")
- supports_courant = part.physics_type == 'FLUID'
- subsub = sub.row()
- subsub.enabled = supports_courant
- subsub.prop(part, "use_adaptive_subframes", text="")
- if supports_courant and part.use_adaptive_subframes:
- col.prop(part, "courant_target", text="Threshold")
+ col.prop(part, "subframes")
+
+ if part.physics_type == 'FLUID':
+ col.prop(part, "use_adaptive_subframes", text="Adaptive")
+ sub = col.row()
+ sub.enabled = part.use_adaptive_subframes
+ sub.prop(part, "courant_target", text="Threshold")
class PARTICLE_PT_boidbrain(ParticleButtonsPanel, Panel):
@@ -1122,33 +1121,28 @@ class PARTICLE_PT_boidbrain(ParticleButtonsPanel, Panel):
def draw(self, context):
layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
boids = particle_get_settings(context).boids
layout.enabled = particle_panel_enabled(context, context.particle_system)
# Currently boids can only use the first state so these are commented out for now.
- #row = layout.row()
+ # row = layout.row()
# row.template_list("UI_UL_list", "particle_boids", boids, "states",
- # boids, "active_boid_state_index", compact="True")
- #col = row.row()
- #sub = col.row(align=True)
- #sub.operator("boid.state_add", icon='ADD', text="")
- #sub.operator("boid.state_del", icon='REMOVE', text="")
- #sub = row.row(align=True)
- #sub.operator("boid.state_move_up", icon='TRIA_UP', text="")
- #sub.operator("boid.state_move_down", icon='TRIA_DOWN', text="")
+ # boids, "active_boid_state_index", compact="True")
+ # col = row.row()
+ # sub = col.row(align=True)
+ # sub.operator("boid.state_add", icon='ADD', text="")
+ # sub.operator("boid.state_del", icon='REMOVE', text="")
+ # sub = row.row(align=True)
+ # sub.operator("boid.state_move_up", icon='TRIA_UP', text="")
+ # sub.operator("boid.state_move_down", icon='TRIA_DOWN', text="")
state = boids.active_boid_state
- #layout.prop(state, "name", text="State name")
-
- row = layout.row()
- row.prop(state, "ruleset_type")
- if state.ruleset_type == 'FUZZY':
- row.prop(state, "rule_fuzzy", slider=True)
- else:
- row.label(text="")
+ # layout.prop(state, "name", text="State name")
row = layout.row()
row.template_list("UI_UL_list", "particle_boids_rules", state,
@@ -1164,47 +1158,46 @@ class PARTICLE_PT_boidbrain(ParticleButtonsPanel, Panel):
subsub.operator("boid.rule_move_up", icon='TRIA_UP', text="")
subsub.operator("boid.rule_move_down", icon='TRIA_DOWN', text="")
+ layout.prop(state, "ruleset_type")
+ if state.ruleset_type == 'FUZZY':
+ layout.prop(state, "rule_fuzzy", slider=True)
+
rule = state.active_boid_rule
if rule:
- row = layout.row()
- row.prop(rule, "name", text="")
- # somebody make nice icons for boids here please! -jahka
- row.prop(rule, "use_in_air", icon='TRIA_UP', text="")
- row.prop(rule, "use_on_land", icon='TRIA_DOWN', text="")
+ col = layout.column(align=True)
+ col.prop(rule, "use_in_air")
+ col.prop(rule, "use_on_land")
- row = layout.row()
+ col = layout.column()
if rule.type == 'GOAL':
- row.prop(rule, "object")
- row = layout.row()
- row.prop(rule, "use_predict")
+ col.prop(rule, "object")
+ col.prop(rule, "use_predict")
elif rule.type == 'AVOID':
- row.prop(rule, "object")
- row = layout.row()
- row.prop(rule, "use_predict")
- row.prop(rule, "fear_factor")
+ col.prop(rule, "object")
+ col.prop(rule, "use_predict")
+ col.prop(rule, "fear_factor")
elif rule.type == 'FOLLOW_PATH':
- row.label(text="Not yet functional")
+ col.label(text="Not yet functional")
elif rule.type == 'AVOID_COLLISION':
- row.prop(rule, "use_avoid")
- row.prop(rule, "use_avoid_collision")
- row.prop(rule, "look_ahead")
+ col.prop(rule, "use_avoid")
+ col.prop(rule, "use_avoid_collision")
+ col.prop(rule, "look_ahead")
elif rule.type == 'FOLLOW_LEADER':
- row.prop(rule, "object", text="")
- row.prop(rule, "distance")
- row = layout.row()
- row.prop(rule, "use_line")
- sub = row.row()
- sub.active = rule.line
+ col.prop(rule, "object")
+ col.prop(rule, "distance")
+ col.prop(rule, "use_line")
+ sub = col.row()
+ sub.active = rule.use_line
sub.prop(rule, "queue_count")
elif rule.type == 'AVERAGE_SPEED':
- row.prop(rule, "speed", slider=True)
- row.prop(rule, "wander", slider=True)
- row.prop(rule, "level", slider=True)
+ col.prop(rule, "speed", slider=True)
+ col.prop(rule, "wander", slider=True)
+ col.prop(rule, "level", slider=True)
elif rule.type == 'FIGHT':
- row.prop(rule, "distance")
- row.prop(rule, "flee_distance")
+ col.prop(rule, "distance")
+ col.prop(rule, "flee_distance")
class PARTICLE_PT_render(ParticleButtonsPanel, Panel):
diff --git a/release/scripts/startup/bl_ui/properties_render.py b/release/scripts/startup/bl_ui/properties_render.py
index 92b649e863c..b4c864c16cd 100644
--- a/release/scripts/startup/bl_ui/properties_render.py
+++ b/release/scripts/startup/bl_ui/properties_render.py
@@ -25,6 +25,8 @@ from bl_ui.space_view3d import (
VIEW3D_PT_shading_options,
)
+from bl_ui.properties_grease_pencil_common import GreasePencilSimplifyPanel
+
class RenderButtonsPanel:
bl_space_type = 'PROPERTIES'
@@ -314,7 +316,6 @@ class RENDER_PT_eevee_subsurface_scattering(RenderButtonsPanel, Panel):
col = layout.column()
col.prop(props, "sss_samples")
col.prop(props, "sss_jitter_threshold")
- col.prop(props, "use_sss_separate_albedo")
class RENDER_PT_eevee_screen_space_reflections(RenderButtonsPanel, Panel):
@@ -366,7 +367,6 @@ class RENDER_PT_eevee_shadows(RenderButtonsPanel, Panel):
props = scene.eevee
col = layout.column()
- col.prop(props, "shadow_method")
col.prop(props, "shadow_cube_size", text="Cube Size")
col.prop(props, "shadow_cascade_size", text="Cascade Size")
col.prop(props, "use_shadow_high_bitdepth")
@@ -655,36 +655,12 @@ class RENDER_PT_simplify_render(RenderButtonsPanel, Panel):
col.prop(rd, "simplify_child_particles_render", text="Max Child Particles")
-class RENDER_PT_simplify_greasepencil(RenderButtonsPanel, Panel):
+class RENDER_PT_simplify_greasepencil(RenderButtonsPanel, Panel, GreasePencilSimplifyPanel):
bl_label = "Grease Pencil"
bl_parent_id = "RENDER_PT_simplify"
- COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME', 'BLENDER_CLAY', 'BLENDER_EEVEE'}
+ COMPAT_ENGINES = {'BLENDER_RENDER', 'BLENDER_GAME', 'BLENDER_CLAY', 'BLENDER_EEVEE', 'BLENDER_WORKBENCH'}
bl_options = {'DEFAULT_CLOSED'}
- def draw_header(self, context):
- rd = context.scene.render
- self.layout.prop(rd, "simplify_gpencil", text="")
-
- def draw(self, context):
- layout = self.layout
- layout.use_property_split = True
- layout.use_property_decorate = False
-
- rd = context.scene.render
-
- layout.active = rd.simplify_gpencil
-
- col = layout.column()
- col.prop(rd, "simplify_gpencil_onplay", text="Playback Only")
- col.prop(rd, "simplify_gpencil_view_modifier", text="Modifiers")
- col.prop(rd, "simplify_gpencil_shader_fx", text="ShaderFX")
- col.prop(rd, "simplify_gpencil_blend", text="Layers Blending")
-
- col.prop(rd, "simplify_gpencil_view_fill")
- sub = col.column()
- sub.active = rd.simplify_gpencil_view_fill
- sub.prop(rd, "simplify_gpencil_remove_lines", text="Lines")
-
classes = (
RENDER_PT_context,
diff --git a/release/scripts/startup/bl_ui/properties_scene.py b/release/scripts/startup/bl_ui/properties_scene.py
index 60a7751e910..0b4ca2902c1 100644
--- a/release/scripts/startup/bl_ui/properties_scene.py
+++ b/release/scripts/startup/bl_ui/properties_scene.py
@@ -63,7 +63,7 @@ class SCENE_PT_scene(SceneButtonsPanel, Panel):
layout.prop(scene, "camera")
layout.prop(scene, "background_set")
- layout.prop(scene, "active_clip")
+ layout.prop(scene, "active_clip", text="Active Clip")
class SCENE_PT_unit(SceneButtonsPanel, Panel):
diff --git a/release/scripts/startup/bl_ui/space_clip.py b/release/scripts/startup/bl_ui/space_clip.py
index 4edda9b2460..b5154e72de6 100644
--- a/release/scripts/startup/bl_ui/space_clip.py
+++ b/release/scripts/startup/bl_ui/space_clip.py
@@ -1221,7 +1221,7 @@ class CLIP_PT_tools_grease_pencil_draw(AnnotationDrawingToolsPanel, Panel):
class CLIP_MT_view_zoom(Menu):
bl_label = "Fractional Zoom"
- def draw(self, context):
+ def draw(self, _context):
layout = self.layout
ratios = ((1, 8), (1, 4), (1, 2), (1, 1), (2, 1), (4, 1), (8, 1))
@@ -1255,16 +1255,17 @@ class CLIP_MT_view(Menu):
layout.operator("clip.view_selected")
layout.operator("clip.view_all")
layout.operator("clip.view_all", text="View Fit").fit_view = True
+ layout.operator("clip.view_center_cursor")
layout.separator()
-
+
layout.operator("clip.view_zoom_in")
layout.operator("clip.view_zoom_out")
layout.separator()
-
+
layout.prop(sc, "show_metadata")
-
+
layout.separator()
layout.menu("CLIP_MT_view_zoom")
diff --git a/release/scripts/startup/bl_ui/space_console.py b/release/scripts/startup/bl_ui/space_console.py
index 2db1b06c902..54a72cf59d0 100644
--- a/release/scripts/startup/bl_ui/space_console.py
+++ b/release/scripts/startup/bl_ui/space_console.py
@@ -125,10 +125,11 @@ class CONSOLE_MT_console(Menu):
layout.operator("console.autocomplete", text="Autocomplete")
+
class CONSOLE_MT_context_menu(Menu):
bl_label = "Console Context Menu"
- def draw(self, context):
+ def draw(self, _context):
layout = self.layout
layout.operator("console.clear")
diff --git a/release/scripts/startup/bl_ui/space_filebrowser.py b/release/scripts/startup/bl_ui/space_filebrowser.py
index b939586ff81..a322b96f9dd 100644
--- a/release/scripts/startup/bl_ui/space_filebrowser.py
+++ b/release/scripts/startup/bl_ui/space_filebrowser.py
@@ -33,59 +33,133 @@ class FILEBROWSER_HT_header(Header):
layout.template_header()
layout.menu("FILEBROWSER_MT_view")
+ layout.menu("FILEBROWSER_MT_select")
- row = layout.row(align=True)
- row.operator("file.previous", text="", icon='BACK')
- row.operator("file.next", text="", icon='FORWARD')
- row.operator("file.parent", text="", icon='FILE_PARENT')
- row.operator("file.refresh", text="", icon='FILE_REFRESH')
+ # can be None when save/reload with a file selector open
+
+ layout.separator_spacer()
+
+ layout.template_running_jobs()
- layout.operator_context = 'EXEC_DEFAULT'
- layout.operator("file.directory_new", icon='NEWFOLDER', text="")
- layout.operator_context = 'INVOKE_DEFAULT'
+class FILEBROWSER_PT_display(Panel):
+ bl_space_type = 'FILE_BROWSER'
+ bl_region_type = 'HEADER'
+ bl_label = "Display"
+ @classmethod
+ def poll(cls, context):
# can be None when save/reload with a file selector open
- if params:
- is_lib_browser = params.use_library_browsing
+ return context.space_data.params is not None
- layout.prop(params, "display_type", expand=True, text="")
- layout.prop(params, "sort_method", expand=True, text="")
- layout.prop(params, "show_hidden", text="", icon='FILE_HIDDEN')
+ def draw(self, context):
+ layout = self.layout
- layout.separator_spacer()
+ space = context.space_data
+ params = space.params
+ is_lib_browser = params.use_library_browsing
- layout.template_running_jobs()
+ layout.label(text="Display as")
+ layout.column().prop(params, "display_type", expand=True)
- if params:
- layout.prop(params, "use_filter", text="", icon='FILTER')
+ layout.use_property_split = True
+ layout.use_property_decorate = False # No animation.
- row = layout.row(align=True)
- row.active = params.use_filter
- row.prop(params, "use_filter_folder", text="")
+ if params.display_type == 'THUMBNAIL':
+ layout.prop(params, "display_size", text="Size")
+ else:
+ layout.prop(params, "show_details_size", text="Size")
+ layout.prop(params, "show_details_datetime", text="Date")
- if params.filter_glob:
- # if st.active_operator and hasattr(st.active_operator, "filter_glob"):
- # row.prop(params, "filter_glob", text="")
- row.label(text=params.filter_glob)
- else:
- row.prop(params, "use_filter_blender", text="")
- row.prop(params, "use_filter_backup", text="")
- row.prop(params, "use_filter_image", text="")
- row.prop(params, "use_filter_movie", text="")
- row.prop(params, "use_filter_script", text="")
- row.prop(params, "use_filter_font", text="")
- row.prop(params, "use_filter_sound", text="")
- row.prop(params, "use_filter_text", text="")
+ layout.prop(params, "recursion_level", text="Recursions")
+
+ layout.use_property_split = False
+ layout.separator()
+
+ layout.label(text="Sort by")
+ layout.column().prop(params, "sort_method", expand=True)
+ layout.prop(params, "use_sort_invert")
+
+
+class FILEBROWSER_PT_filter(Panel):
+ bl_space_type = 'FILE_BROWSER'
+ bl_region_type = 'HEADER'
+ bl_label = "Filter"
+
+ @classmethod
+ def poll(cls, context):
+ # can be None when save/reload with a file selector open
+ return context.space_data.params is not None
+
+ def draw(self, context):
+ layout = self.layout
+
+ space = context.space_data
+ params = space.params
+ is_lib_browser = params.use_library_browsing
- if is_lib_browser:
- row.prop(params, "use_filter_blendid", text="")
- if params.use_filter_blendid:
- row.separator()
- row.prop(params, "filter_id_category", text="")
+ row = layout.row(align=True)
+ row.prop(params, "use_filter", text="", toggle=0)
+ row.label(text="Filter")
- row.separator()
- row.prop(params, "filter_search", text="", icon='VIEWZOOM')
+ col = layout.column()
+ col.active = params.use_filter
+
+ row = col.row()
+ row.label(icon='FILE_FOLDER')
+ row.prop(params, "use_filter_folder", text="Folders", toggle=0)
+
+ if params.filter_glob:
+ col.label(text=params.filter_glob)
+ else:
+ row = col.row()
+ row.label(icon='FILE_BLEND')
+ row.prop(params, "use_filter_blender",
+ text=".blend Files", toggle=0)
+ row = col.row()
+ row.label(icon='FILE_BACKUP')
+ row.prop(params, "use_filter_backup",
+ text="Backup .blend Files", toggle=0)
+ row = col.row()
+ row.label(icon='FILE_IMAGE')
+ row.prop(params, "use_filter_image", text="Image Files", toggle=0)
+ row = col.row()
+ row.label(icon='FILE_MOVIE')
+ row.prop(params, "use_filter_movie", text="Movie Files", toggle=0)
+ row = col.row()
+ row.label(icon='FILE_SCRIPT')
+ row.prop(params, "use_filter_script",
+ text="Script Files", toggle=0)
+ row = col.row()
+ row.label(icon='FILE_FONT')
+ row.prop(params, "use_filter_font", text="Font Files", toggle=0)
+ row = col.row()
+ row.label(icon='FILE_SOUND')
+ row.prop(params, "use_filter_sound", text="Sound Files", toggle=0)
+ row = col.row()
+ row.label(icon='FILE_TEXT')
+ row.prop(params, "use_filter_text", text="Text Files", toggle=0)
+
+ col.separator()
+
+ if is_lib_browser:
+ row = col.row()
+ row.label(icon='BLANK1') # Indentation
+ row.prop(params, "use_filter_blendid",
+ text="Blender IDs", toggle=0)
+ if params.use_filter_blendid:
+ row = col.row()
+ row.label(icon='BLANK1') # Indentation
+ row.prop(params, "filter_id_category", text="")
+
+ col.separator()
+
+ layout.prop(params, "show_hidden")
+
+
+def panel_poll_is_upper_region(region):
+ # The upper region is left-aligned, the lower is split into it then. Note that after "Flip Regions" it's right-aligned.
+ return region.alignment in {'LEFT', 'RIGHT'}
class FILEBROWSER_UL_dir(UIList):
@@ -119,10 +193,13 @@ class FILEBROWSER_UL_dir(UIList):
class FILEBROWSER_PT_bookmarks_volumes(Panel):
bl_space_type = 'FILE_BROWSER'
bl_region_type = 'TOOLS'
- bl_options = {'DEFAULT_CLOSED'}
bl_category = "Bookmarks"
bl_label = "Volumes"
+ @classmethod
+ def poll(cls, context):
+ return panel_poll_is_upper_region(context.region)
+
def draw(self, context):
layout = self.layout
space = context.space_data
@@ -141,7 +218,7 @@ class FILEBROWSER_PT_bookmarks_system(Panel):
@classmethod
def poll(cls, context):
- return not context.preferences.filepaths.hide_system_bookmarks
+ return not context.preferences.filepaths.hide_system_bookmarks and panel_poll_is_upper_region(context.region)
def draw(self, context):
layout = self.layout
@@ -161,8 +238,10 @@ class FILEBROWSER_MT_bookmarks_context_menu(Menu):
layout.operator("file.bookmark_cleanup", icon='X', text="Cleanup")
layout.separator()
- layout.operator("file.bookmark_move", icon='TRIA_UP_BAR', text="Move To Top").direction = 'TOP'
- layout.operator("file.bookmark_move", icon='TRIA_DOWN_BAR', text="Move To Bottom").direction = 'BOTTOM'
+ layout.operator("file.bookmark_move", icon='TRIA_UP_BAR',
+ text="Move to Top").direction = 'TOP'
+ layout.operator("file.bookmark_move", icon='TRIA_DOWN_BAR',
+ text="Move to Bottom").direction = 'BOTTOM'
class FILEBROWSER_PT_bookmarks_favorites(Panel):
@@ -171,6 +250,10 @@ class FILEBROWSER_PT_bookmarks_favorites(Panel):
bl_category = "Bookmarks"
bl_label = "Favorites"
+ @classmethod
+ def poll(cls, context):
+ return panel_poll_is_upper_region(context.region)
+
def draw(self, context):
layout = self.layout
space = context.space_data
@@ -185,12 +268,15 @@ class FILEBROWSER_PT_bookmarks_favorites(Panel):
col = row.column(align=True)
col.operator("file.bookmark_add", icon='ADD', text="")
col.operator("file.bookmark_delete", icon='REMOVE', text="")
- col.menu("FILEBROWSER_MT_bookmarks_context_menu", icon='DOWNARROW_HLT', text="")
+ col.menu("FILEBROWSER_MT_bookmarks_context_menu",
+ icon='DOWNARROW_HLT', text="")
if num_rows > 1:
col.separator()
- col.operator("file.bookmark_move", icon='TRIA_UP', text="").direction = 'UP'
- col.operator("file.bookmark_move", icon='TRIA_DOWN', text="").direction = 'DOWN'
+ col.operator("file.bookmark_move", icon='TRIA_UP',
+ text="").direction = 'UP'
+ col.operator("file.bookmark_move", icon='TRIA_DOWN',
+ text="").direction = 'DOWN'
else:
layout.operator("file.bookmark_add", icon='ADD')
@@ -203,7 +289,7 @@ class FILEBROWSER_PT_bookmarks_recents(Panel):
@classmethod
def poll(cls, context):
- return not context.preferences.filepaths.hide_recent_locations
+ return not context.preferences.filepaths.hide_recent_locations and panel_poll_is_upper_region(context.region)
def draw(self, context):
layout = self.layout
@@ -227,7 +313,7 @@ class FILEBROWSER_PT_advanced_filter(Panel):
@classmethod
def poll(cls, context):
# only useful in append/link (library) context currently...
- return context.space_data.params.use_library_browsing
+ return context.space_data.params.use_library_browsing and panel_poll_is_upper_region(context.region)
def draw(self, context):
layout = self.layout
@@ -242,6 +328,87 @@ class FILEBROWSER_PT_advanced_filter(Panel):
col.prop(params, "filter_id")
+class FILEBROWSER_PT_directory_path(Panel):
+ bl_space_type = 'FILE_BROWSER'
+ bl_region_type = 'UI'
+ bl_label = "Directory Path"
+ bl_category = "Attributes"
+ bl_options = {'HIDE_HEADER'}
+
+ def is_header_visible(self, context):
+ for region in context.area.regions:
+ if region.type == 'HEADER' and region.height <= 1:
+ return False
+
+ return True
+
+ def is_option_region_visible(self, context, space):
+ if not space.active_operator:
+ return False
+
+ for region in context.area.regions:
+ if region.type == 'TOOL_PROPS' and region.width <= 1:
+ return False
+
+ return True
+
+ def draw(self, context):
+ layout = self.layout
+ space = context.space_data
+ params = space.params
+
+ layout.scale_x = 1.3
+ layout.scale_y = 1.3
+
+ row = layout.row()
+ flow = row.grid_flow(row_major=True, columns=0, even_columns=False, even_rows=False, align=False)
+
+ subrow = flow.row()
+
+ subsubrow = subrow.row(align=True)
+ subsubrow.operator("file.previous", text="", icon='BACK')
+ subsubrow.operator("file.next", text="", icon='FORWARD')
+ subsubrow.operator("file.parent", text="", icon='FILE_PARENT')
+ subsubrow.operator("file.refresh", text="", icon='FILE_REFRESH')
+
+ subsubrow = subrow.row()
+ subsubrow.operator_context = 'EXEC_DEFAULT'
+ subsubrow.operator("file.directory_new", icon='NEWFOLDER', text="")
+
+ subrow.template_file_select_path(params)
+
+ subrow = flow.row()
+
+ subsubrow = subrow.row()
+ subsubrow.scale_x = 0.6
+ subsubrow.prop(params, "filter_search", text="", icon='VIEWZOOM')
+
+ # Uses prop_with_popover() as popover() only adds the triangle icon in headers.
+ subrow.prop_with_popover(
+ params,
+ "display_type",
+ panel="FILEBROWSER_PT_display",
+ text="",
+ icon_only=True,
+ )
+ subrow.prop_with_popover(
+ params,
+ "display_type",
+ panel="FILEBROWSER_PT_filter",
+ text="",
+ icon='FILTER',
+ icon_only=True,
+ )
+
+ if space.active_operator:
+ subrow.operator(
+ "screen.region_toggle",
+ text="",
+ icon='PREFERENCES',
+ depress=self.is_option_region_visible(context, space)
+ ).region_type = 'TOOL_PROPS'
+
+
class FILEBROWSER_MT_view(Menu):
bl_label = "View"
@@ -250,7 +417,7 @@ class FILEBROWSER_MT_view(Menu):
st = context.space_data
params = st.params
- layout.prop(st, "show_region_toolbar")
+ layout.prop(st, "show_region_toolbar", text="Source List")
layout.prop(st, "show_region_ui", text="File Path")
layout.separator()
@@ -263,8 +430,64 @@ class FILEBROWSER_MT_view(Menu):
layout.menu("INFO_MT_area")
+class FILEBROWSER_MT_select(Menu):
+ bl_label = "Select"
+
+ def draw(self, context):
+ layout = self.layout
+ st = context.space_data
+
+ layout.operator("file.select_all", text="All").action = 'SELECT'
+ layout.operator("file.select_all", text="None").action = 'DESELECT'
+ layout.operator("file.select_all", text="Inverse").action = 'INVERT'
+
+ layout.separator()
+
+ layout.operator("file.select_box")
+
+
+class FILEBROWSER_MT_context_menu(Menu):
+ bl_label = "Files Context Menu"
+
+ def draw(self, context):
+ layout = self.layout
+ st = context.space_data
+ params = st.params
+
+ layout.operator("file.previous", text="Back")
+ layout.operator("file.next", text="Forward")
+ layout.operator("file.parent", text="Go to Parent")
+ layout.operator("file.refresh", text="Refresh")
+
+ layout.separator()
+
+ layout.operator("file.filenum", text="Increase Number",
+ icon='ADD').increment = 1
+ layout.operator("file.filenum", text="Decrease Number",
+ icon='REMOVE').increment = -1
+
+ layout.separator()
+
+ layout.operator("file.rename", text="Rename")
+ # layout.operator("file.delete")
+ sub = layout.row()
+ sub.operator_context = 'EXEC_DEFAULT'
+ sub.operator("file.directory_new", text="New Folder")
+ layout.operator("file.bookmark_add", text="Add Bookmark")
+
+ layout.separator()
+
+ layout.prop_menu_enum(params, "display_type")
+ if params.display_type == 'THUMBNAIL':
+ layout.prop_menu_enum(params, "display_size")
+ layout.prop_menu_enum(params, "recursion_level", text="Recursions")
+ layout.prop_menu_enum(params, "sort_method")
+
+
classes = (
FILEBROWSER_HT_header,
+ FILEBROWSER_PT_display,
+ FILEBROWSER_PT_filter,
FILEBROWSER_UL_dir,
FILEBROWSER_PT_bookmarks_volumes,
FILEBROWSER_PT_bookmarks_system,
@@ -272,7 +495,10 @@ classes = (
FILEBROWSER_PT_bookmarks_favorites,
FILEBROWSER_PT_bookmarks_recents,
FILEBROWSER_PT_advanced_filter,
+ FILEBROWSER_PT_directory_path,
FILEBROWSER_MT_view,
+ FILEBROWSER_MT_select,
+ FILEBROWSER_MT_context_menu,
)
if __name__ == "__main__": # only for live edit.
diff --git a/release/scripts/startup/bl_ui/space_image.py b/release/scripts/startup/bl_ui/space_image.py
index f24971347e1..aaa73b2c864 100644
--- a/release/scripts/startup/bl_ui/space_image.py
+++ b/release/scripts/startup/bl_ui/space_image.py
@@ -113,6 +113,8 @@ class IMAGE_MT_view(Menu):
layout.operator("image.view_all", text="Frame All")
layout.operator("image.view_all", text="Frame All Fit").fit_view = True
+ layout.operator("image.view_center_cursor", text="Center View to Cursor")
+
layout.separator()
if show_render:
@@ -238,6 +240,7 @@ class IMAGE_MT_image(Menu):
layout.separator()
layout.menu("IMAGE_MT_image_invert")
+ layout.operator("image.resize", text="Resize")
if ima and not show_render:
if ima.packed_file:
@@ -961,7 +964,6 @@ class IMAGE_PT_view_display_uv_edit_overlays(Panel):
col = layout.column()
col.prop(uvedit, "edge_display_type", text="Display As")
- col.prop(uvedit, "show_edges", text="Edges")
col.prop(uvedit, "show_faces", text="Faces")
col = layout.column()
diff --git a/release/scripts/startup/bl_ui/space_info.py b/release/scripts/startup/bl_ui/space_info.py
index eabf71365d5..82ed701aa4c 100644
--- a/release/scripts/startup/bl_ui/space_info.py
+++ b/release/scripts/startup/bl_ui/space_info.py
@@ -34,7 +34,7 @@ class INFO_MT_editor_menus(Menu):
bl_idname = "INFO_MT_editor_menus"
bl_label = ""
- def draw(self, context):
+ def draw(self, _context):
layout = self.layout
layout.menu("INFO_MT_view")
layout.menu("INFO_MT_info")
@@ -43,7 +43,7 @@ class INFO_MT_editor_menus(Menu):
class INFO_MT_view(Menu):
bl_label = "View"
- def draw(self, context):
+ def draw(self, _context):
layout = self.layout
layout.menu("INFO_MT_area")
@@ -52,7 +52,7 @@ class INFO_MT_view(Menu):
class INFO_MT_info(Menu):
bl_label = "Info"
- def draw(self, context):
+ def draw(self, _context):
layout = self.layout
layout.operator("info.select_all", text="Select All").action = 'SELECT'
@@ -107,12 +107,13 @@ class INFO_MT_area(Menu):
class INFO_MT_context_menu(Menu):
bl_label = "Info Context Menu"
- def draw(self, context):
+ def draw(self, _context):
layout = self.layout
layout.operator("info.report_copy", text="Copy")
layout.operator("info.report_delete", text="Delete")
+
classes = (
INFO_HT_header,
INFO_MT_editor_menus,
diff --git a/release/scripts/startup/bl_ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py
index d5f7f0ae498..a942b8769cf 100644
--- a/release/scripts/startup/bl_ui/space_sequencer.py
+++ b/release/scripts/startup/bl_ui/space_sequencer.py
@@ -187,7 +187,7 @@ class SEQUENCER_MT_range(Menu):
class SEQUENCER_MT_preview_zoom(Menu):
bl_label = "Fractional Zoom"
- def draw(self, context):
+ def draw(self, _context):
layout = self.layout
layout.operator_context = 'INVOKE_REGION_PREVIEW'
@@ -502,6 +502,10 @@ class SEQUENCER_MT_add(Menu):
col.menu("SEQUENCER_MT_add_transitions", icon='ARROW_LEFTRIGHT')
col.enabled = selected_sequences_len(context) >= 2
+ col = layout.column()
+ col.operator_menu_enum("sequencer.fades_add", "type", text="Fade", icon="IPO_EASE_IN_OUT")
+ col.enabled = selected_sequences_len(context) >= 1
+
class SEQUENCER_MT_add_empty(Menu):
bl_label = "Empty"
@@ -749,26 +753,33 @@ class SEQUENCER_MT_context_menu(Menu):
layout.operator("sequencer.gap_remove").all = False
layout.operator("sequencer.gap_insert")
+ layout.separator()
+
strip = act_strip(context)
if strip:
strip_type = strip.type
+ selected_sequences_count = selected_sequences_len(context)
if strip_type != 'SOUND':
-
layout.separator()
layout.operator_menu_enum("sequencer.strip_modifier_add", "type", text="Add Modifier")
layout.operator("sequencer.strip_modifier_copy", text="Copy Modifiers to Selection")
- if selected_sequences_len(context) >= 2:
+ if selected_sequences_count >= 2:
layout.separator()
col = layout.column()
col.menu("SEQUENCER_MT_add_transitions", text="Add Transition")
- elif selected_sequences_len(context) >= 2:
+ elif selected_sequences_count >= 2:
layout.separator()
layout.operator("sequencer.crossfade_sounds", text="Crossfade Sounds")
+ if selected_sequences_count >= 1:
+ col = layout.column()
+ col.operator_menu_enum("sequencer.fades_add", "type", text="Fade")
+ layout.operator("sequencer.fades_clear", text="Clear Fade")
+
if strip_type in {
'CROSS', 'ADD', 'SUBTRACT', 'ALPHA_OVER', 'ALPHA_UNDER',
'GAMMA_CROSS', 'MULTIPLY', 'OVER_DROP', 'WIPE', 'GLOW',
@@ -1467,7 +1478,7 @@ class SEQUENCER_PT_time(SequencerButtonsPanel, Panel):
split.alignment = 'RIGHT'
split.label(text="End")
split = split.split(factor=0.8 + max_factor, align=True)
- split.label(text="{:>14}".format(smpte_from_frame(frame_final_end) + ":"))
+ split.label(text="{:>14}".format(smpte_from_frame(frame_final_end)))
split.alignment = 'RIGHT'
split.label(text=str(frame_final_end) + " ")
@@ -1511,7 +1522,7 @@ class SEQUENCER_PT_time(SequencerButtonsPanel, Panel):
split.label(text="Playhead")
split = split.split(factor=0.8 + max_factor, align=True)
playhead = frame_current - frame_final_start
- split.label(text="{:>14}".format(smpte_from_frame(playhead) + ":"))
+ split.label(text="{:>14}".format(smpte_from_frame(playhead)))
split.alignment = 'RIGHT'
split.label(text=str(playhead) + " ")
@@ -1560,10 +1571,13 @@ class SEQUENCER_PT_adjust_sound(SequencerButtonsPanel, Panel):
col.prop(strip, "volume", text="Volume")
col.prop(strip, "pitch")
+
+ col = layout.column()
col.prop(strip, "pan")
+ col.enabled = sound is not None and sound.use_mono
if sound is not None:
-
+ col = layout.column()
if st.waveform_display_type == 'DEFAULT_WAVEFORMS':
col.prop(strip, "show_waveform")
col.prop(sound, "use_mono")
@@ -1678,7 +1692,7 @@ class SEQUENCER_PT_adjust_video(SequencerButtonsPanel, Panel):
col.prop(strip, "undistort")
col.separator()
- col.prop(strip, "playback_direction")
+ col.prop(strip, "use_reverse_frames")
class SEQUENCER_PT_adjust_color(SequencerButtonsPanel, Panel):
@@ -1880,7 +1894,7 @@ class SEQUENCER_PT_preview(SequencerButtonsPanel_Output, Panel):
col = layout.column()
col.prop(render, "sequencer_gl_preview", text="Preview Shading")
- if render.sequencer_gl_preview in ['SOLID', 'WIREFRAME']:
+ if render.sequencer_gl_preview in {'SOLID', 'WIREFRAME'}:
col.prop(render, "use_sequencer_override_scene_strip")
@@ -1894,6 +1908,7 @@ class SEQUENCER_PT_view(SequencerButtonsPanel_Output, Panel):
layout.use_property_decorate = False
st = context.space_data
+ ed = context.scene.sequence_editor
col = layout.column()
col.prop(st, "display_channel", text="Channel")
@@ -1905,6 +1920,7 @@ class SEQUENCER_PT_view(SequencerButtonsPanel_Output, Panel):
col.prop(st, "show_separate_color")
col.prop(st, "proxy_render_size")
+ col.prop(ed, "use_prefetch")
class SEQUENCER_PT_frame_overlay(SequencerButtonsPanel_Output, Panel):
diff --git a/release/scripts/startup/bl_ui/space_time.py b/release/scripts/startup/bl_ui/space_time.py
index 500f889eea9..04a904edde3 100644
--- a/release/scripts/startup/bl_ui/space_time.py
+++ b/release/scripts/startup/bl_ui/space_time.py
@@ -48,26 +48,27 @@ class TIME_HT_editor_buttons(Header):
# hide the play-reversed button
# since JACK transport doesn't support reversed playback
if scene.sync_mode == 'AUDIO_SYNC' and context.preferences.system.audio_device == 'JACK':
- sub = row.row(align=True)
- sub.scale_x = 1.4
- sub.operator("screen.animation_play", text="", icon='PLAY')
+ row.scale_x = 2
+ row.operator("screen.animation_play", text="", icon='PLAY')
+ row.scale_x = 1
else:
row.operator("screen.animation_play", text="", icon='PLAY_REVERSE').reverse = True
row.operator("screen.animation_play", text="", icon='PLAY')
else:
- sub = row.row(align=True)
- sub.scale_x = 1.4
- sub.operator("screen.animation_play", text="", icon='PAUSE')
+ row.scale_x = 2
+ row.operator("screen.animation_play", text="", icon='PAUSE')
+ row.scale_x = 1
row.operator("screen.keyframe_jump", text="", icon='NEXT_KEYFRAME').next = True
row.operator("screen.frame_jump", text="", icon='FF').end = True
layout.separator_spacer()
row = layout.row()
- row.scale_x = 0.95
if scene.show_subframe:
+ row.scale_x = 1.15
row.prop(scene, "frame_float", text="")
else:
+ row.scale_x = 0.95
row.prop(scene, "frame_current", text="")
row = layout.row(align=True)
diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
index fabf8abaeab..aa5be13c01b 100644
--- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py
@@ -48,6 +48,7 @@ def generate_from_enum_ex(
icon_prefix,
type,
attr,
+ cursor='DEFAULT',
tooldef_keywords={},
):
tool_defs = []
@@ -60,6 +61,7 @@ def generate_from_enum_ex(
idname=idname_prefix + name,
label=name,
icon=icon_prefix + idname.lower(),
+ cursor=cursor,
data_block=idname,
**tooldef_keywords,
)
@@ -199,7 +201,7 @@ class _defs_annotate:
idname="builtin.annotate_line",
label="Annotate Line",
icon="ops.gpencil.draw.line",
- cursor='CROSSHAIR',
+ cursor='PAINT_BRUSH',
keymap="Generic Tool: Annotate Line",
draw_settings=draw_settings,
)
@@ -210,7 +212,7 @@ class _defs_annotate:
idname="builtin.annotate_polygon",
label="Annotate Polygon",
icon="ops.gpencil.draw.poly",
- cursor='CROSSHAIR',
+ cursor='PAINT_BRUSH',
keymap="Generic Tool: Annotate Polygon",
draw_settings=draw_settings,
)
@@ -225,7 +227,7 @@ class _defs_annotate:
idname="builtin.annotate_eraser",
label="Annotate Eraser",
icon="ops.gpencil.draw.eraser",
- cursor='CROSSHAIR', # XXX: Always show brush circle when enabled
+ cursor='ERASER',
keymap="Generic Tool: Annotate Eraser",
draw_settings=draw_settings,
)
@@ -324,10 +326,10 @@ class _defs_view3d_select:
pass
return dict(
idname="builtin.select",
- label="Select",
+ label="Tweak",
icon="ops.generic.select",
widget=None,
- keymap="3D View Tool: Select",
+ keymap="3D View Tool: Tweak",
draw_settings=draw_settings,
)
@@ -490,12 +492,17 @@ class _defs_edit_mesh:
@ToolDef.from_fn
def poly_build():
+ def draw_settings(_context, layout, tool):
+ props = tool.operator_properties("mesh.polybuild_face_at_cursor_move")
+ props_macro = props.MESH_OT_polybuild_face_at_cursor
+ layout.prop(props_macro, "create_quads")
return dict(
idname="builtin.poly_build",
label="Poly Build",
icon="ops.mesh.polybuild_hover",
widget="VIEW3D_GGT_mesh_preselect_elem",
keymap=(),
+ draw_settings=draw_settings,
)
@ToolDef.from_fn
@@ -719,8 +726,6 @@ class _defs_edit_mesh:
def shear():
def draw_settings(context, layout, tool):
props = tool.operator_properties("transform.shear")
- layout.label(text="View Axis:")
- layout.prop(props, "shear_axis", expand=True)
_template_widget.VIEW3D_GGT_xform_gizmo.draw_settings_with_index(context, layout, 2)
return dict(
idname="builtin.shear",
@@ -982,6 +987,23 @@ class _defs_sculpt:
keymap=(),
)
+ @ToolDef.from_fn
+ def mesh_filter():
+ def draw_settings(_context, layout, tool):
+ props = tool.operator_properties("sculpt.mesh_filter")
+ layout.prop(props, "type", expand=False)
+ layout.prop(props, "strength")
+ layout.prop(props, "deform_axis")
+
+ return dict(
+ idname="builtin.mesh_filter",
+ label="Mesh Filter",
+ icon="ops.sculpt.mesh_filter",
+ widget=None,
+ keymap=(),
+ draw_settings=draw_settings,
+ )
+
class _defs_vertex_paint:
@@ -1189,7 +1211,7 @@ class _defs_image_uv_select:
pass
return dict(
idname="builtin.select",
- label="Select",
+ label="Tweak",
icon="ops.generic.select",
widget=None,
keymap=(),
@@ -1298,6 +1320,7 @@ class _defs_gpencil_paint:
icon_prefix="brush.gpencil_draw.",
type=bpy.types.Brush,
attr="gpencil_tool",
+ cursor='PAINT_CROSS',
tooldef_keywords=dict(
operator="gpencil.draw",
),
@@ -1387,7 +1410,7 @@ class _defs_gpencil_edit:
layout.prop(context.tool_settings.gpencil_sculpt, "intersection_threshold")
return dict(
idname="builtin.select",
- label="Select",
+ label="Tweak",
icon="ops.generic.select",
widget=None,
keymap=(),
@@ -1552,10 +1575,10 @@ class _defs_node_select:
pass
return dict(
idname="builtin.select",
- label="Select",
+ label="Tweak",
icon="ops.generic.select",
widget=None,
- keymap="Node Tool: Select",
+ keymap="Node Tool: Tweak",
draw_settings=draw_settings,
)
@@ -1964,6 +1987,13 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel):
),
_defs_sculpt.hide_border,
None,
+ _defs_sculpt.mesh_filter,
+ None,
+ _defs_transform.translate,
+ _defs_transform.rotate,
+ _defs_transform.scale,
+ _defs_transform.transform,
+ None,
*_tools_annotate,
],
'PAINT_TEXTURE': [
diff --git a/release/scripts/startup/bl_ui/space_topbar.py b/release/scripts/startup/bl_ui/space_topbar.py
index d0ad9a8f31e..fef0e095099 100644
--- a/release/scripts/startup/bl_ui/space_topbar.py
+++ b/release/scripts/startup/bl_ui/space_topbar.py
@@ -349,7 +349,7 @@ class TOPBAR_MT_app_about(Menu):
layout.separator()
layout.operator("wm.url_open_preset", text="Blender Website", icon='URL').type = 'BLENDER'
- layout.operator("wm.url_open", text="Credits", icon='URL').type = 'CREDITS'
+ layout.operator("wm.url_open_preset", text="Credits", icon='URL').type = 'CREDITS'
layout.separator()
@@ -465,7 +465,6 @@ class TOPBAR_MT_render(Menu):
layout.operator("render.view_show", text="View Render")
layout.operator("render.play_rendered_anim", text="View Animation")
- layout.prop_menu_enum(rd, "display_mode", text="Display Mode")
layout.separator()
@@ -505,6 +504,8 @@ class TOPBAR_MT_edit(Menu):
props.name = "TOPBAR_PT_name"
props.keep_open = False
+ layout.operator("wm.batch_rename")
+
layout.separator()
# Should move elsewhere (impacts outliner & 3D view).
@@ -561,7 +562,7 @@ class TOPBAR_MT_help(Menu):
show_developer = context.preferences.view.show_developer_ui
- layout.operator("wm.url_open_preset", text="Manual", icon='HELP',).type = 'MANUAL'
+ layout.operator("wm.url_open_preset", text="Manual", icon='HELP').type = 'MANUAL'
layout.operator(
"wm.url_open", text="Tutorials", icon='URL',
diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py
index 8ed8eb04898..be41fb52118 100644
--- a/release/scripts/startup/bl_ui/space_userpref.py
+++ b/release/scripts/startup/bl_ui/space_userpref.py
@@ -265,6 +265,26 @@ class USERPREF_PT_interface_editors(PreferencePanel, Panel):
flow.prop(view, "factor_display_type")
+class USERPREF_PT_interface_temporary_windows(PreferencePanel, Panel):
+ bl_label = "Temporary Windows"
+ bl_parent_id = "USERPREF_PT_interface_editors"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, context):
+ prefs = context.preferences
+ return (prefs.active_section == 'INTERFACE')
+
+ def draw_props(self, context, layout):
+ prefs = context.preferences
+ view = prefs.view
+
+ flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
+
+ flow.prop(view, "render_display_type", text="Render in")
+ flow.prop(view, "filebrowser_display_type", text="File Browser")
+
+
class USERPREF_PT_interface_menus(Panel):
bl_space_type = 'PREFERENCES'
bl_region_type = 'WINDOW'
@@ -814,26 +834,21 @@ class PreferenceThemeWidgetColorPanel:
layout.use_property_split = True
- flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
+ flow = layout.grid_flow(row_major=False, columns=2, even_columns=True, even_rows=False, align=False)
- col = flow.column()
- col.prop(widget_style, "outline")
+ col = flow.column(align=True)
+ col.prop(widget_style, "text")
+ col.prop(widget_style, "text_sel", text="Selected")
col.prop(widget_style, "item", slider=True)
- col.prop(widget_style, "inner", slider=True)
- col.prop(widget_style, "inner_sel", slider=True)
- col = flow.column()
- col.prop(widget_style, "text")
- col.prop(widget_style, "text_sel")
- col.prop(widget_style, "roundness")
+ col = flow.column(align=True)
+ col.prop(widget_style, "inner", slider=True)
+ col.prop(widget_style, "inner_sel", text="Selected", slider=True)
+ col.prop(widget_style, "outline")
- col = flow.column()
- col.prop(widget_style, "show_shaded")
+ col.separator()
- colsub = col.column()
- colsub.active = widget_style.show_shaded
- colsub.prop(widget_style, "shadetop")
- colsub.prop(widget_style, "shadedown")
+ col.prop(widget_style, "roundness")
@classmethod
def poll(cls, context):
@@ -841,6 +856,31 @@ class PreferenceThemeWidgetColorPanel:
return (prefs.active_section == 'THEMES')
+class PreferenceThemeWidgetShadePanel:
+ bl_space_type = 'PREFERENCES'
+ bl_region_type = 'WINDOW'
+
+ def draw(self, context):
+ theme = context.preferences.themes[0]
+ ui = theme.user_interface
+ widget_style = getattr(ui, self.wcol)
+ layout = self.layout
+
+ layout.use_property_split = True
+
+ col = layout.column(align=True)
+ col.active = widget_style.show_shaded
+ col.prop(widget_style, "shadetop", text="Shade Top")
+ col.prop(widget_style, "shadedown", text="Down")
+
+ def draw_header(self, context):
+ theme = context.preferences.themes[0]
+ ui = theme.user_interface
+ widget_style = getattr(ui, self.wcol)
+
+ self.layout.prop(widget_style, "show_shaded", text="")
+
+
class USERPREF_PT_theme_interface_state(PreferencePanel, Panel):
bl_label = "State"
bl_options = {'DEFAULT_CLOSED'}
@@ -937,6 +977,7 @@ class USERPREF_PT_theme_interface_icons(PreferencePanel, Panel):
flow.prop(ui, "icon_object_data")
flow.prop(ui, "icon_modifier")
flow.prop(ui, "icon_shading")
+ flow.prop(ui, "icon_folder")
flow.prop(ui, "icon_border_intensity")
@@ -1136,6 +1177,15 @@ class ThemeGenericClassGenerator():
"wcol": wcol,
})
+ panel_shade_id = "USERPREF_PT_theme_interface_shade_" + wcol
+ yield type(panel_shade_id, (PreferenceThemeWidgetShadePanel, Panel), {
+ "bl_label": "Shaded",
+ "bl_options": {'DEFAULT_CLOSED'},
+ "bl_parent_id": panel_id,
+ "draw": PreferenceThemeWidgetShadePanel.draw,
+ "wcol": wcol,
+ })
+
@staticmethod
def generate_theme_area_child_panel_classes(parent_id, rna_type, theme_area, datapath):
def generate_child_panel_classes_recurse(parent_id, rna_type, theme_area, datapath):
@@ -1355,7 +1405,6 @@ class USERPREF_PT_saveload_file_browser(PreferencePanel, Panel):
flow.prop(paths, "show_hidden_files_datablocks")
flow.prop(paths, "hide_recent_locations")
flow.prop(paths, "hide_system_bookmarks")
- flow.prop(paths, "show_thumbnails")
class USERPREF_MT_ndof_settings(Menu):
@@ -2089,6 +2138,7 @@ classes = (
USERPREF_PT_interface_display,
USERPREF_PT_interface_editors,
+ USERPREF_PT_interface_temporary_windows,
USERPREF_PT_interface_translation,
USERPREF_PT_interface_text,
USERPREF_PT_interface_menus,
diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index b684e4aa2dd..aca8ea701ce 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -129,6 +129,8 @@ class VIEW3D_HT_tool_header(Header):
if mode_string == 'EDIT_MESH':
_row, sub = row_for_mirror()
sub.prop(context.object.data, "use_mirror_x", text="X", toggle=True)
+ sub.prop(context.object.data, "use_mirror_y", text="Y", toggle=True)
+ sub.prop(context.object.data, "use_mirror_z", text="Z", toggle=True)
tool_settings = context.tool_settings
layout.prop(tool_settings, "use_mesh_automerge", text="")
elif mode_string == 'EDIT_ARMATURE':
@@ -139,7 +141,10 @@ class VIEW3D_HT_tool_header(Header):
sub.prop(context.object.pose, "use_mirror_x", text="X", toggle=True)
elif mode_string == 'PAINT_WEIGHT':
row, sub = row_for_mirror()
- sub.prop(context.object.data, "use_mirror_x", text="X", toggle=True)
+ wpaint = context.tool_settings.weight_paint
+ sub.prop(wpaint, "use_symmetry_x", text="X", toggle=True)
+ sub.prop(wpaint, "use_symmetry_y", text="Y", toggle=True)
+ sub.prop(wpaint, "use_symmetry_z", text="Z", toggle=True)
row.popover(panel="VIEW3D_PT_tools_weightpaint_symmetry_for_topbar", text="")
elif mode_string == 'SCULPT':
row, sub = row_for_mirror()
@@ -605,7 +610,7 @@ class VIEW3D_HT_header(Header):
row.prop(tool_settings, "gpencil_selectmode_edit", text="", expand=True)
# Select mode for Sculpt
- if gpd.is_stroke_sculpt_mode :
+ if gpd.is_stroke_sculpt_mode:
row = layout.row(align=True)
row.prop(tool_settings, "use_gpencil_select_mask_point", text="")
row.prop(tool_settings, "use_gpencil_select_mask_stroke", text="")
@@ -2100,6 +2105,9 @@ class VIEW3D_MT_object_relations(Menu):
layout.operator("object.proxy_make", text="Make Proxy...")
+ if bpy.app.use_override_library:
+ layout.operator("object.make_override_library", text="Make Library Override...")
+
layout.operator("object.make_dupli_face")
layout.separator()
@@ -2215,7 +2223,7 @@ class VIEW3D_MT_object_rigid_body(Menu):
layout.operator("rigidbody.mass_calculate", text="Calculate Mass")
layout.operator("rigidbody.object_settings_copy", text="Copy from Active")
layout.operator("object.visual_transform_apply", text="Apply Transformation")
- layout.operator("rigidbody.bake_to_keyframes", text="Bake To Keyframes")
+ layout.operator("rigidbody.bake_to_keyframes", text="Bake to Keyframes")
layout.separator()
@@ -2330,6 +2338,7 @@ class VIEW3D_MT_object_context_menu(Menu):
layout.separator()
layout.operator("object.convert", text="Convert to Mesh").target = 'MESH'
+ layout.operator("object.convert", text="Convert to Grease Pencil").target = 'GPENCIL'
layout.operator_menu_enum("object.origin_set", text="Set Origin", property="type")
layout.separator()
@@ -2359,10 +2368,10 @@ class VIEW3D_MT_object_context_menu(Menu):
layout.operator_context = 'INVOKE_REGION_WIN'
- props = layout.operator("wm.context_modal_mouse", text="Energy")
+ props = layout.operator("wm.context_modal_mouse", text="Power")
props.data_path_iter = "selected_editable_objects"
props.data_path_item = "data.energy"
- props.header_text = "Light Energy: %.3f"
+ props.header_text = "Light Power: %.3f"
if light.type == 'AREA':
props = layout.operator("wm.context_modal_mouse", text="Size X")
@@ -2650,7 +2659,6 @@ class VIEW3D_MT_make_links(Menu):
layout.operator("object.join_uvs") # stupid place to add this!
-
class VIEW3D_MT_brush_paint_modes(Menu):
bl_label = "Enabled Modes"
@@ -2807,7 +2815,7 @@ class VIEW3D_MT_paint_weight(Menu):
class VIEW3D_MT_sculpt(Menu):
bl_label = "Sculpt"
- def draw(self, context):
+ def draw(self, _context):
layout = self.layout
props = layout.operator("paint.hide_show", text="Show All")
@@ -2823,6 +2831,7 @@ class VIEW3D_MT_sculpt(Menu):
props.area = 'INSIDE'
props = layout.operator("paint.hide_show", text="Hide Masked")
+ props.action = 'HIDE'
props.area = 'MASKED'
layout.separator()
@@ -2841,6 +2850,79 @@ class VIEW3D_MT_sculpt(Menu):
props = layout.operator("view3d.select_box", text="Box Mask")
props = layout.operator("paint.mask_lasso_gesture", text="Lasso Mask")
+ layout.separator()
+
+ props = layout.operator("sculpt.mask_filter", text='Smooth Mask')
+ props.filter_type = 'SMOOTH'
+ props.auto_iteration_count = True
+
+ props = layout.operator("sculpt.mask_filter", text='Sharpen Mask')
+ props.filter_type = 'SHARPEN'
+ props.auto_iteration_count = True
+
+ props = layout.operator("sculpt.mask_filter", text='Grow Mask')
+ props.filter_type = 'GROW'
+ props.auto_iteration_count = True
+
+ props = layout.operator("sculpt.mask_filter", text='Shrink Mask')
+ props.filter_type = 'SHRINK'
+ props.auto_iteration_count = True
+
+ props = layout.operator("sculpt.mask_filter", text='Increase Contrast')
+ props.filter_type = 'CONTRAST_INCREASE'
+ props.auto_iteration_count = False
+
+ props = layout.operator("sculpt.mask_filter", text='Decrease Contrast')
+ props.filter_type = 'CONTRAST_DECREASE'
+ props.auto_iteration_count = False
+
+ layout.separator()
+
+ props = layout.operator("sculpt.mask_expand", text="Expand Mask By Topology")
+ props.use_normals = False
+ props.keep_previous_mask = False
+ props.invert = True
+ props.smooth_iterations = 2
+
+ props = layout.operator("sculpt.mask_expand", text="Expand Mask By Curvature")
+ props.use_normals = True
+ props.keep_previous_mask = True
+ props.invert = False
+ props.smooth_iterations = 0
+
+ layout.separator()
+
+ props = layout.operator("mesh.paint_mask_extract", text="Mask Extract")
+
+ layout.separator()
+
+ props = layout.operator("sculpt.dirty_mask", text='Dirty Mask')
+
+ layout.separator()
+ layout.menu("VIEW3D_MT_sculpt_set_pivot", text="Set Pivot")
+
+
+class VIEW3D_MT_sculpt_set_pivot(Menu):
+ bl_label = "Sculpt Set Pivot"
+
+ def draw(self, context):
+ layout = self.layout
+
+ props = layout.operator("sculpt.set_pivot_position", text="Pivot to Origin")
+ props.mode = 'ORIGIN'
+
+ props = layout.operator("sculpt.set_pivot_position", text="Pivot to Unmasked")
+ props.mode = 'UNMASKED'
+
+ props = layout.operator("sculpt.set_pivot_position", text="Pivot to Mask Border")
+ props.mode = 'BORDER'
+
+ props = layout.operator("sculpt.set_pivot_position", text="Pivot to Active Vertex")
+ props.mode = 'ACTIVE'
+
+ props = layout.operator("sculpt.set_pivot_position", text="Pivot to Surface Under Cursor")
+ props.mode = 'SURFACE'
+
class VIEW3D_MT_particle(Menu):
bl_label = "Particle"
@@ -3189,7 +3271,7 @@ class BoneOptions:
"use_deform",
"use_envelope_multiply",
"use_inherit_rotation",
- "use_inherit_scale",
+ "inherit_scale",
]
if context.mode == 'EDIT_ARMATURE':
@@ -3384,9 +3466,11 @@ class VIEW3D_MT_edit_mesh_context_menu(Menu):
col.operator("mesh.loopcut_slide")
col.operator("mesh.offset_edge_loops_slide")
+
+ col.separator()
+
col.operator("mesh.knife_tool")
col.operator("mesh.bisect")
- col.operator("mesh.bridge_edge_loops", text="Bridge Edge Loops")
col.separator()
@@ -3933,7 +4017,9 @@ class VIEW3D_MT_edit_gpencil_delete(Menu):
layout.separator()
- layout.operator("gpencil.active_frames_delete_all")
+ layout.operator("gpencil.delete", text="Delete Active Keyframe (Active Layer)").type = 'FRAME'
+ layout.operator("gpencil.active_frames_delete_all", text="Delete Active Keyframes (All Layers)")
+
# Edit Curve
# draw_curve is used by VIEW3D_MT_edit_curve and VIEW3D_MT_edit_surface
@@ -4368,7 +4454,7 @@ class VIEW3D_MT_edit_armature_delete(Menu):
layout.operator("armature.dissolve", text="Dissolve Bones")
-# ********** Grease Pencil Stroke menus **********
+# ********** Grease Pencil menus **********
class VIEW3D_MT_gpencil_autoweights(Menu):
bl_label = "Generate Weights"
@@ -4389,7 +4475,7 @@ class VIEW3D_MT_gpencil_simplify(Menu):
class VIEW3D_MT_paint_gpencil(Menu):
- bl_label = "Strokes"
+ bl_label = "Draw"
def draw(self, _context):
@@ -4400,8 +4486,8 @@ class VIEW3D_MT_paint_gpencil(Menu):
layout.separator()
- layout.operator("gpencil.delete", text="Delete Frame").type = 'FRAME'
- layout.operator("gpencil.active_frames_delete_all")
+ layout.menu("VIEW3D_MT_edit_gpencil_showhide")
+ layout.menu("GPENCIL_MT_cleanup")
class VIEW3D_MT_assign_material(Menu):
@@ -4460,8 +4546,8 @@ class VIEW3D_MT_edit_gpencil(Menu):
layout.operator("gpencil.duplicate_move", text="Duplicate")
layout.operator("gpencil.stroke_split", text="Split")
layout.operator("gpencil.copy", text="Copy", icon='COPYDOWN')
- layout.operator("gpencil.paste", text="Paste", icon='PASTEDOWN').type = 'COPY'
- layout.operator("gpencil.paste", text="Paste & Merge").type = 'MERGE'
+ layout.operator("gpencil.paste", text="Paste", icon='PASTEDOWN').type = 'ACTIVE'
+ layout.operator("gpencil.paste", text="Paste by Layer").type = 'LAYER'
layout.separator()
@@ -4492,13 +4578,14 @@ class VIEW3D_MT_edit_gpencil_stroke(Menu):
layout.separator()
- layout.operator_menu_enum("gpencil.stroke_join", "type", text="Join...")
+ layout.operator_menu_enum("gpencil.stroke_join", "type", text="Join")
layout.separator()
- layout.operator_menu_enum("gpencil.move_to_layer", "layer", text="Move to Layer")
+ layout.menu("GPENCIL_MT_move_to_layer")
layout.menu("VIEW3D_MT_assign_material")
- layout.operator_menu_enum("gpencil.stroke_arrange", "direction", text="Arrange Strokes...")
+ layout.operator("gpencil.set_active_material", text="Set as Active Material")
+ layout.operator_menu_enum("gpencil.stroke_arrange", "direction", text="Arrange Strokes")
layout.separator()
@@ -4507,7 +4594,7 @@ class VIEW3D_MT_edit_gpencil_stroke(Menu):
op.type = 'CLOSE'
op.geometry = True
layout.operator("gpencil.stroke_cyclical_set", text="Toggle Cyclic").type = 'TOGGLE'
- layout.operator_menu_enum("gpencil.stroke_caps_set", text="Toggle Caps...", property="type")
+ layout.operator_menu_enum("gpencil.stroke_caps_set", text="Toggle Caps", property="type")
layout.operator("gpencil.stroke_flip", text="Switch Direction")
@@ -4564,17 +4651,18 @@ class VIEW3D_MT_gpencil_animation(Menu):
def draw(self, _context):
layout = self.layout
- layout.operator("gpencil.blank_frame_add")
+ layout.operator("gpencil.blank_frame_add", text="Insert Blank Keyframe (Active Layer)")
+ layout.operator("gpencil.blank_frame_add", text="Insert Blank Keyframe (All Layers)").all_layers = True
layout.separator()
- layout.operator("gpencil.frame_duplicate", text="Duplicate Active Frame")
- layout.operator("gpencil.frame_duplicate", text="Duplicate All Layers").mode = 'ALL'
+ layout.operator("gpencil.frame_duplicate", text="Duplicate Active Keyframe (Active Layer)")
+ layout.operator("gpencil.frame_duplicate", text="Duplicate Active Keyframe (All Layers)").mode = 'ALL'
layout.separator()
- layout.operator("gpencil.delete", text="Delete Active Frame").type = 'FRAME'
- layout.operator("gpencil.active_frames_delete_all", text="Delete All Active Frames")
+ layout.operator("gpencil.delete", text="Delete Active Keyframe (Active Layer)").type = 'FRAME'
+ layout.operator("gpencil.active_frames_delete_all", text="Delete Active Keyframes (All Layers)")
class VIEW3D_MT_edit_gpencil_transform(Menu):
@@ -4595,18 +4683,19 @@ class VIEW3D_MT_edit_gpencil_transform(Menu):
layout.operator("transform.transform", text="Shrink Fatten").mode = 'GPENCIL_SHRINKFATTEN'
- layout.operator("gpencil.interpolate", text="Interpolate")
- layout.operator("gpencil.interpolate_sequence", text="Sequence")
-
class VIEW3D_MT_edit_gpencil_showhide(Menu):
bl_label = "Show/hide"
def draw(self, _context):
layout = self.layout
- layout.operator("gpencil.hide", text="Hide Active Layer")
layout.operator("gpencil.reveal", text="Show All Layers")
+ layout.separator()
+
+ layout.operator("gpencil.hide", text="Hide Active Layer").unselected = False
+ layout.operator("gpencil.hide", text="Hide Inactive Layers").unselected = True
+
class VIEW3D_MT_edit_gpencil_interpolate(Menu):
bl_label = "Interpolate"
@@ -4775,6 +4864,37 @@ class VIEW3D_MT_proportional_editing_falloff_pie(Menu):
pie.prop(tool_settings, "proportional_edit_falloff", expand=True)
+class VIEW3D_MT_sculpt_mask_edit_pie(Menu):
+ bl_label = "Mask Edit"
+
+ def draw(self, _context):
+ layout = self.layout
+ pie = layout.menu_pie()
+
+ op = pie.operator("paint.mask_flood_fill", text='Invert Mask')
+ op.mode = 'INVERT'
+ op = pie.operator("paint.mask_flood_fill", text='Clear Mask')
+ op.mode = 'VALUE'
+ op = pie.operator("sculpt.mask_filter", text='Smooth Mask')
+ op.filter_type = 'SMOOTH'
+ op.auto_iteration_count = True
+ op = pie.operator("sculpt.mask_filter", text='Sharpen Mask')
+ op.filter_type = 'SHARPEN'
+ op.auto_iteration_count = True
+ op = pie.operator("sculpt.mask_filter", text='Grow Mask')
+ op.filter_type = 'GROW'
+ op.auto_iteration_count = True
+ op = pie.operator("sculpt.mask_filter", text='Shrink Mask')
+ op.filter_type = 'SHRINK'
+ op.auto_iteration_count = True
+ op = pie.operator("sculpt.mask_filter", text='Increase Contrast')
+ op.filter_type = 'CONTRAST_INCREASE'
+ op.auto_iteration_count = False
+ op = pie.operator("sculpt.mask_filter", text='Decrease Contrast')
+ op.filter_type = 'CONTRAST_DECREASE'
+ op.auto_iteration_count = False
+
+
# ********** Panel **********
@@ -4910,7 +5030,7 @@ class VIEW3D_PT_collections(Panel):
bl_label = "Collections"
bl_options = {'DEFAULT_CLOSED'}
- def _draw_collection(self, layout, view_layer, collection, index):
+ def _draw_collection(self, layout, view_layer, use_local_collections, collection, index):
need_separator = index
for child in collection.children:
index += 1
@@ -4936,6 +5056,7 @@ class VIEW3D_PT_collections(Panel):
pass
row = layout.row()
+ row.use_property_decorate = False
sub = row.split(factor=0.98)
subrow = sub.row()
subrow.alignment = 'LEFT'
@@ -4946,11 +5067,21 @@ class VIEW3D_PT_collections(Panel):
sub = row.split()
subrow = sub.row(align=True)
subrow.alignment = 'RIGHT'
- subrow.active = collection.is_visible # Parent collection runtime visibility
- subrow.prop(child, "hide_viewport", text="", emboss=False)
+ if not use_local_collections:
+ subrow.active = collection.is_visible # Parent collection runtime visibility
+ subrow.prop(child, "hide_viewport", text="", emboss=False)
+ elif not child.is_visible:
+ subrow.active = False
+ subrow.label(text="", icon='REMOVE')
+ else:
+ subrow.active = collection.visible_get() # Parent collection runtime visibility
+ icon = 'HIDE_OFF' if child.visible_get() else 'HIDE_ON'
+ props = subrow.operator("object.hide_collection", text="", icon=icon, emboss=False)
+ props.collection_index = index
+ props.toggle = True
for child in collection.children:
- index = self._draw_collection(layout, view_layer, child, index)
+ index = self._draw_collection(layout, view_layer, use_local_collections, child, index)
return index
@@ -4958,11 +5089,17 @@ class VIEW3D_PT_collections(Panel):
layout = self.layout
layout.use_property_split = False
+ view = context.space_data
view_layer = context.view_layer
+
+ layout.use_property_split = True
+ layout.prop(view, "use_local_collections")
+ layout.separator()
+
# We pass index 0 here because the index is increased
# so the first real index is 1
# And we start with index as 1 because we skip the master collection
- self._draw_collection(layout, view_layer, view_layer.layer_collection, 0)
+ self._draw_collection(layout, view_layer, view.use_local_collections, view_layer.layer_collection, 0)
class VIEW3D_PT_object_type_visibility(Panel):
@@ -5049,7 +5186,8 @@ class VIEW3D_PT_shading_lighting(Panel):
@classmethod
def poll(cls, context):
shading = VIEW3D_PT_shading.get_shading(context)
- return shading.type in {'SOLID', 'MATERIAL'}
+ engine = context.scene.render.engine
+ return shading.type in {'SOLID', 'MATERIAL'} or engine == 'BLENDER_EEVEE' and shading.type == 'RENDERED'
def draw(self, context):
layout = self.layout
@@ -5097,7 +5235,6 @@ class VIEW3D_PT_shading_lighting(Panel):
elif shading.light == 'MATCAP':
sub.scale_y = 0.6 # smaller matcap preview
-
sub.template_icon_view(shading, "studio_light", scale_popup=3.0)
col = split.column()
@@ -5107,8 +5244,30 @@ class VIEW3D_PT_shading_lighting(Panel):
elif shading.type == 'MATERIAL':
col.prop(shading, "use_scene_lights")
col.prop(shading, "use_scene_world")
+ col = layout.column()
+ split = col.split(factor=0.9)
if not shading.use_scene_world:
+ col = split.column()
+ sub = col.row()
+ sub.scale_y = 0.6
+ sub.template_icon_view(shading, "studio_light", scale_popup=3)
+
+ col = split.column()
+ col.operator("preferences.studiolight_show", emboss=False, text="", icon='PREFERENCES')
+
+ split = layout.split(factor=0.9)
+ col = split.column()
+ col.prop(shading, "studiolight_rotate_z", text="Rotation")
+ col.prop(shading, "studiolight_intensity")
+ col.prop(shading, "studiolight_background_alpha")
+ col = split.column() # to align properly with above
+
+ elif shading.type == 'RENDERED':
+ col.prop(shading, "use_scene_lights_render")
+ col.prop(shading, "use_scene_world_render")
+
+ if not shading.use_scene_world_render:
col = layout.column()
split = col.split(factor=0.9)
@@ -5120,12 +5279,12 @@ class VIEW3D_PT_shading_lighting(Panel):
col = split.column()
col.operator("preferences.studiolight_show", emboss=False, text="", icon='PREFERENCES')
- if shading.selected_studio_light.type == 'WORLD':
- split = layout.split(factor=0.9)
- col = split.column()
- col.prop(shading, "studiolight_rotate_z", text="Rotation")
- col.prop(shading, "studiolight_background_alpha")
- col = split.column() # to align properly with above
+ split = layout.split(factor=0.9)
+ col = split.column()
+ col.prop(shading, "studiolight_rotate_z", text="Rotation")
+ col.prop(shading, "studiolight_intensity")
+ col.prop(shading, "studiolight_background_alpha")
+ col = split.column() # to align properly with above
class VIEW3D_PT_shading_color(Panel):
@@ -5251,8 +5410,10 @@ class VIEW3D_PT_shading_options(Panel):
sub.active = shading.show_object_outline
sub.prop(shading, "object_outline_color", text="")
+ if shading.type == 'SOLID':
col = layout.column()
- if (shading.light == 'STUDIO') and (shading.type != 'WIREFRAME'):
+ if shading.light in {'STUDIO', 'MATCAP'}:
+ col.active = shading.selected_studio_light.has_specular_highlight_pass
col.prop(shading, "show_specular_highlight", text="Specular Lighting")
@@ -5520,6 +5681,7 @@ class VIEW3D_PT_overlay_edit_mesh(Panel):
layout = self.layout
view = context.space_data
+ shading = view.shading
overlay = view.overlay
display_all = overlay.show_overlays
@@ -5529,6 +5691,7 @@ class VIEW3D_PT_overlay_edit_mesh(Panel):
split = col.split()
sub = split.column()
+ sub.active = not ((shading.type == 'WIREFRAME') or shading.show_xray)
sub.prop(overlay, "show_edges", text="Edges")
sub = split.column()
sub.prop(overlay, "show_faces", text="Faces")
@@ -5887,13 +6050,6 @@ class VIEW3D_PT_pivot_point(Panel):
col.label(text="Pivot Point")
col.prop(tool_settings, "transform_pivot_point", expand=True)
- if (obj is None) or (mode in {'OBJECT', 'POSE', 'WEIGHT_PAINT'}):
- col.separator()
-
- col.label(text="Affect Only")
- col.prop(tool_settings, "use_transform_data_origin", text="Origins")
- col.prop(tool_settings, "use_transform_pivot_point_align", text="Locations")
-
class VIEW3D_PT_snapping(Panel):
bl_space_type = 'VIEW_3D'
@@ -6043,7 +6199,7 @@ class VIEW3D_PT_gpencil_guide(Panel):
col.active = settings.use_guide
col.prop(settings, "type", expand=True)
- if settings.type == 'PARALLEL':
+ if settings.type in {'ISO', 'PARALLEL', 'RADIAL'}:
col.prop(settings, "angle")
row = col.row(align=True)
@@ -6055,7 +6211,7 @@ class VIEW3D_PT_gpencil_guide(Panel):
else:
col.prop(settings, "spacing")
- if settings.type in {'CIRCULAR', 'RADIAL'}:
+ if settings.type in {'CIRCULAR', 'RADIAL'} or settings.use_snapping:
col.label(text="Reference Point")
row = col.row(align=True)
row.prop(settings, "reference_point", expand=True)
@@ -6102,17 +6258,17 @@ class VIEW3D_PT_overlay_gpencil_options(Panel):
sub.prop(overlay, "gpencil_grid_opacity", text="Canvas", slider=True)
row = col.row()
- row.prop(overlay, "use_gpencil_paper", text="")
+ row.prop(overlay, "use_gpencil_fade_layers", text="")
sub = row.row()
- sub.active = overlay.use_gpencil_paper
- sub.prop(overlay, "gpencil_paper_opacity", text="Fade 3D Objects", slider=True)
+ sub.active = overlay.use_gpencil_fade_layers
+ sub.prop(overlay, "gpencil_fade_layer", text="Fade Layers", slider=True)
- if context.object.mode == 'PAINT_GPENCIL':
- row = col.row()
- row.prop(overlay, "use_gpencil_fade_layers", text="")
- sub = row.row()
- sub.active = overlay.use_gpencil_fade_layers
- sub.prop(overlay, "gpencil_fade_layer", text="Fade Layers", slider=True)
+ row = col.row()
+ row.prop(overlay, "use_gpencil_paper", text="")
+ sub = row.row(align=True)
+ sub.active = overlay.use_gpencil_paper
+ sub.prop(overlay, "gpencil_paper_opacity", text="Fade Objects", slider=True)
+ sub.prop(overlay, "use_gpencil_fade_objects", text="", icon='OUTLINER_OB_GREASEPENCIL')
if context.object.mode in {'EDIT_GPENCIL', 'SCULPT_GPENCIL', 'WEIGHT_GPENCIL'}:
layout.prop(overlay, "use_gpencil_edit_lines", text="Edit Lines")
@@ -6276,66 +6432,124 @@ class VIEW3D_PT_gpencil_multi_frame(Panel):
class VIEW3D_MT_gpencil_edit_context_menu(Menu):
- bl_label = "Edit Context Menu"
+ bl_label = ""
def draw(self, context):
- layout = self.layout
+
+ is_point_mode = context.tool_settings.gpencil_selectmode_edit == 'POINT'
+ is_stroke_mode = context.tool_settings.gpencil_selectmode_edit == 'STROKE'
+ is_segment_mode = context.tool_settings.gpencil_selectmode_edit == 'SEGMENT'
+
is_3d_view = context.space_data.type == 'VIEW_3D'
+ layout = self.layout
+
layout.operator_context = 'INVOKE_REGION_WIN'
- # Add
- layout.operator("gpencil.stroke_subdivide", text="Subdivide")
+ row = layout.row()
- layout.separator()
+ if is_point_mode or is_segment_mode:
+ col = row.column()
- # Transform
- layout.operator("transform.transform", text="Shrink/Fatten").mode = 'GPENCIL_SHRINKFATTEN'
- layout.operator("gpencil.stroke_smooth", text="Smooth")
- layout.operator("gpencil.stroke_trim", text="Trim")
+ col.label(text="Point Context Menu", icon='GP_SELECT_POINTS')
+ col.separator()
- layout.separator()
+ # Additive Operators
+ col.operator("gpencil.stroke_subdivide", text="Subdivide").only_selected = True
- # Modify
- layout.menu("VIEW3D_MT_assign_material")
- layout.operator_menu_enum("gpencil.stroke_arrange", "direction", text="Arrange Strokes")
- layout.operator("gpencil.stroke_flip", text="Flip Direction")
- layout.operator_menu_enum("gpencil.stroke_caps_set", text="Toggle Caps", property="type")
+ col.separator()
- layout.separator()
+ col.operator("gpencil.extrude_move", text="Extrude Points")
- layout.operator("gpencil.duplicate_move", text="Duplicate")
- layout.operator("gpencil.copy", text="Copy", icon='COPYDOWN')
- layout.operator("gpencil.paste", text="Paste", icon='PASTEDOWN').type = 'COPY'
- layout.operator("gpencil.paste", text="Paste & Merge").type = 'MERGE'
- layout.menu("VIEW3D_MT_gpencil_copy_layer")
- layout.operator("gpencil.frame_duplicate", text="Duplicate Active Frame")
- layout.operator("gpencil.frame_duplicate", text="Duplicate Active Frame All Layers").mode = 'ALL'
+ col.separator()
- layout.separator()
+ # Deform Operators
+ col.operator("gpencil.stroke_smooth", text="Smooth Points").only_selected = True
+ col.operator("transform.bend", text="Bend")
+ col.operator("transform.shear", text="Shear")
+ col.operator("transform.tosphere", text="To Sphere")
+ col.operator("transform.transform", text="Shrink Fatten").mode = 'GPENCIL_SHRINKFATTEN'
- layout.operator("gpencil.stroke_join", text="Join").type = 'JOIN'
- layout.operator("gpencil.stroke_join", text="Join & Copy").type = 'JOINCOPY'
- layout.operator_menu_enum("gpencil.stroke_separate", "mode")
- layout.operator("gpencil.stroke_split", text="Split")
- op = layout.operator("gpencil.stroke_cyclical_set", text="Close")
- op.type = 'CLOSE'
- op.geometry = True
+ col.separator()
- layout.separator()
+ col.menu("VIEW3D_MT_mirror", text="Mirror Points")
+ col.menu("VIEW3D_MT_snap", text="Snap Points")
- layout.menu("VIEW3D_MT_mirror")
- layout.menu("VIEW3D_MT_snap")
+ col.separator()
- layout.separator()
+ # Duplicate operators
+ col.operator("gpencil.duplicate_move", text="Duplicate")
+ col.operator("gpencil.copy", text="Copy", icon='COPYDOWN')
+ col.operator("gpencil.paste", text="Paste", icon='PASTEDOWN').type = 'ACTIVE'
+ col.operator("gpencil.paste", text="Paste by Layer").type = 'LAYER'
- # Remove
- if is_3d_view:
- layout.menu("GPENCIL_MT_cleanup")
+ col.separator()
- layout.menu("VIEW3D_MT_gpencil_simplify")
- layout.operator("gpencil.stroke_merge", text="Merge")
- layout.menu("VIEW3D_MT_edit_gpencil_delete")
+ # Removal Operators
+ col.operator("gpencil.stroke_merge", text="Merge Points")
+ col.operator("gpencil.stroke_merge_by_distance").use_unselected = False
+ col.operator("gpencil.stroke_split", text="Split")
+ col.operator("gpencil.stroke_separate", text="Separate").mode = 'POINT'
+
+ col.separator()
+
+ col.operator("gpencil.delete", text="Delete Points").type = 'POINTS'
+ col.operator("gpencil.dissolve", text="Dissolve Points").type = 'POINTS'
+ col.operator("gpencil.dissolve", text="Dissolve Between").type = 'BETWEEN'
+ col.operator("gpencil.dissolve", text="Dissolve Unselected").type = 'UNSELECT'
+
+ if is_stroke_mode:
+
+ col = row.column()
+ col.label(text="Stroke Context Menu", icon='GP_SELECT_STROKES')
+ col.separator()
+
+ # Main Strokes Operators
+ col.operator("gpencil.stroke_subdivide", text="Subdivide").only_selected = False
+ col.menu("VIEW3D_MT_gpencil_simplify")
+ col.operator("gpencil.stroke_trim", text="Trim")
+
+ col.separator()
+
+ col.operator("gpencil.stroke_smooth", text="Smooth Stroke").only_selected = False
+ col.operator("transform.transform", text="Shrink Fatten").mode = 'GPENCIL_SHRINKFATTEN'
+
+ col.separator()
+
+ # Layer and Materials operators
+ col.menu("GPENCIL_MT_move_to_layer")
+ col.menu("VIEW3D_MT_assign_material")
+ col.operator("gpencil.set_active_material", text="Set as Active Material")
+ col.operator_menu_enum("gpencil.stroke_arrange", "direction", text="Arrange Strokes")
+
+ col.separator()
+
+ col.menu("VIEW3D_MT_mirror", text="Mirror Stroke")
+ col.menu("VIEW3D_MT_snap", text="Snap Stroke")
+
+ col.separator()
+
+ # Duplicate operators
+ col.operator("gpencil.duplicate_move", text="Duplicate")
+ col.operator("gpencil.copy", text="Copy", icon='COPYDOWN')
+ col.operator("gpencil.paste", text="Paste", icon='PASTEDOWN').type = 'ACTIVE'
+ col.operator("gpencil.paste", text="Paste by Layer").type = 'LAYER'
+
+ col.separator()
+
+ # Removal Operators
+ col.operator("gpencil.stroke_merge_by_distance").use_unselected = True
+ col.operator_menu_enum("gpencil.stroke_join", "type", text="Join")
+ col.operator("gpencil.stroke_split", text="Split")
+ col.operator("gpencil.stroke_separate", text="Separate").mode = 'STROKE'
+
+ col.separator()
+
+ col.operator("gpencil.delete", text="Delete Strokes").type = 'STROKES'
+
+ col.separator()
+
+ col.operator("gpencil.reproject", text="Reproject Strokes")
class VIEW3D_PT_gpencil_sculpt_context_menu(Panel):
@@ -6360,14 +6574,18 @@ class VIEW3D_PT_gpencil_sculpt_context_menu(Panel):
layout.operator_context = 'INVOKE_REGION_WIN'
- layout.operator("gpencil.blank_frame_add", text="Insert Blank", icon='ADD')
- layout.operator("gpencil.frame_duplicate", text="Duplicate Active", icon='DUPLICATE')
- layout.operator("gpencil.frame_duplicate", text="Duplicate for All Layers", icon='DUPLICATE').mode = 'ALL'
+ layout.operator("gpencil.blank_frame_add", text="Insert Blank in Active Layer", icon='ADD')
+ layout.operator("gpencil.blank_frame_add", text="Insert Blank in All Layers", icon='ADD').all_layers = True
+
+ layout.separator()
+
+ layout.operator("gpencil.frame_duplicate", text="Duplicate Active Layer", icon='DUPLICATE')
+ layout.operator("gpencil.frame_duplicate", text="Duplicate All Layers", icon='DUPLICATE').mode = 'ALL'
layout.separator()
- layout.operator("gpencil.delete", text="Delete Active", icon='REMOVE').type = 'FRAME'
- layout.operator("gpencil.active_frames_delete_all", text="Delete All Active Layers", icon='REMOVE')
+ layout.operator("gpencil.delete", text="Delete Active Layer", icon='REMOVE').type = 'FRAME'
+ layout.operator("gpencil.active_frames_delete_all", text="Delete All Layers", icon='REMOVE')
class VIEW3D_PT_gpencil_draw_context_menu(Panel):
@@ -6393,14 +6611,18 @@ class VIEW3D_PT_gpencil_draw_context_menu(Panel):
layout.operator_context = 'INVOKE_REGION_WIN'
- layout.operator("gpencil.blank_frame_add", text="Insert Blank", icon='ADD')
- layout.operator("gpencil.frame_duplicate", text="Duplicate Active", icon='DUPLICATE')
- layout.operator("gpencil.frame_duplicate", text="Duplicate for All Layers", icon='DUPLICATE').mode = 'ALL'
+ layout.operator("gpencil.blank_frame_add", text="Insert Blank in Active Layer", icon='ADD')
+ layout.operator("gpencil.blank_frame_add", text="Insert Blank in All Layers", icon='ADD').all_layers = True
+
+ layout.separator()
+
+ layout.operator("gpencil.frame_duplicate", text="Duplicate Active Layer", icon='DUPLICATE')
+ layout.operator("gpencil.frame_duplicate", text="Duplicate All Layers", icon='DUPLICATE').mode = 'ALL'
layout.separator()
- layout.operator("gpencil.delete", text="Delete Active", icon='REMOVE').type = 'FRAME'
- layout.operator("gpencil.active_frames_delete_all", text="Delete All Active Layers", icon='REMOVE')
+ layout.operator("gpencil.delete", text="Delete Active Layer", icon='REMOVE').type = 'FRAME'
+ layout.operator("gpencil.active_frames_delete_all", text="Delete All Layers", icon='REMOVE')
class VIEW3D_PT_paint_vertex_context_menu(Panel):
@@ -6585,6 +6807,7 @@ classes = (
VIEW3D_MT_gpencil_vertex_group,
VIEW3D_MT_paint_weight,
VIEW3D_MT_sculpt,
+ VIEW3D_MT_sculpt_set_pivot,
VIEW3D_MT_particle,
VIEW3D_MT_particle_context_menu,
VIEW3D_MT_particle_showhide,
@@ -6666,6 +6889,7 @@ classes = (
VIEW3D_MT_snap_pie,
VIEW3D_MT_orientations_pie,
VIEW3D_MT_proportional_editing_falloff_pie,
+ VIEW3D_MT_sculpt_mask_edit_pie,
VIEW3D_PT_active_tool,
VIEW3D_PT_active_tool_duplicate,
VIEW3D_PT_view3d_properties,
diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
index 5246d8fa864..3aee14e0239 100644
--- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
@@ -122,6 +122,39 @@ def is_not_gpencil_edit_mode(context):
return not is_gpmode
+# ********** default tools for object mode ****************
+
+
+class VIEW3D_PT_tools_object_options(View3DPanel, Panel):
+ bl_category = "Tool"
+ bl_context = ".objectmode" # dot on purpose (access from topbar)
+ bl_label = "Options"
+
+ def draw(self, context):
+ # layout = self.layout
+ pass
+
+
+class VIEW3D_PT_tools_object_options_transform(View3DPanel, Panel):
+ bl_category = "Tool"
+ bl_context = ".objectmode" # dot on purpose (access from topbar)
+ bl_label = "Transform"
+ bl_parent_id = "VIEW3D_PT_tools_object_options"
+
+ def draw(self, context):
+ layout = self.layout
+
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
+ tool_settings = context.tool_settings
+
+ layout.label(text="Affect Only")
+ layout.prop(tool_settings, "use_transform_data_origin", text="Origins")
+ layout.prop(tool_settings, "use_transform_pivot_point_align", text="Locations")
+ layout.prop(tool_settings, "use_transform_skip_children", text="Parents")
+
+
# ********** default tools for editmode_mesh ****************
@@ -144,11 +177,21 @@ class VIEW3D_PT_tools_meshedit_options(View3DPanel, Panel):
ob = context.active_object
mesh = ob.data
- col = layout.column(align=True)
- col.prop(mesh, "use_mirror_x")
+ split = layout.split()
+
+ col = split.column()
+ col.alignment = 'RIGHT'
+ col.label(text="Mirror")
+
+ col = split.column()
row = col.row(align=True)
- row.active = ob.data.use_mirror_x
+ row.prop(mesh, "use_mirror_x", text="X", toggle=True)
+ row.prop(mesh, "use_mirror_y", text="Y", toggle=True)
+ row.prop(mesh, "use_mirror_z", text="Z", toggle=True)
+
+ row = layout.row(align=True)
+ row.active = ob.data.use_mirror_x or ob.data.use_mirror_y or ob.data.use_mirror_z
row.prop(mesh, "use_mirror_topology")
@@ -176,8 +219,10 @@ class VIEW3D_PT_tools_meshedit_options_automerge(View3DPanel, Panel):
layout.use_property_split = True
layout.use_property_decorate = False
- layout.active = tool_settings.use_mesh_automerge
- layout.prop(tool_settings, "double_threshold", text="Threshold")
+ col = layout.column(align=True)
+ col.active = tool_settings.use_mesh_automerge
+ col.prop(tool_settings, "use_mesh_automerge_and_split", toggle=False)
+ col.prop(tool_settings, "double_threshold", text="Threshold")
# ********** default tools for editmode_curve ****************
@@ -261,12 +306,17 @@ class VIEW3D_PT_tools_posemode_options(View3DPanel, Panel):
pose = context.active_object.pose
layout = self.layout
+ tool_settings = context.tool_settings
+
layout.prop(pose, "use_auto_ik")
layout.prop(pose, "use_mirror_x")
col = layout.column()
col.active = pose.use_mirror_x
col.prop(pose, "use_mirror_relative")
+ layout.label(text="Affect Only")
+ layout.prop(tool_settings, "use_transform_pivot_point_align", text="Locations")
+
# ********** default tools for paint modes ****************
@@ -363,6 +413,25 @@ class VIEW3D_PT_tools_brush(Panel, View3DPaintPanel):
if not self.is_popover:
brush_basic_sculpt_settings(col, context, brush)
+ # normal_radius_factor
+ col.separator()
+ row = col.row()
+ row.prop(brush, "normal_radius_factor", slider=True)
+
+ if brush.sculpt_tool == 'ELASTIC_DEFORM':
+ col.separator()
+ row = col.row()
+ row.prop(brush, "elastic_deform_type")
+ row = col.row()
+ row.prop(brush, "elastic_deform_volume_preservation", slider=True)
+ elif brush.sculpt_tool == 'POSE':
+ row = col.row()
+ row.prop(brush, "pose_offset")
+ elif brush.sculpt_tool == 'GRAB':
+ col.separator()
+ row = col.row()
+ row.prop(brush, "use_grab_active_vertex")
+
# topology_rake_factor
if (
capabilities.has_topology_rake and
@@ -385,7 +454,10 @@ class VIEW3D_PT_tools_brush(Panel, View3DPaintPanel):
# crease_pinch_factor
if capabilities.has_pinch_factor:
row = col.row(align=True)
- row.prop(brush, "crease_pinch_factor", slider=True, text="Pinch")
+ if (brush.sculpt_tool in ('BLOB', 'SNAKE_HOOK')):
+ row.prop(brush, "crease_pinch_factor", slider=True, text="Magnify")
+ else:
+ row.prop(brush, "crease_pinch_factor", slider=True, text="Pinch")
# rake_factor
if capabilities.has_rake_factor:
@@ -567,6 +639,7 @@ class VIEW3D_PT_tools_brush_options(Panel, View3DPaintPanel):
brush_texpaint_common_options(self, context, layout, brush, settings, True)
elif context.sculpt_object and brush:
+ col.prop(brush, "use_automasking_topology")
if capabilities.has_accumulate:
col.prop(brush, "use_accumulate")
@@ -575,6 +648,7 @@ class VIEW3D_PT_tools_brush_options(Panel, View3DPaintPanel):
if capabilities.has_sculpt_plane:
col.prop(brush, "sculpt_plane")
col.prop(brush, "use_original_normal")
+ col.prop(brush, "use_original_plane")
col.prop(brush, "use_frontface", text="Front Faces Only")
col.prop(brush, "use_projected")
@@ -702,6 +776,7 @@ class VIEW3D_PT_stencil_projectpaint(View3DPanel, Panel):
bl_context = ".imagepaint" # dot on purpose (access from topbar)
bl_label = "Mask"
bl_options = {'DEFAULT_CLOSED'}
+ bl_ui_units_x = 14
@classmethod
def poll(cls, context):
@@ -726,20 +801,20 @@ class VIEW3D_PT_stencil_projectpaint(View3DPanel, Panel):
col = layout.column()
col.active = ipaint.use_stencil_layer
+ col.label(text="Stencil Image")
+ col.template_ID(ipaint, "stencil_image", new="image.new", open="image.open")
+
stencil_text = mesh.uv_layer_stencil.name if mesh.uv_layer_stencil else ""
- split = col.split(factor=0.5)
+
+ col.separator()
+
+ split = col.split()
colsub = split.column()
colsub.alignment = 'RIGHT'
colsub.label(text="UV Layer")
split.column().menu("VIEW3D_MT_tools_projectpaint_stencil", text=stencil_text, translate=False)
- # todo this should be combined into a single row
- split = col.split(factor=0.5)
- colsub = split.column()
- colsub.alignment = 'RIGHT'
- colsub.label(text="Stencil Image")
- colsub = split.column()
- colsub.template_ID(ipaint, "stencil_image", new="image.new", open="image.open")
+ col.separator()
row = col.row(align=True)
row.prop(ipaint, "stencil_color", text="Display Color")
@@ -912,6 +987,8 @@ class VIEW3D_PT_tools_brush_stroke(Panel, View3DPaintPanel):
if brush.sculpt_capabilities.has_space_attenuation:
col.prop(brush, "use_space_attenuation")
+ col.prop(brush, "use_scene_spacing")
+
if brush.sculpt_capabilities.has_jitter:
row = col.row(align=True)
@@ -1139,6 +1216,7 @@ class VIEW3D_PT_sculpt_dyntopo_remesh(Panel, View3DPaintPanel):
col = flow.column()
col.operator("sculpt.detail_flood_fill")
+
class VIEW3D_PT_sculpt_voxel_remesh(Panel, View3DPaintPanel):
bl_context = ".sculpt_mode" # dot on purpose (access from topbar)
bl_label = "Remesh"
@@ -1149,15 +1227,6 @@ class VIEW3D_PT_sculpt_voxel_remesh(Panel, View3DPaintPanel):
def poll(cls, context):
return (context.sculpt_object and context.tool_settings.sculpt)
- def draw_header(self, context):
- is_popover = self.is_popover
- layout = self.layout
- layout.operator(
- "object.voxel_remesh",
- text="",
- emboss=is_popover,
- )
-
def draw(self, context):
layout = self.layout
layout.use_property_split = True
@@ -1166,12 +1235,16 @@ class VIEW3D_PT_sculpt_voxel_remesh(Panel, View3DPaintPanel):
col = layout.column()
mesh = context.active_object.data
col.prop(mesh, "remesh_voxel_size")
+ col.prop(mesh, "remesh_voxel_adaptivity")
+ col.prop(mesh, "remesh_fix_poles")
col.prop(mesh, "remesh_smooth_normals")
+ col.prop(mesh, "remesh_preserve_volume")
col.prop(mesh, "remesh_preserve_paint_mask")
col.operator("object.voxel_remesh", text="Remesh")
# TODO, move to space_view3d.py
+
class VIEW3D_PT_sculpt_options(Panel, View3DPaintPanel):
bl_context = ".sculpt_mode" # dot on purpose (access from topbar)
bl_label = "Options"
@@ -1780,7 +1853,7 @@ class VIEW3D_PT_tools_grease_pencil_brush(View3DPanel, Panel):
brush = gpencil_paint.brush
sub = col.column(align=True)
- sub.operator("gpencil.brush_presets_create", icon='HELP', text="")
+ sub.operator("gpencil.brush_presets_create", icon='PRESET_NEW', text="")
if brush is not None:
gp_settings = brush.gpencil_settings
@@ -1808,7 +1881,6 @@ class VIEW3D_PT_tools_grease_pencil_brush_option(View3DPanel, Panel):
bl_context = ".greasepencil_paint"
bl_label = "Options"
bl_category = "Tool"
- bl_options = {'DEFAULT_CLOSED'}
@classmethod
def poll(cls, context):
@@ -1888,7 +1960,6 @@ class VIEW3D_PT_tools_grease_pencil_brush_settings(View3DPanel, Panel):
bl_parent_id = 'VIEW3D_PT_tools_grease_pencil_brush_option'
bl_label = "Post-Processing"
bl_category = "Tool"
- bl_options = {'DEFAULT_CLOSED'}
@classmethod
def poll(cls, context):
@@ -1922,6 +1993,9 @@ class VIEW3D_PT_tools_grease_pencil_brush_settings(View3DPanel, Panel):
col.prop(gp_settings, "random_subdiv", text="Randomness", slider=True)
col = layout.column(align=True)
+ col.prop(gp_settings, "simplify_factor")
+
+ col = layout.column(align=True)
col.prop(gp_settings, "trim")
@@ -2151,6 +2225,8 @@ class VIEW3D_PT_gpencil_brush_presets(PresetPanel, Panel):
classes = (
VIEW3D_MT_brush_context_menu,
VIEW3D_MT_brush_context_menu_paint_modes,
+ VIEW3D_PT_tools_object_options,
+ VIEW3D_PT_tools_object_options_transform,
VIEW3D_PT_tools_meshedit_options,
VIEW3D_PT_tools_meshedit_options_automerge,
VIEW3D_PT_tools_curveedit_options_stroke,
@@ -2177,12 +2253,12 @@ classes = (
VIEW3D_PT_tools_brush_display_custom_icon,
VIEW3D_PT_sculpt_dyntopo,
VIEW3D_PT_sculpt_dyntopo_remesh,
+ VIEW3D_PT_sculpt_voxel_remesh,
VIEW3D_PT_sculpt_symmetry,
VIEW3D_PT_sculpt_symmetry_for_topbar,
VIEW3D_PT_sculpt_options,
VIEW3D_PT_sculpt_options_unified,
VIEW3D_PT_sculpt_options_gravity,
- VIEW3D_PT_sculpt_voxel_remesh,
VIEW3D_PT_tools_weightpaint_symmetry,
VIEW3D_PT_tools_weightpaint_symmetry_for_topbar,
VIEW3D_PT_tools_weightpaint_options,
diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py
index 5dc2cf8d106..f0f1baba642 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -190,6 +190,7 @@ shader_node_categories = [
NodeItem("ShaderNodeParticleInfo"),
NodeItem("ShaderNodeCameraData"),
NodeItem("ShaderNodeUVMap"),
+ NodeItem("ShaderNodeVertexColor"),
NodeItem("ShaderNodeUVAlongStroke", poll=line_style_shader_nodes_poll),
NodeItem("NodeGroupInput", poll=group_input_output_item_poll),
]),