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')
-rw-r--r--release/datafiles/blender_icons_geom.py8
-rwxr-xr-xrelease/datafiles/ctodata.py2
-rw-r--r--release/datafiles/fonts/NotoSansHebrew-Regular.woff2bin0 -> 18312 bytes
-rw-r--r--release/datafiles/fonts/NotoSansHebrew-VariableFont_wdth,wght.woff2bin17544 -> 0 bytes
m---------release/datafiles/locale0
-rw-r--r--release/freedesktop/org.blender.Blender.appdata.xml41
m---------release/scripts/addons0
m---------release/scripts/addons_contrib0
-rw-r--r--release/scripts/freestyle/modules/freestyle/functions.py2
-rw-r--r--release/scripts/modules/bl_app_override/__init__.py8
-rw-r--r--release/scripts/modules/bl_app_override/helpers.py4
-rw-r--r--release/scripts/modules/bl_console_utils/autocomplete/complete_calltip.py18
-rw-r--r--release/scripts/modules/bl_console_utils/autocomplete/complete_import.py8
-rw-r--r--release/scripts/modules/bl_console_utils/autocomplete/complete_namespace.py22
-rw-r--r--release/scripts/modules/bl_console_utils/autocomplete/intellisense.py16
-rw-r--r--release/scripts/modules/bl_i18n_utils/bl_extract_messages.py52
-rw-r--r--release/scripts/modules/bl_i18n_utils/settings.py11
-rw-r--r--release/scripts/modules/bl_i18n_utils/utils.py2
-rwxr-xr-xrelease/scripts/modules/bl_i18n_utils/utils_languages_menu.py10
-rw-r--r--release/scripts/modules/bl_i18n_utils/utils_spell_check.py1
-rw-r--r--release/scripts/modules/bl_keymap_utils/io.py2
-rw-r--r--release/scripts/modules/bl_keymap_utils/keymap_from_toolbar.py4
-rw-r--r--release/scripts/modules/bpy/utils/__init__.py94
-rw-r--r--release/scripts/modules/bpy_extras/io_utils.py5
-rw-r--r--release/scripts/modules/bpy_extras/mesh_utils.py14
-rw-r--r--release/scripts/modules/bpy_extras/node_shader_utils.py2
-rw-r--r--release/scripts/modules/bpy_extras/wm_utils/progress_report.py4
-rw-r--r--release/scripts/modules/bpy_types.py3
-rw-r--r--release/scripts/modules/console_python.py2
-rw-r--r--release/scripts/modules/gpu_extras/batch.py33
-rw-r--r--release/scripts/modules/gpu_extras/presets.py7
-rw-r--r--release/scripts/modules/rna_manual_reference.py193
-rw-r--r--release/scripts/modules/rna_prop_ui.py4
-rw-r--r--release/scripts/modules/sys_info.py9
-rw-r--r--release/scripts/presets/keyconfig/keymap_data/blender_default.py6
-rw-r--r--release/scripts/startup/bl_operators/__init__.py2
-rw-r--r--release/scripts/startup/bl_operators/geometry_nodes.py4
-rw-r--r--release/scripts/startup/bl_operators/node.py73
-rw-r--r--release/scripts/startup/bl_operators/spreadsheet.py1
-rw-r--r--release/scripts/startup/bl_operators/userpref.py4
-rw-r--r--release/scripts/startup/bl_operators/uvcalc_follow_active.py2
-rw-r--r--release/scripts/startup/bl_operators/uvcalc_lightmap.py2
-rw-r--r--release/scripts/startup/bl_operators/uvcalc_randomize_transform.py212
-rw-r--r--release/scripts/startup/bl_operators/uvcalc_transform.py464
-rw-r--r--release/scripts/startup/bl_operators/vertexpaint_dirt.py2
-rw-r--r--release/scripts/startup/bl_operators/wm.py35
-rw-r--r--release/scripts/startup/bl_ui/__init__.py2
-rw-r--r--release/scripts/startup/bl_ui/node_add_menu.py68
-rw-r--r--release/scripts/startup/bl_ui/node_add_menu_geometry.py446
-rw-r--r--release/scripts/startup/bl_ui/properties_data_bone.py10
-rw-r--r--release/scripts/startup/bl_ui/properties_data_mesh.py26
-rw-r--r--release/scripts/startup/bl_ui/properties_paint_common.py31
-rw-r--r--release/scripts/startup/bl_ui/properties_view_layer.py15
-rw-r--r--release/scripts/startup/bl_ui/space_dopesheet.py1
-rw-r--r--release/scripts/startup/bl_ui/space_image.py30
-rw-r--r--release/scripts/startup/bl_ui/space_info.py3
-rw-r--r--release/scripts/startup/bl_ui/space_nla.py1
-rw-r--r--release/scripts/startup/bl_ui/space_node.py8
-rw-r--r--release/scripts/startup/bl_ui/space_outliner.py52
-rw-r--r--release/scripts/startup/bl_ui/space_spreadsheet.py75
-rw-r--r--release/scripts/startup/bl_ui/space_time.py4
-rw-r--r--release/scripts/startup/bl_ui/space_toolsystem_common.py2
-rw-r--r--release/scripts/startup/bl_ui/space_userpref.py34
-rw-r--r--release/scripts/startup/bl_ui/space_view3d.py43
-rw-r--r--release/scripts/startup/bl_ui/space_view3d_toolbar.py107
-rw-r--r--release/scripts/startup/nodeitems_builtins.py310
-rw-r--r--release/scripts/templates_py/custom_nodes.py2
-rw-r--r--release/scripts/templates_py/operator_modal_draw.py3
68 files changed, 1813 insertions, 848 deletions
diff --git a/release/datafiles/blender_icons_geom.py b/release/datafiles/blender_icons_geom.py
index b95baf3419e..878cc4b46f6 100644
--- a/release/datafiles/blender_icons_geom.py
+++ b/release/datafiles/blender_icons_geom.py
@@ -72,7 +72,7 @@ class TriMesh:
@staticmethod
def _tri_copy_from_object(ob):
import bmesh
- assert(ob.type in OBJECTS_TYPES_MESH_COMPATIBLE)
+ assert ob.type in OBJECTS_TYPES_MESH_COMPATIBLE
bm = bmesh.new()
bm.from_mesh(ob.to_mesh())
bmesh.ops.triangulate(bm, faces=bm.faces)
@@ -143,7 +143,7 @@ def mesh_data_lists_from_mesh(me, material_colors):
i1 = 1
# we only write tris now
- assert(len(loops_poly) == 3)
+ assert len(loops_poly) == 3
for i2 in range(2, l_len):
l0 = loops_poly[i0]
@@ -217,7 +217,7 @@ def mesh_data_lists_from_objects(ob_parent, ob_children):
def write_mesh_to_py(fh, ob, ob_children):
def float_as_byte(f, axis_range):
- assert(axis_range <= 255)
+ assert axis_range <= 255
# -1..1 -> 0..255
f = (f + 1.0) * 0.5
f = round(f * axis_range)
@@ -238,7 +238,7 @@ def write_mesh_to_py(fh, ob, ob_children):
if 0:
# make as large as we can, keeping alignment
def size_scale_up(size):
- assert(size != 0)
+ assert size != 0
while size * 2 <= 255:
size *= 2
return size
diff --git a/release/datafiles/ctodata.py b/release/datafiles/ctodata.py
index b6420d5c9a2..6c5afdb1b5b 100755
--- a/release/datafiles/ctodata.py
+++ b/release/datafiles/ctodata.py
@@ -31,7 +31,7 @@ data = [int(v) for v in data]
if strip_byte:
# String data gets trailing byte.
last = data.pop()
- assert(last == 0)
+ assert last == 0
data = bytes(data)
diff --git a/release/datafiles/fonts/NotoSansHebrew-Regular.woff2 b/release/datafiles/fonts/NotoSansHebrew-Regular.woff2
new file mode 100644
index 00000000000..afbe2b7f62b
--- /dev/null
+++ b/release/datafiles/fonts/NotoSansHebrew-Regular.woff2
Binary files differ
diff --git a/release/datafiles/fonts/NotoSansHebrew-VariableFont_wdth,wght.woff2 b/release/datafiles/fonts/NotoSansHebrew-VariableFont_wdth,wght.woff2
deleted file mode 100644
index 4f6033c916f..00000000000
--- a/release/datafiles/fonts/NotoSansHebrew-VariableFont_wdth,wght.woff2
+++ /dev/null
Binary files differ
diff --git a/release/datafiles/locale b/release/datafiles/locale
-Subproject a2eb507891449a0b67582be9561840075513661
+Subproject 7be7aff5a18c550465b3f7634539ed4168af7c5
diff --git a/release/freedesktop/org.blender.Blender.appdata.xml b/release/freedesktop/org.blender.Blender.appdata.xml
index 12291860050..0f1aa5099b6 100644
--- a/release/freedesktop/org.blender.Blender.appdata.xml
+++ b/release/freedesktop/org.blender.Blender.appdata.xml
@@ -40,6 +40,47 @@
</screenshot>
</screenshots>
<releases>
+ <release version="3.3" date="2022-09-07">
+ <description>
+ <p>New features:</p>
+ <ul>
+ <li>New hair system</li>
+ <li>Cycles Rendering on Intel Arc GPUs</li>
+ <li>Grease Pencil Light and Shadow calculations</li>
+ <li>Motion Tracker Image Plane Marker</li>
+ </ul>
+ <p>Enhancements:</p>
+ <ul>
+ <li>Faster Line Art loading time</li>
+ <li>Library Overrides improvements</li>
+ <li>Massive performance gains importing large amounts of objects in USD, Alembic, and OBJ</li>
+ <li>UV improvements</li>
+ <li>Improved sculpting performance in EEVEE</li>
+ <li>Cycles GPU rendering improvements for AMD GPUs and Apple Silicon</li>
+ </ul>
+ </description>
+ </release>
+ <release version="3.2" date="2022-06-08">
+ <description>
+ <p>New features:</p>
+ <ul>
+ <li>Cycles Light Groups</li>
+ <li>Cycles Shadow Caustics using Manifold Next Event Estimation</li>
+ <li>New Tools and usability improvements for Polygon Painting</li>
+ <li>More Geometry Nodes, including Duplicate Elements</li>
+ <li>Asset Browser: Support for Asset Collections</li>
+ </ul>
+ <p>Enhancements:</p>
+ <ul>
+ <li>Enhanced channels in the video sequencer</li>
+ <li>Support for WebP format</li>
+ <li>New experimental OBJ importer</li>
+ <li>Motion Paths improvements</li>
+ <li>Grease Pencil Envelope Modifier</li>
+ <li>New Curve Pen Tool</li>
+ </ul>
+ </description>
+ </release>
<release version="3.1" date="2022-03-09">
<description>
<p>New features:</p>
diff --git a/release/scripts/addons b/release/scripts/addons
-Subproject 7a8502871c34db0343cc7de52d6b49b15a84238
+Subproject 726d08c9036b939f46b59bceb72a61e3102600c
diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib
-Subproject 95107484d076bc965239942e857c83433bfa86d
+Subproject c43c0b2bcf08c34d933c3b56f096c9a23c8eff6
diff --git a/release/scripts/freestyle/modules/freestyle/functions.py b/release/scripts/freestyle/modules/freestyle/functions.py
index 4a4a2f036e1..326e072d34a 100644
--- a/release/scripts/freestyle/modules/freestyle/functions.py
+++ b/release/scripts/freestyle/modules/freestyle/functions.py
@@ -198,7 +198,7 @@ class pyInverseCurvature2DAngleF0D(UnaryFunction0DDouble):
class pyCurvilinearLengthF0D(UnaryFunction0DDouble):
def __call__(self, inter):
cp = inter.object
- assert(isinstance(cp, CurvePoint))
+ assert isinstance(cp, CurvePoint)
return cp.t2d
diff --git a/release/scripts/modules/bl_app_override/__init__.py b/release/scripts/modules/bl_app_override/__init__.py
index 4d6194e71cd..1408cf3594f 100644
--- a/release/scripts/modules/bl_app_override/__init__.py
+++ b/release/scripts/modules/bl_app_override/__init__.py
@@ -74,7 +74,7 @@ def ui_draw_filter_register(
if ui_test is None:
UILayout.__getattribute__(self, "label")(text="")
else:
- assert(ui_test is True)
+ assert ui_test is True
# may need to be set
ret = OperatorProperties_Fake()
return ret
@@ -95,7 +95,7 @@ def ui_draw_filter_register(
if ui_test is None:
UILayout.__getattribute__(self, "label")(text="")
else:
- assert(ui_test is True)
+ assert ui_test is True
ret = None
return ret
return dummy_func
@@ -115,7 +115,7 @@ def ui_draw_filter_register(
if ui_test is None:
UILayout.__getattribute__(self, "label")(text="")
else:
- assert(ui_test is True)
+ assert ui_test is True
ret = None
return ret
return dummy_func
@@ -135,7 +135,7 @@ def ui_draw_filter_register(
if ui_test is None:
real_func(text="")
else:
- assert(ui_test is True)
+ assert ui_test is True
ret = None
return ret
return dummy_func
diff --git a/release/scripts/modules/bl_app_override/helpers.py b/release/scripts/modules/bl_app_override/helpers.py
index 4759e0ae8e5..0b785511886 100644
--- a/release/scripts/modules/bl_app_override/helpers.py
+++ b/release/scripts/modules/bl_app_override/helpers.py
@@ -44,14 +44,14 @@ class AppOverrideState:
self._ui_ignore_store = None
def _setup_classes(self):
- assert(self._class_store is None)
+ assert self._class_store is None
self._class_store = self.class_ignore()
from bpy.utils import unregister_class
for cls in self._class_store:
unregister_class(cls)
def _teardown_classes(self):
- assert(self._class_store is not None)
+ assert self._class_store is not None
from bpy.utils import register_class
for cls in self._class_store:
diff --git a/release/scripts/modules/bl_console_utils/autocomplete/complete_calltip.py b/release/scripts/modules/bl_console_utils/autocomplete/complete_calltip.py
index 07ccac81f91..419a6dc9852 100644
--- a/release/scripts/modules/bl_console_utils/autocomplete/complete_calltip.py
+++ b/release/scripts/modules/bl_console_utils/autocomplete/complete_calltip.py
@@ -29,7 +29,7 @@ RE_DEF_COMPLETE = re.compile(
def reduce_newlines(text):
"""Reduces multiple newlines to a single newline.
- :param text: text with multiple newlines
+ :arg text: text with multiple newlines
:type text: str
:returns: text with single newlines
:rtype: str
@@ -43,7 +43,7 @@ def reduce_newlines(text):
def reduce_spaces(text):
"""Reduces multiple whitespaces to a single space.
- :param text: text with multiple spaces
+ :arg text: text with multiple spaces
:type text: str
:returns: text with single spaces
:rtype: str
@@ -57,7 +57,7 @@ def reduce_spaces(text):
def get_doc(obj):
"""Get the doc string or comments for an object.
- :param object: object
+ :arg object: object
:returns: doc string
:rtype: str
@@ -71,11 +71,11 @@ def get_doc(obj):
def get_argspec(func, *, strip_self=True, doc=None, source=None):
"""Get argument specifications.
- :param strip_self: strip `self` from argspec
+ :arg strip_self: strip `self` from argspec
:type strip_self: bool
- :param doc: doc string of func (optional)
+ :arg doc: doc string of func (optional)
:type doc: str
- :param source: source code of func (optional)
+ :arg source: source code of func (optional)
:type source: str
:returns: argument specification
:rtype: str
@@ -131,11 +131,11 @@ def get_argspec(func, *, strip_self=True, doc=None, source=None):
def complete(line, cursor, namespace):
"""Complete callable with calltip.
- :param line: incomplete text line
+ :arg line: incomplete text line
:type line: str
- :param cursor: current character position
+ :arg cursor: current character position
:type cursor: int
- :param namespace: namespace
+ :arg namespace: namespace
:type namespace: dict
:returns: (matches, world, scrollback)
:rtype: (list of str, str, str)
diff --git a/release/scripts/modules/bl_console_utils/autocomplete/complete_import.py b/release/scripts/modules/bl_console_utils/autocomplete/complete_import.py
index 2f321fee0b2..c506e674cd5 100644
--- a/release/scripts/modules/bl_console_utils/autocomplete/complete_import.py
+++ b/release/scripts/modules/bl_console_utils/autocomplete/complete_import.py
@@ -42,7 +42,7 @@ def get_root_modules():
"""
global ROOT_MODULES
modules = []
- if not(ROOT_MODULES is None):
+ if not (ROOT_MODULES is None):
return ROOT_MODULES
from time import time
t = time()
@@ -76,7 +76,7 @@ def module_list(path):
Return the list containing the names of the modules available in
the given folder.
- :param path: folder path
+ :arg path: folder path
:type path: str
:returns: modules
:rtype: list
@@ -107,7 +107,7 @@ def complete(line):
"""
Returns a list containing the completion possibilities for an import line.
- :param line:
+ :arg line:
incomplete line which contains an import statement::
@@ -131,7 +131,7 @@ def complete(line):
if only_modules:
return inspect.ismodule(getattr(module, attr))
else:
- return not(attr[:2] == '__' and attr[-2:] == '__')
+ return not (attr[:2] == '__' and attr[-2:] == '__')
try:
m = __import__(mod)
diff --git a/release/scripts/modules/bl_console_utils/autocomplete/complete_namespace.py b/release/scripts/modules/bl_console_utils/autocomplete/complete_namespace.py
index 4ba446d6832..b1b751c96ab 100644
--- a/release/scripts/modules/bl_console_utils/autocomplete/complete_namespace.py
+++ b/release/scripts/modules/bl_console_utils/autocomplete/complete_namespace.py
@@ -27,9 +27,9 @@ def is_struct_seq(obj):
def complete_names(word, namespace):
"""Complete variable names or attributes
- :param word: word to be completed
+ :arg word: word to be completed
:type word: str
- :param namespace: namespace
+ :arg namespace: namespace
:type namespace: dict
:returns: completion matches
:rtype: list of str
@@ -50,12 +50,12 @@ def complete_indices(word, namespace, *, obj=None, base=None):
* integer numbers for list
* any keys for dictionary
- :param word: word to be completed
+ :arg word: word to be completed
:type word: str
- :param namespace: namespace
+ :arg namespace: namespace
:type namespace: dict
- :param obj: object evaluated from base
- :param base: sub-string which can be evaluated into an object.
+ :arg obj: object evaluated from base
+ :arg base: sub-string which can be evaluated into an object.
:type base: str
:returns: completion matches
:rtype: list of str
@@ -103,11 +103,11 @@ def complete(word, namespace, *, private=True):
"""Complete word within a namespace with the standard rlcompleter
module. Also supports index or key access [].
- :param word: word to be completed
+ :arg word: word to be completed
:type word: str
- :param namespace: namespace
+ :arg namespace: namespace
:type namespace: dict
- :param private: whether private attribute/methods should be returned
+ :arg private: whether private attribute/methods should be returned
:type private: bool
:returns: completion matches
:rtype: list of str
@@ -132,7 +132,7 @@ def complete(word, namespace, *, private=True):
matches = complete_indices(word, namespace,
base=re_incomplete_index.group(1))
- elif not('[' in word):
+ elif not ('[' in word):
matches = complete_names(word, namespace)
elif word[-1] == ']':
@@ -182,7 +182,7 @@ def complete(word, namespace, *, private=True):
matches = [word + '.']
# separate public from private
- public_matches = [match for match in matches if not('._' in match)]
+ public_matches = [match for match in matches if not ('._' in match)]
if private:
private_matches = [match for match in matches if '._' in match]
return public_matches + private_matches
diff --git a/release/scripts/modules/bl_console_utils/autocomplete/intellisense.py b/release/scripts/modules/bl_console_utils/autocomplete/intellisense.py
index e53e38dbc53..7aff3596c42 100644
--- a/release/scripts/modules/bl_console_utils/autocomplete/intellisense.py
+++ b/release/scripts/modules/bl_console_utils/autocomplete/intellisense.py
@@ -43,13 +43,13 @@ def complete(line, cursor, namespace, private):
* index completion for lists and dictionaries
* module completion (from/import)
- :param line: incomplete text line
+ :arg line: incomplete text line
:type line: str
- :param cursor: current character position
+ :arg cursor: current character position
:type cursor: int
- :param namespace: namespace
+ :arg namespace: namespace
:type namespace: dict
- :param private: whether private variables should be listed
+ :arg private: whether private variables should be listed
:type private: bool
:returns: list of completions, word
:rtype: list, str
@@ -82,13 +82,13 @@ def expand(line, cursor, namespace, *, private=True):
"""This method is invoked when the user asks autocompletion,
e.g. when Ctrl+Space is clicked.
- :param line: incomplete text line
+ :arg line: incomplete text line
:type line: str
- :param cursor: current character position
+ :arg cursor: current character position
:type cursor: int
- :param namespace: namespace
+ :arg namespace: namespace
:type namespace: dict
- :param private: whether private variables should be listed
+ :arg private: whether private variables should be listed
:type private: bool
:returns:
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 fc7cbe566c3..21ca38bff20 100644
--- a/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py
+++ b/release/scripts/modules/bl_i18n_utils/bl_extract_messages.py
@@ -97,7 +97,7 @@ def check(check_ctxt, msgs, key, msgsrc, settings):
if key in py_in_rna[1]:
py_in_rna[0].add(key)
if not_capitalized is not None:
- if(key[1] not in settings.WARN_MSGID_NOT_CAPITALIZED_ALLOWED and
+ if (key[1] not in settings.WARN_MSGID_NOT_CAPITALIZED_ALLOWED and
key[1][0].isalpha() and not key[1][0].isupper()):
not_capitalized.add(key)
if end_point is not None:
@@ -258,11 +258,12 @@ def dump_rna_messages(msgs, reports, settings, verbose=False):
bl_rna_base_props = set()
if bl_rna_base:
bl_rna_base_props |= set(bl_rna_base.properties.values())
- for cls_base in cls.__bases__:
- bl_rna_base = getattr(cls_base, "bl_rna", None)
- if not bl_rna_base:
- continue
- bl_rna_base_props |= set(bl_rna_base.properties.values())
+ if hasattr(cls, "__bases__"):
+ for cls_base in cls.__bases__:
+ bl_rna_base = getattr(cls_base, "bl_rna", None)
+ if not bl_rna_base:
+ continue
+ bl_rna_base_props |= set(bl_rna_base.properties.values())
props = sorted(bl_rna.properties, key=lambda p: p.identifier)
for prop in props:
@@ -450,6 +451,19 @@ def dump_rna_messages(msgs, reports, settings, verbose=False):
process_msg(msgs, bpy.app.translations.contexts.operator_default, cat_str, "Generated operator category",
reports, check_ctxt_rna, settings)
+ # Parse keymap preset preferences
+ for preset_filename in sorted(
+ os.listdir(os.path.join(settings.PRESETS_DIR, "keyconfig"))):
+ preset_path = os.path.join(settings.PRESETS_DIR, "keyconfig", preset_filename)
+ if not (os.path.isfile(preset_path) and preset_filename.endswith(".py")):
+ continue
+ preset_name, _ = os.path.splitext(preset_filename)
+
+ bpy.utils.keyconfig_set(preset_path)
+ preset = bpy.data.window_managers[0].keyconfigs[preset_name]
+ if preset.preferences is not None:
+ walk_properties(preset.preferences)
+
# And parse keymaps!
from bl_keymap_utils import keymap_hierarchy
walk_keymap_hierarchy(keymap_hierarchy.generate(), "KM_HIERARCHY")
@@ -907,6 +921,22 @@ def dump_template_messages(msgs, reports, settings):
reports, None, settings)
+def dump_addon_bl_info(msgs, reports, module, settings):
+ for prop in ('name', 'location', 'description'):
+ process_msg(
+ msgs,
+ settings.DEFAULT_CONTEXT,
+ module.bl_info[prop],
+ "Add-on " +
+ module.bl_info['name'] +
+ " info: " +
+ prop,
+ reports,
+ None,
+ settings,
+ )
+
+
##### Main functions! #####
def dump_messages(do_messages, do_checks, settings):
bl_ver = "Blender " + bpy.app.version_string
@@ -945,6 +975,13 @@ def dump_messages(do_messages, do_checks, settings):
# Get strings from startup templates.
dump_template_messages(msgs, reports, settings)
+ # Get strings from addons' bl_info.
+ import addon_utils
+ for module in addon_utils.modules():
+ if module.bl_info['support'] != 'OFFICIAL':
+ continue
+ dump_addon_bl_info(msgs, reports, module, settings)
+
# Get strings from addons' categories.
for uid, label, tip in bpy.types.WindowManager.addon_filter.keywords['items'](
bpy.context.window_manager,
@@ -1041,6 +1078,9 @@ def dump_addon_messages(module_name, do_checks, settings):
reports["check_ctxt"] = check_ctxt
dump_py_messages(msgs, reports, {addon}, settings, addons_only=True)
+ # Get strings from the addon's bl_info
+ dump_addon_bl_info(msgs, reports, addon, settings)
+
pot.unescape() # Strings gathered in py/C source code may contain escaped chars...
print_info(reports, pot)
diff --git a/release/scripts/modules/bl_i18n_utils/settings.py b/release/scripts/modules/bl_i18n_utils/settings.py
index 05db4df7cd2..a8a3ed9f4b7 100644
--- a/release/scripts/modules/bl_i18n_utils/settings.py
+++ b/release/scripts/modules/bl_i18n_utils/settings.py
@@ -49,7 +49,7 @@ LANGUAGES = (
(15, "Russian (Русский)", "ru_RU"),
(16, "Croatian (Hrvatski)", "hr_HR"),
(17, "Serbian (Српски)", "sr_RS"),
- (18, "Ukrainian (Український)", "uk_UA"),
+ (18, "Ukrainian (Українська)", "uk_UA"),
(19, "Polish (Polski)", "pl_PL"),
(20, "Romanian (Român)", "ro_RO"),
# Using the utf8 flipped form of Arabic (العربية).
@@ -87,7 +87,7 @@ LANGUAGES = (
# Default context, in py (keep in sync with `BLT_translation.h`)!
if bpy is not None:
- assert(bpy.app.translations.contexts.default == "*")
+ assert bpy.app.translations.contexts.default == "*"
DEFAULT_CONTEXT = "*"
# Name of language file used by Blender to generate translations' menu.
@@ -318,6 +318,7 @@ WARN_MSGID_NOT_CAPITALIZED_ALLOWED = {
"glTF 2.0 (.glb/.gltf)",
"glTF Binary (.glb)",
"glTF Embedded (.gltf)",
+ "glTF Material Output",
"glTF Original PBR data",
"glTF Separate (.gltf + .bin + textures)",
"invoke() needs to be called before execute()",
@@ -368,10 +369,11 @@ WARN_MSGID_NOT_CAPITALIZED_ALLOWED = {
"and AMD Radeon Pro 21.Q4 driver or newer",
"and Linux driver version xx.xx.23570 or newer",
"and NVIDIA driver version 470 or newer",
- "and Windows driver version 101.1660 or newer",
+ "and Windows driver version 101.3268 or newer",
"available with",
"brown fox",
"can't save image while rendering",
+ "category",
"constructive modifier",
"cursor",
"custom",
@@ -398,6 +400,7 @@ WARN_MSGID_NOT_CAPITALIZED_ALLOWED = {
"local",
"matrices", "no matrices",
"multi-res modifier",
+ "name",
"non-triangle face",
"normal",
"or AMD with macOS 12.3 or newer",
@@ -423,6 +426,7 @@ WARN_MSGID_NOT_CAPITALIZED_ALLOWED = {
"unsupported format",
"unsupported image format",
"unsupported movie clip format",
+ "untitled",
"vertex data",
"verts only",
"view",
@@ -544,6 +548,7 @@ CUSTOM_PY_UI_FILES = [
os.path.join("scripts", "startup", "bl_ui"),
os.path.join("scripts", "startup", "bl_operators"),
os.path.join("scripts", "modules", "rna_prop_ui.py"),
+ os.path.join("scripts", "presets", "keyconfig"),
]
# An optional text file listing files to force include/exclude from py_xgettext process.
diff --git a/release/scripts/modules/bl_i18n_utils/utils.py b/release/scripts/modules/bl_i18n_utils/utils.py
index 324c3ea261d..784b206fb84 100644
--- a/release/scripts/modules/bl_i18n_utils/utils.py
+++ b/release/scripts/modules/bl_i18n_utils/utils.py
@@ -68,7 +68,7 @@ def locale_explode(locale):
try:
import bpy.app.translations as bpy_translations
- assert(ret == bpy_translations.locale_explode(locale))
+ assert ret == bpy_translations.locale_explode(locale)
except ModuleNotFoundError:
pass
diff --git a/release/scripts/modules/bl_i18n_utils/utils_languages_menu.py b/release/scripts/modules/bl_i18n_utils/utils_languages_menu.py
index 833c46a732e..428b00ebc6c 100755
--- a/release/scripts/modules/bl_i18n_utils/utils_languages_menu.py
+++ b/release/scripts/modules/bl_i18n_utils/utils_languages_menu.py
@@ -9,12 +9,12 @@ import os
OK = 0
MISSING = 1
TOOLOW = 2
-FORBIDDEN = 3
+SKIPPED = 3
FLAG_MESSAGES = {
OK: "",
- MISSING: "No translation yet!",
- TOOLOW: "Not enough advanced to be included...",
- FORBIDDEN: "Explicitly forbidden!",
+ MISSING: "No translation yet.",
+ TOOLOW: "Not complete enough to be included.",
+ SKIPPED: "Skipped (see IMPORT_LANGUAGES_SKIP in settings.py).",
}
@@ -25,7 +25,7 @@ def gen_menu_file(stats, settings):
for uid_num, label, uid in settings.LANGUAGES:
if uid in stats:
if uid in settings.IMPORT_LANGUAGES_SKIP:
- tmp.append((stats[uid], uid_num, label, uid, FORBIDDEN))
+ tmp.append((stats[uid], uid_num, label, uid, SKIPPED))
else:
tmp.append((stats[uid], uid_num, label, uid, OK))
else:
diff --git a/release/scripts/modules/bl_i18n_utils/utils_spell_check.py b/release/scripts/modules/bl_i18n_utils/utils_spell_check.py
index a2fe2dd42ba..a93f1323562 100644
--- a/release/scripts/modules/bl_i18n_utils/utils_spell_check.py
+++ b/release/scripts/modules/bl_i18n_utils/utils_spell_check.py
@@ -750,6 +750,7 @@ class SpellChecker:
"unix",
"uuid",
"vbo", "vbos",
+ "vfx",
"vr",
"wxyz",
"xr",
diff --git a/release/scripts/modules/bl_keymap_utils/io.py b/release/scripts/modules/bl_keymap_utils/io.py
index 5d74ffbcf56..8d849498bd7 100644
--- a/release/scripts/modules/bl_keymap_utils/io.py
+++ b/release/scripts/modules/bl_keymap_utils/io.py
@@ -229,7 +229,7 @@ def keyconfig_export_as_data(wm, kc, filepath, *, all_keymaps=False):
# Take care making changes that could impact performance.
def _init_properties_from_data(base_props, base_value):
- assert(type(base_value) is list)
+ assert type(base_value) is list
for attr, value in base_value:
if type(value) is list:
base_props.property_unset(attr)
diff --git a/release/scripts/modules/bl_keymap_utils/keymap_from_toolbar.py b/release/scripts/modules/bl_keymap_utils/keymap_from_toolbar.py
index f75a38c1c66..09a55827128 100644
--- a/release/scripts/modules/bl_keymap_utils/keymap_from_toolbar.py
+++ b/release/scripts/modules/bl_keymap_utils/keymap_from_toolbar.py
@@ -173,7 +173,7 @@ def generate(context, space_type, *, use_fallback_keys=True, use_reset=True):
mode = context.active_object.mode
# See: BKE_paint_get_tool_prop_id_from_paintmode
if space_type == 'IMAGE_EDITOR':
- if context.space_data.ui_mode == 'PAINT':
+ if context.space_data.mode == 'PAINT':
attr = "image_tool"
else:
attr = None
@@ -200,7 +200,7 @@ def generate(context, space_type, *, use_fallback_keys=True, use_reset=True):
properties=kmi_hack_brush_select_properties,
include={'KEYBOARD'},
)[1]
- elif mode in {'PARTICLE_EDIT', 'SCULPT_GPENCIL'}:
+ elif mode in {'EDIT', 'PARTICLE_EDIT', 'SCULPT_GPENCIL'}:
# Doesn't use brushes
pass
else:
diff --git a/release/scripts/modules/bpy/utils/__init__.py b/release/scripts/modules/bpy/utils/__init__.py
index 54fcb4cdc67..22577dbd1cf 100644
--- a/release/scripts/modules/bpy/utils/__init__.py
+++ b/release/scripts/modules/bpy/utils/__init__.py
@@ -61,9 +61,18 @@ import sys as _sys
import addon_utils as _addon_utils
_preferences = _bpy.context.preferences
-_script_module_dirs = "startup", "modules"
_is_factory_startup = _bpy.app.factory_startup
+# Directories added to the start of `sys.path` for all of Blender's "scripts" directories.
+_script_module_dirs = "startup", "modules"
+
+# Base scripts, this points to the directory containing: "modules" & "startup" (see `_script_module_dirs`).
+# In Blender's code-base this is `./release/scripts`.
+#
+# NOTE: in virtually all cases this should match `BLENDER_SYSTEM_SCRIPTS` as this script is it's self a system script,
+# it must be in the `BLENDER_SYSTEM_SCRIPTS` by definition and there is no need for a look-up from `_bpy_script_paths`.
+_script_base_dir = _os.path.dirname(_os.path.dirname(_os.path.dirname(_os.path.dirname(__file__))))
+
def execfile(filepath, *, mod=None):
"""
@@ -324,12 +333,6 @@ def load_scripts(*, reload_scripts=False, refresh_scripts=False):
)
-# base scripts
-_scripts = (
- _os.path.dirname(_os.path.dirname(_os.path.dirname(__file__))),
-)
-
-
def script_path_user():
"""returns the env var and falls back to home dir or None"""
path = _user_resource('SCRIPTS')
@@ -350,60 +353,55 @@ def script_paths(*, subdir=None, user_pref=True, check_all=False, use_user=True)
:type subdir: string
:arg user_pref: Include the user preference script path.
:type user_pref: bool
- :arg check_all: Include local, user and system paths rather just the paths
- blender uses.
+ :arg check_all: Include local, user and system paths rather just the paths Blender uses.
:type check_all: bool
:return: script paths.
:rtype: list
"""
- scripts = list(_scripts)
- # Only paths Blender uses.
- #
- # Needed this is needed even when 'check_all' is enabled,
- # so the 'BLENDER_SYSTEM_SCRIPTS' environment variable will be used.
- base_paths = _bpy_script_paths()
+ if check_all or use_user:
+ path_system, path_user = _bpy_script_paths()
- # Defined to be (system, user) so we can skip the second if needed.
- if not use_user:
- base_paths = base_paths[:1]
+ base_paths = []
if check_all:
- # All possible paths, no duplicates, keep order.
+ # Order: 'LOCAL', 'USER', 'SYSTEM' (where user is optional).
+ if path_local := resource_path('LOCAL'):
+ base_paths.append(_os.path.join(path_local, "scripts"))
if use_user:
- test_paths = ('LOCAL', 'USER', 'SYSTEM')
- else:
- test_paths = ('LOCAL', 'SYSTEM')
-
- base_paths = (
- *(path for path in (
- _os.path.join(resource_path(res), "scripts")
- for res in test_paths) if path not in base_paths),
- *base_paths,
- )
-
- test_paths = (
- *base_paths,
- *((script_path_user(),) if use_user else ()),
- *((script_path_pref(),) if user_pref else ()),
- )
+ base_paths.append(path_user)
+ base_paths.append(path_system) # Same as: `system_resource('SCRIPTS')`.
- for path in test_paths:
- if path:
- path = _os.path.normpath(path)
- if path not in scripts and _os.path.isdir(path):
- scripts.append(path)
+ # Note that `_script_base_dir` may be either:
+ # - `os.path.join(bpy.utils.resource_path('LOCAL'), "scripts")`
+ # - `bpy.utils.system_resource('SCRIPTS')`.
+ # When `check_all` is enabled duplicate paths will be added however
+ # paths are de-duplicated so it wont cause problems.
+ base_paths.append(_script_base_dir)
- if subdir is None:
- return scripts
+ if not check_all:
+ if use_user:
+ base_paths.append(path_user)
- scripts_subdir = []
- for path in scripts:
- path_subdir = _os.path.join(path, subdir)
- if _os.path.isdir(path_subdir):
- scripts_subdir.append(path_subdir)
+ if user_pref:
+ base_paths.append(script_path_pref())
+
+ scripts = []
+ for path in base_paths:
+ if not path:
+ continue
+
+ path = _os.path.normpath(path)
+ if subdir is not None:
+ path = _os.path.join(path, subdir)
+
+ if path in scripts:
+ continue
+ if not _os.path.isdir(path):
+ continue
+ scripts.append(path)
- return scripts_subdir
+ return scripts
def refresh_script_paths():
diff --git a/release/scripts/modules/bpy_extras/io_utils.py b/release/scripts/modules/bpy_extras/io_utils.py
index 0497d69162e..b6da6c7768c 100644
--- a/release/scripts/modules/bpy_extras/io_utils.py
+++ b/release/scripts/modules/bpy_extras/io_utils.py
@@ -21,6 +21,7 @@ from bpy.props import (
EnumProperty,
StringProperty,
)
+from bpy.app.translations import pgettext_data as data_
def _check_axis_conversion(op):
@@ -56,7 +57,7 @@ class ExportHelper:
if not self.filepath:
blend_filepath = context.blend_data.filepath
if not blend_filepath:
- blend_filepath = "untitled"
+ blend_filepath = data_("untitled")
else:
blend_filepath = os.path.splitext(blend_filepath)[0]
@@ -294,7 +295,7 @@ def axis_conversion(from_forward='Y', from_up='Z', to_forward='Y', to_up='Z'):
for i, axis_lut in enumerate(_axis_convert_lut):
if value in axis_lut:
return Matrix(_axis_convert_matrix[i])
- assert(0)
+ assert 0
def axis_conversion_ensure(operator, forward_attr, up_attr):
diff --git a/release/scripts/modules/bpy_extras/mesh_utils.py b/release/scripts/modules/bpy_extras/mesh_utils.py
index f6dc33e4f02..d593ce6a1e4 100644
--- a/release/scripts/modules/bpy_extras/mesh_utils.py
+++ b/release/scripts/modules/bpy_extras/mesh_utils.py
@@ -13,14 +13,22 @@ __all__ = (
def mesh_linked_uv_islands(mesh):
"""
- Splits the mesh into connected polygons, use this for separating cubes from
- other mesh elements within 1 mesh datablock.
+ Returns lists of polygon indices connected by UV islands.
:arg mesh: the mesh used to group with.
:type mesh: :class:`bpy.types.Mesh`
- :return: lists of lists containing polygon indices
+ :return: list of lists containing polygon indices
:rtype: list
"""
+
+ if mesh.polygons and not mesh.uv_layers.active.data:
+ # Currently, when in edit mode, UV Layer data will always be empty
+ # when accessed though RNA. This may change in the future.
+ raise ValueError(
+ "UV Layers are not currently available from python in Edit Mode. "
+ "Use bmesh and bpy_extras.bmesh_utils.bmesh_linked_uv_islands instead."
+ )
+
uv_loops = [luv.uv[:] for luv in mesh.uv_layers.active.data]
poly_loops = [poly.loop_indices for poly in mesh.polygons]
luv_hash = {}
diff --git a/release/scripts/modules/bpy_extras/node_shader_utils.py b/release/scripts/modules/bpy_extras/node_shader_utils.py
index cda291c6c90..0c349084220 100644
--- a/release/scripts/modules/bpy_extras/node_shader_utils.py
+++ b/release/scripts/modules/bpy_extras/node_shader_utils.py
@@ -13,7 +13,7 @@ def _set_check(func):
@wraps(func)
def wrapper(self, *args, **kwargs):
if self.is_readonly:
- assert(not "Trying to set value to read-only shader!")
+ assert not "Trying to set value to read-only shader!"
return
return func(self, *args, **kwargs)
return wrapper
diff --git a/release/scripts/modules/bpy_extras/wm_utils/progress_report.py b/release/scripts/modules/bpy_extras/wm_utils/progress_report.py
index 637d60838db..371d598042c 100644
--- a/release/scripts/modules/bpy_extras/wm_utils/progress_report.py
+++ b/release/scripts/modules/bpy_extras/wm_utils/progress_report.py
@@ -93,7 +93,7 @@ class ProgressReport:
def leave_substeps(self, msg=""):
if (msg):
self.update(msg)
- assert(len(self.steps) > 1)
+ assert len(self.steps) > 1
del self.steps[-1]
del self.curr_step[-1]
del self.start_time[-1]
@@ -134,7 +134,7 @@ class ProgressReportSubstep:
return self
def __exit__(self, exc_type, exc_value, traceback):
- assert(len(self.progress.steps) > self.level)
+ assert len(self.progress.steps) > self.level
while len(self.progress.steps) > self.level + 1:
self.progress.leave_substeps()
self.progress.leave_substeps(self.final_msg)
diff --git a/release/scripts/modules/bpy_types.py b/release/scripts/modules/bpy_types.py
index 87b32eb1f40..d8d6a9123f2 100644
--- a/release/scripts/modules/bpy_types.py
+++ b/release/scripts/modules/bpy_types.py
@@ -742,7 +742,6 @@ class Gizmo(StructRNA):
matrix = self.matrix_world
batch, shader = shape
- shader.bind()
if select_id is not None:
gpu.select.load_id(select_id)
@@ -793,7 +792,7 @@ class Gizmo(StructRNA):
vbo = GPUVertBuf(len=len(verts), format=fmt)
vbo.attr_fill(id=pos_id, data=verts)
batch = GPUBatch(type=type, buf=vbo)
- shader = gpu.shader.from_builtin('3D_UNIFORM_COLOR' if dims == 3 else '2D_UNIFORM_COLOR')
+ shader = gpu.shader.from_builtin('UNIFORM_COLOR')
batch.program_set(shader)
return (batch, shader)
diff --git a/release/scripts/modules/console_python.py b/release/scripts/modules/console_python.py
index 2aa4caab7f6..5cf55d3c3b5 100644
--- a/release/scripts/modules/console_python.py
+++ b/release/scripts/modules/console_python.py
@@ -325,7 +325,7 @@ def banner(context):
"PYTHON INTERACTIVE CONSOLE %s" % version_string,
"",
"Builtin Modules: "
- "bpy, bpy.data, bpy.ops, bpy.props, bpy.types, bpy.context, bpy.utils, bgl, blf, mathutils",
+ "bpy, bpy.data, bpy.ops, bpy.props, bpy.types, bpy.context, bpy.utils, bgl, gpu, blf, mathutils",
"Convenience Imports: from mathutils import *; from math import *",
"Convenience Variables: C = bpy.context, D = bpy.data",
diff --git a/release/scripts/modules/gpu_extras/batch.py b/release/scripts/modules/gpu_extras/batch.py
index 34dd1f16665..ba8e3879a8e 100644
--- a/release/scripts/modules/gpu_extras/batch.py
+++ b/release/scripts/modules/gpu_extras/batch.py
@@ -22,15 +22,46 @@ def batch_for_shader(shader, type, content, *, indices=None):
GPUBatch,
GPUIndexBuf,
GPUVertBuf,
+ GPUVertFormat,
)
+ def recommended_comp_type(attr_type):
+ if attr_type in {'FLOAT', 'VEC2', 'VEC3', 'VEC4', 'MAT3', 'MAT4'}:
+ return 'F32'
+ if attr_type in {'UINT', 'UVEC2', 'UVEC3', 'UVEC4'}:
+ return 'U32'
+ # `attr_type` in {'INT', 'IVEC2', 'IVEC3', 'IVEC4', 'BOOL'}.
+ return 'I32'
+
+ def recommended_attr_len(attr_name):
+ item = content[attr_name][0]
+ attr_len = 1
+ try:
+ while True:
+ attr_len *= len(item)
+ item = item[0]
+ except TypeError:
+ pass
+ return attr_len
+
+ def recommended_fetch_mode(comp_type):
+ if comp_type == 'F32':
+ return 'FLOAT'
+ return 'INT'
+
for data in content.values():
vbo_len = len(data)
break
else:
raise ValueError("Empty 'content'")
- vbo_format = shader.format_calc()
+ vbo_format = GPUVertFormat()
+ attrs_info = shader.attrs_info_get()
+ for name, attr_type in attrs_info:
+ comp_type = recommended_comp_type(attr_type)
+ attr_len = recommended_attr_len(name)
+ vbo_format.attr_add(id=name, comp_type=comp_type, len=attr_len, fetch_mode=recommended_fetch_mode(comp_type))
+
vbo = GPUVertBuf(vbo_format, vbo_len)
for id, data in content.items():
diff --git a/release/scripts/modules/gpu_extras/presets.py b/release/scripts/modules/gpu_extras/presets.py
index eba8d6c161d..f0d80e855c1 100644
--- a/release/scripts/modules/gpu_extras/presets.py
+++ b/release/scripts/modules/gpu_extras/presets.py
@@ -42,7 +42,7 @@ def draw_circle_2d(position, color, radius, *, segments=None):
vbo = GPUVertBuf(len=len(verts), format=fmt)
vbo.attr_fill(id=pos_id, data=verts)
batch = GPUBatch(type='LINE_STRIP', buf=vbo)
- shader = gpu.shader.from_builtin('2D_UNIFORM_COLOR')
+ shader = gpu.shader.from_builtin('UNIFORM_COLOR')
batch.program_set(shader)
shader.uniform_float("color", color)
batch.draw()
@@ -67,7 +67,7 @@ def draw_texture_2d(texture, position, width, height):
coords = ((0, 0), (1, 0), (1, 1), (0, 1))
- shader = gpu.shader.from_builtin('2D_IMAGE')
+ shader = gpu.shader.from_builtin('IMAGE')
batch = batch_for_shader(
shader, 'TRI_FAN',
{"pos": coords, "texCoord": coords},
@@ -77,8 +77,7 @@ def draw_texture_2d(texture, position, width, height):
gpu.matrix.translate(position)
gpu.matrix.scale((width, height))
- shader = gpu.shader.from_builtin('2D_IMAGE')
- shader.bind()
+ shader = gpu.shader.from_builtin('IMAGE')
if isinstance(texture, int):
# Call the legacy bgl to not break the existing API
diff --git a/release/scripts/modules/rna_manual_reference.py b/release/scripts/modules/rna_manual_reference.py
index 1232ead8101..10925e78ef3 100644
--- a/release/scripts/modules/rna_manual_reference.py
+++ b/release/scripts/modules/rna_manual_reference.py
@@ -60,6 +60,7 @@ url_manual_mapping = (
("bpy.types.fluiddomainsettings.sndparticle_sampling_trappedair*", "physics/fluid/type/domain/liquid/particles.html#bpy-types-fluiddomainsettings-sndparticle-sampling-trappedair"),
("bpy.types.fluiddomainsettings.sndparticle_sampling_wavecrest*", "physics/fluid/type/domain/liquid/particles.html#bpy-types-fluiddomainsettings-sndparticle-sampling-wavecrest"),
("bpy.types.lineartgpencilmodifier.use_image_boundary_trimming*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-use-image-boundary-trimming"),
+ ("bpy.types.materiallineart.use_intersection_priority_override*", "render/materials/line_art.html#bpy-types-materiallineart-use-intersection-priority-override"),
("bpy.types.rigidbodyconstraint.use_override_solver_iterations*", "physics/rigid_body/constraints/introduction.html#bpy-types-rigidbodyconstraint-use-override-solver-iterations"),
("bpy.types.toolsettings.use_transform_correct_face_attributes*", "modeling/meshes/tools/tool_settings.html#bpy-types-toolsettings-use-transform-correct-face-attributes"),
("bpy.types.brushcurvessculptsettings.interpolate_point_count*", "sculpt_paint/curves_sculpting/tools/add_curves.html#bpy-types-brushcurvessculptsettings-interpolate-point-count"),
@@ -71,6 +72,7 @@ url_manual_mapping = (
("bpy.types.cyclesrendersettings.preview_denoising_prefilter*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-preview-denoising-prefilter"),
("bpy.types.cyclesrendersettings.preview_scrambling_distance*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-preview-scrambling-distance"),
("bpy.types.fluiddomainsettings.sndparticle_potential_radius*", "physics/fluid/type/domain/liquid/particles.html#bpy-types-fluiddomainsettings-sndparticle-potential-radius"),
+ ("bpy.types.objectlineart.use_intersection_priority_override*", "scene_layout/object/properties/line_art.html#bpy-types-objectlineart-use-intersection-priority-override"),
("bpy.types.brushgpencilsettings.use_stroke_random_strength*", "grease_pencil/modes/draw/tools/draw.html#bpy-types-brushgpencilsettings-use-stroke-random-strength"),
("bpy.types.cyclesrendersettings.film_transparent_roughness*", "render/cycles/render_settings/film.html#bpy-types-cyclesrendersettings-film-transparent-roughness"),
("bpy.types.cyclesrendersettings.preview_adaptive_threshold*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-preview-adaptive-threshold"),
@@ -88,6 +90,7 @@ url_manual_mapping = (
("bpy.types.brushgpencilsettings.use_random_press_strength*", "grease_pencil/modes/draw/tools/draw.html#bpy-types-brushgpencilsettings-use-random-press-strength"),
("bpy.types.fluiddomainsettings.use_collision_border_front*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-use-collision-border-front"),
("bpy.types.fluiddomainsettings.use_collision_border_right*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-use-collision-border-right"),
+ ("bpy.types.lineartgpencilmodifier.shadow_region_filtering*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-shadow-region-filtering"),
("bpy.types.sequencertimelineoverlay.waveform_display_type*", "editors/video_sequencer/sequencer/display.html#bpy-types-sequencertimelineoverlay-waveform-display-type"),
("bpy.types.view3doverlay.use_normals_constant_screen_size*", "editors/3dview/display/overlays.html#bpy-types-view3doverlay-use-normals-constant-screen-size"),
("bpy.types.brushgpencilsettings.random_saturation_factor*", "grease_pencil/modes/draw/tools/draw.html#bpy-types-brushgpencilsettings-random-saturation-factor"),
@@ -109,6 +112,7 @@ url_manual_mapping = (
("bpy.types.brushgpencilsettings.eraser_thickness_factor*", "grease_pencil/modes/draw/tools/erase.html#bpy-types-brushgpencilsettings-eraser-thickness-factor"),
("bpy.types.brushgpencilsettings.use_random_press_radius*", "grease_pencil/modes/draw/tools/draw.html#bpy-types-brushgpencilsettings-use-random-press-radius"),
("bpy.types.brushgpencilsettings.use_settings_stabilizer*", "grease_pencil/modes/draw/tools/draw.html#bpy-types-brushgpencilsettings-use-settings-stabilizer"),
+ ("bpy.types.collection.use_lineart_intersection_priority*", "scene_layout/collections/collections.html#bpy-types-collection-use-lineart-intersection-priority"),
("bpy.types.colormanagedsequencercolorspacesettings.name*", "render/color_management.html#bpy-types-colormanagedsequencercolorspacesettings-name"),
("bpy.types.cyclesrendersettings.max_transparent_bounces*", "render/cycles/render_settings/light_paths.html#bpy-types-cyclesrendersettings-max-transparent-bounces"),
("bpy.types.cyclesrendersettings.min_transparent_bounces*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-min-transparent-bounces"),
@@ -118,6 +122,7 @@ url_manual_mapping = (
("bpy.types.lineartgpencilmodifier.use_back_face_culling*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-use-back-face-culling"),
("bpy.types.lineartgpencilmodifier.use_intersection_mask*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-use-intersection-mask"),
("bpy.types.lineartgpencilmodifier.use_invert_collection*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-use-invert-collection"),
+ ("bpy.types.lineartgpencilmodifier.use_invert_silhouette*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-use-invert-silhouette"),
("bpy.types.movietrackingsettings.use_keyframe_selection*", "movie_clip/tracking/clip/toolbar/solve.html#bpy-types-movietrackingsettings-use-keyframe-selection"),
("bpy.types.rendersettings.simplify_gpencil_antialiasing*", "render/cycles/render_settings/simplify.html#bpy-types-rendersettings-simplify-gpencil-antialiasing"),
("bpy.types.sequencertimelineoverlay.show_strip_duration*", "editors/video_sequencer/sequencer/display.html#bpy-types-sequencertimelineoverlay-show-strip-duration"),
@@ -132,6 +137,8 @@ url_manual_mapping = (
("bpy.types.cyclesrendersettings.film_transparent_glass*", "render/cycles/render_settings/film.html#bpy-types-cyclesrendersettings-film-transparent-glass"),
("bpy.types.cyclesrendersettings.offscreen_dicing_scale*", "render/cycles/render_settings/subdivision.html#bpy-types-cyclesrendersettings-offscreen-dicing-scale"),
("bpy.types.fluiddomainsettings.sndparticle_bubble_drag*", "physics/fluid/type/domain/liquid/particles.html#bpy-types-fluiddomainsettings-sndparticle-bubble-drag"),
+ ("bpy.types.lineartgpencilmodifier.light_contour_object*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-light-contour-object"),
+ ("bpy.types.lineartgpencilmodifier.silhouette_filtering*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-silhouette-filtering"),
("bpy.types.lineartgpencilmodifier.use_crease_on_smooth*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-use-crease-on-smooth"),
("bpy.types.lineartgpencilmodifier.use_face_mark_invert*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-use-face-mark-invert"),
("bpy.types.linestylegeometrymodifier_backbonestretcher*", "render/freestyle/view_layer/line_style/modifiers/geometry/backbone_stretcher.html#bpy-types-linestylegeometrymodifier-backbonestretcher"),
@@ -165,7 +172,7 @@ url_manual_mapping = (
("bpy.types.sequencertimelineoverlay.show_strip_source*", "editors/video_sequencer/sequencer/display.html#bpy-types-sequencertimelineoverlay-show-strip-source"),
("bpy.types.toolsettings.use_gpencil_automerge_strokes*", "grease_pencil/modes/draw/introduction.html#bpy-types-toolsettings-use-gpencil-automerge-strokes"),
("bpy.types.toolsettings.use_proportional_edit_objects*", "editors/3dview/controls/proportional_editing.html#bpy-types-toolsettings-use-proportional-edit-objects"),
- ("bpy.ops.outliner.liboverride_troubleshoot_operation*", "files/linked_libraries/library_overrides.html#bpy-ops-outliner-liboverride_troubleshoot_operation"),
+ ("bpy.ops.outliner.liboverride_troubleshoot_operation*", "files/linked_libraries/library_overrides.html#bpy-ops-outliner-liboverride-troubleshoot-operation"),
("bpy.ops.view3d.edit_mesh_extrude_move_shrink_fatten*", "modeling/meshes/editing/face/extrude_faces_normal.html#bpy-ops-view3d-edit-mesh-extrude-move-shrink-fatten"),
("bpy.types.brushgpencilsettings.active_smooth_factor*", "grease_pencil/modes/draw/tools/draw.html#bpy-types-brushgpencilsettings-active-smooth-factor"),
("bpy.types.brushgpencilsettings.extend_stroke_factor*", "grease_pencil/modes/draw/tools/fill.html#bpy-types-brushgpencilsettings-extend-stroke-factor"),
@@ -191,6 +198,8 @@ url_manual_mapping = (
("bpy.types.freestylelineset.select_material_boundary*", "render/freestyle/view_layer/line_set.html#bpy-types-freestylelineset-select-material-boundary"),
("bpy.types.gpencillayer.annotation_onion_after_color*", "interface/annotate_tool.html#bpy-types-gpencillayer-annotation-onion-after-color"),
("bpy.types.gpencillayer.annotation_onion_after_range*", "interface/annotate_tool.html#bpy-types-gpencillayer-annotation-onion-after-range"),
+ ("bpy.types.lineartgpencilmodifier.shadow_camera_near*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-shadow-camera-near"),
+ ("bpy.types.lineartgpencilmodifier.shadow_camera_size*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-shadow-camera-size"),
("bpy.types.materialgpencilstyle.use_fill_texture_mix*", "grease_pencil/materials/properties.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"),
@@ -206,6 +215,7 @@ url_manual_mapping = (
("bpy.types.brushgpencilsettings.use_jitter_pressure*", "grease_pencil/modes/draw/tools/draw.html#bpy-types-brushgpencilsettings-use-jitter-pressure"),
("bpy.types.brushgpencilsettings.use_random_press_uv*", "grease_pencil/modes/draw/tools/draw.html#bpy-types-brushgpencilsettings-use-random-press-uv"),
("bpy.types.brushgpencilsettings.use_settings_random*", "grease_pencil/modes/draw/tools/draw.html#bpy-types-brushgpencilsettings-use-settings-random"),
+ ("bpy.types.collection.lineart_intersection_priority*", "scene_layout/collections/collections.html#bpy-types-collection-lineart-intersection-priority"),
("bpy.types.collection.lineart_use_intersection_mask*", "scene_layout/collections/collections.html#bpy-types-collection-lineart-use-intersection-mask"),
("bpy.types.colormanagedinputcolorspacesettings.name*", "editors/image/image_settings.html#bpy-types-colormanagedinputcolorspacesettings-name"),
("bpy.types.cyclesrendersettings.denoising_prefilter*", "render/cycles/render_settings/sampling.html#bpy-types-cyclesrendersettings-denoising-prefilter"),
@@ -220,9 +230,12 @@ url_manual_mapping = (
("bpy.types.fluiddomainsettings.sys_particle_maximum*", "physics/fluid/type/domain/settings.html#bpy-types-fluiddomainsettings-sys-particle-maximum"),
("bpy.types.fluiddomainsettings.use_bubble_particles*", "physics/fluid/type/domain/liquid/particles.html#bpy-types-fluiddomainsettings-use-bubble-particles"),
("bpy.types.freestylelineset.select_external_contour*", "render/freestyle/view_layer/line_set.html#bpy-types-freestylelineset-select-external-contour"),
+ ("bpy.types.lineartgpencilmodifier.shadow_camera_far*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-shadow-camera-far"),
("bpy.types.lineartgpencilmodifier.use_custom_camera*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-use-custom-camera"),
+ ("bpy.types.lineartgpencilmodifier.use_light_contour*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-use-light-contour"),
("bpy.types.linestylegeometrymodifier_simplification*", "render/freestyle/view_layer/line_style/modifiers/geometry/simplification.html#bpy-types-linestylegeometrymodifier-simplification"),
("bpy.types.materialgpencilstyle.use_overlap_strokes*", "grease_pencil/materials/properties.html#bpy-types-materialgpencilstyle-use-overlap-strokes"),
+ ("bpy.types.movietrackingtrack.use_grayscale_preview*", "movie_clip/tracking/clip/sidebar/track/track.html#bpy-types-movietrackingtrack-use-grayscale-preview"),
("bpy.types.sequencertimelineoverlay.show_strip_name*", "editors/video_sequencer/sequencer/display.html#bpy-types-sequencertimelineoverlay-show-strip-name"),
("bpy.types.sequencertimelineoverlay.show_thumbnails*", "editors/video_sequencer/sequencer/display.html#bpy-types-sequencertimelineoverlay-show-thumbnails"),
("bpy.types.spacespreadsheet.geometry_component_type*", "editors/spreadsheet.html#bpy-types-spacespreadsheet-geometry-component-type"),
@@ -255,10 +268,13 @@ url_manual_mapping = (
("bpy.types.freestylesettings.kr_derivative_epsilon*", "render/freestyle/view_layer/freestyle.html#bpy-types-freestylesettings-kr-derivative-epsilon"),
("bpy.types.geometrynodecurveprimitivebeziersegment*", "modeling/geometry_nodes/curve_primitives/bezier_segment.html#bpy-types-geometrynodecurveprimitivebeziersegment"),
("bpy.types.geometrynodecurveprimitivequadrilateral*", "modeling/geometry_nodes/curve_primitives/quadrilateral.html#bpy-types-geometrynodecurveprimitivequadrilateral"),
+ ("bpy.types.lineartgpencilmodifier.crease_threshold*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-crease-threshold"),
("bpy.types.lineartgpencilmodifier.smooth_tolerance*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-smooth-tolerance"),
+ ("bpy.types.lineartgpencilmodifier.use_intersection*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-use-intersection"),
("bpy.types.linestylegeometrymodifier_perlinnoise1d*", "render/freestyle/view_layer/line_style/modifiers/geometry/perlin_noise_1d.html#bpy-types-linestylegeometrymodifier-perlinnoise1d"),
("bpy.types.linestylegeometrymodifier_perlinnoise2d*", "render/freestyle/view_layer/line_style/modifiers/geometry/perlin_noise_2d.html#bpy-types-linestylegeometrymodifier-perlinnoise2d"),
("bpy.types.materialgpencilstyle.use_stroke_holdout*", "grease_pencil/materials/properties.html#bpy-types-materialgpencilstyle-use-stroke-holdout"),
+ ("bpy.types.movietrackingplanetrack.use_auto_keying*", "movie_clip/tracking/clip/sidebar/track/plane_track.html#bpy-types-movietrackingplanetrack-use-auto-keying"),
("bpy.types.movietrackingsettings.use_tripod_solver*", "movie_clip/tracking/clip/toolbar/solve.html#bpy-types-movietrackingsettings-use-tripod-solver"),
("bpy.types.rendersettings.simplify_child_particles*", "render/cycles/render_settings/simplify.html#bpy-types-rendersettings-simplify-child-particles"),
("bpy.types.rendersettings.use_high_quality_normals*", "render/eevee/render_settings/performance.html#bpy-types-rendersettings-use-high-quality-normals"),
@@ -364,6 +380,8 @@ url_manual_mapping = (
("bpy.types.linestylegeometrymodifier_2dtransform*", "render/freestyle/view_layer/line_style/modifiers/geometry/2d_transform.html#bpy-types-linestylegeometrymodifier-2dtransform"),
("bpy.types.linestylegeometrymodifier_beziercurve*", "render/freestyle/view_layer/line_style/modifiers/geometry/bezier_curve.html#bpy-types-linestylegeometrymodifier-beziercurve"),
("bpy.types.materialgpencilstyle.use_fill_holdout*", "grease_pencil/materials/properties.html#bpy-types-materialgpencilstyle-use-fill-holdout"),
+ ("bpy.types.materiallineart.intersection_priority*", "render/materials/line_art.html#bpy-types-materiallineart-intersection-priority"),
+ ("bpy.types.movietrackingplanetrack.image_opacity*", "movie_clip/tracking/clip/sidebar/track/plane_track.html#bpy-types-movietrackingplanetrack-image-opacity"),
("bpy.types.particlesettings.use_parent_particles*", "physics/particles/emitter/render.html#bpy-types-particlesettings-use-parent-particles"),
("bpy.types.rigidbodyconstraint.solver_iterations*", "physics/rigid_body/constraints/introduction.html#bpy-types-rigidbodyconstraint-solver-iterations"),
("bpy.types.sequenceeditor.use_overlay_frame_lock*", "editors/video_sequencer/preview/sidebar.html#bpy-types-sequenceeditor-use-overlay-frame-lock"),
@@ -406,18 +424,25 @@ url_manual_mapping = (
("bpy.types.greasepencil.curve_edit_corner_angle*", "grease_pencil/modes/edit/curve_editing.html#bpy-types-greasepencil-curve-edit-corner-angle"),
("bpy.types.imageformatsettings.color_management*", "render/output/properties/output.html#bpy-types-imageformatsettings-color-management"),
("bpy.types.lineartgpencilmodifier.source_camera*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-source-camera"),
+ ("bpy.types.lineartgpencilmodifier.use_edge_mark*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-use-edge-mark"),
("bpy.types.lineartgpencilmodifier.use_face_mark*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-use-face-mark"),
("bpy.types.linestylegeometrymodifier_tipremover*", "render/freestyle/view_layer/line_style/modifiers/geometry/tip_remover.html#bpy-types-linestylegeometrymodifier-tipremover"),
("bpy.types.movieclipuser.use_render_undistorted*", "editors/clip/display/clip_display.html#bpy-types-movieclipuser-use-render-undistorted"),
+ ("bpy.types.moviesequence.animation_offset_start*", "editors/video_sequencer/sequencer/sidebar/strip.html#bpy-types-moviesequence-animation-offset-start"),
("bpy.types.movietrackingcamera.distortion_model*", "movie_clip/tracking/clip/sidebar/track/camera.html#bpy-types-movietrackingcamera-distortion-model"),
+ ("bpy.types.movietrackingtrack.use_alpha_preview*", "movie_clip/tracking/clip/sidebar/track/track.html#bpy-types-movietrackingtrack-use-alpha-preview"),
+ ("bpy.types.movietrackingtrack.use_green_channel*", "movie_clip/tracking/clip/sidebar/track/track.html#bpy-types-movietrackingtrack-use-green-channel"),
("bpy.types.rendersettings.resolution_percentage*", "render/output/properties/format.html#bpy-types-rendersettings-resolution-percentage"),
("bpy.types.rendersettings_simplify_gpencil_tint*", "render/cycles/render_settings/simplify.html#bpy-types-rendersettings-simplify-gpencil-tint"),
+ ("bpy.types.spaceimageeditor.show_gizmo_navigate*", "editors/image/introduction.html#bpy-types-spaceimageeditor-show-gizmo-navigate"),
("bpy.types.spaceoutliner.lib_override_view_mode*", "editors/outliner/interface.html#bpy-types-spaceoutliner-lib-override-view-mode"),
("bpy.types.spaceoutliner.use_filter_object_mesh*", "editors/outliner/interface.html#bpy-types-spaceoutliner-use-filter-object-mesh"),
("bpy.types.spaceoutliner.use_filter_view_layers*", "editors/outliner/interface.html#bpy-types-spaceoutliner-use-filter-view-layers"),
("bpy.types.spacesequenceeditor.show_overexposed*", "editors/video_sequencer/preview/sidebar.html#bpy-types-spacesequenceeditor-show-overexposed"),
+ ("bpy.types.toolsettings.snap_face_nearest_steps*", "editors/3dview/controls/snapping.html#bpy-types-toolsettings-snap-face-nearest-steps"),
("bpy.types.toolsettings.use_gpencil_draw_onback*", "grease_pencil/modes/draw/introduction.html#bpy-types-toolsettings-use-gpencil-draw-onback"),
("bpy.types.toolsettings.use_snap_align_rotation*", "editors/3dview/controls/snapping.html#bpy-types-toolsettings-use-snap-align-rotation"),
+ ("bpy.types.toolsettings.use_snap_to_same_target*", "editors/3dview/controls/snapping.html#bpy-types-toolsettings-use-snap-to-same-target"),
("bpy.types.viewlayer.use_pass_cryptomatte_asset*", "render/layers/passes.html#bpy-types-viewlayer-use-pass-cryptomatte-asset"),
("bpy.ops.outliner.collection_indirect_only_set*", "render/layers/introduction.html#bpy-ops-outliner-collection-indirect-only-set"),
("bpy.ops.scene.freestyle_geometry_modifier_add*", "render/freestyle/view_layer/line_style/geometry.html#bpy-ops-scene-freestyle-geometry-modifier-add"),
@@ -459,8 +484,12 @@ url_manual_mapping = (
("bpy.types.geometrynodedistributepointsonfaces*", "modeling/geometry_nodes/point/distribute_points_on_faces.html#bpy-types-geometrynodedistributepointsonfaces"),
("bpy.types.geometrynodesetcurvehandlepositions*", "modeling/geometry_nodes/curve/set_handle_positions.html#bpy-types-geometrynodesetcurvehandlepositions"),
("bpy.types.greasepencil.stroke_thickness_space*", "grease_pencil/properties/strokes.html#bpy-types-greasepencil-stroke-thickness-space"),
+ ("bpy.types.lineartgpencilmodifier.use_material*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-use-material"),
("bpy.types.linestylegeometrymodifier_blueprint*", "render/freestyle/view_layer/line_style/modifiers/geometry/blueprint.html#bpy-types-linestylegeometrymodifier-blueprint"),
("bpy.types.materialgpencilstyle.alignment_mode*", "grease_pencil/materials/properties.html#bpy-types-materialgpencilstyle-alignment-mode"),
+ ("bpy.types.movietrackingtrack.use_blue_channel*", "movie_clip/tracking/clip/sidebar/track/track.html#bpy-types-movietrackingtrack-use-blue-channel"),
+ ("bpy.types.movietrackingtrack.use_custom_color*", "movie_clip/tracking/clip/sidebar/track/track.html#bpy-types-movietrackingtrack-use-custom-color"),
+ ("bpy.types.objectlineart.intersection_priority*", "scene_layout/object/properties/line_art.html#bpy-types-objectlineart-intersection-priority"),
("bpy.types.particlesettings.use_modifier_stack*", "physics/particles/emitter/emission.html#bpy-types-particlesettings-use-modifier-stack"),
("bpy.types.rendersettings.sequencer_gl_preview*", "editors/video_sequencer/preview/sidebar.html#bpy-types-rendersettings-sequencer-gl-preview"),
("bpy.types.rendersettings.simplify_subdivision*", "render/cycles/render_settings/simplify.html#bpy-types-rendersettings-simplify-subdivision"),
@@ -522,9 +551,12 @@ url_manual_mapping = (
("bpy.types.geometrynodeinputshortestedgepaths*", "modeling/geometry_nodes/mesh/shortest_edge_paths.html#bpy-types-geometrynodeinputshortestedgepaths"),
("bpy.types.gpencilsculptguide.reference_point*", "grease_pencil/modes/draw/guides.html#bpy-types-gpencilsculptguide-reference-point"),
("bpy.types.greasepencil.edit_curve_resolution*", "grease_pencil/modes/edit/curve_editing.html#bpy-types-greasepencil-edit-curve-resolution"),
+ ("bpy.types.lineartgpencilmodifier.use_contour*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-use-contour"),
("bpy.types.linestylegeometrymodifier_2doffset*", "render/freestyle/view_layer/line_style/modifiers/geometry/2d_offset.html#bpy-types-linestylegeometrymodifier-2doffset"),
("bpy.types.linestylegeometrymodifier_sampling*", "render/freestyle/view_layer/line_style/modifiers/geometry/sampling.html#bpy-types-linestylegeometrymodifier-sampling"),
+ ("bpy.types.moviesequence.animation_offset_end*", "editors/video_sequencer/sequencer/sidebar/strip.html#bpy-types-moviesequence-animation-offset-end"),
("bpy.types.movietrackingdopesheet.sort_method*", "movie_clip/tracking/dope_sheet.html#bpy-types-movietrackingdopesheet-sort-method"),
+ ("bpy.types.movietrackingtrack.use_red_channel*", "movie_clip/tracking/clip/sidebar/track/track.html#bpy-types-movietrackingtrack-use-red-channel"),
("bpy.types.nodesocketinterface*.default_value*", "interface/controls/nodes/groups.html#bpy-types-nodesocketinterface-default-value"),
("bpy.types.rendersettings.line_thickness_mode*", "render/freestyle/render.html#bpy-types-rendersettings-line-thickness-mode"),
("bpy.types.rendersettings.motion_blur_shutter*", "render/cycles/render_settings/motion_blur.html#bpy-types-rendersettings-motion-blur-shutter"),
@@ -569,8 +601,11 @@ url_manual_mapping = (
("bpy.types.geometrynodeinputmeshfaceisplanar*", "modeling/geometry_nodes/mesh/face_is_planar.html#bpy-types-geometrynodeinputmeshfaceisplanar"),
("bpy.types.geometrynodeinputsplineresolution*", "modeling/geometry_nodes/curve/spline_resolution.html#bpy-types-geometrynodeinputsplineresolution"),
("bpy.types.greasepencil.curve_edit_threshold*", "grease_pencil/modes/edit/curve_editing.html#bpy-types-greasepencil-curve-edit-threshold"),
+ ("bpy.types.lineartgpencilmodifier.use_crease*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-use-crease"),
+ ("bpy.types.lineartgpencilmodifier.use_shadow*", "grease_pencil/modifiers/generate/line_art.html#bpy-types-lineartgpencilmodifier-use-shadow"),
("bpy.types.materialgpencilstyle.stroke_style*", "grease_pencil/materials/properties.html#bpy-types-materialgpencilstyle-stroke-style"),
("bpy.types.materiallineart.use_material_mask*", "render/materials/line_art.html#bpy-types-materiallineart-use-material-mask"),
+ ("bpy.types.movietracking.active_object_index*", "movie_clip/tracking/clip/sidebar/track/objects.html#bpy-types-movietracking-active-object-index"),
("bpy.types.objectlineart.use_crease_override*", "scene_layout/object/properties/line_art.html#bpy-types-objectlineart-use-crease-override"),
("bpy.types.rendersettings.preview_pixel_size*", "render/cycles/render_settings/performance.html#bpy-types-rendersettings-preview-pixel-size"),
("bpy.types.rendersettings.use_crop_to_border*", "render/output/properties/format.html#bpy-types-rendersettings-use-crop-to-border"),
@@ -578,7 +613,10 @@ url_manual_mapping = (
("bpy.types.sculpt.constant_detail_resolution*", "sculpt_paint/sculpting/tool_settings/dyntopo.html#bpy-types-sculpt-constant-detail-resolution"),
("bpy.types.sequencertoolsettings.pivot_point*", "editors/video_sequencer/preview/controls/pivot_point.html#bpy-types-sequencertoolsettings-pivot-point"),
("bpy.types.spaceclipeditor.annotation_source*", "movie_clip/tracking/clip/sidebar/view.html#bpy-types-spaceclipeditor-annotation-source"),
+ ("bpy.types.spaceclipeditor.mask_display_type*", "editors/clip/display/mask_display.html#bpy-types-spaceclipeditor-mask-display-type"),
+ ("bpy.types.spaceclipeditor.mask_overlay_mode*", "editors/clip/display/mask_display.html#bpy-types-spaceclipeditor-mask-overlay-mode"),
("bpy.types.spaceclipeditor.show_blue_channel*", "editors/clip/display/clip_display.html#bpy-types-spaceclipeditor-show-blue-channel"),
+ ("bpy.types.spaceclipeditor.show_mask_overlay*", "editors/clip/display/mask_display.html#bpy-types-spaceclipeditor-show-mask-overlay"),
("bpy.types.spacefilebrowser.system_bookmarks*", "editors/file_browser.html#bpy-types-spacefilebrowser-system-bookmarks"),
("bpy.types.spaceoutliner.use_filter_children*", "editors/outliner/interface.html#bpy-types-spaceoutliner-use-filter-children"),
("bpy.types.spaceoutliner.use_filter_complete*", "editors/outliner/interface.html#bpy-types-spaceoutliner-use-filter-complete"),
@@ -592,6 +630,7 @@ url_manual_mapping = (
("bpy.types.view3doverlay.wireframe_threshold*", "editors/3dview/display/overlays.html#bpy-types-view3doverlay-wireframe-threshold"),
("bpy.types.viewlayer.active_lightgroup_index*", "render/layers/passes.html#bpy-types-viewlayer-active-lightgroup-index"),
("bpy.ops.ed.lib_id_override_editable_toggle*", "editors/outliner/interface.html#bpy-ops-ed-lib-id-override-editable-toggle"),
+ ("bpy.ops.geometry.color_attribute_duplicate*", "modeling/meshes/properties/object_data.html#bpy-ops-geometry-color-attribute-duplicate"),
("bpy.ops.object.constraint_add_with_targets*", "animation/constraints/interface/adding_removing.html#bpy-ops-object-constraint-add-with-targets"),
("bpy.ops.object.material_slot_remove_unused*", "scene_layout/object/editing/cleanup.html#bpy-ops-object-material-slot-remove-unused"),
("bpy.ops.outliner.collection_disable_render*", "editors/outliner/editing.html#bpy-ops-outliner-collection-disable-render"),
@@ -646,11 +685,13 @@ url_manual_mapping = (
("bpy.types.posebone.use_ik_rotation_control*", "animation/armatures/posing/bone_constraints/inverse_kinematics/introduction.html#bpy-types-posebone-use-ik-rotation-control"),
("bpy.types.rendersettings.use_bake_multires*", "render/cycles/baking.html#bpy-types-rendersettings-use-bake-multires"),
("bpy.types.scenegpencil.antialias_threshold*", "render/cycles/render_settings/grease_pencil.html#bpy-types-scenegpencil-antialias-threshold"),
+ ("bpy.types.spaceclipeditor.show_mask_spline*", "editors/clip/display/mask_display.html#bpy-types-spaceclipeditor-show-mask-spline"),
("bpy.types.spaceclipeditor.show_red_channel*", "editors/clip/display/clip_display.html#bpy-types-spaceclipeditor-show-red-channel"),
("bpy.types.spaceclipeditor.use_mute_footage*", "editors/clip/display/clip_display.html#bpy-types-spaceclipeditor-use-mute-footage"),
("bpy.types.spacenodeoverlay.show_wire_color*", "interface/controls/nodes/introduction.html#bpy-types-spacenodeoverlay-show-wire-color"),
("bpy.types.spacesequenceeditor.display_mode*", "editors/video_sequencer/preview/display/display_mode.html#bpy-types-spacesequenceeditor-display-mode"),
("bpy.types.spaceview3d.show_object_viewport*", "editors/3dview/display/visibility.html#bpy-types-spaceview3d-show-object-viewport"),
+ ("bpy.types.toolsettings.use_snap_selectable*", "editors/3dview/controls/snapping.html#bpy-types-toolsettings-use-snap-selectable"),
("bpy.types.view3doverlay.show_fade_inactive*", "editors/3dview/display/overlays.html#bpy-types-view3doverlay-show-fade-inactive"),
("bpy.types.viewlayer.pass_cryptomatte_depth*", "render/layers/passes.html#bpy-types-viewlayer-pass-cryptomatte-depth"),
("bpy.ops.clip.stabilize_2d_rotation_select*", "movie_clip/tracking/clip/selecting.html#bpy-ops-clip-stabilize-2d-rotation-select"),
@@ -801,9 +842,11 @@ url_manual_mapping = (
("bpy.types.movietrackingcamera.division_k*", "movie_clip/tracking/clip/sidebar/track/camera.html#bpy-types-movietrackingcamera-division-k"),
("bpy.types.movietrackingobject.keyframe_a*", "movie_clip/tracking/clip/toolbar/solve.html#bpy-types-movietrackingobject-keyframe-a"),
("bpy.types.movietrackingobject.keyframe_b*", "movie_clip/tracking/clip/toolbar/solve.html#bpy-types-movietrackingobject-keyframe-b"),
+ ("bpy.types.movietrackingtrack.weight_stab*", "movie_clip/tracking/clip/sidebar/track/track.html#bpy-types-movietrackingtrack-weight-stab"),
("bpy.types.nodesocketinterface*.max_value*", "interface/controls/nodes/groups.html#bpy-types-nodesocketinterface-max-value"),
("bpy.types.nodesocketinterface*.min_value*", "interface/controls/nodes/groups.html#bpy-types-nodesocketinterface-min-value"),
("bpy.types.nodesocketinterface.hide_value*", "interface/controls/nodes/groups.html#bpy-types-nodesocketinterface-hide-value"),
+ ("bpy.types.object.use_shape_key_edit_mode*", "animation/shape_keys/shape_keys_panel.html#bpy-types-object-use-shape-key-edit-mode"),
("bpy.types.objectlineart.crease_threshold*", "scene_layout/object/properties/line_art.html#bpy-types-objectlineart-crease-threshold"),
("bpy.types.rendersettings.use_compositing*", "render/output/properties/post_processing.html#bpy-types-rendersettings-use-compositing"),
("bpy.types.rendersettings.use_motion_blur*", "render/cycles/render_settings/motion_blur.html#bpy-types-rendersettings-use-motion-blur"),
@@ -832,6 +875,7 @@ url_manual_mapping = (
("bpy.ops.poselib.restore_previous_action*", "animation/armatures/posing/editing/pose_library.html#bpy-ops-poselib-restore-previous-action"),
("bpy.ops.preferences.reset_default_theme*", "editors/preferences/themes.html#bpy-ops-preferences-reset-default-theme"),
("bpy.ops.scene.view_layer_add_lightgroup*", "render/layers/passes.html#bpy-ops-scene-view-layer-add-lightgroup"),
+ ("bpy.ops.sculpt.dyntopo_detail_size_edit*", "sculpt_paint/sculpting/tool_settings/dyntopo.html#bpy-ops-sculpt-dyntopo-detail-size-edit"),
("bpy.ops.sculpt_curves.min_distance_edit*", "sculpt_paint/curves_sculpting/tools/density_curves.html#bpy-ops-sculpt-curves-min-distance-edit"),
("bpy.ops.sequencer.strip_transform_clear*", "video_editing/edit/montage/editing.html#bpy-ops-sequencer-strip-transform-clear"),
("bpy.ops.spreadsheet.add_row_filter_rule*", "editors/spreadsheet.html#bpy-ops-spreadsheet-add-row-filter-rule"),
@@ -882,6 +926,7 @@ url_manual_mapping = (
("bpy.types.material.use_sss_translucency*", "render/eevee/materials/settings.html#bpy-types-material-use-sss-translucency"),
("bpy.types.materiallineart.mat_occlusion*", "render/materials/line_art.html#bpy-types-materiallineart-mat-occlusion"),
("bpy.types.movietrackingcamera.principal*", "movie_clip/tracking/clip/sidebar/track/camera.html#bpy-types-movietrackingcamera-principal"),
+ ("bpy.types.object.active_shape_key_index*", "animation/shape_keys/shape_keys_panel.html#bpy-types-object-active-shape-key-index"),
("bpy.types.object.use_camera_lock_parent*", "scene_layout/object/properties/relations.html#bpy-types-object-use-camera-lock-parent"),
("bpy.types.object.visible_volume_scatter*", "render/cycles/object_settings/object_data.html#bpy-types-object-visible-volume-scatter"),
("bpy.types.rendersettings.line_thickness*", "render/freestyle/render.html#bpy-types-rendersettings-line-thickness"),
@@ -889,6 +934,7 @@ url_manual_mapping = (
("bpy.types.rendersettings.pixel_aspect_y*", "render/output/properties/format.html#bpy-types-rendersettings-pixel-aspect-y"),
("bpy.types.rigidbodyconstraint.use_limit*", "physics/rigid_body/constraints/introduction.html#bpy-types-rigidbodyconstraint-use-limit"),
("bpy.types.sceneeevee.taa_render_samples*", "render/eevee/render_settings/sampling.html#bpy-types-sceneeevee-taa-render-samples"),
+ ("bpy.types.sequence.frame_final_duration*", "editors/video_sequencer/sequencer/sidebar/strip.html#bpy-types-sequence-frame-final-duration"),
("bpy.types.spaceoutliner.use_sync_select*", "editors/outliner/interface.html#bpy-types-spaceoutliner-use-sync-select"),
("bpy.types.spaceproperties.outliner_sync*", "editors/properties_editor.html#bpy-types-spaceproperties-outliner-sync"),
("bpy.types.spaceproperties.search_filter*", "editors/properties_editor.html#bpy-types-spaceproperties-search-filter"),
@@ -902,6 +948,7 @@ url_manual_mapping = (
("bpy.types.toolsettings.double_threshold*", "modeling/meshes/tools/tool_settings.html#bpy-types-toolsettings-double-threshold"),
("bpy.types.toolsettings.lock_object_mode*", "interface/window_system/topbar.html#bpy-types-toolsettings-lock-object-mode"),
("bpy.types.toolsettings.mesh_select_mode*", "modeling/meshes/selecting/introduction.html#bpy-types-toolsettings-mesh-select-mode"),
+ ("bpy.types.toolsettings.use_snap_nonedit*", "editors/3dview/controls/snapping.html#bpy-types-toolsettings-use-snap-nonedit"),
("bpy.types.toolsettings.use_snap_project*", "editors/3dview/controls/snapping.html#bpy-types-toolsettings-use-snap-project"),
("bpy.types.transformorientationslot.type*", "editors/3dview/controls/orientation.html#bpy-types-transformorientationslot-type"),
("bpy.types.unitsettings.temperature_unit*", "scene_layout/scene/properties.html#bpy-types-unitsettings-temperature-unit"),
@@ -909,10 +956,12 @@ url_manual_mapping = (
("bpy.types.view3doverlay.show_wireframes*", "editors/3dview/display/overlays.html#bpy-types-view3doverlay-show-wireframes"),
("bpy.types.view3dshading.background_type*", "editors/3dview/display/shading.html#bpy-types-view3dshading-background-type"),
("bpy.types.workspace.use_filter_by_owner*", "interface/window_system/workspaces.html#bpy-types-workspace-use-filter-by-owner"),
- ("bpy.ops.outliner.liboverride_operation*", "files/linked_libraries/library_overrides.html#bpy-ops-outliner-liboverride_operation"),
("bpy.ops.gpencil.image_to_grease_pencil*", "editors/image/editing.html#bpy-ops-gpencil-image-to-grease-pencil"),
("bpy.ops.mesh.vertices_smooth_laplacian*", "modeling/meshes/editing/vertex/laplacian_smooth.html#bpy-ops-mesh-vertices-smooth-laplacian"),
("bpy.ops.object.multires_rebuild_subdiv*", "modeling/modifiers/generate/multiresolution.html#bpy-ops-object-multires-rebuild-subdiv"),
+ ("bpy.ops.outliner.liboverride_operation*", "files/linked_libraries/library_overrides.html#bpy-ops-outliner-liboverride-operation"),
+ ("bpy.ops.screen.space_type_set_or_cycle*", "editors/index.html#bpy-ops-screen-space-type-set-or-cycle"),
+ ("bpy.ops.sculpt.dynamic_topology_toggle*", "sculpt_paint/sculpting/tool_settings/dyntopo.html#bpy-ops-sculpt-dynamic-topology-toggle"),
("bpy.ops.sequencer.select_side_of_frame*", "video_editing/edit/montage/selecting.html#bpy-ops-sequencer-select-side-of-frame"),
("bpy.types.animvizmotionpaths.frame_end*", "animation/motion_paths.html#bpy-types-animvizmotionpaths-frame-end"),
("bpy.types.armature.rigify_colors_index*", "addons/rigging/rigify/metarigs.html#bpy-types-armature-rigify-colors-index"),
@@ -953,6 +1002,7 @@ url_manual_mapping = (
("bpy.types.materialgpencilstyle.pattern*", "grease_pencil/materials/properties.html#bpy-types-materialgpencilstyle-pattern"),
("bpy.types.materialgpencilstyle.texture*", "grease_pencil/materials/properties.html#bpy-types-materialgpencilstyle-texture"),
("bpy.types.modifier.use_apply_on_spline*", "modeling/modifiers/introduction.html#bpy-types-modifier-use-apply-on-spline"),
+ ("bpy.types.movietrackingplanetrack.name*", "movie_clip/tracking/clip/sidebar/track/plane_track.html#bpy-types-movietrackingplanetrack-name"),
("bpy.types.object.use_empty_image_alpha*", "modeling/empties.html#bpy-types-object-use-empty-image-alpha"),
("bpy.types.rendersettings.frame_map_new*", "render/output/properties/frame_range.html#bpy-types-rendersettings-frame-map-new"),
("bpy.types.rendersettings.frame_map_old*", "render/output/properties/frame_range.html#bpy-types-rendersettings-frame-map-old"),
@@ -966,6 +1016,7 @@ url_manual_mapping = (
("bpy.types.sequencetimelinechannel.name*", "editors/video_sequencer/sequencer/channels.html#bpy-types-sequencetimelinechannel-name"),
("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.spaceclipeditor.blend_factor*", "editors/clip/display/mask_display.html#bpy-types-spaceclipeditor-blend-factor"),
("bpy.types.spacegrapheditor.show_cursor*", "editors/graph_editor/introduction.html#bpy-types-spacegrapheditor-show-cursor"),
("bpy.types.spaceimageeditor.show_repeat*", "editors/image/sidebar.html#bpy-types-spaceimageeditor-show-repeat"),
("bpy.types.spacenodeoverlay.show_timing*", "modeling/geometry_nodes/inspection.html#bpy-types-spacenodeoverlay-show-timing"),
@@ -976,30 +1027,34 @@ url_manual_mapping = (
("bpy.types.spacetexteditor.use_find_all*", "editors/text_editor.html#bpy-types-spacetexteditor-use-find-all"),
("bpy.types.toolsettings.snap_uv_element*", "editors/uv/controls/snapping.html#bpy-types-toolsettings-snap-uv-element"),
("bpy.types.toolsettings.use_snap_rotate*", "editors/3dview/controls/snapping.html#bpy-types-toolsettings-use-snap-rotate"),
+ ("bpy.types.toolsettings.uv_relax_method*", "modeling/meshes/uv/tools/relax.html#bpy-types-toolsettings-uv-relax-method"),
("bpy.types.unitsettings.system_rotation*", "scene_layout/scene/properties.html#bpy-types-unitsettings-system-rotation"),
("bpy.types.view3doverlay.display_handle*", "editors/3dview/display/overlays.html#bpy-types-view3doverlay-display-handle"),
("bpy.types.volumedisplay.wireframe_type*", "modeling/volumes/properties.html#bpy-types-volumedisplay-wireframe-type"),
("bpy.ops.anim.channels_editable_toggle*", "editors/graph_editor/channels.html#bpy-ops-anim-channels-editable-toggle"),
+ ("bpy.ops.anim.channels_setting_disable*", "editors/graph_editor/channels.html#bpy-ops-anim-channels-setting-disable"),
("bpy.ops.curve.normals_make_consistent*", "modeling/curves/editing/control_points.html#bpy-ops-curve-normals-make-consistent"),
("bpy.ops.curves.snap_curves_to_surface*", "sculpt_paint/curves_sculpting/introduction.html#bpy-ops-curves-snap-curves-to-surface"),
("bpy.ops.ed.lib_id_load_custom_preview*", "editors/asset_browser.html#bpy-ops-ed-lib-id-load-custom-preview"),
("bpy.ops.gpencil.frame_clean_duplicate*", "grease_pencil/modes/edit/grease_pencil_menu.html#bpy-ops-gpencil-frame-clean-duplicate"),
("bpy.ops.gpencil.stroke_simplify_fixed*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-stroke-simplify-fixed"),
+ ("bpy.ops.mask.add_feather_vertex_slide*", "movie_clip/masking/editing.html#bpy-ops-mask-add-feather-vertex-slide"),
("bpy.ops.mesh.faces_select_linked_flat*", "modeling/meshes/selecting/linked.html#bpy-ops-mesh-faces-select-linked-flat"),
("bpy.ops.mesh.primitive_ico_sphere_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-ico-sphere-add"),
+ ("bpy.ops.object.clear_override_library*", "files/linked_libraries/library_overrides.html#bpy-ops-object-clear-override-library"),
("bpy.ops.object.gpencil_modifier_apply*", "grease_pencil/modifiers/introduction.html#bpy-ops-object-gpencil-modifier-apply"),
("bpy.ops.object.material_slot_deselect*", "render/materials/assignment.html#bpy-ops-object-material-slot-deselect"),
("bpy.ops.object.modifier_move_to_index*", "modeling/modifiers/introduction.html#bpy-ops-object-modifier-move-to-index"),
("bpy.ops.object.multires_external_save*", "modeling/modifiers/generate/multiresolution.html#bpy-ops-object-multires-external-save"),
+ ("bpy.ops.object.reset_override_library*", "files/linked_libraries/library_overrides.html#bpy-ops-object-reset-override-library"),
("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/apply.html#bpy-ops-object-visual-transform-apply"),
- ("bpy.ops.object.clear_override_library*", "files/linked_libraries/library_overrides.html#bpy-ops-object-clear-override-library"),
- ("bpy.ops.object.reset_override_library*", "files/linked_libraries/library_overrides.html#bpy-ops-object-reset-override-library"),
("bpy.ops.outliner.collection_duplicate*", "editors/outliner/editing.html#bpy-ops-outliner-collection-duplicate"),
("bpy.ops.pose.select_constraint_target*", "animation/armatures/posing/selecting.html#bpy-ops-pose-select-constraint-target"),
("bpy.ops.sequencer.change_effect_input*", "video_editing/edit/montage/editing.html#bpy-ops-sequencer-change-effect-input"),
("bpy.ops.sequencer.strip_color_tag_set*", "editors/video_sequencer/sequencer/sidebar/strip.html#bpy-ops-sequencer-strip-color-tag-set"),
("bpy.ops.sequencer.strip_transform_fit*", "video_editing/edit/montage/editing.html#bpy-ops-sequencer-strip-transform-fit"),
+ ("bpy.ops.wm.doc_view_manual_ui_context*", "getting_started/help.html#bpy-ops-wm-doc-view-manual-ui-context"),
("bpy.types.armature.rigify_colors_lock*", "addons/rigging/rigify/metarigs.html#bpy-types-armature-rigify-colors-lock"),
("bpy.types.bakesettings.cage_extrusion*", "render/cycles/baking.html#bpy-types-bakesettings-cage-extrusion"),
("bpy.types.bakesettings.use_pass_color*", "render/cycles/baking.html#bpy-types-bakesettings-use-pass-color"),
@@ -1062,10 +1117,12 @@ url_manual_mapping = (
("bpy.types.sceneeevee.volumetric_light*", "render/eevee/render_settings/volumetrics.html#bpy-types-sceneeevee-volumetric-light"),
("bpy.types.sculpt.detail_refine_method*", "sculpt_paint/sculpting/tool_settings/dyntopo.html#bpy-types-sculpt-detail-refine-method"),
("bpy.types.sculpt.symmetrize_direction*", "sculpt_paint/sculpting/tool_settings/symmetry.html#bpy-types-sculpt-symmetrize-direction"),
+ ("bpy.types.sequence.frame_offset_start*", "editors/video_sequencer/sequencer/sidebar/strip.html#bpy-types-sequence-frame-offset-start"),
("bpy.types.sequenceeditor.show_overlay*", "editors/video_sequencer/preview/sidebar.html#bpy-types-sequenceeditor-show-overlay"),
("bpy.types.sequenceeditor.use_prefetch*", "editors/video_sequencer/preview/sidebar.html#bpy-types-sequenceeditor-use-prefetch"),
("bpy.types.soundsequence.show_waveform*", "editors/video_sequencer/sequencer/sidebar/strip.html#bpy-types-soundsequence-show-waveform"),
("bpy.types.spaceclipeditor.show_stable*", "editors/clip/display/clip_display.html#bpy-types-spaceclipeditor-show-stable"),
+ ("bpy.types.spaceimageeditor.show_gizmo*", "editors/image/introduction.html#bpy-types-spaceimageeditor-show-gizmo"),
("bpy.types.spaceoutliner.filter_invert*", "editors/outliner/interface.html#bpy-types-spaceoutliner-filter-invert"),
("bpy.types.spacetexteditor.show_margin*", "editors/text_editor.html#bpy-types-spacetexteditor-show-margin"),
("bpy.types.spline.radius_interpolation*", "modeling/curves/properties/active_spline.html#bpy-types-spline-radius-interpolation"),
@@ -1073,12 +1130,13 @@ url_manual_mapping = (
("bpy.types.toolsettings.use_snap_scale*", "editors/3dview/controls/snapping.html#bpy-types-toolsettings-use-snap-scale"),
("bpy.types.toolsettings.uv_select_mode*", "editors/uv/selecting.html#bpy-types-toolsettings-uv-select-mode"),
("bpy.types.viewlayer.material_override*", "render/layers/introduction.html#bpy-types-viewlayer-material-override"),
- ("bpy.ops.anim.channels_disable_toggle*", "editors/graph_editor/channels.html#bpy-ops-anim-channels-disable-toggle"),
("bpy.ops.anim.channels_fcurves_enable*", "editors/graph_editor/channels.html#bpy-ops-anim-channels-fcurves-enable"),
+ ("bpy.ops.anim.channels_setting_enable*", "editors/graph_editor/channels.html#bpy-ops-anim-channels-setting-enable"),
("bpy.ops.anim.channels_setting_toggle*", "editors/graph_editor/channels.html#bpy-ops-anim-channels-setting-toggle"),
("bpy.ops.clip.set_viewport_background*", "movie_clip/tracking/clip/editing/clip.html#bpy-ops-clip-set-viewport-background"),
("bpy.ops.geometry.color_attribute_add*", "modeling/meshes/properties/object_data.html#bpy-ops-geometry-color-attribute-add"),
("bpy.ops.gpencil.interpolate_sequence*", "grease_pencil/animation/tools.html#bpy-ops-gpencil-interpolate-sequence"),
+ ("bpy.ops.mask.normals_make_consistent*", "movie_clip/masking/editing.html#bpy-ops-mask-normals-make-consistent"),
("bpy.ops.mesh.normals_make_consistent*", "modeling/meshes/editing/mesh/normals.html#bpy-ops-mesh-normals-make-consistent"),
("bpy.ops.mesh.offset_edge_loops_slide*", "modeling/meshes/editing/edge/offset_edge_slide.html#bpy-ops-mesh-offset-edge-loops-slide"),
("bpy.ops.mesh.primitive_uv_sphere_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-uv-sphere-add"),
@@ -1086,13 +1144,12 @@ url_manual_mapping = (
("bpy.ops.object.make_override_library*", "files/linked_libraries/library_overrides.html#bpy-ops-object-make-override-library"),
("bpy.ops.object.parent_no_inverse_set*", "scene_layout/object/editing/parent.html#bpy-ops-object-parent-no-inverse-set"),
("bpy.ops.object.vertex_group_quantize*", "sculpt_paint/weight_paint/editing.html#bpy-ops-object-vertex-group-quantize"),
- ("bpy.ops.object.make_override_library*", "files/linked_libraries/library_overrides.html#bpy-ops-object-make-override-library"),
("bpy.ops.outliner.collection_instance*", "editors/outliner/editing.html#bpy-ops-outliner-collection-instance"),
("bpy.ops.sequencer.change_effect_type*", "video_editing/edit/montage/editing.html#bpy-ops-sequencer-change-effect-type"),
("bpy.ops.transform.create_orientation*", "editors/3dview/controls/orientation.html#bpy-ops-transform-create-orientation"),
("bpy.ops.transform.delete_orientation*", "editors/3dview/controls/orientation.html#bpy-ops-transform-delete-orientation"),
- ("bpy.ops.ui.override_idtemplate_reset*", "files/linked_libraries/library_overrides.html#bpy-ops-ui-override-idtemplate-reset"),
("bpy.ops.ui.override_idtemplate_clear*", "files/linked_libraries/library_overrides.html#bpy-ops-ui-override-idtemplate-clear"),
+ ("bpy.ops.ui.override_idtemplate_reset*", "files/linked_libraries/library_overrides.html#bpy-ops-ui-override-idtemplate-reset"),
("bpy.ops.view3d.localview_remove_from*", "editors/3dview/navigate/local_view.html#bpy-ops-view3d-localview-remove-from"),
("bpy.types.animdata.action_blend_type*", "editors/nla/sidebar.html#bpy-types-animdata-action-blend-type"),
("bpy.types.bakesettings.use_pass_emit*", "render/cycles/baking.html#bpy-types-bakesettings-use-pass-emit"),
@@ -1139,6 +1196,7 @@ url_manual_mapping = (
("bpy.types.movietrackingcamera.nuke_k*", "movie_clip/tracking/clip/sidebar/track/camera.html#bpy-types-movietrackingcamera-nuke-k"),
("bpy.types.movietrackingstabilization*", "movie_clip/tracking/clip/sidebar/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.object.show_only_shape_key*", "animation/shape_keys/shape_keys_panel.html#bpy-types-object-show-only-shape-key"),
("bpy.types.regionview3d.lock_rotation*", "editors/3dview/navigate/views.html#bpy-types-regionview3d-lock-rotation"),
("bpy.types.rendersettings.hair_subdiv*", "render/cycles/render_settings/hair.html#bpy-types-rendersettings-hair-subdiv"),
("bpy.types.scene.audio_distance_model*", "scene_layout/scene/properties.html#bpy-types-scene-audio-distance-model"),
@@ -1153,10 +1211,11 @@ url_manual_mapping = (
("bpy.types.spaceuveditor.show_stretch*", "editors/uv/overlays.html#bpy-types-spaceuveditor-show-stretch"),
("bpy.types.toolsettings.keyframe_type*", "editors/timeline.html#bpy-types-toolsettings-keyframe-type"),
("bpy.types.toolsettings.snap_elements*", "editors/3dview/controls/snapping.html#bpy-types-toolsettings-snap-elements"),
+ ("bpy.types.toolsettings.use_snap_edit*", "editors/3dview/controls/snapping.html#bpy-types-toolsettings-use-snap-edit"),
("bpy.types.toolsettings.use_snap_node*", "interface/controls/nodes/arranging.html#bpy-types-toolsettings-use-snap-node"),
("bpy.types.toolsettings.use_snap_self*", "editors/3dview/controls/snapping.html#bpy-types-toolsettings-use-snap-self"),
("bpy.types.viewlayer.active_aov_index*", "render/layers/passes.html#bpy-types-viewlayer-active-aov-index"),
- ("bpy.ops.anim.channels_enable_toggle*", "editors/graph_editor/channels.html#bpy-ops-anim-channels-enable-toggle"),
+ ("bpy.ops.clip.tracking_object_remove*", "movie_clip/tracking/clip/sidebar/track/objects.html#bpy-ops-clip-tracking-object-remove"),
("bpy.ops.constraint.copy_to_selected*", "animation/constraints/interface/header.html#bpy-ops-constraint-copy-to-selected"),
("bpy.ops.gpencil.bake_mesh_animation*", "grease_pencil/animation/tools.html#bpy-ops-gpencil-bake-mesh-animation"),
("bpy.ops.gpencil.select_vertex_color*", "grease_pencil/selecting.html#bpy-ops-gpencil-select-vertex-color"),
@@ -1165,6 +1224,7 @@ url_manual_mapping = (
("bpy.ops.gpencil.stroke_cyclical_set*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-stroke-cyclical-set"),
("bpy.ops.gpencil.vertex_color_invert*", "grease_pencil/modes/vertex_paint/editing.html#bpy-ops-gpencil-vertex-color-invert"),
("bpy.ops.gpencil.vertex_color_levels*", "grease_pencil/modes/vertex_paint/editing.html#bpy-ops-gpencil-vertex-color-levels"),
+ ("bpy.ops.mask.slide_spline_curvature*", "movie_clip/masking/editing.html#bpy-ops-mask-slide-spline-curvature"),
("bpy.ops.mesh.primitive_cylinder_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-cylinder-add"),
("bpy.ops.mesh.set_normals_from_faces*", "modeling/meshes/editing/mesh/normals.html#bpy-ops-mesh-set-normals-from-faces"),
("bpy.ops.mesh.shape_propagate_to_all*", "modeling/meshes/editing/vertex/propagate_shapes.html#bpy-ops-mesh-shape-propagate-to-all"),
@@ -1183,8 +1243,8 @@ url_manual_mapping = (
("bpy.ops.render.shutter_curve_preset*", "render/cycles/render_settings/motion_blur.html#bpy-ops-render-shutter-curve-preset"),
("bpy.ops.sculpt_curves.select_random*", "sculpt_paint/curves_sculpting/introduction.html#bpy-ops-sculpt-curves-select-random"),
("bpy.ops.sequencer.view_ghost_border*", "editors/video_sequencer/preview/sidebar.html#bpy-ops-sequencer-view-ghost-border"),
- ("bpy.ops.ui.override_type_set_button*", "files/linked_libraries/library_overrides.html#bpy-ops-ui-override-type-set-button"),
("bpy.ops.ui.override_idtemplate_make*", "files/linked_libraries/library_overrides.html#bpy-ops-ui-override-idtemplate-make"),
+ ("bpy.ops.ui.override_type_set_button*", "files/linked_libraries/library_overrides.html#bpy-ops-ui-override-type-set-button"),
("bpy.types.animdata.action_influence*", "editors/nla/sidebar.html#bpy-types-animdata-action-influence"),
("bpy.types.armature.layers_protected*", "animation/armatures/properties/skeleton.html#bpy-types-armature-layers-protected"),
("bpy.types.assetmetadata.description*", "editors/asset_browser.html#bpy-types-assetmetadata-description"),
@@ -1240,6 +1300,7 @@ url_manual_mapping = (
("bpy.types.meshsequencecachemodifier*", "modeling/modifiers/modify/mesh_sequence_cache.html#bpy-types-meshsequencecachemodifier"),
("bpy.types.modifier.show_in_editmode*", "modeling/modifiers/introduction.html#bpy-types-modifier-show-in-editmode"),
("bpy.types.motionpath.line_thickness*", "animation/motion_paths.html#bpy-types-motionpath-line-thickness"),
+ ("bpy.types.movietrackingtrack.weight*", "movie_clip/tracking/clip/sidebar/track/track.html#bpy-types-movietrackingtrack-weight"),
("bpy.types.object.empty_display_size*", "modeling/empties.html#bpy-types-object-empty-display-size"),
("bpy.types.object.empty_display_type*", "modeling/empties.html#bpy-types-object-empty-display-type"),
("bpy.types.regionview3d.use_box_clip*", "editors/3dview/navigate/views.html#bpy-types-regionview3d-use-box-clip"),
@@ -1250,6 +1311,7 @@ url_manual_mapping = (
("bpy.types.sceneeevee.bokeh_max_size*", "render/eevee/render_settings/depth_of_field.html#bpy-types-sceneeevee-bokeh-max-size"),
("bpy.types.sculpt.detail_type_method*", "sculpt_paint/sculpting/tool_settings/dyntopo.html#bpy-types-sculpt-detail-type-method"),
("bpy.types.sculpt.use_smooth_shading*", "sculpt_paint/sculpting/tool_settings/dyntopo.html#bpy-types-sculpt-use-smooth-shading"),
+ ("bpy.types.sequence.frame_offset_end*", "editors/video_sequencer/sequencer/sidebar/strip.html#bpy-types-sequence-frame-offset-end"),
("bpy.types.sequenceeditor.show_cache*", "editors/video_sequencer/sequencer/navigating.html#bpy-types-sequenceeditor-show-cache"),
("bpy.types.shadernodebsdfanisotropic*", "render/shader_nodes/shader/anisotropic.html#bpy-types-shadernodebsdfanisotropic"),
("bpy.types.shadernodebsdftranslucent*", "render/shader_nodes/shader/translucent.html#bpy-types-shadernodebsdftranslucent"),
@@ -1292,10 +1354,12 @@ url_manual_mapping = (
("bpy.ops.palette.extract_from_image*", "editors/image/editing.html#bpy-ops-palette-extract-from-image"),
("bpy.ops.pose.user_transforms_clear*", "animation/armatures/posing/editing/clear.html#bpy-ops-pose-user-transforms-clear"),
("bpy.ops.poselib.browse_interactive*", "animation/armatures/posing/editing/pose_library.html#bpy-ops-poselib-browse-interactive"),
+ ("bpy.ops.screen.region_context_menu*", "interface/controls/buttons/menus.html#bpy-ops-screen-region-context-menu"),
("bpy.ops.sculpt.set_persistent_base*", "sculpt_paint/sculpting/tools/layer.html#bpy-ops-sculpt-set-persistent-base"),
("bpy.ops.sequencer.crossfade_sounds*", "video_editing/edit/montage/strips/transitions/sound_crossfade.html#bpy-ops-sequencer-crossfade-sounds"),
("bpy.ops.sequencer.export_subtitles*", "editors/video_sequencer/preview/header.html#bpy-ops-sequencer-export-subtitles"),
("bpy.ops.transform.edge_bevelweight*", "modeling/meshes/editing/edge/edge_data.html#bpy-ops-transform-edge-bevelweight"),
+ ("bpy.ops.view3d.clear_render_border*", "editors/3dview/navigate/regions.html#bpy-ops-view3d-clear-render-border"),
("bpy.ops.wm.previews_batch_generate*", "files/blend/previews.html#bpy-ops-wm-previews-batch-generate"),
("bpy.types.animvizmotionpaths.range*", "animation/motion_paths.html#bpy-types-animvizmotionpaths-range"),
("bpy.types.assetmetadata.active_tag*", "editors/asset_browser.html#bpy-types-assetmetadata-active-tag"),
@@ -1351,6 +1415,7 @@ url_manual_mapping = (
("bpy.types.material.alpha_threshold*", "render/eevee/materials/settings.html#bpy-types-material-alpha-threshold"),
("bpy.types.mesh.use_mirror_topology*", "modeling/meshes/tools/tool_settings.html#bpy-types-mesh-use-mirror-topology"),
("bpy.types.movieclip.display_aspect*", "editors/clip/display/clip_display.html#bpy-types-movieclip-display-aspect"),
+ ("bpy.types.movietrackingtrack.color*", "movie_clip/tracking/clip/sidebar/track/track.html#bpy-types-movietrackingtrack-color"),
("bpy.types.nodesocketinterface.name*", "interface/controls/nodes/groups.html#bpy-types-nodesocketinterface-name"),
("bpy.types.object.is_shadow_catcher*", "render/cycles/object_settings/object_data.html#bpy-types-object-is-shadow-catcher"),
("bpy.types.particleinstancemodifier*", "modeling/modifiers/physics/particle_instance.html#bpy-types-particleinstancemodifier"),
@@ -1378,6 +1443,8 @@ url_manual_mapping = (
("bpy.types.volumedisplay.slice_axis*", "modeling/volumes/properties.html#bpy-types-volumedisplay-slice-axis"),
("bpy.ops.action.markers_make_local*", "animation/markers.html#bpy-ops-action-markers-make-local"),
("bpy.ops.anim.channels_clean_empty*", "editors/nla/editing.html#bpy-ops-anim-channels-clean-empty"),
+ ("bpy.ops.anim.driver_button_remove*", "animation/drivers/usage.html#bpy-ops-anim-driver-button-remove"),
+ ("bpy.ops.anim.keyingset_button_add*", "animation/keyframes/keying_sets.html#bpy-ops-anim-keyingset-button-add"),
("bpy.ops.armature.select_hierarchy*", "animation/armatures/bones/selecting.html#bpy-ops-armature-select-hierarchy"),
("bpy.ops.armature.switch_direction*", "animation/armatures/bones/editing/switch_direction.html#bpy-ops-armature-switch-direction"),
("bpy.ops.clip.apply_solution_scale*", "movie_clip/tracking/clip/editing/reconstruction.html#bpy-ops-clip-apply-solution-scale"),
@@ -1387,14 +1454,19 @@ url_manual_mapping = (
("bpy.ops.font.text_paste_from_file*", "modeling/texts/editing.html#bpy-ops-font-text-paste-from-file"),
("bpy.ops.geometry.attribute_remove*", "modeling/geometry_nodes/attributes_reference.html#bpy-ops-geometry-attribute-remove"),
("bpy.ops.gpencil.frame_clean_loose*", "grease_pencil/modes/edit/grease_pencil_menu.html#bpy-ops-gpencil-frame-clean-loose"),
+ ("bpy.ops.gpencil.selectmode_toggle*", "grease_pencil/selecting.html#bpy-ops-gpencil-selectmode-toggle"),
+ ("bpy.ops.mask.feather_weight_clear*", "movie_clip/masking/editing.html#bpy-ops-mask-feather-weight-clear"),
("bpy.ops.mask.primitive_circle_add*", "movie_clip/masking/scurve.html#bpy-ops-mask-primitive-circle-add"),
("bpy.ops.mask.primitive_square_add*", "movie_clip/masking/scurve.html#bpy-ops-mask-primitive-square-add"),
+ ("bpy.ops.mesh.dupli_extrude_cursor*", "modeling/meshes/tools/extrude_cursor.html#bpy-ops-mesh-dupli-extrude-cursor"),
("bpy.ops.mesh.primitive_circle_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-circle-add"),
("bpy.ops.mesh.primitive_monkey_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-monkey-add"),
("bpy.ops.mesh.select_face_by_sides*", "modeling/meshes/selecting/all_by_trait.html#bpy-ops-mesh-select-face-by-sides"),
("bpy.ops.mesh.shortest_path_select*", "modeling/meshes/selecting/linked.html#bpy-ops-mesh-shortest-path-select"),
("bpy.ops.mesh.vert_connect_concave*", "modeling/meshes/editing/mesh/cleanup.html#bpy-ops-mesh-vert-connect-concave"),
+ ("bpy.ops.nla.duplicate_linked_move*", "editors/nla/editing.html#bpy-ops-nla-duplicate-linked-move"),
("bpy.ops.object.multires_subdivide*", "modeling/modifiers/generate/multiresolution.html#bpy-ops-object-multires-subdivide"),
+ ("bpy.ops.object.shape_key_transfer*", "animation/shape_keys/shape_keys_panel.html#bpy-ops-object-shape-key-transfer"),
("bpy.ops.object.vertex_group_clean*", "sculpt_paint/weight_paint/editing.html#bpy-ops-object-vertex-group-clean"),
("bpy.ops.poselib.create_pose_asset*", "animation/armatures/posing/editing/pose_library.html#bpy-ops-poselib-create-pose-asset"),
("bpy.ops.preferences.theme_install*", "editors/preferences/themes.html#bpy-ops-preferences-theme-install"),
@@ -1402,11 +1474,13 @@ url_manual_mapping = (
("bpy.ops.sculpt.set_pivot_position*", "sculpt_paint/sculpting/editing/sculpt.html#bpy-ops-sculpt-set-pivot-position"),
("bpy.ops.sculpt_curves.select_grow*", "sculpt_paint/curves_sculpting/introduction.html#bpy-ops-sculpt-curves-select-grow"),
("bpy.ops.sequencer.image_strip_add*", "video_editing/edit/montage/strips/image.html#bpy-ops-sequencer-image-strip-add"),
+ ("bpy.ops.sequencer.images_separate*", "video_editing/edit/montage/editing.html#bpy-ops-sequencer-images-separate"),
("bpy.ops.sequencer.movie_strip_add*", "video_editing/edit/montage/strips/movie.html#bpy-ops-sequencer-movie-strip-add"),
("bpy.ops.sequencer.reassign_inputs*", "video_editing/edit/montage/editing.html#bpy-ops-sequencer-reassign-inputs"),
("bpy.ops.sequencer.sound_strip_add*", "video_editing/edit/montage/strips/sound.html#bpy-ops-sequencer-sound-strip-add"),
("bpy.ops.ui.remove_override_button*", "files/linked_libraries/library_overrides.html#bpy-ops-ui-remove-override-button"),
("bpy.ops.view3d.view_center_camera*", "editors/3dview/navigate/camera_view.html#bpy-ops-view3d-view-center-camera"),
+ ("bpy.ops.view3d.zoom_camera_1_to_1*", "editors/3dview/navigate/camera_view.html#bpy-ops-view3d-zoom-camera-1-to-1"),
("bpy.types.animvizmotionpaths.type*", "animation/motion_paths.html#bpy-types-animvizmotionpaths-type"),
("bpy.types.armaturegpencilmodifier*", "grease_pencil/modifiers/deform/armature.html#bpy-types-armaturegpencilmodifier"),
("bpy.types.brush.cloth_deform_type*", "sculpt_paint/sculpting/tools/cloth.html#bpy-types-brush-cloth-deform-type"),
@@ -1472,6 +1546,8 @@ url_manual_mapping = (
("bpy.types.limitdistanceconstraint*", "animation/constraints/transform/limit_distance.html#bpy-types-limitdistanceconstraint"),
("bpy.types.limitlocationconstraint*", "animation/constraints/transform/limit_location.html#bpy-types-limitlocationconstraint"),
("bpy.types.limitrotationconstraint*", "animation/constraints/transform/limit_rotation.html#bpy-types-limitrotationconstraint"),
+ ("bpy.types.movietrackingtrack.lock*", "movie_clip/tracking/clip/sidebar/track/track.html#bpy-types-movietrackingtrack-lock"),
+ ("bpy.types.movietrackingtrack.name*", "movie_clip/tracking/clip/sidebar/track/track.html#bpy-types-movietrackingtrack-name"),
("bpy.types.multiplygpencilmodifier*", "grease_pencil/modifiers/generate/multiple_strokes.html#bpy-types-multiplygpencilmodifier"),
("bpy.types.rendersettings.filepath*", "render/output/properties/output.html#bpy-types-rendersettings-filepath"),
("bpy.types.rendersettings.fps_base*", "render/output/properties/format.html#bpy-types-rendersettings-fps-base"),
@@ -1496,10 +1572,11 @@ url_manual_mapping = (
("bpy.types.worldmistsettings.depth*", "render/cycles/world_settings.html#bpy-types-worldmistsettings-depth"),
("bpy.types.worldmistsettings.start*", "render/cycles/world_settings.html#bpy-types-worldmistsettings-start"),
("bpy.ops.armature.armature_layers*", "animation/armatures/bones/editing/change_layers.html#bpy-ops-armature-armature-layers"),
- ("bpy.ops.armature.select_linked()*", "animation/armatures/bones/selecting.html#bpy-ops-armature-select-linked"),
("bpy.ops.clip.stabilize_2d_select*", "movie_clip/tracking/clip/selecting.html#bpy-ops-clip-stabilize-2d-select"),
+ ("bpy.ops.clip.tracking_object_new*", "movie_clip/tracking/clip/sidebar/track/objects.html#bpy-ops-clip-tracking-object-new"),
("bpy.ops.constraint.move_to_index*", "animation/constraints/interface/header.html#bpy-ops-constraint-move-to-index"),
("bpy.ops.gpencil.frame_clean_fill*", "grease_pencil/modes/edit/grease_pencil_menu.html#bpy-ops-gpencil-frame-clean-fill"),
+ ("bpy.ops.gpencil.select_alternate*", "grease_pencil/selecting.html#bpy-ops-gpencil-select-alternate"),
("bpy.ops.gpencil.stroke_subdivide*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-stroke-subdivide"),
("bpy.ops.gpencil.vertex_color_hsv*", "grease_pencil/modes/vertex_paint/editing.html#bpy-ops-gpencil-vertex-color-hsv"),
("bpy.ops.gpencil.vertex_color_set*", "grease_pencil/modes/vertex_paint/editing.html#bpy-ops-gpencil-vertex-color-set"),
@@ -1531,6 +1608,7 @@ url_manual_mapping = (
("bpy.ops.sequencer.duplicate_move*", "video_editing/edit/montage/editing.html#bpy-ops-sequencer-duplicate-move"),
("bpy.ops.sequencer.select_grouped*", "video_editing/edit/montage/selecting.html#bpy-ops-sequencer-select-grouped"),
("bpy.ops.sequencer.select_handles*", "video_editing/edit/montage/selecting.html#bpy-ops-sequencer-select-handles"),
+ ("bpy.ops.ui.copy_data_path_button*", "interface/controls/buttons/menus.html#bpy-ops-ui-copy-data-path-button"),
("bpy.ops.uv.average_islands_scale*", "modeling/meshes/uv/editing.html#bpy-ops-uv-average-islands-scale"),
("bpy.types.action.use_frame_range*", "animation/actions.html#bpy-types-action-use-frame-range"),
("bpy.types.armature.axes_position*", "animation/armatures/properties/display.html#bpy-types-armature-axes-position"),
@@ -1614,6 +1692,7 @@ url_manual_mapping = (
("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.shadernodevectorrotate*", "render/shader_nodes/vector/vector_rotate.html#bpy-types-shadernodevectorrotate"),
+ ("bpy.types.shapekey.interpolation*", "animation/shape_keys/shape_keys_panel.html#bpy-types-shapekey-interpolation"),
("bpy.types.sound.use_memory_cache*", "editors/video_sequencer/sequencer/sidebar/strip.html#bpy-types-sound-use-memory-cache"),
("bpy.types.spaceview3d.show_gizmo*", "editors/3dview/display/gizmo.html#bpy-types-spaceview3d-show-gizmo"),
("bpy.types.texturegpencilmodifier*", "grease_pencil/modifiers/modify/texture_mapping.html#bpy-types-texturegpencilmodifier"),
@@ -1622,12 +1701,14 @@ url_manual_mapping = (
("bpy.types.unitsettings.mass_unit*", "scene_layout/scene/properties.html#bpy-types-unitsettings-mass-unit"),
("bpy.types.unitsettings.time_unit*", "scene_layout/scene/properties.html#bpy-types-unitsettings-time-unit"),
("bpy.types.volumedisplacemodifier*", "modeling/modifiers/deform/volume_displace.html#bpy-types-volumedisplacemodifier"),
+ ("bpy.types.volumerender.precision*", "modeling/volumes/properties.html#bpy-types-volumerender-precision"),
("bpy.types.volumerender.step_size*", "modeling/volumes/properties.html#bpy-types-volumerender-step-size"),
("bpy.types.weightednormalmodifier*", "modeling/modifiers/modify/weighted_normal.html#bpy-types-weightednormalmodifier"),
("bpy.types.worldlighting.distance*", "render/cycles/render_settings/light_paths.html#bpy-types-worldlighting-distance"),
("bpy.ops.armature.autoside_names*", "animation/armatures/bones/editing/naming.html#bpy-ops-armature-autoside-names"),
("bpy.ops.armature.calculate_roll*", "animation/armatures/bones/editing/bone_roll.html#bpy-ops-armature-calculate-roll"),
("bpy.ops.armature.duplicate_move*", "animation/armatures/bones/editing/duplicate.html#bpy-ops-armature-duplicate-move"),
+ ("bpy.ops.armature.extrude_forked*", "animation/armatures/bones/editing/extrude.html#bpy-ops-armature-extrude-forked"),
("bpy.ops.armature.select_similar*", "animation/armatures/bones/selecting.html#bpy-ops-armature-select-similar"),
("bpy.ops.clip.create_plane_track*", "movie_clip/tracking/clip/editing/track.html#bpy-ops-clip-create-plane-track"),
("bpy.ops.curve.spline_weight_set*", "modeling/curves/editing/other.html#bpy-ops-curve-spline-weight-set"),
@@ -1650,6 +1731,7 @@ url_manual_mapping = (
("bpy.ops.mesh.primitive_cone_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-cone-add"),
("bpy.ops.mesh.primitive_cube_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-cube-add"),
("bpy.ops.mesh.primitive_grid_add*", "modeling/meshes/primitives.html#bpy-ops-mesh-primitive-grid-add"),
+ ("bpy.ops.mesh.shortest_path_pick*", "modeling/meshes/selecting/linked.html#bpy-ops-mesh-shortest-path-pick"),
("bpy.ops.mesh.subdivide_edgering*", "modeling/meshes/editing/edge/subdivide_edge_ring.html#bpy-ops-mesh-subdivide-edgering"),
("bpy.ops.node.hide_socket_toggle*", "interface/controls/nodes/editing.html#bpy-ops-node-hide-socket-toggle"),
("bpy.ops.node.tree_socket_remove*", "interface/controls/nodes/groups.html#bpy-ops-node-tree-socket-remove"),
@@ -1660,6 +1742,9 @@ url_manual_mapping = (
("bpy.ops.object.make_single_user*", "scene_layout/object/editing/relations/make_single_user.html#bpy-ops-object-make-single-user"),
("bpy.ops.object.multires_reshape*", "modeling/modifiers/generate/multiresolution.html#bpy-ops-object-multires-reshape"),
("bpy.ops.object.select_hierarchy*", "scene_layout/object/selecting.html#bpy-ops-object-select-hierarchy"),
+ ("bpy.ops.object.shape_key_mirror*", "animation/shape_keys/shape_keys_panel.html#bpy-ops-object-shape-key-mirror"),
+ ("bpy.ops.object.shape_key_remove*", "animation/shape_keys/shape_keys_panel.html#bpy-ops-object-shape-key-remove"),
+ ("bpy.ops.object.shape_key_retime*", "animation/shape_keys/shape_keys_panel.html#bpy-ops-object-shape-key-retime"),
("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.outliner.collection_new*", "editors/outliner/editing.html#bpy-ops-outliner-collection-new"),
@@ -1667,7 +1752,6 @@ url_manual_mapping = (
("bpy.ops.outliner.show_one_level*", "editors/outliner/editing.html#bpy-ops-outliner-show-one-level"),
("bpy.ops.paint.brush_colors_flip*", "sculpt_paint/texture_paint/tool_settings/brush_settings.html#bpy-ops-paint-brush-colors-flip"),
("bpy.ops.paint.weight_from_bones*", "sculpt_paint/weight_paint/editing.html#bpy-ops-paint-weight-from-bones"),
- ("bpy.ops.pose.blend_to_neighbour*", "animation/armatures/posing/editing/in_betweens.html#bpy-ops-pose-blend-to-neighbour"),
("bpy.ops.pose.paths_range_update*", "animation/motion_paths.html#bpy-ops-pose-paths-range-update"),
("bpy.ops.poselib.action_sanitize*", "animation/armatures/properties/pose_library.html#bpy-ops-poselib-action-sanitize"),
("bpy.ops.preferences.studiolight*", "editors/preferences/lights.html#bpy-ops-preferences-studiolight"),
@@ -1680,9 +1764,11 @@ url_manual_mapping = (
("bpy.ops.transform.vertex_random*", "modeling/meshes/editing/mesh/transform/randomize.html#bpy-ops-transform-vertex-random"),
("bpy.ops.ui.reset_default_button*", "interface/controls/buttons/menus.html#bpy-ops-ui-reset-default-button"),
("bpy.ops.uv.shortest_path_select*", "editors/uv/selecting.html#bpy-ops-uv-shortest-path-select"),
+ ("bpy.ops.view3d.object_as_camera*", "editors/3dview/navigate/camera_view.html#bpy-ops-view3d-object-as-camera"),
("bpy.ops.wm.operator_cheat_sheet*", "advanced/operators.html#bpy-ops-wm-operator-cheat-sheet"),
("bpy.ops.wm.previews_batch_clear*", "files/blend/previews.html#bpy-ops-wm-previews-batch-clear"),
("bpy.ops.wm.recover_last_session*", "files/blend/open_save.html#bpy-ops-wm-recover-last-session"),
+ ("bpy.ops.wm.toolbar_fallback_pie*", "interface/tool_system.html#bpy-ops-wm-toolbar-fallback-pie"),
("bpy.types.armature.display_type*", "animation/armatures/properties/display.html#bpy-types-armature-display-type"),
("bpy.types.armature.use_mirror_x*", "animation/armatures/bones/tools/tool_settings.html#bpy-types-armature-use-mirror-x"),
("bpy.types.bakesettings.normal_b*", "render/cycles/baking.html#bpy-types-bakesettings-normal-b"),
@@ -1754,6 +1840,8 @@ url_manual_mapping = (
("bpy.types.shadernodetexgradient*", "render/shader_nodes/textures/gradient.html#bpy-types-shadernodetexgradient"),
("bpy.types.shadernodevectorcurve*", "render/shader_nodes/vector/curves.html#bpy-types-shadernodevectorcurve"),
("bpy.types.shadernodevertexcolor*", "render/shader_nodes/input/vertex_color.html#bpy-types-shadernodevertexcolor"),
+ ("bpy.types.shapekey.relative_key*", "animation/shape_keys/shape_keys_panel.html#bpy-types-shapekey-relative-key"),
+ ("bpy.types.shapekey.vertex_group*", "animation/shape_keys/shape_keys_panel.html#bpy-types-shapekey-vertex-group"),
("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.surfacedeformmodifier*", "modeling/modifiers/deform/surface_deform.html#bpy-types-surfacedeformmodifier"),
@@ -1765,13 +1853,19 @@ url_manual_mapping = (
("bpy.types.volumerender.clipping*", "modeling/volumes/properties.html#bpy-types-volumerender-clipping"),
("bpy.types.workspace.object_mode*", "interface/window_system/workspaces.html#bpy-types-workspace-object-mode"),
("bpy.ops.anim.channels_collapse*", "editors/graph_editor/channels.html#bpy-ops-anim-channels-collapse"),
+ ("bpy.ops.anim.driver_button_add*", "animation/drivers/usage.html#bpy-ops-anim-driver-button-add"),
+ ("bpy.ops.armature.click_extrude*", "animation/armatures/bones/editing/extrude.html#bpy-ops-armature-click-extrude"),
+ ("bpy.ops.armature.select_linked*", "animation/armatures/bones/selecting.html#bpy-ops-armature-select-linked"),
("bpy.ops.armature.select_mirror*", "animation/armatures/bones/selecting.html#bpy-ops-armature-select-mirror"),
("bpy.ops.curve.switch_direction*", "modeling/curves/editing/segments.html#bpy-ops-curve-switch-direction"),
("bpy.ops.geometry.attribute_add*", "modeling/geometry_nodes/attributes_reference.html#bpy-ops-geometry-attribute-add"),
("bpy.ops.gpencil.duplicate_move*", "grease_pencil/modes/edit/grease_pencil_menu.html#bpy-ops-gpencil-duplicate-move"),
+ ("bpy.ops.gpencil.select_grouped*", "grease_pencil/selecting.html#bpy-ops-gpencil-select-grouped"),
("bpy.ops.gpencil.stroke_arrange*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-stroke-arrange"),
("bpy.ops.graph.blend_to_default*", "editors/graph_editor/fcurves/editing.html#bpy-ops-graph-blend-to-default"),
("bpy.ops.graph.equalize_handles*", "editors/graph_editor/fcurves/editing.html#bpy-ops-graph-equalize-handles"),
+ ("bpy.ops.mball.delete_metaelems*", "modeling/metas/editing.html#bpy-ops-mball-delete-metaelems"),
+ ("bpy.ops.mball.reveal_metaelems*", "modeling/metas/properties.html#bpy-ops-mball-reveal-metaelems"),
("bpy.ops.mesh.bridge-edge-loops*", "modeling/meshes/editing/edge/bridge_edge_loops.html#bpy-ops-mesh-bridge-edge-loops"),
("bpy.ops.mesh.intersect_boolean*", "modeling/meshes/editing/face/intersect_boolean.html#bpy-ops-mesh-intersect-boolean"),
("bpy.ops.mesh.loop_multi_select*", "modeling/meshes/selecting/loops.html#bpy-ops-mesh-loop-multi-select"),
@@ -1780,15 +1874,20 @@ url_manual_mapping = (
("bpy.ops.object.make_links_data*", "scene_layout/object/editing/link_transfer/link_data.html#bpy-ops-object-make-links-data"),
("bpy.ops.object.modifier_remove*", "modeling/modifiers/introduction.html#bpy-ops-object-modifier-remove"),
("bpy.ops.object.paths_calculate*", "animation/motion_paths.html#bpy-ops-object-paths-calculate"),
+ ("bpy.ops.object.shape_key_clear*", "animation/shape_keys/shape_keys_panel.html#bpy-ops-object-shape-key-clear"),
("bpy.ops.object.transform_apply*", "scene_layout/object/editing/apply.html#bpy-ops-object-transform-apply"),
("bpy.ops.outliner.lib_operation*", "files/linked_libraries/link_append.html#bpy-ops-outliner-lib-operation"),
("bpy.ops.outliner.orphans_purge*", "editors/outliner/interface.html#bpy-ops-outliner-orphans-purge"),
("bpy.ops.paint.mask_box_gesture*", "sculpt_paint/sculpting/editing/mask.html#bpy-ops-paint-mask-box-gesture"),
+ ("bpy.ops.pose.blend_to_neighbor*", "animation/armatures/posing/editing/in_betweens.html#bpy-ops-pose-blend-to-neighbor"),
("bpy.ops.screen.region_quadview*", "editors/3dview/navigate/views.html#bpy-ops-screen-region-quadview"),
("bpy.ops.screen.screenshot_area*", "interface/window_system/topbar.html#bpy-ops-screen-screenshot-area"),
+ ("bpy.ops.screen.workspace_cycle*", "interface/window_system/workspaces.html#bpy-ops-screen-workspace-cycle"),
+ ("bpy.ops.sequencer.change_scene*", "video_editing/edit/montage/editing.html#bpy-ops-sequencer-change-scene"),
("bpy.ops.sequencer.offset_clear*", "video_editing/edit/montage/editing.html#bpy-ops-sequencer-offset-clear"),
("bpy.ops.spreadsheet.toggle_pin*", "editors/spreadsheet.html#bpy-ops-spreadsheet-toggle-pin"),
("bpy.ops.uv.follow_active_quads*", "modeling/meshes/editing/uv.html#bpy-ops-uv-follow-active-quads"),
+ ("bpy.ops.view3d.view_persportho*", "editors/3dview/navigate/projections.html#bpy-ops-view3d-view-persportho"),
("bpy.types.arraygpencilmodifier*", "grease_pencil/modifiers/generate/array.html#bpy-types-arraygpencilmodifier"),
("bpy.types.assetmetadata.author*", "editors/asset_browser.html#bpy-types-assetmetadata-author"),
("bpy.types.bone.envelope_weight*", "animation/armatures/bones/properties/deform.html#bpy-types-bone-envelope-weight"),
@@ -1861,6 +1960,7 @@ url_manual_mapping = (
("bpy.types.shadernodewavelength*", "render/shader_nodes/converter/wavelength.html#bpy-types-shadernodewavelength"),
("bpy.types.shrinkwrapconstraint*", "animation/constraints/relationship/shrinkwrap.html#bpy-types-shrinkwrapconstraint"),
("bpy.types.simpledeformmodifier*", "modeling/modifiers/deform/simple_deform.html#bpy-types-simpledeformmodifier"),
+ ("bpy.types.soundsequence.volume*", "editors/video_sequencer/sequencer/sidebar/strip.html#bpy-types-soundsequence-volume"),
("bpy.types.spaceclipeditor.show*", "editors/clip/display/index.html#bpy-types-spaceclipeditor-show"),
("bpy.types.spacedopesheeteditor*", "editors/dope_sheet/index.html#bpy-types-spacedopesheeteditor"),
("bpy.types.speedcontrolsequence*", "video_editing/edit/montage/strips/effects/speed_control.html#bpy-types-speedcontrolsequence"),
@@ -1880,21 +1980,30 @@ url_manual_mapping = (
("bpy.ops.armature.parent_clear*", "animation/armatures/bones/editing/parenting.html#bpy-ops-armature-parent-clear"),
("bpy.ops.clip.clear_track_path*", "movie_clip/tracking/clip/editing/track.html#bpy-ops-clip-clear-track-path"),
("bpy.ops.clip.set_scene_frames*", "movie_clip/tracking/clip/editing/clip.html#bpy-ops-clip-set-scene-frames"),
+ ("bpy.ops.clip.track_copy_color*", "movie_clip/tracking/clip/sidebar/track/track.html#bpy-ops-clip-track-copy-color"),
("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.file.unpack_libraries*", "files/blend/packed_data.html#bpy-ops-file-unpack-libraries"),
("bpy.ops.gpencil.layer_isolate*", "grease_pencil/properties/layers.html#bpy-ops-gpencil-layer-isolate"),
("bpy.ops.gpencil.move_to_layer*", "grease_pencil/modes/edit/stroke_menu.html#bpy-ops-gpencil-move-to-layer"),
+ ("bpy.ops.gpencil.select_linked*", "grease_pencil/selecting.html#bpy-ops-gpencil-select-linked"),
+ ("bpy.ops.gpencil.select_random*", "grease_pencil/selecting.html#bpy-ops-gpencil-select-random"),
("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.graph.keyframe_insert*", "editors/graph_editor/fcurves/editing.html#bpy-ops-graph-keyframe-insert"),
("bpy.ops.image.read_viewlayers*", "editors/image/editing.html#bpy-ops-image-read-viewlayers"),
+ ("bpy.ops.mask.add_vertex_slide*", "movie_clip/masking/editing.html#bpy-ops-mask-add-vertex-slide"),
+ ("bpy.ops.mask.shape_key_insert*", "movie_clip/masking/editing.html#bpy-ops-mask-shape-key-insert"),
+ ("bpy.ops.mask.switch_direction*", "movie_clip/masking/editing.html#bpy-ops-mask-switch-direction"),
("bpy.ops.mesh.blend_from_shape*", "modeling/meshes/editing/vertex/blend_shape.html#bpy-ops-mesh-blend-from-shape"),
("bpy.ops.mesh.dissolve_limited*", "modeling/meshes/editing/mesh/delete.html#bpy-ops-mesh-dissolve-limited"),
("bpy.ops.mesh.face_make_planar*", "modeling/meshes/editing/mesh/cleanup.html#bpy-ops-mesh-face-make-planar"),
("bpy.ops.mesh.face_set_extract*", "sculpt_paint/sculpting/editing/face_sets.html#bpy-ops-mesh-face-set-extract"),
("bpy.ops.mesh.faces_shade_flat*", "modeling/meshes/editing/face/shading.html#bpy-ops-mesh-faces-shade-flat"),
("bpy.ops.mesh.paint_mask_slice*", "sculpt_paint/sculpting/editing/mask.html#bpy-ops-mesh-paint-mask-slice"),
+ ("bpy.ops.mesh.select_edge_ring*", "modeling/meshes/selecting/loops.html#bpy-ops-mesh-select-edge-ring"),
+ ("bpy.ops.mesh.select_next_item*", "modeling/meshes/selecting/more_less.html#bpy-ops-mesh-select-next-item"),
+ ("bpy.ops.mesh.select_prev_item*", "modeling/meshes/selecting/more_less.html#bpy-ops-mesh-select-prev-item"),
("bpy.ops.mesh.select_ungrouped*", "modeling/meshes/selecting/all_by_trait.html#bpy-ops-mesh-select-ungrouped"),
("bpy.ops.node.delete_reconnect*", "interface/controls/nodes/editing.html#bpy-ops-node-delete-reconnect"),
("bpy.ops.node.tree_path_parent*", "interface/controls/nodes/groups.html#bpy-ops-node-tree-path-parent"),
@@ -1927,6 +2036,8 @@ url_manual_mapping = (
("bpy.ops.transform.edge_crease*", "modeling/meshes/editing/edge/edge_data.html#bpy-ops-transform-edge-crease"),
("bpy.ops.transform.skin_resize*", "modeling/meshes/editing/mesh/transform/skin_resize.html#bpy-ops-transform-skin-resize"),
("bpy.ops.uv.seams_from_islands*", "modeling/meshes/uv/editing.html#bpy-ops-uv-seams-from-islands"),
+ ("bpy.ops.uv.shortest_path_pick*", "editors/uv/selecting.html#bpy-ops-uv-shortest-path-pick"),
+ ("bpy.ops.view3d.camera_to_view*", "editors/3dview/navigate/camera_view.html#bpy-ops-view3d-camera-to-view"),
("bpy.types.bakesettings.margin*", "render/cycles/baking.html#bpy-types-bakesettings-margin"),
("bpy.types.bakesettings.target*", "render/cycles/baking.html#bpy-types-bakesettings-target"),
("bpy.types.brush.cloth_damping*", "sculpt_paint/sculpting/tools/cloth.html#bpy-types-brush-cloth-damping"),
@@ -1961,7 +2072,6 @@ url_manual_mapping = (
("bpy.types.material.line_color*", "render/freestyle/material.html#bpy-types-material-line-color"),
("bpy.types.material.pass_index*", "render/materials/settings.html#bpy-types-material-pass-index"),
("bpy.types.mesh.use_paint_mask*", "sculpt_paint/brush/introduction.html#bpy-types-mesh-use-paint-mask"),
- ("bpy.types.movietrackingcamera*", "movie_clip/tracking/clip/sidebar/track/camera.html#bpy-types-movietrackingcamera"),
("bpy.types.object.display_type*", "scene_layout/object/properties/display.html#bpy-types-object-display-type"),
("bpy.types.objectlineart.usage*", "scene_layout/object/properties/line_art.html#bpy-types-objectlineart-usage"),
("bpy.types.particledupliweight*", "physics/particles/emitter/vertex_groups.html#bpy-types-particledupliweight"),
@@ -1980,6 +2090,8 @@ url_manual_mapping = (
("bpy.types.shadernodeoutputaov*", "render/shader_nodes/output/aov.html#bpy-types-shadernodeoutputaov"),
("bpy.types.shadernodepointinfo*", "render/shader_nodes/input/point_info.html#bpy-types-shadernodepointinfo"),
("bpy.types.shadernodewireframe*", "render/shader_nodes/input/wireframe.html#bpy-types-shadernodewireframe"),
+ ("bpy.types.shapekey.slider_max*", "animation/shape_keys/shape_keys_panel.html#bpy-types-shapekey-slider-max"),
+ ("bpy.types.shapekey.slider_min*", "animation/shape_keys/shape_keys_panel.html#bpy-types-shapekey-slider-min"),
("bpy.types.spacesequenceeditor*", "editors/video_sequencer/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"),
@@ -2008,6 +2120,9 @@ url_manual_mapping = (
("bpy.ops.armature.select_less*", "animation/armatures/bones/selecting.html#bpy-ops-armature-select-less"),
("bpy.ops.armature.select_more*", "animation/armatures/bones/selecting.html#bpy-ops-armature-select-more"),
("bpy.ops.asset.bundle_install*", "editors/asset_browser.html#bpy-ops-asset-bundle-install"),
+ ("bpy.ops.buttons.clear_filter*", "interface/controls/buttons/fields.html#bpy-ops-buttons-clear-filter"),
+ ("bpy.ops.buttons.context_menu*", "interface/controls/buttons/menus.html#bpy-ops-buttons-context-menu"),
+ ("bpy.ops.buttons.start_filter*", "interface/controls/buttons/fields.html#bpy-ops-buttons-start-filter"),
("bpy.ops.clip.add_marker_move*", "movie_clip/tracking/clip/editing/track.html#bpy-ops-clip-add-marker-move"),
("bpy.ops.clip.bundles_to_mesh*", "movie_clip/tracking/clip/editing/reconstruction.html#bpy-ops-clip-bundles-to-mesh"),
("bpy.ops.clip.detect_features*", "movie_clip/tracking/clip/editing/track.html#bpy-ops-clip-detect-features"),
@@ -2018,9 +2133,14 @@ url_manual_mapping = (
("bpy.ops.fluid.bake_particles*", "physics/fluid/type/domain/liquid/particles.html#bpy-ops-fluid-bake-particles"),
("bpy.ops.fluid.free_particles*", "physics/fluid/type/domain/liquid/particles.html#bpy-ops-fluid-free-particles"),
("bpy.ops.gpencil.extrude_move*", "grease_pencil/modes/edit/point_menu.html#bpy-ops-gpencil-extrude-move"),
+ ("bpy.ops.gpencil.select_first*", "grease_pencil/selecting.html#bpy-ops-gpencil-select-first"),
("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.graph.duplicate_move*", "editors/graph_editor/fcurves/editing.html#bpy-ops-graph-duplicate-move"),
+ ("bpy.ops.mask.handle_type_set*", "movie_clip/masking/editing.html#bpy-ops-mask-handle-type-set"),
+ ("bpy.ops.mask.hide_view_clear*", "movie_clip/masking/editing.html#bpy-ops-mask-hide-view-clear"),
+ ("bpy.ops.mask.shape_key_clear*", "movie_clip/masking/editing.html#bpy-ops-mask-shape-key-clear"),
+ ("bpy.ops.mball.hide_metaelems*", "modeling/metas/properties.html#bpy-ops-mball-hide-metaelems"),
("bpy.ops.mesh.average_normals*", "modeling/meshes/editing/mesh/normals.html#bpy-ops-mesh-average-normals"),
("bpy.ops.mesh.delete_edgeloop*", "modeling/meshes/editing/mesh/delete.html#bpy-ops-mesh-delete-edgeloop"),
("bpy.ops.mesh.vertices_smooth*", "modeling/meshes/editing/vertex/smooth_vertices.html#bpy-ops-mesh-vertices-smooth"),
@@ -2036,6 +2156,7 @@ url_manual_mapping = (
("bpy.ops.object.select_linked*", "scene_layout/object/selecting.html#bpy-ops-object-select-linked"),
("bpy.ops.object.select_mirror*", "scene_layout/object/selecting.html#bpy-ops-object-select-mirror"),
("bpy.ops.object.select_random*", "scene_layout/object/selecting.html#bpy-ops-object-select-random"),
+ ("bpy.ops.object.shape_key_add*", "animation/shape_keys/shape_keys_panel.html#bpy-ops-object-shape-key-add"),
("bpy.ops.object.transfer_mode*", "editors/3dview/modes.html#bpy-ops-object-transfer-mode"),
("bpy.ops.outliner.show_active*", "editors/outliner/editing.html#bpy-ops-outliner-show-active"),
("bpy.ops.paint.add_simple_uvs*", "sculpt_paint/texture_paint/tool_settings/texture_slots.html#bpy-ops-paint-add-simple-uvs"),
@@ -2052,7 +2173,9 @@ url_manual_mapping = (
("bpy.ops.sound.bake_animation*", "scene_layout/scene/properties.html#bpy-ops-sound-bake-animation"),
("bpy.ops.transform.edge_slide*", "modeling/meshes/editing/edge/edge_slide.html#bpy-ops-transform-edge-slide"),
("bpy.ops.transform.vert_slide*", "modeling/meshes/editing/vertex/slide_vertices.html#bpy-ops-transform-vert-slide"),
+ ("bpy.ops.ui.list_start_filter*", "interface/controls/templates/list_view.html#bpy-ops-ui-list-start-filter"),
("bpy.ops.uv.project_from_view*", "modeling/meshes/editing/uv.html#bpy-ops-uv-project-from-view"),
+ ("bpy.ops.view3d.render_border*", "editors/3dview/navigate/regions.html#bpy-ops-view3d-render-border"),
("bpy.ops.view3d.view_selected*", "editors/3dview/navigate/navigation.html#bpy-ops-view3d-view-selected"),
("bpy.ops.wm.memory_statistics*", "advanced/operators.html#bpy-ops-wm-memory-statistics"),
("bpy.ops.wm.recover_auto_save*", "files/blend/open_save.html#bpy-ops-wm-recover-auto-save"),
@@ -2139,11 +2262,16 @@ url_manual_mapping = (
("bpy.ops.curve.smooth_weight*", "modeling/curves/editing/control_points.html#bpy-ops-curve-smooth-weight"),
("bpy.ops.file.pack_libraries*", "files/blend/packed_data.html#bpy-ops-file-pack-libraries"),
("bpy.ops.font.change_spacing*", "modeling/texts/editing.html#bpy-ops-font-change-spacing"),
+ ("bpy.ops.gpencil.interpolate*", "grease_pencil/modes/draw/tools/interpolate.html#bpy-ops-gpencil-interpolate"),
("bpy.ops.gpencil.layer_merge*", "grease_pencil/properties/layers.html#bpy-ops-gpencil-layer-merge"),
+ ("bpy.ops.gpencil.select_last*", "grease_pencil/selecting.html#bpy-ops-gpencil-select-last"),
+ ("bpy.ops.gpencil.select_less*", "grease_pencil/selecting.html#bpy-ops-gpencil-select-less"),
+ ("bpy.ops.gpencil.select_more*", "grease_pencil/selecting.html#bpy-ops-gpencil-select-more"),
("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.gpencil.trace_image*", "grease_pencil/modes/object/trace_image.html#bpy-ops-gpencil-trace-image"),
+ ("bpy.ops.graph.fmodifier_add*", "editors/graph_editor/fcurves/editing.html#bpy-ops-graph-fmodifier-add"),
("bpy.ops.image.external_edit*", "editors/image/editing.html#bpy-ops-image-external-edit"),
("bpy.ops.mesh.colors_reverse*", "modeling/meshes/editing/face/face_data.html#bpy-ops-mesh-colors-reverse"),
("bpy.ops.mesh.dissolve_edges*", "modeling/meshes/editing/mesh/delete.html#bpy-ops-mesh-dissolve-edges"),
@@ -2175,6 +2303,9 @@ url_manual_mapping = (
("bpy.ops.poselib.pose_remove*", "animation/armatures/posing/editing/pose_library.html#bpy-ops-poselib-pose-remove"),
("bpy.ops.poselib.pose_rename*", "animation/armatures/posing/editing/pose_library.html#bpy-ops-poselib-pose-rename"),
("bpy.ops.preferences.keyitem*", "editors/preferences/keymap.html#bpy-ops-preferences-keyitem"),
+ ("bpy.ops.screen.area_options*", "interface/window_system/areas.html#bpy-ops-screen-area-options"),
+ ("bpy.ops.screen.region_blend*", "interface/window_system/regions.html#bpy-ops-screen-region-blend"),
+ ("bpy.ops.screen.region_scale*", "interface/window_system/regions.html#bpy-ops-screen-region-scale"),
("bpy.ops.sequencer.swap_data*", "video_editing/edit/montage/editing.html#bpy-ops-sequencer-swap-data"),
("bpy.ops.transform.push_pull*", "modeling/meshes/editing/mesh/transform/push_pull.html#bpy-ops-transform-push-pull"),
("bpy.ops.transform.seq_slide*", "video_editing/edit/montage/editing.html#bpy-ops-transform-seq-slide"),
@@ -2236,6 +2367,7 @@ url_manual_mapping = (
("bpy.types.shadernodergbtobw*", "render/shader_nodes/converter/rgb_to_bw.html#bpy-types-shadernodergbtobw"),
("bpy.types.shadernodetangent*", "render/shader_nodes/input/tangent.html#bpy-types-shadernodetangent"),
("bpy.types.shadernodetexwave*", "render/shader_nodes/textures/wave.html#bpy-types-shadernodetexwave"),
+ ("bpy.types.soundsequence.pan*", "editors/video_sequencer/sequencer/sidebar/strip.html#bpy-types-soundsequence-pan"),
("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"),
@@ -2252,6 +2384,7 @@ url_manual_mapping = (
("bpy.ops.anim.channels_move*", "editors/graph_editor/channels.html#bpy-ops-anim-channels-move"),
("bpy.ops.armature.subdivide*", "animation/armatures/bones/editing/subdivide.html#bpy-ops-armature-subdivide"),
("bpy.ops.buttons.toggle_pin*", "editors/properties_editor.html#bpy-ops-buttons-toggle-pin"),
+ ("bpy.ops.clip.delete_marker*", "movie_clip/tracking/clip/editing/track.html#bpy-ops-clip-delete-marker"),
("bpy.ops.clip.filter_tracks*", "movie_clip/tracking/clip/editing/track.html#bpy-ops-clip-filter-tracks"),
("bpy.ops.clip.select_circle*", "movie_clip/tracking/clip/selecting.html#bpy-ops-clip-select-circle"),
("bpy.ops.clip.track_markers*", "movie_clip/tracking/clip/editing/track.html#bpy-ops-clip-track-markers"),
@@ -2260,6 +2393,9 @@ url_manual_mapping = (
("bpy.ops.file.directory_new*", "editors/file_browser.html#bpy-ops-file-directory-new"),
("bpy.ops.graph.euler_filter*", "editors/graph_editor/fcurves/editing.html#bpy-ops-graph-euler-filter"),
("bpy.ops.marker.camera_bind*", "animation/markers.html#bpy-ops-marker-camera-bind"),
+ ("bpy.ops.mask.cyclic_toggle*", "movie_clip/masking/editing.html#bpy-ops-mask-cyclic-toggle"),
+ ("bpy.ops.mask.hide_view_set*", "movie_clip/masking/editing.html#bpy-ops-mask-hide-view-set"),
+ ("bpy.ops.mask.paste_splines*", "movie_clip/masking/editing.html#bpy-ops-mask-paste-splines"),
("bpy.ops.mask.select_circle*", "movie_clip/masking/selecting.html#bpy-ops-mask-select-circle"),
("bpy.ops.mask.select_linked*", "movie_clip/masking/selecting.html#bpy-ops-mask-select-linked"),
("bpy.ops.mesh.beautify_fill*", "modeling/meshes/editing/face/beautify_faces.html#bpy-ops-mesh-beautify-fill"),
@@ -2274,12 +2410,14 @@ url_manual_mapping = (
("bpy.ops.mesh.point_normals*", "modeling/meshes/editing/mesh/normals.html#bpy-ops-mesh-point-normals"),
("bpy.ops.mesh.rip_edge_move*", "modeling/meshes/editing/vertex/rip_vertices_extend.html#bpy-ops-mesh-rip-edge-move"),
("bpy.ops.mesh.select_linked*", "modeling/meshes/selecting/linked.html#bpy-ops-mesh-select-linked"),
+ ("bpy.ops.mesh.select_mirror*", "modeling/meshes/selecting/mirror.html#bpy-ops-mesh-select-mirror"),
("bpy.ops.mesh.select_random*", "modeling/meshes/selecting/random.html#bpy-ops-mesh-select-random"),
("bpy.ops.mesh.sort_elements*", "modeling/meshes/editing/mesh/sort_elements.html#bpy-ops-mesh-sort-elements"),
("bpy.ops.mesh.split_normals*", "modeling/meshes/editing/mesh/normals.html#bpy-ops-mesh-split-normals"),
("bpy.ops.mesh.symmetry_snap*", "modeling/meshes/editing/mesh/snap_symmetry.html#bpy-ops-mesh-symmetry-snap"),
("bpy.ops.node.group_ungroup*", "interface/controls/nodes/groups.html#bpy-ops-node-group-ungroup"),
("bpy.ops.object.gpencil_add*", "grease_pencil/primitives.html#bpy-ops-object-gpencil-add"),
+ ("bpy.ops.object.join_shapes*", "animation/shape_keys/shape_keys_panel.html#bpy-ops-object-join-shapes"),
("bpy.ops.object.paths_clear*", "animation/motion_paths.html#bpy-ops-object-paths-clear"),
("bpy.ops.object.select_less*", "scene_layout/object/selecting.html#bpy-ops-object-select-less"),
("bpy.ops.object.select_more*", "scene_layout/object/selecting.html#bpy-ops-object-select-more"),
@@ -2294,6 +2432,7 @@ url_manual_mapping = (
("bpy.ops.transform.tosphere*", "modeling/meshes/editing/mesh/transform/to_sphere.html#bpy-ops-transform-tosphere"),
("bpy.ops.view3d.clip_border*", "editors/3dview/navigate/regions.html#bpy-ops-view3d-clip-border"),
("bpy.ops.view3d.toggle_xray*", "modeling/meshes/selecting/introduction.html#bpy-ops-view3d-toggle-xray"),
+ ("bpy.ops.view3d.view_camera*", "editors/3dview/navigate/camera_view.html#bpy-ops-view3d-view-camera"),
("bpy.ops.view3d.zoom_border*", "editors/3dview/navigate/navigation.html#bpy-ops-view3d-zoom-border"),
("bpy.ops.wm.previews_ensure*", "files/blend/previews.html#bpy-ops-wm-previews-ensure"),
("bpy.ops.wm.properties_edit*", "files/data_blocks.html#bpy-ops-wm-properties-edit"),
@@ -2322,6 +2461,7 @@ url_manual_mapping = (
("bpy.types.freestylelineset*", "render/freestyle/view_layer/line_set.html#bpy-types-freestylelineset"),
("bpy.types.greasepencilgrid*", "grease_pencil/properties/display.html#bpy-types-greasepencilgrid"),
("bpy.types.image.alpha_mode*", "editors/image/image_settings.html#bpy-types-image-alpha-mode"),
+ ("bpy.types.key.use_relative*", "animation/shape_keys/shape_keys_panel.html#bpy-types-key-use-relative"),
("bpy.types.mask.frame_start*", "movie_clip/masking/sidebar.html#bpy-types-mask-frame-start"),
("bpy.types.motionpath.color*", "animation/motion_paths.html#bpy-types-motionpath-color"),
("bpy.types.motionpath.lines*", "animation/motion_paths.html#bpy-types-motionpath-lines"),
@@ -2353,6 +2493,7 @@ url_manual_mapping = (
("bpy.types.solidifymodifier*", "modeling/modifiers/generate/solidify.html#bpy-types-solidifymodifier"),
("bpy.types.spacefilebrowser*", "editors/file_browser.html#bpy-types-spacefilebrowser"),
("bpy.types.spacegrapheditor*", "editors/graph_editor/index.html#bpy-types-spacegrapheditor"),
+ ("bpy.types.spaceimageeditor*", "editors/image/index.html#bpy-types-spaceimageeditor"),
("bpy.types.spacepreferences*", "editors/preferences/index.html#bpy-types-spacepreferences"),
("bpy.types.spacespreadsheet*", "editors/spreadsheet.html#bpy-types-spacespreadsheet"),
("bpy.types.spaceview3d.lock*", "editors/3dview/sidebar.html#bpy-types-spaceview3d-lock"),
@@ -2382,6 +2523,7 @@ url_manual_mapping = (
("bpy.ops.graph.easing_type*", "editors/graph_editor/fcurves/editing.html#bpy-ops-graph-easing-type"),
("bpy.ops.graph.handle_type*", "editors/graph_editor/fcurves/editing.html#bpy-ops-graph-handle-type"),
("bpy.ops.marker.select_all*", "animation/markers.html#bpy-ops-marker-select-all"),
+ ("bpy.ops.mask.copy_splines*", "movie_clip/masking/editing.html#bpy-ops-mask-copy-splines"),
("bpy.ops.mask.parent_clear*", "movie_clip/masking/editing.html#bpy-ops-mask-parent-clear"),
("bpy.ops.mask.select_lasso*", "movie_clip/masking/selecting.html#bpy-ops-mask-select-lasso"),
("bpy.ops.mesh.bevel.vertex*", "modeling/meshes/editing/vertex/bevel_vertices.html#bpy-ops-mesh-bevel-vertex"),
@@ -2405,11 +2547,14 @@ url_manual_mapping = (
("bpy.ops.poselib.pose_move*", "animation/armatures/properties/pose_library.html#bpy-ops-poselib-pose-move"),
("bpy.ops.preferences.addon*", "editors/preferences/addons.html#bpy-ops-preferences-addon"),
("bpy.ops.scene.light_cache*", "render/eevee/render_settings/indirect_lighting.html#bpy-ops-scene-light-cache"),
+ ("bpy.ops.screen.actionzone*", "interface/window_system/areas.html#bpy-ops-screen-actionzone"),
("bpy.ops.screen.area_dupli*", "interface/window_system/areas.html#bpy-ops-screen-area-dupli"),
+ ("bpy.ops.screen.area_split*", "interface/window_system/areas.html#bpy-ops-screen-area-split"),
("bpy.ops.screen.screenshot*", "interface/window_system/topbar.html#bpy-ops-screen-screenshot"),
("bpy.ops.sculpt.dirty_mask*", "sculpt_paint/sculpting/editing/mask.html#bpy-ops-sculpt-dirty-mask"),
("bpy.ops.sculpt.symmetrize*", "sculpt_paint/sculpting/tool_settings/symmetry.html#bpy-ops-sculpt-symmetrize"),
("bpy.ops.uv.remove_doubles*", "modeling/meshes/uv/editing.html#bpy-ops-uv-remove-doubles"),
+ ("bpy.ops.uv.select_similar*", "editors/uv/selecting.html#bpy-ops-uv-select-similar"),
("bpy.ops.uv.sphere_project*", "modeling/meshes/editing/uv.html#bpy-ops-uv-sphere-project"),
("bpy.ops.view3d.view_orbit*", "editors/3dview/navigate/navigation.html#bpy-ops-view3d-view-orbit"),
("bpy.ops.wm.previews_clear*", "files/blend/previews.html#bpy-ops-wm-previews-clear"),
@@ -2473,6 +2618,10 @@ url_manual_mapping = (
("bpy.ops.mask.select_more*", "movie_clip/masking/selecting.html#bpy-ops-mask-select-more"),
("bpy.ops.mesh.convex_hull*", "modeling/meshes/editing/mesh/convex_hull.html#bpy-ops-mesh-convex-hull"),
("bpy.ops.mesh.edge_rotate*", "modeling/meshes/editing/edge/rotate_edge.html#bpy-ops-mesh-edge-rotate"),
+ ("bpy.ops.mesh.loop_select*", "modeling/meshes/selecting/loops.html#bpy-ops-mesh-loop-select"),
+ ("bpy.ops.mesh.select_less*", "modeling/meshes/selecting/more_less.html#bpy-ops-mesh-select-less"),
+ ("bpy.ops.mesh.select_mode*", "modeling/meshes/selecting/introduction.html#bpy-ops-mesh-select-mode"),
+ ("bpy.ops.mesh.select_more*", "modeling/meshes/selecting/more_less.html#bpy-ops-mesh-select-more"),
("bpy.ops.mesh.unsubdivide*", "modeling/meshes/editing/edge/unsubdivide.html#bpy-ops-mesh-unsubdivide"),
("bpy.ops.mesh.uvs_reverse*", "modeling/meshes/uv/editing.html#bpy-ops-mesh-uvs-reverse"),
("bpy.ops.node.hide_toggle*", "interface/controls/nodes/editing.html#bpy-ops-node-hide-toggle"),
@@ -2483,6 +2632,9 @@ url_manual_mapping = (
("bpy.ops.pose.scale_clear*", "animation/armatures/posing/editing/clear.html#bpy-ops-pose-scale-clear"),
("bpy.ops.poselib.pose_add*", "animation/armatures/posing/editing/pose_library.html#bpy-ops-poselib-pose-add"),
("bpy.ops.scene.view_layer*", "render/layers/introduction.html#bpy-ops-scene-view-layer"),
+ ("bpy.ops.screen.area_join*", "interface/window_system/areas.html#bpy-ops-screen-area-join"),
+ ("bpy.ops.screen.area_move*", "interface/window_system/areas.html#bpy-ops-screen-area-move"),
+ ("bpy.ops.screen.area_swap*", "interface/window_system/areas.html#bpy-ops-screen-area-swap"),
("bpy.ops.screen.redo_last*", "interface/undo_redo.html#bpy-ops-screen-redo-last"),
("bpy.ops.sculpt.mask_init*", "sculpt_paint/sculpting/editing/mask.html#bpy-ops-sculpt-mask-init"),
("bpy.ops.sequencer.delete*", "video_editing/edit/montage/editing.html#bpy-ops-sequencer-delete"),
@@ -2525,6 +2677,8 @@ url_manual_mapping = (
("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.shapekey.frame*", "animation/shape_keys/shape_keys_panel.html#bpy-types-shapekey-frame"),
+ ("bpy.types.shapekey.value*", "animation/shape_keys/shape_keys_panel.html#bpy-types-shapekey-value"),
("bpy.types.smoothmodifier*", "modeling/modifiers/deform/smooth.html#bpy-types-smoothmodifier"),
("bpy.types.sound.use_mono*", "editors/video_sequencer/sequencer/sidebar/strip.html#bpy-types-sound-use-mono"),
("bpy.types.spline.order_u*", "modeling/curves/properties/active_spline.html#bpy-types-spline-order-u"),
@@ -2563,8 +2717,10 @@ url_manual_mapping = (
("bpy.ops.nla.apply_scale*", "editors/nla/editing.html#bpy-ops-nla-apply-scale"),
("bpy.ops.nla.clear_scale*", "editors/nla/editing.html#bpy-ops-nla-clear-scale"),
("bpy.ops.nla.mute_toggle*", "editors/nla/editing.html#bpy-ops-nla-mute-toggle"),
+ ("bpy.ops.node.group_edit*", "interface/controls/nodes/groups.html#bpy-ops-node-group-edit"),
("bpy.ops.node.group_make*", "interface/controls/nodes/groups.html#bpy-ops-node-group-make"),
("bpy.ops.node.links_mute*", "interface/controls/nodes/editing.html#bpy-ops-node-links-mute"),
+ ("bpy.ops.node.parent_set*", "interface/controls/nodes/frame.html#bpy-ops-node-parent-set"),
("bpy.ops.object.armature*", "animation/armatures/index.html#bpy-ops-object-armature"),
("bpy.ops.object.face_map*", "modeling/meshes/properties/object_data.html#bpy-ops-object-face-map"),
("bpy.ops.object.join_uvs*", "scene_layout/object/editing/link_transfer/copy_uvmaps.html#bpy-ops-object-join-uvs"),
@@ -2575,9 +2731,12 @@ url_manual_mapping = (
("bpy.ops.sculpt.optimize*", "sculpt_paint/sculpting/editing/sculpt.html#bpy-ops-sculpt-optimize"),
("bpy.ops.sequencer.split*", "video_editing/edit/montage/editing.html#bpy-ops-sequencer-split"),
("bpy.ops.transform.shear*", "modeling/meshes/editing/mesh/transform/shear.html#bpy-ops-transform-shear"),
+ ("bpy.ops.ui.eyedropper_**", "interface/controls/buttons/eyedropper.html#bpy-ops-ui-eyedropper"),
("bpy.ops.uv.cube_project*", "modeling/meshes/editing/uv.html#bpy-ops-uv-cube-project"),
("bpy.ops.uv.pack_islands*", "modeling/meshes/uv/editing.html#bpy-ops-uv-pack-islands"),
("bpy.ops.uv.select_split*", "modeling/meshes/uv/editing.html#bpy-ops-uv-select-split"),
+ ("bpy.ops.view3d.cursor3d*", "editors/3dview/3d_cursor.html#bpy-ops-view3d-cursor3d"),
+ ("bpy.ops.view3d.navigate*", "editors/3dview/navigate/index.html#bpy-ops-view3d-navigate"),
("bpy.ops.view3d.view_all*", "editors/3dview/navigate/navigation.html#bpy-ops-view3d-view-all"),
("bpy.ops.view3d.view_pan*", "editors/3dview/navigate/navigation.html#bpy-ops-view3d-view-pan"),
("bpy.ops.wm.app_template*", "advanced/app_templates.html#bpy-ops-wm-app-template"),
@@ -2604,6 +2763,7 @@ url_manual_mapping = (
("bpy.types.editbone.tail*", "animation/armatures/bones/properties/transform.html#bpy-types-editbone-tail"),
("bpy.types.fieldsettings*", "physics/forces/force_fields/index.html#bpy-types-fieldsettings"),
("bpy.types.imagesequence*", "video_editing/edit/montage/strips/image.html#bpy-types-imagesequence"),
+ ("bpy.types.key.eval_time*", "animation/shape_keys/shape_keys_panel.html#bpy-types-key-eval-time"),
("bpy.types.marbletexture*", "render/materials/legacy_textures/types/marble.html#bpy-types-marbletexture"),
("bpy.types.modifier.name*", "modeling/modifiers/introduction.html#bpy-types-modifier-name"),
("bpy.types.modifier.show*", "modeling/modifiers/introduction.html#bpy-types-modifier-show"),
@@ -2624,6 +2784,7 @@ url_manual_mapping = (
("bpy.types.sequenceproxy*", "editors/video_sequencer/sequencer/sidebar/proxy.html#bpy-types-sequenceproxy"),
("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.shapekey.mute*", "animation/shape_keys/shape_keys_panel.html#bpy-types-shapekey-mute"),
("bpy.types.soundsequence*", "video_editing/edit/montage/strips/sound.html#bpy-types-soundsequence"),
("bpy.types.spaceoutliner*", "editors/outliner/index.html#bpy-types-spaceoutliner"),
("bpy.types.spacetimeline*", "editors/timeline.html#bpy-types-spacetimeline"),
@@ -2746,6 +2907,7 @@ url_manual_mapping = (
("bpy.ops.wm.obj_export*", "files/import_export/obj.html#bpy-ops-wm-obj-export"),
("bpy.ops.wm.obj_import*", "files/import_export/obj.html#bpy-ops-wm-obj-import"),
("bpy.ops.wm.properties*", "files/data_blocks.html#bpy-ops-wm-properties"),
+ ("bpy.ops.wm.stl_import*", "files/import_export/stl.html#bpy-ops-wm-stl-import"),
("bpy.ops.wm.usd_export*", "files/import_export/usd.html#bpy-ops-wm-usd-export"),
("bpy.types.addsequence*", "video_editing/edit/montage/strips/effects/add.html#bpy-types-addsequence"),
("bpy.types.brush.cloth*", "sculpt_paint/sculpting/tools/cloth.html#bpy-types-brush-cloth"),
@@ -2824,10 +2986,12 @@ url_manual_mapping = (
("bpy.ops.graph.clean*", "editors/graph_editor/fcurves/editing.html#bpy-ops-graph-clean"),
("bpy.ops.graph.paste*", "editors/graph_editor/fcurves/editing.html#bpy-ops-graph-paste"),
("bpy.ops.marker.move*", "animation/markers.html#bpy-ops-marker-move"),
+ ("bpy.ops.mask.delete*", "movie_clip/masking/editing.html#bpy-ops-mask-delete"),
("bpy.ops.mesh.bisect*", "modeling/meshes/editing/mesh/bisect.html#bpy-ops-mesh-bisect"),
("bpy.ops.mesh.delete*", "modeling/meshes/editing/mesh/delete.html#bpy-ops-mesh-delete"),
("bpy.ops.nla.move_up*", "editors/nla/editing.html#bpy-ops-nla-move-up"),
("bpy.ops.node.delete*", "interface/controls/nodes/editing.html#bpy-ops-node-delete"),
+ ("bpy.ops.node.detach*", "interface/controls/nodes/frame.html#bpy-ops-node-detach"),
("bpy.ops.object.bake*", "render/cycles/baking.html#bpy-ops-object-bake"),
("bpy.ops.object.hook*", "modeling/meshes/editing/vertex/hooks.html#bpy-ops-object-hook"),
("bpy.ops.object.join*", "scene_layout/object/editing/join.html#bpy-ops-object-join"),
@@ -2836,6 +3000,7 @@ url_manual_mapping = (
("bpy.ops.spreadsheet*", "editors/spreadsheet.html#bpy-ops-spreadsheet"),
("bpy.ops.uv.rip_move*", "modeling/meshes/uv/tools/rip.html#bpy-ops-uv-rip-move"),
("bpy.ops.view3d.snap*", "scene_layout/object/editing/snap.html#bpy-ops-view3d-snap"),
+ ("bpy.ops.view3d.walk*", "editors/3dview/navigate/walk_fly.html#bpy-ops-view3d-walk"),
("bpy.ops.view3d.zoom*", "editors/3dview/navigate/navigation.html#bpy-ops-view3d-zoom"),
("bpy.types.*texspace*", "modeling/meshes/uv/uv_texture_spaces.html#bpy-types-texspace"),
("bpy.types.arealight*", "render/lights/light_object.html#bpy-types-arealight"),
@@ -2877,6 +3042,7 @@ url_manual_mapping = (
("bpy.ops.mesh.inset*", "modeling/meshes/editing/face/inset_faces.html#bpy-ops-mesh-inset"),
("bpy.ops.mesh.knife*", "modeling/meshes/tools/knife.html#bpy-ops-mesh-knife"),
("bpy.ops.mesh.merge*", "modeling/meshes/editing/mesh/merge.html#bpy-ops-mesh-merge"),
+ ("bpy.ops.mesh.relax*", "addons/mesh/edit_mesh_tools.html#bpy-ops-mesh-relax"),
("bpy.ops.mesh.screw*", "modeling/meshes/editing/edge/screw.html#bpy-ops-mesh-screw"),
("bpy.ops.mesh.split*", "modeling/meshes/editing/mesh/split.html#bpy-ops-mesh-split"),
("bpy.ops.nla.delete*", "editors/nla/editing.html#bpy-ops-nla-delete"),
@@ -2884,6 +3050,8 @@ url_manual_mapping = (
("bpy.ops.pose.paste*", "animation/armatures/posing/editing/copy_paste.html#bpy-ops-pose-paste"),
("bpy.ops.pose.relax*", "animation/armatures/posing/editing/in_betweens.html#bpy-ops-pose-relax"),
("bpy.ops.safe_areas*", "render/cameras.html#bpy-ops-safe-areas"),
+ ("bpy.ops.view3d.fly*", "editors/3dview/navigate/walk_fly.html#bpy-ops-view3d-fly"),
+ ("bpy.ops.wm.toolbar*", "interface/tool_system.html#bpy-ops-wm-toolbar"),
("bpy.types.aov.type*", "render/layers/passes.html#bpy-types-aov-type"),
("bpy.types.armature*", "animation/armatures/index.html#bpy-types-armature"),
("bpy.types.editbone*", "animation/armatures/bones/editing/index.html#bpy-types-editbone"),
@@ -2911,6 +3079,7 @@ url_manual_mapping = (
("bpy.ops.mesh.poke*", "modeling/meshes/editing/face/poke_faces.html#bpy-ops-mesh-poke"),
("bpy.ops.mesh.spin*", "modeling/meshes/tools/spin.html#bpy-ops-mesh-spin"),
("bpy.ops.nla.split*", "editors/nla/editing.html#bpy-ops-nla-split"),
+ ("bpy.ops.node.join*", "interface/controls/nodes/frame.html#bpy-ops-node-join"),
("bpy.ops.pose.copy*", "animation/armatures/posing/editing/copy_paste.html#bpy-ops-pose-copy"),
("bpy.ops.pose.push*", "animation/armatures/posing/editing/in_betweens.html#bpy-ops-pose-push"),
("bpy.ops.rigidbody*", "physics/rigid_body/index.html#bpy-ops-rigidbody"),
diff --git a/release/scripts/modules/rna_prop_ui.py b/release/scripts/modules/rna_prop_ui.py
index 8b8cfaaccc5..5f4a6b8cf38 100644
--- a/release/scripts/modules/rna_prop_ui.py
+++ b/release/scripts/modules/rna_prop_ui.py
@@ -127,7 +127,7 @@ def draw(layout, context, context_member, property_type, *, use_edit=True):
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))
+ assert isinstance(rna_item, property_type)
items = list(rna_item.items())
items.sort()
@@ -183,7 +183,7 @@ def draw(layout, context, context_member, property_type, *, use_edit=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).
- operator_row.enabled = not(is_lib_override and key in rna_item.id_data.override_library.reference)
+ operator_row.enabled = not (is_lib_override and key in rna_item.id_data.override_library.reference)
if use_edit:
if is_rna:
diff --git a/release/scripts/modules/sys_info.py b/release/scripts/modules/sys_info.py
index a5bae1b97af..026c39908c0 100644
--- a/release/scripts/modules/sys_info.py
+++ b/release/scripts/modules/sys_info.py
@@ -176,6 +176,7 @@ def write_sysinfo(filepath):
output.write("renderer:\t%r\n" % gpu.platform.renderer_get())
output.write("vendor:\t\t%r\n" % gpu.platform.vendor_get())
output.write("version:\t%r\n" % gpu.platform.version_get())
+ output.write("device type:\t%r\n" % gpu.platform.device_type_get())
output.write("extensions:\n")
glext = sorted(gpu.capabilities.extensions_get())
@@ -196,6 +197,14 @@ def write_sysinfo(filepath):
output.write("Maximum Fragment Image Units:\t%d\n" % gpu.capabilities.max_textures_frag_get())
output.write("Maximum Pipeline Image Units:\t%d\n" % gpu.capabilities.max_textures_get())
+ output.write("\nFeatures:\n")
+ output.write("Compute Shader Support: \t%d\n" %
+ gpu.capabilities.compute_shader_support_get())
+ output.write("Shader Storage Buffer Objects Support:\t%d\n" %
+ gpu.capabilities.shader_storage_buffer_objects_support_get())
+ output.write("Image Load/Store Support: \t%d\n" %
+ gpu.capabilities.shader_image_load_store_support_get())
+
if bpy.app.build_options.cycles:
import cycles
output.write(title("Cycles"))
diff --git a/release/scripts/presets/keyconfig/keymap_data/blender_default.py b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
index c8569990a3a..5ab9cdb542a 100644
--- a/release/scripts/presets/keyconfig/keymap_data/blender_default.py
+++ b/release/scripts/presets/keyconfig/keymap_data/blender_default.py
@@ -128,7 +128,7 @@ class Params:
self.legacy = legacy
if use_mouse_emulate_3_button:
- assert(use_alt_tool_or_cursor is False)
+ assert use_alt_tool_or_cursor is False
if select_mouse == 'RIGHT':
# Right mouse select.
@@ -5069,8 +5069,8 @@ def km_sculpt(params):
{"properties": [("mode", 'TOGGLE')]}),
("sculpt.face_set_change_visibility", {"type": 'H', "value": 'PRESS', "shift": True},
{"properties": [("mode", 'HIDE_ACTIVE')]}),
- ("sculpt.face_set_change_visibility", {"type": 'H', "value": 'PRESS', "alt": True},
- {"properties": [("mode", 'SHOW_ALL')]}),
+ ("sculpt.reveal_all", {"type": 'H', "value": 'PRESS', "alt": True},
+ {"properties": []}),
("sculpt.face_set_edit", {"type": 'W', "value": 'PRESS', "ctrl": True},
{"properties": [("mode", 'GROW')]}),
diff --git a/release/scripts/startup/bl_operators/__init__.py b/release/scripts/startup/bl_operators/__init__.py
index 6f61d7e7129..de0b7798072 100644
--- a/release/scripts/startup/bl_operators/__init__.py
+++ b/release/scripts/startup/bl_operators/__init__.py
@@ -31,7 +31,7 @@ _modules = [
"userpref",
"uvcalc_follow_active",
"uvcalc_lightmap",
- "uvcalc_randomize_transform",
+ "uvcalc_transform",
"vertexpaint_dirt",
"view3d",
"wm",
diff --git a/release/scripts/startup/bl_operators/geometry_nodes.py b/release/scripts/startup/bl_operators/geometry_nodes.py
index 1f573543e7b..2b92b87a97f 100644
--- a/release/scripts/startup/bl_operators/geometry_nodes.py
+++ b/release/scripts/startup/bl_operators/geometry_nodes.py
@@ -8,8 +8,8 @@ from bpy.app.translations import pgettext_data as data_
def geometry_node_group_empty_new():
group = bpy.data.node_groups.new(data_("Geometry Nodes"), 'GeometryNodeTree')
- group.inputs.new('NodeSocketGeometry', "Geometry")
- group.outputs.new('NodeSocketGeometry', "Geometry")
+ group.inputs.new('NodeSocketGeometry', data_("Geometry"))
+ group.outputs.new('NodeSocketGeometry', data_("Geometry"))
input_node = group.nodes.new('NodeGroupInput')
output_node = group.nodes.new('NodeGroupOutput')
output_node.is_active_output = True
diff --git a/release/scripts/startup/bl_operators/node.py b/release/scripts/startup/bl_operators/node.py
index ff9b5a06fb7..5cc9c850ebe 100644
--- a/release/scripts/startup/bl_operators/node.py
+++ b/release/scripts/startup/bl_operators/node.py
@@ -149,78 +149,6 @@ class NODE_OT_add_node(NodeAddOperator, Operator):
bl_options = {'REGISTER', 'UNDO'}
-class NODE_OT_add_search(NodeAddOperator, Operator):
- '''Add a node to the active tree'''
- bl_idname = "node.add_search"
- bl_label = "Search and Add Node"
- bl_options = {'REGISTER', 'UNDO'}
- bl_property = "node_item"
-
- _enum_item_hack = []
-
- # Create an enum list from node items
- def node_enum_items(self, context):
- import nodeitems_utils
-
- enum_items = NODE_OT_add_search._enum_item_hack
- enum_items.clear()
-
- for index, item in enumerate(nodeitems_utils.node_items_iter(context)):
- if isinstance(item, nodeitems_utils.NodeItem):
- enum_items.append(
- (str(index),
- item.label,
- "",
- index,
- ))
- return enum_items
-
- # Look up the item based on index
- def find_node_item(self, context):
- import nodeitems_utils
-
- node_item = int(self.node_item)
- for index, item in enumerate(nodeitems_utils.node_items_iter(context)):
- if index == node_item:
- return item
- return None
-
- node_item: EnumProperty(
- name="Node Type",
- description="Node type",
- items=NODE_OT_add_search.node_enum_items,
- )
-
- def execute(self, context):
- item = self.find_node_item(context)
-
- # no need to keep
- self._enum_item_hack.clear()
-
- if item:
- # apply settings from the node item
- for setting in item.settings.items():
- ops = self.settings.add()
- ops.name = setting[0]
- ops.value = setting[1]
-
- self.create_node(context, item.nodetype)
-
- if self.use_transform:
- bpy.ops.node.translate_attach_remove_on_cancel(
- 'INVOKE_DEFAULT')
-
- return {'FINISHED'}
- else:
- return {'CANCELLED'}
-
- def invoke(self, context, event):
- self.store_mouse_cursor(context, event)
- # Delayed execution in the search popup
- context.window_manager.invoke_search_popup(self)
- return {'CANCELLED'}
-
-
class NODE_OT_collapse_hide_unused_toggle(Operator):
'''Toggle collapsed nodes and hide unused sockets'''
bl_idname = "node.collapse_hide_unused_toggle"
@@ -276,7 +204,6 @@ classes = (
NodeSetting,
NODE_OT_add_node,
- NODE_OT_add_search,
NODE_OT_collapse_hide_unused_toggle,
NODE_OT_tree_path_parent,
)
diff --git a/release/scripts/startup/bl_operators/spreadsheet.py b/release/scripts/startup/bl_operators/spreadsheet.py
index 1ba7d2db2fd..aef4231d573 100644
--- a/release/scripts/startup/bl_operators/spreadsheet.py
+++ b/release/scripts/startup/bl_operators/spreadsheet.py
@@ -32,7 +32,6 @@ class SPREADSHEET_OT_toggle_pin(Operator):
def unpin(self, context):
space = context.space_data
space.is_pinned = False
- space.context_path.guess()
classes = (
diff --git a/release/scripts/startup/bl_operators/userpref.py b/release/scripts/startup/bl_operators/userpref.py
index 54de9c28144..ce23024fed5 100644
--- a/release/scripts/startup/bl_operators/userpref.py
+++ b/release/scripts/startup/bl_operators/userpref.py
@@ -1116,6 +1116,10 @@ class PREFERENCES_OT_studiolight_show(Operator):
bl_label = ""
bl_options = {'INTERNAL'}
+ @classmethod
+ def poll(cls, _context):
+ return bpy.ops.screen.userpref_show.poll()
+
def execute(self, context):
context.preferences.active_section = 'LIGHTS'
bpy.ops.screen.userpref_show('INVOKE_DEFAULT')
diff --git a/release/scripts/startup/bl_operators/uvcalc_follow_active.py b/release/scripts/startup/bl_operators/uvcalc_follow_active.py
index a5c91f238d2..f9f8d7d1019 100644
--- a/release/scripts/startup/bl_operators/uvcalc_follow_active.py
+++ b/release/scripts/startup/bl_operators/uvcalc_follow_active.py
@@ -229,7 +229,7 @@ def main(context, operator):
elif status & STATUS_ERR_NOT_SELECTED:
operator.report({'ERROR'}, "Active face not selected")
else:
- assert((status & STATUS_ERR_ACTIVE_FACE) != 0)
+ assert status & STATUS_ERR_ACTIVE_FACE != 0
operator.report({'ERROR'}, "No active face")
diff --git a/release/scripts/startup/bl_operators/uvcalc_lightmap.py b/release/scripts/startup/bl_operators/uvcalc_lightmap.py
index 93c72c97129..995ec721046 100644
--- a/release/scripts/startup/bl_operators/uvcalc_lightmap.py
+++ b/release/scripts/startup/bl_operators/uvcalc_lightmap.py
@@ -452,7 +452,7 @@ def lightmap_uvpack(
pretty_faces.append(pf_parent)
w, h = pf_parent.width, pf_parent.height
- assert(w <= h)
+ assert w <= h
if w == h:
even_dict.setdefault(w, []).append(pf_parent)
diff --git a/release/scripts/startup/bl_operators/uvcalc_randomize_transform.py b/release/scripts/startup/bl_operators/uvcalc_randomize_transform.py
deleted file mode 100644
index 2867164a72e..00000000000
--- a/release/scripts/startup/bl_operators/uvcalc_randomize_transform.py
+++ /dev/null
@@ -1,212 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-or-later
-
-from bpy.types import Operator
-from mathutils import Vector
-
-import math
-
-
-def get_random_transform(transform_params, entropy):
- from random import uniform
- from random import seed as random_seed
-
- (seed, loc, rot, scale, scale_even) = transform_params
-
- # First, seed the RNG.
- random_seed(seed + entropy)
-
- # Next, call uniform a known number of times.
- offset_u = uniform(0, 1)
- offset_v = uniform(0, 1)
- angle = uniform(0, 1)
- scale_u = uniform(0, 1)
- scale_v = uniform(0, 1)
-
- # Apply the transform_params.
- if loc:
- offset_u *= loc[0]
- offset_v *= loc[1]
- else:
- offset_u = 0
- offset_v = 0
-
- if rot:
- angle *= rot
- else:
- angle = 0
-
- if scale:
- scale_u = scale_u * (2 * scale[0] - 2.0) + 2.0 - scale[0]
- scale_v = scale_v * (2 * scale[1] - 2.0) + 2.0 - scale[1]
- else:
- scale_u = 1
- scale_v = 1
-
- if scale_even:
- scale_v = scale_u
-
- # Results in homogenous co-ordinates.
- return [[scale_u * math.cos(angle), -scale_v * math.sin(angle), offset_u],
- [scale_u * math.sin(angle), scale_v * math.cos(angle), offset_v]]
-
-
-def randomize_uv_transform_island(bm, uv_layer, faces, transform_params):
- # Ensure consistent random values for island, regardless of selection etc.
- entropy = min(f.index for f in faces)
-
- transform = get_random_transform(transform_params, entropy)
-
- # Find bounding box.
- minmax = [1e30, 1e30, -1e30, -1e30]
- for face in faces:
- for loop in face.loops:
- u, v = loop[uv_layer].uv
- minmax[0] = min(minmax[0], u)
- minmax[1] = min(minmax[1], v)
- minmax[2] = max(minmax[2], u)
- minmax[3] = max(minmax[3], v)
-
- mid_u = (minmax[0] + minmax[2]) / 2
- mid_v = (minmax[1] + minmax[3]) / 2
-
- del_u = transform[0][2] + mid_u - transform[0][0] * mid_u - transform[0][1] * mid_v
- del_v = transform[1][2] + mid_v - transform[1][0] * mid_u - transform[1][1] * mid_v
-
- # Apply transform.
- for face in faces:
- for loop in face.loops:
- pre_uv = loop[uv_layer].uv
- u = transform[0][0] * pre_uv[0] + transform[0][1] * pre_uv[1] + del_u
- v = transform[1][0] * pre_uv[0] + transform[1][1] * pre_uv[1] + del_v
- loop[uv_layer].uv = (u, v)
-
-
-def is_face_uv_selected(face, uv_layer):
- for loop in face.loops:
- if not loop[uv_layer].select:
- return False
- return True
-
-
-def is_island_uv_selected(bm, island, uv_layer):
- for face in island:
- if is_face_uv_selected(face, uv_layer):
- return True
- return False
-
-
-def randomize_uv_transform_bmesh(mesh, bm, transform_params):
- import bpy_extras.bmesh_utils
- uv_layer = bm.loops.layers.uv.verify()
- islands = bpy_extras.bmesh_utils.bmesh_linked_uv_islands(bm, uv_layer)
- for island in islands:
- if is_island_uv_selected(bm, island, uv_layer):
- randomize_uv_transform_island(bm, uv_layer, island, transform_params)
-
-
-def randomize_uv_transform(context, transform_params):
- import bmesh
- ob_list = context.objects_in_mode_unique_data
- for ob in ob_list:
- bm = bmesh.from_edit_mesh(ob.data)
- if not bm.loops.layers.uv:
- continue
-
- # Only needed to access the minimum face index of each island.
- bm.faces.index_update()
- randomize_uv_transform_bmesh(ob.data, bm, transform_params)
-
- for ob in ob_list:
- bmesh.update_edit_mesh(ob.data)
-
- return {'FINISHED'}
-
-
-from bpy.props import (
- BoolProperty,
- FloatProperty,
- FloatVectorProperty,
- IntProperty,
-)
-
-
-class RandomizeUVTransform(Operator):
- """Randomize uv island's location, rotation, and scale"""
- bl_idname = "uv.randomize_uv_transform"
- bl_label = "Randomize"
- bl_options = {'REGISTER', 'UNDO'}
-
- random_seed: IntProperty(
- name="Random Seed",
- description="Seed value for the random generator",
- min=0,
- max=10000,
- default=0,
- )
- use_loc: BoolProperty(
- name="Randomize Location",
- description="Randomize the location values",
- default=True,
- )
- loc: FloatVectorProperty(
- name="Location",
- description=("Maximum distance the objects "
- "can spread over each axis"),
- min=-100.0,
- max=100.0,
- size=2,
- subtype='TRANSLATION',
- default=(0.0, 0.0),
- )
- use_rot: BoolProperty(
- name="Randomize Rotation",
- description="Randomize the rotation value",
- default=True,
- )
- rot: FloatProperty(
- name="Rotation",
- description="Maximum rotation",
- min=-2 * math.pi,
- max=2 * math.pi,
- subtype='ANGLE',
- default=0.0,
- )
- use_scale: BoolProperty(
- name="Randomize Scale",
- description="Randomize the scale values",
- default=True,
- )
- scale_even: BoolProperty(
- name="Scale Even",
- description="Use the same scale value for both axes",
- default=False,
- )
-
- scale: FloatVectorProperty(
- name="Scale",
- description="Maximum scale randomization over each axis",
- min=-100.0,
- max=100.0,
- default=(1.0, 1.0),
- size=2,
- )
-
- @classmethod
- def poll(cls, context):
- return context.mode == 'EDIT_MESH'
-
- def execute(self, context):
- seed = self.random_seed
-
- loc = [0, 0] if not self.use_loc else self.loc
- rot = 0 if not self.use_rot else self.rot
- scale = None if not self.use_scale else self.scale
- scale_even = self.scale_even
-
- transformParams = [seed, loc, rot, scale, scale_even]
- return randomize_uv_transform(context, transformParams)
-
-
-classes = (
- RandomizeUVTransform,
-)
diff --git a/release/scripts/startup/bl_operators/uvcalc_transform.py b/release/scripts/startup/bl_operators/uvcalc_transform.py
new file mode 100644
index 00000000000..d52096f5485
--- /dev/null
+++ b/release/scripts/startup/bl_operators/uvcalc_transform.py
@@ -0,0 +1,464 @@
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+import math
+
+from bpy.types import Operator
+from mathutils import Matrix, Vector
+
+from bpy.props import (
+ BoolProperty,
+ EnumProperty,
+ FloatProperty,
+ FloatVectorProperty,
+ IntProperty,
+)
+
+
+# ------------------------------------------------------------------------------
+# Local Utility Functions
+
+def is_face_uv_selected(face, uv_layer, any_edge):
+ """
+ Returns True if the face is UV selected.
+
+ :arg face: the face to query.
+ :type face: :class:`BMFace`
+ :arg uv_layer: the UV layer to source UVs from.
+ :type bmesh: :class:`BMLayerItem`
+ :arg any_edge: use edge selection instead of vertex selection.
+ :type any_edge: bool
+ :return: True if the face is UV selected.
+ :rtype: bool
+ """
+
+ if not face.select: # Geometry selection
+ return False
+
+ import bpy
+ if bpy.context.tool_settings.use_uv_select_sync:
+ # In sync selection mode, UV selection comes solely from geometry selection.
+ return True
+
+ if any_edge:
+ for loop in face.loops:
+ if loop[uv_layer].select_edge:
+ return True
+ return False
+
+ for loop in face.loops:
+ if not loop[uv_layer].select:
+ return False
+ return True
+
+
+def is_island_uv_selected(island, uv_layer, any_edge):
+ """
+ Returns True if the island is UV selected.
+
+ :arg island: list of faces to query.
+ :type island: sequence of :class:`BMFace`.
+ :arg uv_layer: the UV layer to source UVs from.
+ :type bmesh: :class:`BMLayerItem`
+ :arg any_edge: use edge selection instead of vertex selection.
+ :type any_edge: bool
+ :return: list of lists containing polygon indices.
+ :rtype: bool
+ """
+ for face in island:
+ if is_face_uv_selected(face, uv_layer, any_edge):
+ return True
+ return False
+
+
+def island_uv_bounds(island, uv_layer):
+ """
+ The UV bounds of UV island.
+
+ :arg island: list of faces to query.
+ :type island: sequence of :class:`BMFace`.
+ :arg uv_layer: the UV layer to source UVs from.
+ :return: U-min, V-min, U-max, V-max.
+ :rtype: list
+ """
+ minmax = [1e30, 1e30, -1e30, -1e30]
+ for face in island:
+ for loop in face.loops:
+ u, v = loop[uv_layer].uv
+ minmax[0] = min(minmax[0], u)
+ minmax[1] = min(minmax[1], v)
+ minmax[2] = max(minmax[2], u)
+ minmax[3] = max(minmax[3], v)
+ return minmax
+
+
+def island_uv_bounds_center(island, uv_layer):
+ """
+ The UV bounds center of UV island.
+
+ :arg island: list of faces to query.
+ :type island: sequence of :class:`BMFace`.
+ :arg uv_layer: the UV layer to source UVs from.
+ :return: U, V center.
+ :rtype: tuple
+ """
+ minmax = island_uv_bounds(island, uv_layer)
+ return (
+ (minmax[0] + minmax[2]) / 2.0,
+ (minmax[1] + minmax[3]) / 2.0,
+ )
+
+
+# ------------------------------------------------------------------------------
+# Align UV Rotation Operator
+
+def find_rotation_auto(bm, uv_layer, faces):
+ sum_u = 0.0
+ sum_v = 0.0
+ for face in faces:
+ prev_uv = face.loops[-1][uv_layer].uv
+ for loop in face.loops:
+ uv = loop[uv_layer].uv
+ du = uv[0] - prev_uv[0]
+ dv = uv[1] - prev_uv[1]
+ edge_angle = math.atan2(dv, du)
+ edge_angle *= 4.0 # Wrap 4 times around the circle
+ sum_u += math.cos(edge_angle)
+ sum_v += math.sin(edge_angle)
+ prev_uv = uv
+
+ # Compute angle.
+ return -math.atan2(sum_v, sum_u) / 4.0
+
+
+def find_rotation_edge(bm, uv_layer, faces):
+ sum_u = 0.0
+ sum_v = 0.0
+ for face in faces:
+ prev_uv = face.loops[-1][uv_layer].uv
+ prev_select = face.loops[-1][uv_layer].select_edge
+ for loop in face.loops:
+ uv = loop[uv_layer].uv
+ if prev_select:
+ du = uv[0] - prev_uv[0]
+ dv = uv[1] - prev_uv[1]
+ edge_angle = math.atan2(dv, du)
+ edge_angle *= 2.0 # Wrap 2 times around the circle
+ sum_u += math.cos(edge_angle)
+ sum_v += math.sin(edge_angle)
+
+ prev_uv = uv
+ prev_select = loop[uv_layer].select_edge
+
+ # Add 90 degrees to align along V co-ordinate.
+ # Twice, because we divide by two.
+ sum_u, sum_v = -sum_u, -sum_v
+
+ # Compute angle.
+ return -math.atan2(sum_v, sum_u) / 2.0
+
+
+def find_rotation_geometry(bm, uv_layer, faces, method, axis):
+ sum_u_co = Vector((0.0, 0.0, 0.0))
+ sum_v_co = Vector((0.0, 0.0, 0.0))
+ for face in faces:
+ # Triangulate.
+ for fan in range(2, len(face.loops)):
+ delta_uv0 = face.loops[fan - 1][uv_layer].uv - face.loops[0][uv_layer].uv
+ delta_uv1 = face.loops[fan][uv_layer].uv - face.loops[0][uv_layer].uv
+
+ mat = Matrix((delta_uv0, delta_uv1))
+ mat.invert_safe()
+
+ delta_co0 = face.loops[fan - 1].vert.co - face.loops[0].vert.co
+ delta_co1 = face.loops[fan].vert.co - face.loops[0].vert.co
+ w = delta_co0.cross(delta_co1).length
+ # U direction in geometry co-ordinates.
+ sum_u_co += (delta_co0 * mat[0][0] + delta_co1 * mat[0][1]) * w
+ # V direction in geometry co-ordinates.
+ sum_v_co += (delta_co0 * mat[1][0] + delta_co1 * mat[1][1]) * w
+
+ if axis == 'X':
+ axis_index = 0
+ elif axis == 'Y':
+ axis_index = 1
+ elif axis == 'Z':
+ axis_index = 2
+
+ # Compute angle.
+ return math.atan2(sum_u_co[axis_index], sum_v_co[axis_index])
+
+
+def align_uv_rotation_island(bm, uv_layer, faces, method, axis):
+ angle = 0.0
+ if method == 'AUTO':
+ angle = find_rotation_auto(bm, uv_layer, faces)
+ elif method == 'EDGE':
+ angle = find_rotation_edge(bm, uv_layer, faces)
+ elif method == 'GEOMETRY':
+ angle = find_rotation_geometry(bm, uv_layer, faces, method, axis)
+
+ if angle == 0.0:
+ return False # No change.
+
+ # Find bounding box center.
+ mid_u, mid_v = island_uv_bounds_center(faces, uv_layer)
+
+ cos_angle = math.cos(angle)
+ sin_angle = math.sin(angle)
+
+ delta_u = mid_u - cos_angle * mid_u + sin_angle * mid_v
+ delta_v = mid_v - sin_angle * mid_u - cos_angle * mid_v
+
+ # Apply transform.
+ for face in faces:
+ for loop in face.loops:
+ pre_uv = loop[uv_layer].uv
+ u = cos_angle * pre_uv[0] - sin_angle * pre_uv[1] + delta_u
+ v = sin_angle * pre_uv[0] + cos_angle * pre_uv[1] + delta_v
+ loop[uv_layer].uv = u, v
+
+ return True
+
+
+def align_uv_rotation_bmesh(mesh, bm, method, axis):
+ import bpy_extras.bmesh_utils
+
+ uv_layer = bm.loops.layers.uv.active
+ if not uv_layer:
+ return False
+
+ islands = bpy_extras.bmesh_utils.bmesh_linked_uv_islands(bm, uv_layer)
+ changed = False
+ for island in islands:
+ if is_island_uv_selected(island, uv_layer, method == 'EDGE'):
+ if align_uv_rotation_island(bm, uv_layer, island, method, axis):
+ changed = True
+ return changed
+
+
+def align_uv_rotation(context, method, axis):
+ import bmesh
+ ob_list = context.objects_in_mode_unique_data
+ for ob in ob_list:
+ bm = bmesh.from_edit_mesh(ob.data)
+ if bm.loops.layers.uv:
+ if align_uv_rotation_bmesh(ob.data, bm, method, axis):
+ bmesh.update_edit_mesh(ob.data)
+
+ return {'FINISHED'}
+
+
+class AlignUVRotation(Operator):
+ """Align uv island's rotation"""
+ bl_idname = "uv.align_rotation"
+ bl_label = "Align Rotation"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ method: EnumProperty(
+ name="Method", description="Method to calculate rotation angle",
+ items=(
+ ('AUTO', "Auto", "Align from all edges"),
+ ('EDGE', "Edge", "Only selected edges"),
+ ('GEOMETRY', "Geometry", "Align to Geometry axis"),
+ ),
+ )
+
+ axis: EnumProperty(
+ name="Axis", description="Axis to align to",
+ items=(
+ ('X', "X", "X axis"),
+ ('Y', "Y", "Y axis"),
+ ('Z', "Z", "Z axis"),
+ ),
+ )
+
+ def execute(self, context):
+ return align_uv_rotation(context, self.method, self.axis)
+
+ def draw(self, _context):
+ layout = self.layout
+ layout.prop(self, "method")
+ if self.method == 'GEOMETRY':
+ layout.prop(self, "axis")
+
+ @classmethod
+ def poll(cls, context):
+ return context.mode == 'EDIT_MESH'
+
+
+# ------------------------------------------------------------------------------
+# Randomize UV Operator
+
+def get_random_transform(transform_params, entropy):
+ from random import uniform
+ from random import seed as random_seed
+
+ (seed, loc, rot, scale, scale_even) = transform_params
+
+ # First, seed the RNG.
+ random_seed(seed + entropy)
+
+ # Next, call uniform a known number of times.
+ offset_u = uniform(0.0, 1.0)
+ offset_v = uniform(0.0, 1.0)
+ angle = uniform(0.0, 1.0)
+ scale_u = uniform(0.0, 1.0)
+ scale_v = uniform(0.0, 1.0)
+
+ # Apply the transform_params.
+ if loc:
+ offset_u *= loc[0]
+ offset_v *= loc[1]
+ else:
+ offset_u = 0.0
+ offset_v = 0.0
+
+ if rot:
+ angle *= rot
+ else:
+ angle = 0.0
+
+ if scale:
+ scale_u = scale_u * (2.0 * scale[0] - 2.0) + 2.0 - scale[0]
+ scale_v = scale_v * (2.0 * scale[1] - 2.0) + 2.0 - scale[1]
+ else:
+ scale_u = 1.0
+ scale_v = 1.0
+
+ if scale_even:
+ scale_v = scale_u
+
+ # Results in homogenous co-ordinates.
+ return [[scale_u * math.cos(angle), -scale_v * math.sin(angle), offset_u],
+ [scale_u * math.sin(angle), scale_v * math.cos(angle), offset_v]]
+
+
+def randomize_uv_transform_island(bm, uv_layer, faces, transform_params):
+ # Ensure consistent random values for island, regardless of selection etc.
+ entropy = min(f.index for f in faces)
+
+ transform = get_random_transform(transform_params, entropy)
+
+ # Find bounding box center.
+ mid_u, mid_v = island_uv_bounds_center(faces, uv_layer)
+
+ del_u = transform[0][2] + mid_u - transform[0][0] * mid_u - transform[0][1] * mid_v
+ del_v = transform[1][2] + mid_v - transform[1][0] * mid_u - transform[1][1] * mid_v
+
+ # Apply transform.
+ for face in faces:
+ for loop in face.loops:
+ pre_uv = loop[uv_layer].uv
+ u = transform[0][0] * pre_uv[0] + transform[0][1] * pre_uv[1] + del_u
+ v = transform[1][0] * pre_uv[0] + transform[1][1] * pre_uv[1] + del_v
+ loop[uv_layer].uv = (u, v)
+
+
+def randomize_uv_transform_bmesh(mesh, bm, transform_params):
+ import bpy_extras.bmesh_utils
+ uv_layer = bm.loops.layers.uv.verify()
+ islands = bpy_extras.bmesh_utils.bmesh_linked_uv_islands(bm, uv_layer)
+ for island in islands:
+ if is_island_uv_selected(island, uv_layer, False):
+ randomize_uv_transform_island(bm, uv_layer, island, transform_params)
+
+
+def randomize_uv_transform(context, transform_params):
+ import bmesh
+ ob_list = context.objects_in_mode_unique_data
+ for ob in ob_list:
+ bm = bmesh.from_edit_mesh(ob.data)
+ if not bm.loops.layers.uv:
+ continue
+
+ # Only needed to access the minimum face index of each island.
+ bm.faces.index_update()
+ randomize_uv_transform_bmesh(ob.data, bm, transform_params)
+
+ for ob in ob_list:
+ bmesh.update_edit_mesh(ob.data)
+
+ return {'FINISHED'}
+
+
+class RandomizeUVTransform(Operator):
+ """Randomize uv island's location, rotation, and scale"""
+ bl_idname = "uv.randomize_uv_transform"
+ bl_label = "Randomize"
+ bl_options = {'REGISTER', 'UNDO'}
+
+ random_seed: IntProperty(
+ name="Random Seed",
+ description="Seed value for the random generator",
+ min=0,
+ max=10000,
+ default=0,
+ )
+ use_loc: BoolProperty(
+ name="Randomize Location",
+ description="Randomize the location values",
+ default=True,
+ )
+ loc: FloatVectorProperty(
+ name="Location",
+ description=("Maximum distance the objects "
+ "can spread over each axis"),
+ min=-100.0,
+ max=100.0,
+ size=2,
+ subtype='TRANSLATION',
+ default=(0.0, 0.0),
+ )
+ use_rot: BoolProperty(
+ name="Randomize Rotation",
+ description="Randomize the rotation value",
+ default=True,
+ )
+ rot: FloatProperty(
+ name="Rotation",
+ description="Maximum rotation",
+ min=-2.0 * math.pi,
+ max=2.0 * math.pi,
+ subtype='ANGLE',
+ default=0.0,
+ )
+ use_scale: BoolProperty(
+ name="Randomize Scale",
+ description="Randomize the scale values",
+ default=True,
+ )
+ scale_even: BoolProperty(
+ name="Scale Even",
+ description="Use the same scale value for both axes",
+ default=False,
+ )
+
+ scale: FloatVectorProperty(
+ name="Scale",
+ description="Maximum scale randomization over each axis",
+ min=-100.0,
+ max=100.0,
+ default=(1.0, 1.0),
+ size=2,
+ )
+
+ @classmethod
+ def poll(cls, context):
+ return context.mode == 'EDIT_MESH'
+
+ def execute(self, context):
+ seed = self.random_seed
+
+ loc = [0.0, 0.0] if not self.use_loc else self.loc
+ rot = 0.0 if not self.use_rot else self.rot
+ scale = None if not self.use_scale else self.scale
+ scale_even = self.scale_even
+
+ transformParams = [seed, loc, rot, scale, scale_even]
+ return randomize_uv_transform(context, transformParams)
+
+
+classes = (
+ AlignUVRotation,
+ RandomizeUVTransform,
+)
diff --git a/release/scripts/startup/bl_operators/vertexpaint_dirt.py b/release/scripts/startup/bl_operators/vertexpaint_dirt.py
index 74c20a774a3..616e37d37e7 100644
--- a/release/scripts/startup/bl_operators/vertexpaint_dirt.py
+++ b/release/scripts/startup/bl_operators/vertexpaint_dirt.py
@@ -5,7 +5,7 @@
def ensure_active_color_attribute(me):
if me.attributes.active_color:
return me.attributes.active_color
- return me.color_attributes.new("Color", 'BYTE_COLOR', 'FACE_CORNER')
+ return me.color_attributes.new("Color", 'BYTE_COLOR', 'CORNER')
def applyVertexDirt(me, blur_iterations, blur_strength, clamp_dirt, clamp_clean, dirt_only, normalize):
diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py
index cbb5a63b754..9d04cfd5bc8 100644
--- a/release/scripts/startup/bl_operators/wm.py
+++ b/release/scripts/startup/bl_operators/wm.py
@@ -178,10 +178,10 @@ def context_path_decompose(data_path):
prop_item = "".join(path_split[i + 1:])
if base_path:
- assert(base_path.startswith("."))
+ assert base_path.startswith(".")
base_path = base_path[1:]
if prop_attr:
- assert(prop_attr.startswith("."))
+ assert prop_attr.startswith(".")
prop_attr = prop_attr[1:]
else:
# If there are no properties, everything is an item.
@@ -2518,6 +2518,7 @@ class WM_OT_batch_rename(Operator):
('BONE', "Bones", ""),
('NODE', "Nodes", ""),
('SEQUENCE_STRIP', "Sequence Strips", ""),
+ ('ACTION_CLIP', "Action Clips", ""),
),
description="Type of data to rename",
)
@@ -2690,6 +2691,30 @@ class WM_OT_batch_rename(Operator):
"name",
iface_("Material(s)"),
)
+ elif data_type == "ACTION_CLIP":
+ data = (
+ (
+ # Outliner.
+ tuple(set(
+ action for id in context.selected_ids
+ if (((animation_data := id.animation_data) is not None) and
+ ((action := animation_data.action) is not None) and
+ (action.library is None))
+ ))
+ if space_type == 'OUTLINER' else
+ # 3D View (default).
+ tuple(set(
+ action for ob in context.selected_objects
+ if (((animation_data := ob.animation_data) is not None) and
+ ((action := animation_data.action) is not None) and
+ (action.library is None))
+ ))
+ )
+ if only_selected else
+ [id for id in bpy.data.actions if id.library is None],
+ "name",
+ iface_("Action(s)"),
+ )
elif data_type in object_data_type_attrs_map.keys():
attr, descr, ty = object_data_type_attrs_map[data_type]
data = (
@@ -2730,7 +2755,7 @@ class WM_OT_batch_rename(Operator):
elif method == 'SUFFIX':
name = name + text
else:
- assert(0)
+ assert 0
elif ty == 'STRIP':
chars = action.strip_chars
@@ -2775,9 +2800,9 @@ class WM_OT_batch_rename(Operator):
elif method == 'TITLE':
name = name.title()
else:
- assert(0)
+ assert 0
else:
- assert(0)
+ assert 0
return name
def _data_update(self, context):
diff --git a/release/scripts/startup/bl_ui/__init__.py b/release/scripts/startup/bl_ui/__init__.py
index a57a2cc5a4c..eaf61b58e6d 100644
--- a/release/scripts/startup/bl_ui/__init__.py
+++ b/release/scripts/startup/bl_ui/__init__.py
@@ -9,6 +9,8 @@ if "bpy" in locals():
del reload
_modules = [
+ "node_add_menu",
+ "node_add_menu_geometry",
"properties_animviz",
"properties_constraint",
"properties_data_armature",
diff --git a/release/scripts/startup/bl_ui/node_add_menu.py b/release/scripts/startup/bl_ui/node_add_menu.py
new file mode 100644
index 00000000000..31b84b8f08a
--- /dev/null
+++ b/release/scripts/startup/bl_ui/node_add_menu.py
@@ -0,0 +1,68 @@
+# SPDX-License-Identifier: GPL-2.0-or-later
+import bpy
+from bpy.types import Menu
+from bpy.app.translations import (
+ pgettext_iface as iface_,
+ contexts as i18n_contexts,
+)
+
+
+def add_node_type(layout, node_type, *, label=None):
+ """Add a node type to a menu."""
+ bl_rna = bpy.types.Node.bl_rna_get_subclass(node_type)
+ if not label:
+ label = bl_rna.name if bl_rna else iface_("Unknown")
+ translation_context = bl_rna.translation_context if bl_rna else i18n_contexts.default
+ props = layout.operator("node.add_node", text=label, text_ctxt=translation_context)
+ props.type = node_type
+ props.use_transform = True
+ return props
+
+
+def draw_node_group_add_menu(context, layout):
+ """Add items to the layout used for interacting with node groups."""
+ space_node = context.space_data
+ node_tree = space_node.edit_tree
+ all_node_groups = context.blend_data.node_groups
+
+ layout.operator("node.group_make")
+ layout.operator("node.group_ungroup")
+ if node_tree in all_node_groups.values():
+ layout.separator()
+ add_node_type(layout, "NodeGroupInput")
+ add_node_type(layout, "NodeGroupOutput")
+
+ if node_tree:
+ from nodeitems_builtins import node_tree_group_type
+
+ def contains_group(nodetree, group):
+ if nodetree == group:
+ return True
+ for node in nodetree.nodes:
+ if node.bl_idname in node_tree_group_type.values() and node.node_tree is not None:
+ if contains_group(node.node_tree, group):
+ return True
+ return False
+
+ groups = [
+ group for group in context.blend_data.node_groups
+ if (group.bl_idname == node_tree.bl_idname and
+ not contains_group(group, node_tree) and
+ not group.name.startswith('.'))
+ ]
+ if groups:
+ layout.separator()
+ for group in groups:
+ props = add_node_type(layout, node_tree_group_type[group.bl_idname], label=group.name)
+ ops = props.settings.add()
+ ops.name = "node_tree"
+ ops.value = "bpy.data.node_groups[%r]" % group.name
+
+
+classes = (
+)
+
+if __name__ == "__main__": # only for live edit.
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/node_add_menu_geometry.py b/release/scripts/startup/bl_ui/node_add_menu_geometry.py
new file mode 100644
index 00000000000..c31a0e18756
--- /dev/null
+++ b/release/scripts/startup/bl_ui/node_add_menu_geometry.py
@@ -0,0 +1,446 @@
+# SPDX-License-Identifier: GPL-2.0-or-later
+import bpy
+from bpy.types import Menu
+from bl_ui import node_add_menu
+from bpy.app.translations import pgettext_iface as iface_
+
+
+class NODE_MT_geometry_node_GEO_ATTRIBUTE(Menu):
+ bl_idname = "NODE_MT_geometry_node_GEO_ATTRIBUTE"
+ bl_label = "Attribute"
+
+ def draw(self, _context):
+ layout = self.layout
+ node_add_menu.add_node_type(layout, "GeometryNodeAttributeStatistic")
+ node_add_menu.add_node_type(layout, "GeometryNodeCaptureAttribute")
+ node_add_menu.add_node_type(layout, "GeometryNodeAttributeDomainSize")
+ node_add_menu.add_node_type(layout, "GeometryNodeRemoveAttribute")
+ node_add_menu.add_node_type(layout, "GeometryNodeStoreNamedAttribute")
+
+
+class NODE_MT_geometry_node_GEO_COLOR(Menu):
+ bl_idname = "NODE_MT_geometry_node_GEO_COLOR"
+ bl_label = "Color"
+
+ def draw(self, _context):
+ layout = self.layout
+ node_add_menu.add_node_type(layout, "ShaderNodeValToRGB")
+ node_add_menu.add_node_type(layout, "FunctionNodeCombineColor")
+ props = node_add_menu.add_node_type(layout, "ShaderNodeMix", label=iface_("Mix Color"))
+ ops = props.settings.add()
+ ops.name = "data_type"
+ ops.value = "'RGBA'"
+ node_add_menu.add_node_type(layout, "ShaderNodeRGBCurve")
+ node_add_menu.add_node_type(layout, "FunctionNodeSeparateColor")
+
+
+class NODE_MT_geometry_node_GEO_CURVE(Menu):
+ bl_idname = "NODE_MT_geometry_node_GEO_CURVE"
+ bl_label = "Curve"
+
+ def draw(self, _context):
+ layout = self.layout
+ node_add_menu.add_node_type(layout, "GeometryNodeCurveLength")
+ node_add_menu.add_node_type(layout, "GeometryNodeCurveToMesh")
+ node_add_menu.add_node_type(layout, "GeometryNodeCurveToPoints")
+ node_add_menu.add_node_type(layout, "GeometryNodeDeformCurvesOnSurface")
+ node_add_menu.add_node_type(layout, "GeometryNodeFillCurve")
+ node_add_menu.add_node_type(layout, "GeometryNodeFilletCurve")
+ node_add_menu.add_node_type(layout, "GeometryNodeResampleCurve")
+ node_add_menu.add_node_type(layout, "GeometryNodeReverseCurve")
+ node_add_menu.add_node_type(layout, "GeometryNodeSampleCurve")
+ node_add_menu.add_node_type(layout, "GeometryNodeSubdivideCurve")
+ node_add_menu.add_node_type(layout, "GeometryNodeTrimCurve")
+ layout.separator()
+ node_add_menu.add_node_type(layout, "GeometryNodeInputCurveHandlePositions")
+ node_add_menu.add_node_type(layout, "GeometryNodeInputTangent")
+ node_add_menu.add_node_type(layout, "GeometryNodeInputCurveTilt")
+ node_add_menu.add_node_type(layout, "GeometryNodeCurveEndpointSelection")
+ node_add_menu.add_node_type(layout, "GeometryNodeCurveHandleTypeSelection")
+ node_add_menu.add_node_type(layout, "GeometryNodeInputSplineCyclic")
+ node_add_menu.add_node_type(layout, "GeometryNodeSplineLength")
+ node_add_menu.add_node_type(layout, "GeometryNodeSplineParameter")
+ node_add_menu.add_node_type(layout, "GeometryNodeInputSplineResolution")
+ layout.separator()
+ node_add_menu.add_node_type(layout, "GeometryNodeSetCurveNormal")
+ node_add_menu.add_node_type(layout, "GeometryNodeSetCurveRadius")
+ node_add_menu.add_node_type(layout, "GeometryNodeSetCurveTilt")
+ node_add_menu.add_node_type(layout, "GeometryNodeSetCurveHandlePositions")
+ node_add_menu.add_node_type(layout, "GeometryNodeCurveSetHandles")
+ node_add_menu.add_node_type(layout, "GeometryNodeSetSplineCyclic")
+ node_add_menu.add_node_type(layout, "GeometryNodeSetSplineResolution")
+ node_add_menu.add_node_type(layout, "GeometryNodeCurveSplineType")
+
+
+class NODE_MT_geometry_node_GEO_PRIMITIVES_CURVE(Menu):
+ bl_idname = "NODE_MT_geometry_node_GEO_PRIMITIVES_CURVE"
+ bl_label = "Curve Primitives"
+
+ def draw(self, _context):
+ layout = self.layout
+ node_add_menu.add_node_type(layout, "GeometryNodeCurveArc")
+ node_add_menu.add_node_type(layout, "GeometryNodeCurvePrimitiveBezierSegment")
+ node_add_menu.add_node_type(layout, "GeometryNodeCurvePrimitiveCircle")
+ node_add_menu.add_node_type(layout, "GeometryNodeCurvePrimitiveLine")
+ node_add_menu.add_node_type(layout, "GeometryNodeCurveSpiral")
+ node_add_menu.add_node_type(layout, "GeometryNodeCurveQuadraticBezier")
+ node_add_menu.add_node_type(layout, "GeometryNodeCurvePrimitiveQuadrilateral")
+ node_add_menu.add_node_type(layout, "GeometryNodeCurveStar")
+
+
+class NODE_MT_geometry_node_curve_topology(Menu):
+ bl_idname = "NODE_MT_geometry_node_curve_topology"
+ bl_label = "Curve Topology"
+
+ def draw(self, _context):
+ layout = self.layout
+ node_add_menu.add_node_type(layout, "GeometryNodeOffsetPointInCurve")
+ node_add_menu.add_node_type(layout, "GeometryNodeCurveOfPoint")
+ node_add_menu.add_node_type(layout, "GeometryNodePointsOfCurve")
+
+
+class NODE_MT_geometry_node_GEO_GEOMETRY(Menu):
+ bl_idname = "NODE_MT_geometry_node_GEO_GEOMETRY"
+ bl_label = "Geometry"
+
+ def draw(self, _context):
+ layout = self.layout
+ node_add_menu.add_node_type(layout, "GeometryNodeBoundBox")
+ node_add_menu.add_node_type(layout, "GeometryNodeConvexHull")
+ node_add_menu.add_node_type(layout, "GeometryNodeDeleteGeometry")
+ node_add_menu.add_node_type(layout, "GeometryNodeDuplicateElements")
+ node_add_menu.add_node_type(layout, "GeometryNodeProximity")
+ node_add_menu.add_node_type(layout, "GeometryNodeGeometryToInstance")
+ node_add_menu.add_node_type(layout, "GeometryNodeJoinGeometry")
+ node_add_menu.add_node_type(layout, "GeometryNodeMergeByDistance")
+ node_add_menu.add_node_type(layout, "GeometryNodeRaycast")
+ node_add_menu.add_node_type(layout, "GeometryNodeSampleIndex")
+ node_add_menu.add_node_type(layout, "GeometryNodeSampleNearest")
+ node_add_menu.add_node_type(layout, "GeometryNodeSeparateComponents")
+ node_add_menu.add_node_type(layout, "GeometryNodeSeparateGeometry")
+ node_add_menu.add_node_type(layout, "GeometryNodeTransform")
+ layout.separator()
+ node_add_menu.add_node_type(layout, "GeometryNodeSetID")
+ node_add_menu.add_node_type(layout, "GeometryNodeSetPosition")
+
+
+class NODE_MT_geometry_node_GEO_INPUT(Menu):
+ bl_idname = "NODE_MT_geometry_node_GEO_INPUT"
+ bl_label = "Input"
+
+ def draw(self, _context):
+ layout = self.layout
+ node_add_menu.add_node_type(layout, "FunctionNodeInputBool")
+ node_add_menu.add_node_type(layout, "GeometryNodeCollectionInfo")
+ node_add_menu.add_node_type(layout, "FunctionNodeInputColor")
+ node_add_menu.add_node_type(layout, "FunctionNodeInputInt")
+ node_add_menu.add_node_type(layout, "GeometryNodeIsViewport")
+ node_add_menu.add_node_type(layout, "GeometryNodeInputMaterial")
+ node_add_menu.add_node_type(layout, "GeometryNodeObjectInfo")
+ node_add_menu.add_node_type(layout, "GeometryNodeSelfObject")
+ node_add_menu.add_node_type(layout, "FunctionNodeInputString")
+ node_add_menu.add_node_type(layout, "ShaderNodeValue")
+ node_add_menu.add_node_type(layout, "FunctionNodeInputVector")
+ layout.separator()
+ node_add_menu.add_node_type(layout, "GeometryNodeInputID")
+ node_add_menu.add_node_type(layout, "GeometryNodeInputIndex")
+ node_add_menu.add_node_type(layout, "GeometryNodeInputNamedAttribute")
+ node_add_menu.add_node_type(layout, "GeometryNodeInputNormal")
+ node_add_menu.add_node_type(layout, "GeometryNodeInputPosition")
+ node_add_menu.add_node_type(layout, "GeometryNodeInputRadius")
+ node_add_menu.add_node_type(layout, "GeometryNodeInputSceneTime")
+
+
+class NODE_MT_geometry_node_GEO_INSTANCE(Menu):
+ bl_idname = "NODE_MT_geometry_node_GEO_INSTANCE"
+ bl_label = "Instances"
+
+ def draw(self, _context):
+ layout = self.layout
+ node_add_menu.add_node_type(layout, "GeometryNodeInstanceOnPoints")
+ node_add_menu.add_node_type(layout, "GeometryNodeInstancesToPoints")
+ node_add_menu.add_node_type(layout, "GeometryNodeRealizeInstances")
+ node_add_menu.add_node_type(layout, "GeometryNodeRotateInstances")
+ node_add_menu.add_node_type(layout, "GeometryNodeScaleInstances")
+ node_add_menu.add_node_type(layout, "GeometryNodeTranslateInstances")
+ layout.separator()
+ node_add_menu.add_node_type(layout, "GeometryNodeInputInstanceRotation")
+ node_add_menu.add_node_type(layout, "GeometryNodeInputInstanceScale")
+
+
+class NODE_MT_geometry_node_GEO_MATERIAL(Menu):
+ bl_idname = "NODE_MT_geometry_node_GEO_MATERIAL"
+ bl_label = "Material"
+
+ def draw(self, _context):
+ layout = self.layout
+ node_add_menu.add_node_type(layout, "GeometryNodeReplaceMaterial")
+ layout.separator()
+ node_add_menu.add_node_type(layout, "GeometryNodeInputMaterialIndex")
+ node_add_menu.add_node_type(layout, "GeometryNodeMaterialSelection")
+ layout.separator()
+ node_add_menu.add_node_type(layout, "GeometryNodeSetMaterial")
+ node_add_menu.add_node_type(layout, "GeometryNodeSetMaterialIndex")
+
+
+class NODE_MT_geometry_node_GEO_MESH(Menu):
+ bl_idname = "NODE_MT_geometry_node_GEO_MESH"
+ bl_label = "Mesh"
+
+ def draw(self, _context):
+ layout = self.layout
+ node_add_menu.add_node_type(layout, "GeometryNodeDualMesh")
+ node_add_menu.add_node_type(layout, "GeometryNodeEdgePathsToCurves")
+ node_add_menu.add_node_type(layout, "GeometryNodeEdgePathsToSelection")
+ node_add_menu.add_node_type(layout, "GeometryNodeExtrudeMesh")
+ node_add_menu.add_node_type(layout, "GeometryNodeFlipFaces")
+ node_add_menu.add_node_type(layout, "GeometryNodeMeshBoolean")
+ node_add_menu.add_node_type(layout, "GeometryNodeMeshToCurve")
+ node_add_menu.add_node_type(layout, "GeometryNodeMeshToPoints")
+ node_add_menu.add_node_type(layout, "GeometryNodeMeshToVolume")
+ node_add_menu.add_node_type(layout, "GeometryNodeSampleNearestSurface")
+ node_add_menu.add_node_type(layout, "GeometryNodeSampleUVSurface")
+ node_add_menu.add_node_type(layout, "GeometryNodeScaleElements")
+ node_add_menu.add_node_type(layout, "GeometryNodeSplitEdges")
+ node_add_menu.add_node_type(layout, "GeometryNodeSubdivideMesh")
+ node_add_menu.add_node_type(layout, "GeometryNodeSubdivisionSurface")
+ node_add_menu.add_node_type(layout, "GeometryNodeTriangulate")
+ layout.separator()
+ node_add_menu.add_node_type(layout, "GeometryNodeInputMeshEdgeAngle")
+ node_add_menu.add_node_type(layout, "GeometryNodeInputMeshEdgeNeighbors")
+ node_add_menu.add_node_type(layout, "GeometryNodeInputMeshFaceArea")
+ node_add_menu.add_node_type(layout, "GeometryNodeInputMeshFaceNeighbors")
+ node_add_menu.add_node_type(layout, "GeometryNodeMeshFaceSetBoundaries")
+ node_add_menu.add_node_type(layout, "GeometryNodeInputMeshFaceIsPlanar")
+ node_add_menu.add_node_type(layout, "GeometryNodeInputShadeSmooth")
+ node_add_menu.add_node_type(layout, "GeometryNodeInputMeshIsland")
+ node_add_menu.add_node_type(layout, "GeometryNodeInputShortestEdgePaths")
+ node_add_menu.add_node_type(layout, "GeometryNodeInputMeshVertexNeighbors")
+ layout.separator()
+ node_add_menu.add_node_type(layout, "GeometryNodeSetShadeSmooth")
+
+
+class NODE_MT_category_PRIMITIVES_MESH(Menu):
+ bl_idname = "NODE_MT_category_PRIMITIVES_MESH"
+ bl_label = "Mesh Primitives"
+
+ def draw(self, _context):
+ layout = self.layout
+ node_add_menu.add_node_type(layout, "GeometryNodeMeshCone")
+ node_add_menu.add_node_type(layout, "GeometryNodeMeshCube")
+ node_add_menu.add_node_type(layout, "GeometryNodeMeshCylinder")
+ node_add_menu.add_node_type(layout, "GeometryNodeMeshGrid")
+ node_add_menu.add_node_type(layout, "GeometryNodeMeshIcoSphere")
+ node_add_menu.add_node_type(layout, "GeometryNodeMeshCircle")
+ node_add_menu.add_node_type(layout, "GeometryNodeMeshLine")
+
+
+class NODE_MT_geometry_node_mesh_topology(Menu):
+ bl_idname = "NODE_MT_geometry_node_mesh_topology"
+ bl_label = "Mesh Topology"
+
+ def draw(self, _context):
+ layout = self.layout
+ node_add_menu.add_node_type(layout, "GeometryNodeCornersOfFace"),
+ node_add_menu.add_node_type(layout, "GeometryNodeCornersOfVertex"),
+ node_add_menu.add_node_type(layout, "GeometryNodeInputMeshEdgeVertices")
+ node_add_menu.add_node_type(layout, "GeometryNodeEdgesOfCorner"),
+ node_add_menu.add_node_type(layout, "GeometryNodeEdgesOfVertex"),
+ node_add_menu.add_node_type(layout, "GeometryNodeFaceOfCorner"),
+ node_add_menu.add_node_type(layout, "GeometryNodeOffsetCornerInFace"),
+ node_add_menu.add_node_type(layout, "GeometryNodeVertexOfCorner"),
+
+
+class NODE_MT_category_GEO_OUTPUT(Menu):
+ bl_idname = "NODE_MT_category_GEO_OUTPUT"
+ bl_label = "Output"
+
+ def draw(self, _context):
+ layout = self.layout
+ node_add_menu.add_node_type(layout, "GeometryNodeViewer")
+
+
+class NODE_MT_category_GEO_POINT(Menu):
+ bl_idname = "NODE_MT_category_GEO_POINT"
+ bl_label = "Point"
+
+ def draw(self, _context):
+ layout = self.layout
+ node_add_menu.add_node_type(layout, "GeometryNodeDistributePointsInVolume")
+ node_add_menu.add_node_type(layout, "GeometryNodeDistributePointsOnFaces")
+ node_add_menu.add_node_type(layout, "GeometryNodePoints")
+ node_add_menu.add_node_type(layout, "GeometryNodePointsToVertices")
+ node_add_menu.add_node_type(layout, "GeometryNodePointsToVolume")
+ layout.separator()
+ node_add_menu.add_node_type(layout, "GeometryNodeSetPointRadius")
+
+
+class NODE_MT_category_GEO_TEXT(Menu):
+ bl_idname = "NODE_MT_category_GEO_TEXT"
+ bl_label = "Text"
+
+ def draw(self, _context):
+ layout = self.layout
+ node_add_menu.add_node_type(layout, "GeometryNodeStringJoin")
+ node_add_menu.add_node_type(layout, "FunctionNodeReplaceString")
+ node_add_menu.add_node_type(layout, "FunctionNodeSliceString")
+ node_add_menu.add_node_type(layout, "FunctionNodeStringLength")
+ node_add_menu.add_node_type(layout, "GeometryNodeStringToCurves")
+ node_add_menu.add_node_type(layout, "FunctionNodeValueToString")
+ layout.separator()
+ node_add_menu.add_node_type(layout, "FunctionNodeInputSpecialCharacters")
+
+
+class NODE_MT_category_GEO_TEXTURE(Menu):
+ bl_idname = "NODE_MT_category_GEO_TEXTURE"
+ bl_label = "Texture"
+
+ def draw(self, _context):
+ layout = self.layout
+ node_add_menu.add_node_type(layout, "ShaderNodeTexBrick")
+ node_add_menu.add_node_type(layout, "ShaderNodeTexChecker")
+ node_add_menu.add_node_type(layout, "ShaderNodeTexGradient")
+ node_add_menu.add_node_type(layout, "GeometryNodeImageTexture")
+ node_add_menu.add_node_type(layout, "ShaderNodeTexMagic")
+ node_add_menu.add_node_type(layout, "ShaderNodeTexMusgrave")
+ node_add_menu.add_node_type(layout, "ShaderNodeTexNoise")
+ node_add_menu.add_node_type(layout, "ShaderNodeTexVoronoi")
+ node_add_menu.add_node_type(layout, "ShaderNodeTexWave")
+ node_add_menu.add_node_type(layout, "ShaderNodeTexWhiteNoise")
+
+
+class NODE_MT_category_GEO_UTILITIES(Menu):
+ bl_idname = "NODE_MT_category_GEO_UTILITIES"
+ bl_label = "Utilities"
+
+ def draw(self, _context):
+ layout = self.layout
+ node_add_menu.add_node_type(layout, "GeometryNodeAccumulateField")
+ node_add_menu.add_node_type(layout, "FunctionNodeAlignEulerToVector")
+ node_add_menu.add_node_type(layout, "FunctionNodeBooleanMath")
+ node_add_menu.add_node_type(layout, "ShaderNodeClamp")
+ node_add_menu.add_node_type(layout, "FunctionNodeCompare")
+ node_add_menu.add_node_type(layout, "GeometryNodeFieldAtIndex")
+ node_add_menu.add_node_type(layout, "ShaderNodeFloatCurve")
+ node_add_menu.add_node_type(layout, "FunctionNodeFloatToInt")
+ node_add_menu.add_node_type(layout, "GeometryNodeFieldOnDomain")
+ node_add_menu.add_node_type(layout, "ShaderNodeMapRange")
+ node_add_menu.add_node_type(layout, "ShaderNodeMath")
+ node_add_menu.add_node_type(layout, "ShaderNodeMix")
+ node_add_menu.add_node_type(layout, "FunctionNodeRandomValue")
+ node_add_menu.add_node_type(layout, "FunctionNodeRotateEuler")
+ node_add_menu.add_node_type(layout, "GeometryNodeSwitch")
+
+
+class NODE_MT_category_GEO_UV(Menu):
+ bl_idname = "NODE_MT_category_GEO_UV"
+ bl_label = "UV"
+
+ def draw(self, _context):
+ layout = self.layout
+ node_add_menu.add_node_type(layout, "GeometryNodeUVPackIslands")
+ node_add_menu.add_node_type(layout, "GeometryNodeUVUnwrap")
+
+
+class NODE_MT_category_GEO_VECTOR(Menu):
+ bl_idname = "NODE_MT_category_GEO_VECTOR"
+ bl_label = "Vector"
+
+ def draw(self, _context):
+ layout = self.layout
+ node_add_menu.add_node_type(layout, "ShaderNodeCombineXYZ")
+ node_add_menu.add_node_type(layout, "ShaderNodeSeparateXYZ")
+ node_add_menu.add_node_type(layout, "ShaderNodeVectorCurve")
+ node_add_menu.add_node_type(layout, "ShaderNodeVectorMath")
+ node_add_menu.add_node_type(layout, "ShaderNodeVectorRotate")
+
+
+class NODE_MT_category_GEO_VOLUME(Menu):
+ bl_idname = "NODE_MT_category_GEO_VOLUME"
+ bl_label = "Volume"
+
+ def draw(self, _context):
+ layout = self.layout
+ node_add_menu.add_node_type(layout, "GeometryNodeVolumeCube")
+ node_add_menu.add_node_type(layout, "GeometryNodeVolumeToMesh")
+
+
+class NODE_MT_category_GEO_GROUP(Menu):
+ bl_idname = "NODE_MT_category_GEO_GROUP"
+ bl_label = "Group"
+
+ def draw(self, context):
+ layout = self.layout
+ node_add_menu.draw_node_group_add_menu(context, layout)
+
+
+class NODE_MT_category_GEO_LAYOUT(Menu):
+ bl_idname = "NODE_MT_category_GEO_LAYOUT"
+ bl_label = "Layout"
+
+ def draw(self, _context):
+ layout = self.layout
+ node_add_menu.add_node_type(layout, "NodeFrame")
+ node_add_menu.add_node_type(layout, "NodeReroute")
+
+
+class NODE_MT_geometry_node_add_all(Menu):
+ bl_idname = "NODE_MT_geometry_node_add_all"
+ bl_label = ""
+
+ def draw(self, _context):
+ layout = self.layout
+ layout.menu("NODE_MT_geometry_node_GEO_ATTRIBUTE")
+ layout.menu("NODE_MT_geometry_node_GEO_COLOR")
+ layout.menu("NODE_MT_geometry_node_GEO_CURVE")
+ layout.menu("NODE_MT_geometry_node_GEO_PRIMITIVES_CURVE")
+ layout.menu("NODE_MT_geometry_node_curve_topology")
+ layout.menu("NODE_MT_geometry_node_GEO_GEOMETRY")
+ layout.menu("NODE_MT_geometry_node_GEO_INPUT")
+ layout.menu("NODE_MT_geometry_node_GEO_INSTANCE")
+ layout.menu("NODE_MT_geometry_node_GEO_MATERIAL")
+ layout.menu("NODE_MT_geometry_node_GEO_MESH")
+ layout.menu("NODE_MT_category_PRIMITIVES_MESH")
+ layout.menu("NODE_MT_geometry_node_mesh_topology")
+ layout.menu("NODE_MT_category_GEO_OUTPUT")
+ layout.menu("NODE_MT_category_GEO_POINT")
+ layout.menu("NODE_MT_category_GEO_TEXT")
+ layout.menu("NODE_MT_category_GEO_TEXTURE")
+ layout.menu("NODE_MT_category_GEO_UTILITIES")
+ layout.menu("NODE_MT_category_GEO_UV")
+ layout.menu("NODE_MT_category_GEO_VECTOR")
+ layout.menu("NODE_MT_category_GEO_VOLUME")
+ layout.menu("NODE_MT_category_GEO_GROUP")
+ layout.menu("NODE_MT_category_GEO_LAYOUT")
+
+
+classes = (
+ NODE_MT_geometry_node_add_all,
+ NODE_MT_geometry_node_GEO_ATTRIBUTE,
+ NODE_MT_geometry_node_GEO_COLOR,
+ NODE_MT_geometry_node_GEO_CURVE,
+ NODE_MT_geometry_node_GEO_PRIMITIVES_CURVE,
+ NODE_MT_geometry_node_curve_topology,
+ NODE_MT_geometry_node_GEO_GEOMETRY,
+ NODE_MT_geometry_node_GEO_INPUT,
+ NODE_MT_geometry_node_GEO_INSTANCE,
+ NODE_MT_geometry_node_GEO_MATERIAL,
+ NODE_MT_geometry_node_GEO_MESH,
+ NODE_MT_category_PRIMITIVES_MESH,
+ NODE_MT_geometry_node_mesh_topology,
+ NODE_MT_category_GEO_OUTPUT,
+ NODE_MT_category_GEO_POINT,
+ NODE_MT_category_GEO_TEXT,
+ NODE_MT_category_GEO_TEXTURE,
+ NODE_MT_category_GEO_UTILITIES,
+ NODE_MT_category_GEO_UV,
+ NODE_MT_category_GEO_VECTOR,
+ NODE_MT_category_GEO_VOLUME,
+ NODE_MT_category_GEO_GROUP,
+ NODE_MT_category_GEO_LAYOUT,
+)
+
+if __name__ == "__main__": # only for live edit.
+ from bpy.utils import register_class
+ for cls in classes:
+ register_class(cls)
diff --git a/release/scripts/startup/bl_ui/properties_data_bone.py b/release/scripts/startup/bl_ui/properties_data_bone.py
index abbb3a8717f..8e1808949b3 100644
--- a/release/scripts/startup/bl_ui/properties_data_bone.py
+++ b/release/scripts/startup/bl_ui/properties_data_bone.py
@@ -4,6 +4,8 @@ import bpy
from bpy.types import Panel
from rna_prop_ui import PropertyPanel
+from bpy.app.translations import contexts as i18n_contexts
+
class BoneButtonsPanel:
bl_space_type = 'PROPERTIES'
@@ -156,8 +158,8 @@ class BONE_PT_curved(BoneButtonsPanel, Panel):
col.prop(bbone, "bbone_scaleout", text="Scale Out")
col = topcol.column(align=True)
- col.prop(bbone, "bbone_easein", text="Ease In")
- col.prop(bbone, "bbone_easeout", text="Out")
+ col.prop(bbone, "bbone_easein", text="Ease In", text_ctxt=i18n_contexts.id_armature)
+ col.prop(bbone, "bbone_easeout", text="Out", text_ctxt=i18n_contexts.id_armature)
col.prop(bone, "use_scale_easing")
col = topcol.column(align=True)
@@ -177,7 +179,7 @@ class BONE_PT_curved(BoneButtonsPanel, Panel):
row2.prop(bone, "bbone_handle_use_scale_start", index=0, text="X", toggle=True)
row2.prop(bone, "bbone_handle_use_scale_start", index=1, text="Y", toggle=True)
row2.prop(bone, "bbone_handle_use_scale_start", index=2, text="Z", toggle=True)
- split2.prop(bone, "bbone_handle_use_ease_start", text="Ease", toggle=True)
+ split2.prop(bone, "bbone_handle_use_ease_start", text="Ease", text_ctxt=i18n_contexts.id_armature, toggle=True)
row.label(icon='BLANK1')
col = topcol.column(align=True)
@@ -197,7 +199,7 @@ class BONE_PT_curved(BoneButtonsPanel, Panel):
row2.prop(bone, "bbone_handle_use_scale_end", index=0, text="X", toggle=True)
row2.prop(bone, "bbone_handle_use_scale_end", index=1, text="Y", toggle=True)
row2.prop(bone, "bbone_handle_use_scale_end", index=2, text="Z", toggle=True)
- split2.prop(bone, "bbone_handle_use_ease_end", text="Ease", toggle=True)
+ split2.prop(bone, "bbone_handle_use_ease_end", text="Ease", text_ctxt=i18n_contexts.id_armature, toggle=True)
row.label(icon='BLANK1')
diff --git a/release/scripts/startup/bl_ui/properties_data_mesh.py b/release/scripts/startup/bl_ui/properties_data_mesh.py
index 8f2141ba6fc..a775a3cfa1b 100644
--- a/release/scripts/startup/bl_ui/properties_data_mesh.py
+++ b/release/scripts/startup/bl_ui/properties_data_mesh.py
@@ -493,13 +493,25 @@ class DATA_PT_customdata(MeshButtonsPanel, Panel):
else:
col.operator("mesh.customdata_custom_splitnormals_add", icon='ADD')
- col = layout.column(heading="Store")
+ if me.has_bevel_weight_edge:
+ col.operator("mesh.customdata_bevel_weight_edge_clear", icon='X')
+ else:
+ col.operator("mesh.customdata_bevel_weight_edge_add", icon='ADD')
+
+ if me.has_bevel_weight_vertex:
+ col.operator("mesh.customdata_bevel_weight_vertex_clear", icon='X')
+ else:
+ col.operator("mesh.customdata_bevel_weight_vertex_add", icon='ADD')
- col.enabled = obj is not None and obj.mode != 'EDIT'
- col.prop(me, "use_customdata_vertex_bevel", text="Vertex Bevel Weight")
- col.prop(me, "use_customdata_edge_bevel", text="Edge Bevel Weight")
- col.prop(me, "use_customdata_vertex_crease", text="Vertex Crease")
- col.prop(me, "use_customdata_edge_crease", text="Edge Crease")
+ if me.has_crease_edge:
+ col.operator("mesh.customdata_crease_edge_clear", icon='X')
+ else:
+ col.operator("mesh.customdata_crease_edge_add", icon='ADD')
+
+ if me.has_crease_vertex:
+ col.operator("mesh.customdata_crease_vertex_clear", icon='X')
+ else:
+ col.operator("mesh.customdata_crease_vertex_add", icon='ADD')
class DATA_PT_custom_props_mesh(MeshButtonsPanel, PropertyPanel, Panel):
@@ -580,7 +592,7 @@ class DATA_PT_mesh_attributes(MeshButtonsPanel, Panel):
colliding_names = []
for collection in (
# Built-in names.
- {"position": None, "material_index": None, "shade_smooth": None, "normal": None, "crease": None},
+ {"position": None, "shade_smooth": None, "normal": None, "crease": None},
mesh.attributes,
mesh.uv_layers,
ob.vertex_groups,
diff --git a/release/scripts/startup/bl_ui/properties_paint_common.py b/release/scripts/startup/bl_ui/properties_paint_common.py
index 9b1cf11f6e7..72a87703bd5 100644
--- a/release/scripts/startup/bl_ui/properties_paint_common.py
+++ b/release/scripts/startup/bl_ui/properties_paint_common.py
@@ -943,8 +943,39 @@ def brush_settings_advanced(layout, context, brush, popover=False):
# boundary edges/face sets automasking
col.prop(brush, "use_automasking_boundary_edges", text="Mesh Boundary")
col.prop(brush, "use_automasking_boundary_face_sets", text="Face Sets Boundary")
+ col.prop(brush, "use_automasking_cavity", text="Cavity")
+ col.prop(brush, "use_automasking_cavity_inverted", text="Cavity (Inverted)")
+ col.prop(brush, "use_automasking_start_normal", text="Area Normal")
+ col.prop(brush, "use_automasking_view_normal", text="View Normal")
+
+ col.separator()
col.prop(brush, "automasking_boundary_edges_propagation_steps")
+ sculpt = context.tool_settings.sculpt
+
+ if brush.use_automasking_start_normal:
+ col.separator()
+
+ col.prop(sculpt, "automasking_start_normal_limit")
+ col.prop(sculpt, "automasking_start_normal_falloff")
+
+ if brush.use_automasking_view_normal:
+ col.separator()
+
+ col.prop(brush, "use_automasking_view_occlusion", text="Occlusion")
+ col.prop(sculpt, "automasking_view_normal_limit")
+ col.prop(sculpt, "automasking_view_normal_falloff")
+
+ if brush.use_automasking_cavity or brush.use_automasking_cavity_inverted:
+ col.separator()
+
+ col.prop(brush, "automasking_cavity_factor", text="Cavity Factor")
+ col.prop(brush, "automasking_cavity_blur_steps", text="Cavity Blur")
+ col.prop(brush, "use_automasking_custom_cavity_curve", text="Use Curve")
+
+ if brush.use_automasking_custom_cavity_curve:
+ col.template_curve_mapping(brush, "automasking_cavity_curve")
+
layout.separator()
# sculpt plane settings
diff --git a/release/scripts/startup/bl_ui/properties_view_layer.py b/release/scripts/startup/bl_ui/properties_view_layer.py
index 78aec096510..c6d1ee2a065 100644
--- a/release/scripts/startup/bl_ui/properties_view_layer.py
+++ b/release/scripts/startup/bl_ui/properties_view_layer.py
@@ -1,5 +1,7 @@
# SPDX-License-Identifier: GPL-2.0-or-later
-from bpy.types import Menu, Panel, UIList
+from bpy.types import Menu, Panel, UIList, ViewLayer
+
+from rna_prop_ui import PropertyPanel
class VIEWLAYER_UL_aov(UIList):
@@ -207,7 +209,7 @@ class ViewLayerCryptomattePanel(ViewLayerButtonsPanel, Panel):
class VIEWLAYER_PT_layer_passes_cryptomatte(ViewLayerCryptomattePanel, Panel):
bl_parent_id = "VIEWLAYER_PT_layer_passes"
- COMPAT_ENGINES = {'BLENDER_EEVEE'}
+ COMPAT_ENGINES = {'BLENDER_EEVEE', 'BLENDER_EEVEE_NEXT'}
class VIEWLAYER_MT_lightgroup_sync(Menu):
@@ -249,6 +251,14 @@ class VIEWLAYER_PT_layer_passes_lightgroups(ViewLayerLightgroupsPanel):
COMPAT_ENGINES = {'CYCLES'}
+class VIEWLAYER_PT_layer_custom_props(PropertyPanel, Panel):
+ bl_space_type = 'PROPERTIES'
+ bl_region_type = 'WINDOW'
+ bl_context = "view_layer"
+ _context_path = "view_layer"
+ _property_type = ViewLayer
+
+
classes = (
VIEWLAYER_MT_lightgroup_sync,
VIEWLAYER_PT_layer,
@@ -260,6 +270,7 @@ classes = (
VIEWLAYER_PT_layer_passes_cryptomatte,
VIEWLAYER_PT_layer_passes_aov,
VIEWLAYER_PT_layer_passes_lightgroups,
+ VIEWLAYER_PT_layer_custom_props,
VIEWLAYER_UL_aov,
)
diff --git a/release/scripts/startup/bl_ui/space_dopesheet.py b/release/scripts/startup/bl_ui/space_dopesheet.py
index a2e691c2d9f..f95650ccc23 100644
--- a/release/scripts/startup/bl_ui/space_dopesheet.py
+++ b/release/scripts/startup/bl_ui/space_dopesheet.py
@@ -318,6 +318,7 @@ class DOPESHEET_MT_view(Menu):
st = context.space_data
layout.prop(st, "show_region_ui")
+ layout.prop(st, "show_region_hud")
layout.separator()
diff --git a/release/scripts/startup/bl_ui/space_image.py b/release/scripts/startup/bl_ui/space_image.py
index 4165f6ab0cf..cefa4bf7d1d 100644
--- a/release/scripts/startup/bl_ui/space_image.py
+++ b/release/scripts/startup/bl_ui/space_image.py
@@ -402,7 +402,7 @@ class IMAGE_MT_uvs(Menu):
layout.menu("IMAGE_MT_uvs_mirror")
layout.menu("IMAGE_MT_uvs_snap")
- layout.prop_menu_enum(uv, "pixel_snap_mode")
+ layout.prop_menu_enum(uv, "pixel_round_mode")
layout.prop(uv, "lock_bounds")
layout.separator()
@@ -436,6 +436,7 @@ class IMAGE_MT_uvs(Menu):
layout.operator("uv.minimize_stretch")
layout.operator("uv.stitch")
layout.menu("IMAGE_MT_uvs_align")
+ layout.operator("uv.align_rotation")
layout.separator()
@@ -536,10 +537,12 @@ class IMAGE_MT_pivot_pie(Menu):
layout = self.layout
pie = layout.menu_pie()
- pie.prop_enum(context.space_data, "pivot_point", value='CENTER')
- pie.prop_enum(context.space_data, "pivot_point", value='CURSOR')
- pie.prop_enum(context.space_data, "pivot_point", value='INDIVIDUAL_ORIGINS')
- pie.prop_enum(context.space_data, "pivot_point", value='MEDIAN')
+ sima = context.space_data
+
+ pie.prop_enum(sima, "pivot_point", value='CENTER')
+ pie.prop_enum(sima, "pivot_point", value='CURSOR')
+ pie.prop_enum(sima, "pivot_point", value='INDIVIDUAL_ORIGINS')
+ pie.prop_enum(sima, "pivot_point", value='MEDIAN')
class IMAGE_MT_uvs_snap_pie(Menu):
@@ -1530,15 +1533,26 @@ class IMAGE_PT_overlay_guides(Panel):
if overlay.show_grid_background:
layout.use_property_split = True
+
+ col = layout.column(align=False, heading="Grid Over Image")
+ col.use_property_decorate = False
+ row = col.row(align=True)
+ sub = row.row(align=True)
+ sub.prop(uvedit, "show_grid_over_image", text="")
+ sub.active = sima.image is not None
+
col = layout.column(align=False, heading="Fixed Subdivisions")
col.use_property_decorate = False
row = col.row(align=True)
sub = row.row(align=True)
sub.prop(uvedit, "use_custom_grid", text="")
- sub = sub.row(align=True)
- sub.active = uvedit.use_custom_grid
- sub.prop(uvedit, "custom_grid_subdivisions", text="")
+ if uvedit.use_custom_grid:
+ row = layout.row()
+ row.use_property_split = True
+ row.use_property_decorate = False
+ sub = sub.row(align=True)
+ sub.prop(uvedit, "custom_grid_subdivisions", text="")
row = layout.row()
row.use_property_split = True
diff --git a/release/scripts/startup/bl_ui/space_info.py b/release/scripts/startup/bl_ui/space_info.py
index 3a9e4841749..20deb97c92f 100644
--- a/release/scripts/startup/bl_ui/space_info.py
+++ b/release/scripts/startup/bl_ui/space_info.py
@@ -1,6 +1,8 @@
# SPDX-License-Identifier: GPL-2.0-or-later
from bpy.types import Header, Menu
+from bpy.app.translations import contexts as i18n_contexts
+
class INFO_HT_header(Header):
bl_space_type = 'INFO'
@@ -61,6 +63,7 @@ class INFO_MT_info(Menu):
class INFO_MT_area(Menu):
bl_label = "Area"
+ bl_translation_context = i18n_contexts.id_windowmanager
def draw(self, context):
layout = self.layout
diff --git a/release/scripts/startup/bl_ui/space_nla.py b/release/scripts/startup/bl_ui/space_nla.py
index 5157a215f34..a1c7e5c54de 100644
--- a/release/scripts/startup/bl_ui/space_nla.py
+++ b/release/scripts/startup/bl_ui/space_nla.py
@@ -88,6 +88,7 @@ class NLA_MT_view(Menu):
st = context.space_data
layout.prop(st, "show_region_ui")
+ layout.prop(st, "show_region_hud")
layout.separator()
layout.prop(st, "use_realtime_update")
diff --git a/release/scripts/startup/bl_ui/space_node.py b/release/scripts/startup/bl_ui/space_node.py
index 118928ef9c6..f4070a8289d 100644
--- a/release/scripts/startup/bl_ui/space_node.py
+++ b/release/scripts/startup/bl_ui/space_node.py
@@ -219,10 +219,14 @@ class NODE_MT_add(bpy.types.Menu):
import nodeitems_utils
layout = self.layout
-
layout.operator_context = 'INVOKE_DEFAULT'
- if nodeitems_utils.has_node_categories(context):
+ snode = context.space_data
+ if snode.tree_type == 'GeometryNodeTree':
+ props = layout.operator("node.add_search", text="Search...", icon='VIEWZOOM')
+ layout.separator()
+ layout.menu_contents("NODE_MT_geometry_node_add_all")
+ elif nodeitems_utils.has_node_categories(context):
props = layout.operator("node.add_search", text="Search...", icon='VIEWZOOM')
props.use_transform = True
diff --git a/release/scripts/startup/bl_ui/space_outliner.py b/release/scripts/startup/bl_ui/space_outliner.py
index dc4eea13ce3..8420d830257 100644
--- a/release/scripts/startup/bl_ui/space_outliner.py
+++ b/release/scripts/startup/bl_ui/space_outliner.py
@@ -30,8 +30,15 @@ class OUTLINER_HT_header(Header):
layout.separator_spacer()
- row = layout.row(align=True)
- row.prop(space, "filter_text", icon='VIEWZOOM', text="")
+ filter_text_supported = True
+ # No text filtering for library override hierarchies. The tree is lazy built to avoid
+ # performance issues in complex files.
+ if display_mode == 'LIBRARY_OVERRIDES' and space.lib_override_view_mode == 'HIERARCHIES':
+ filter_text_supported = False
+
+ if filter_text_supported:
+ row = layout.row(align=True)
+ row.prop(space, "filter_text", icon='VIEWZOOM', text="")
layout.separator_spacer()
@@ -46,11 +53,8 @@ class OUTLINER_HT_header(Header):
text="",
icon='FILTER',
)
- if display_mode == 'LIBRARY_OVERRIDES' and space.lib_override_view_mode == 'HIERARCHIES':
- # Don't add ID type filter for library overrides hierarchies mode. Point of it is to see a hierarchy that is
- # usually constructed out of different ID types.
- pass
- elif display_mode in {'LIBRARIES', 'LIBRARY_OVERRIDES', 'ORPHAN_DATA'}:
+
+ if display_mode in {'LIBRARIES', 'ORPHAN_DATA'}:
row.prop(space, "use_filter_id_type", text="", icon='FILTER')
sub = row.row(align=True)
sub.active = space.use_filter_id_type
@@ -319,9 +323,22 @@ class OUTLINER_MT_object(Menu):
OUTLINER_MT_context_menu.draw_common_operators(layout)
+def has_selected_ids_in_context(context):
+ if hasattr(context, "id"):
+ return True
+ if len(context.selected_ids) > 0:
+ return True
+
+ return False
+
+
class OUTLINER_MT_asset(Menu):
bl_label = "Assets"
+ @classmethod
+ def poll(cls, context):
+ return has_selected_ids_in_context(context)
+
def draw(self, _context):
layout = self.layout
@@ -333,6 +350,10 @@ class OUTLINER_MT_asset(Menu):
class OUTLINER_MT_liboverride(Menu):
bl_label = "Library Override"
+ @classmethod
+ def poll(cls, context):
+ return has_selected_ids_in_context(context)
+
def draw(self, _context):
layout = self.layout
@@ -394,14 +415,19 @@ class OUTLINER_PT_filter(Panel):
row.prop(space, "show_mode_column", text="Show Mode Column")
layout.separator()
- col = layout.column(align=True)
- col.label(text="Search")
- col.prop(space, "use_filter_complete", text="Exact Match")
- col.prop(space, "use_filter_case_sensitive", text="Case Sensitive")
+ filter_text_supported = True
+ # Same exception for library overrides as in OUTLINER_HT_header.
+ if display_mode == 'LIBRARY_OVERRIDES' and space.lib_override_view_mode == 'HIERARCHIES':
+ filter_text_supported = False
+
+ if filter_text_supported:
+ col = layout.column(align=True)
+ col.label(text="Search")
+ col.prop(space, "use_filter_complete", text="Exact Match")
+ col.prop(space, "use_filter_case_sensitive", text="Case Sensitive")
if display_mode == 'LIBRARY_OVERRIDES' and space.lib_override_view_mode == 'PROPERTIES' and bpy.data.libraries:
- col.separator()
- row = col.row()
+ row = layout.row()
row.label(icon='LIBRARY_DATA_OVERRIDE')
row.prop(space, "use_filter_lib_override_system", text="System Overrides")
diff --git a/release/scripts/startup/bl_ui/space_spreadsheet.py b/release/scripts/startup/bl_ui/space_spreadsheet.py
index 741ad544d67..846582b0142 100644
--- a/release/scripts/startup/bl_ui/space_spreadsheet.py
+++ b/release/scripts/startup/bl_ui/space_spreadsheet.py
@@ -11,34 +11,37 @@ class SPREADSHEET_HT_header(bpy.types.Header):
space = context.space_data
layout.template_header()
+ viewer_path = space.viewer_path.path
- if len(space.context_path) == 0:
- self.draw_without_context_path(layout)
+ if len(viewer_path) == 0:
+ self.draw_without_viewer_path(layout)
return
- root_context = space.context_path[0]
- if root_context.type != 'OBJECT':
- self.draw_without_context_path(layout)
+ root_context = viewer_path[0]
+ if root_context.type != 'ID':
+ self.draw_without_viewer_path(layout)
return
- obj = root_context.object
+ if not isinstance(root_context.id, bpy.types.Object):
+ self.draw_without_viewer_path(layout)
+ return
+ obj = root_context.id
if obj is None:
- self.draw_without_context_path(layout)
+ self.draw_without_viewer_path(layout)
return
layout.prop(space, "object_eval_state", text="")
- context_path = space.context_path
if space.object_eval_state == 'ORIGINAL':
# Only show first context.
- context_path = context_path[:1]
- if space.display_context_path_collapsed:
- self.draw_collapsed_context_path(context, layout, context_path)
+ viewer_path = viewer_path[:1]
+ if space.display_viewer_path_collapsed:
+ self.draw_collapsed_viewer_path(context, layout, viewer_path)
else:
- self.draw_full_context_path(context, layout, context_path)
+ self.draw_full_viewer_path(context, layout, viewer_path)
pin_icon = 'PINNED' if space.is_pinned else 'UNPINNED'
layout.operator("spreadsheet.toggle_pin", text="", icon=pin_icon, emboss=False)
- if space.object_eval_state == 'VIEWER_NODE' and len(context_path) < 3:
+ if space.object_eval_state == 'VIEWER_NODE' and len(viewer_path) < 3:
layout.label(text="No active viewer node", icon='INFO')
layout.separator_spacer()
@@ -49,50 +52,52 @@ class SPREADSHEET_HT_header(bpy.types.Header):
sub.prop(space, "show_only_selected", text="")
row.prop(space, "use_filter", toggle=True, icon='FILTER', icon_only=True)
- def draw_without_context_path(self, layout):
+ def draw_without_viewer_path(self, layout):
layout.label(text="No active context")
- def draw_full_context_path(self, context, layout, context_path):
+ def draw_full_viewer_path(self, context, layout, viewer_path):
space = context.space_data
row = layout.row()
- for ctx in context_path[:-1]:
+ for ctx in viewer_path[:-1]:
subrow = row.row(align=True)
self.draw_spreadsheet_context(subrow, ctx)
- self.draw_spreadsheet_context_path_icon(subrow, space)
+ self.draw_spreadsheet_viewer_path_icon(subrow, space)
- self.draw_spreadsheet_context(row, context_path[-1])
+ self.draw_spreadsheet_context(row, viewer_path[-1])
- def draw_collapsed_context_path(self, context, layout, context_path):
+ def draw_collapsed_viewer_path(self, context, layout, viewer_path):
space = context.space_data
row = layout.row(align=True)
- self.draw_spreadsheet_context(row, context_path[0])
- if len(context_path) == 1:
+ self.draw_spreadsheet_context(row, viewer_path[0])
+ if len(viewer_path) == 1:
return
- self.draw_spreadsheet_context_path_icon(row, space)
- if len(context_path) > 2:
- self.draw_spreadsheet_context_path_icon(row, space, icon='DOT')
- self.draw_spreadsheet_context_path_icon(row, space)
- self.draw_spreadsheet_context(row, context_path[-1])
+ self.draw_spreadsheet_viewer_path_icon(row, space)
+ if len(viewer_path) > 2:
+ self.draw_spreadsheet_viewer_path_icon(row, space, icon='DOT')
+ self.draw_spreadsheet_viewer_path_icon(row, space)
+ self.draw_spreadsheet_context(row, viewer_path[-1])
def draw_spreadsheet_context(self, layout, ctx):
- if ctx.type == 'OBJECT':
- if ctx.object is None:
- layout.label(text="<no object>", icon='OBJECT_DATA')
+ if ctx.type == 'ID':
+ if ctx.id is not None and isinstance(ctx.id, bpy.types.Object):
+ layout.label(text=ctx.id.name, icon='OBJECT_DATA')
else:
- layout.label(text=ctx.object.name, icon='OBJECT_DATA')
+ layout.label(text="Invalid id")
elif ctx.type == 'MODIFIER':
layout.label(text=ctx.modifier_name, icon='MODIFIER')
elif ctx.type == 'NODE':
layout.label(text=ctx.node_name, icon='NODE')
- def draw_spreadsheet_context_path_icon(self, layout, space, icon='RIGHTARROW_THIN'):
- layout.prop(space, "display_context_path_collapsed", icon_only=True, emboss=False, icon=icon)
+ def draw_spreadsheet_viewer_path_icon(self, layout, space, icon='RIGHTARROW_THIN'):
+ layout.prop(space, "display_viewer_path_collapsed", icon_only=True, emboss=False, icon=icon)
def selection_filter_available(self, space):
- root_context = space.context_path[0]
- if root_context.type != 'OBJECT':
+ root_context = space.viewer_path.path[0]
+ if root_context.type != 'ID':
+ return False
+ if not isinstance(root_context.id, bpy.types.Object):
return False
- obj = root_context.object
+ obj = root_context.id
if obj is None:
return False
if obj.type == 'MESH':
diff --git a/release/scripts/startup/bl_ui/space_time.py b/release/scripts/startup/bl_ui/space_time.py
index d948ea09a74..3c04e71269d 100644
--- a/release/scripts/startup/bl_ui/space_time.py
+++ b/release/scripts/startup/bl_ui/space_time.py
@@ -120,6 +120,10 @@ class TIME_MT_view(Menu):
scene = context.scene
st = context.space_data
+ layout.prop(st, "show_region_hud")
+
+ layout.separator()
+
layout.prop(st, "show_seconds")
layout.prop(st, "show_locked_time")
diff --git a/release/scripts/startup/bl_ui/space_toolsystem_common.py b/release/scripts/startup/bl_ui/space_toolsystem_common.py
index 39dfdd0eecb..81acc0837aa 100644
--- a/release/scripts/startup/bl_ui/space_toolsystem_common.py
+++ b/release/scripts/startup/bl_ui/space_toolsystem_common.py
@@ -232,7 +232,7 @@ class ToolSelectPanelHelper:
def _icon_value_from_icon_handle(icon_name):
import os
if icon_name is not None:
- assert(type(icon_name) is str)
+ assert type(icon_name) is str
icon_value = _icon_cache.get(icon_name)
if icon_value is None:
dirname = bpy.utils.system_resource('DATAFILES', path="icons")
diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py
index 1b155d22bdf..441babefd60 100644
--- a/release/scripts/startup/bl_ui/space_userpref.py
+++ b/release/scripts/startup/bl_ui/space_userpref.py
@@ -386,9 +386,8 @@ class USERPREF_PT_edit_objects_duplicate_data(EditingPanel, CenterAlignMixIn, Pa
col.prop(edit, "use_duplicate_camera", text="Camera")
col.prop(edit, "use_duplicate_curve", text="Curve")
# col.prop(edit, "use_duplicate_fcurve", text="F-Curve") # Not implemented.
+ col.prop(edit, "use_duplicate_curves", text="Curves")
col.prop(edit, "use_duplicate_grease_pencil", text="Grease Pencil")
- if hasattr(edit, "use_duplicate_curves"):
- col.prop(edit, "use_duplicate_curves", text="Curves")
col = flow.column()
col.prop(edit, "use_duplicate_lattice", text="Lattice")
@@ -1535,6 +1534,23 @@ class USERPREF_PT_input_mouse(InputPanel, CenterAlignMixIn, Panel):
flow.prop(inputs, "move_threshold")
+class USERPREF_PT_input_touchpad(InputPanel, CenterAlignMixIn, Panel):
+ bl_label = "Touchpad"
+ bl_options = {'DEFAULT_CLOSED'}
+
+ @classmethod
+ def poll(cls, context):
+ import sys
+ return sys.platform[:3] == "win" or sys.platform == "darwin"
+
+ def draw_centered(self, context, layout):
+ prefs = context.preferences
+ inputs = prefs.inputs
+
+ col = layout.column()
+ col.prop(inputs, "use_multitouch_gestures")
+
+
class USERPREF_PT_input_tablet(InputPanel, CenterAlignMixIn, Panel):
bl_label = "Tablet"
@@ -1928,9 +1944,11 @@ class USERPREF_PT_addons(AddOnPanel, Panel):
if is_visible:
if search and not (
- (search in info["name"].lower()) or
+ (search in info["name"].lower() or
+ search in iface_(info["name"]).lower()) or
(info["author"] and (search in info["author"].lower())) or
- ((filter == "All") and (search in info["category"].lower()))
+ ((filter == "All") and (search in info["category"].lower() or
+ search in iface_(info["category"]).lower()))
):
continue
@@ -1954,7 +1972,7 @@ class USERPREF_PT_addons(AddOnPanel, Panel):
sub = row.row()
sub.active = is_enabled
- sub.label(text="%s: %s" % (info["category"], info["name"]))
+ sub.label(text=iface_("%s: %s") % (iface_(info["category"]), iface_(info["name"])))
if info["warning"]:
sub.label(icon='ERROR')
@@ -1967,11 +1985,11 @@ class USERPREF_PT_addons(AddOnPanel, Panel):
if info["description"]:
split = colsub.row().split(factor=0.15)
split.label(text="Description:")
- split.label(text=info["description"])
+ split.label(text=tip_(info["description"]))
if info["location"]:
split = colsub.row().split(factor=0.15)
split.label(text="Location:")
- split.label(text=info["location"])
+ split.label(text=tip_(info["location"]))
if mod:
split = colsub.row().split(factor=0.15)
split.label(text="File:")
@@ -2326,6 +2344,7 @@ class USERPREF_PT_experimental_debugging(ExperimentalPanel, Panel):
({"property": "use_cycles_debug"}, None),
({"property": "show_asset_debug_info"}, None),
({"property": "use_asset_indexing"}, None),
+ ({"property": "use_viewport_debug"}, None),
),
)
@@ -2409,6 +2428,7 @@ classes = (
USERPREF_PT_input_keyboard,
USERPREF_PT_input_mouse,
USERPREF_PT_input_tablet,
+ USERPREF_PT_input_touchpad,
USERPREF_PT_input_ndof,
USERPREF_PT_navigation_orbit,
USERPREF_PT_navigation_zoom,
diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py
index b1b5738aecd..ada2993a16f 100644
--- a/release/scripts/startup/bl_ui/space_view3d.py
+++ b/release/scripts/startup/bl_ui/space_view3d.py
@@ -1216,6 +1216,7 @@ class VIEW3D_MT_view(Menu):
layout.operator("view3d.view_all").center = False
layout.operator("view3d.view_persportho", text="Perspective/Orthographic")
layout.menu("VIEW3D_MT_view_local")
+ layout.prop(view, "show_viewer", text="Viewer Node")
layout.separator()
@@ -3297,7 +3298,8 @@ class VIEW3D_MT_mask(Menu):
layout.separator()
- props = layout.operator("sculpt.dirty_mask", text='Dirty Mask')
+ props = layout.operator("sculpt.mask_from_cavity", text="Mask From Cavity")
+ props.use_automask_settings = False
layout.separator()
@@ -5153,6 +5155,7 @@ class VIEW3D_MT_edit_gpencil_stroke(Menu):
layout.operator("gpencil.stroke_subdivide", text="Subdivide").only_selected = False
layout.menu("VIEW3D_MT_gpencil_simplify")
layout.operator("gpencil.stroke_trim", text="Trim")
+ layout.operator("gpencil.stroke_outline", text="Outline")
layout.separator()
@@ -5174,18 +5177,16 @@ class VIEW3D_MT_edit_gpencil_stroke(Menu):
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("gpencil.stroke_flip", text="Switch Direction")
- layout.prop(settings, "use_scale_thickness", text="Scale Thickness")
+ layout.operator("gpencil.stroke_start_set", text="Set Start Point")
layout.separator()
layout.operator("gpencil.stroke_normalize", text="Normalize Thickness").mode = 'THICKNESS'
layout.operator("gpencil.stroke_normalize", text="Normalize Opacity").mode = 'OPACITY'
+ layout.prop(settings, "use_scale_thickness", text="Scale Thickness")
layout.separator()
layout.operator("gpencil.reset_transform_fill", text="Reset Fill Transform")
- layout.separator()
- layout.operator("gpencil.stroke_outline", text="Outline")
-
class VIEW3D_MT_edit_gpencil_point(Menu):
bl_label = "Point"
@@ -5494,6 +5495,10 @@ class VIEW3D_MT_sculpt_automasking_pie(Menu):
pie.prop(sculpt, "use_automasking_face_sets", text="Face Sets")
pie.prop(sculpt, "use_automasking_boundary_edges", text="Mesh Boundary")
pie.prop(sculpt, "use_automasking_boundary_face_sets", text="Face Sets Boundary")
+ pie.prop(sculpt, "use_automasking_cavity", text="Cavity")
+ pie.prop(sculpt, "use_automasking_cavity_inverted", text="Cavity (Inverted)")
+ pie.prop(sculpt, "use_automasking_start_normal", text="Area Normal")
+ pie.prop(sculpt, "use_automasking_view_normal", text="View Normal")
class VIEW3D_MT_sculpt_face_sets_edit_pie(Menu):
@@ -6348,6 +6353,13 @@ class VIEW3D_PT_overlay_geometry(Panel):
sub.prop(overlay, "wireframe_opacity", text="Opacity")
row = col.row(align=True)
+ row.active = view.show_viewer
+ row.prop(overlay, "show_viewer_attribute", text="")
+ subrow = row.row(align=True)
+ subrow.active = overlay.show_viewer_attribute
+ subrow.prop(overlay, "viewer_attribute_opacity", text="Viewer Node")
+
+ row = col.row(align=True)
# These properties should be always available in the UI for all modes
# other than Object.
@@ -7331,6 +7343,7 @@ class VIEW3D_MT_gpencil_edit_context_menu(Menu):
col.operator("transform.shear", text="Shear")
col.operator("transform.tosphere", text="To Sphere")
col.operator("transform.transform", text="Shrink/Fatten").mode = 'GPENCIL_SHRINKFATTEN'
+ col.operator("gpencil.stroke_start_set", text="Set Start Point")
col.separator()
@@ -7809,6 +7822,25 @@ class VIEW3D_PT_curves_sculpt_grow_shrink_scaling(Panel):
layout.prop(brush.curves_sculpt_settings, "minimum_length")
+class VIEW3D_PT_viewport_debug(Panel):
+ bl_space_type = 'VIEW_3D'
+ bl_region_type = 'HEADER'
+ bl_parent_id = 'VIEW3D_PT_overlay'
+ bl_label = "Viewport Debug"
+
+ @classmethod
+ def poll(cls, context):
+ prefs = context.preferences
+ return prefs.experimental.use_viewport_debug
+
+ def draw(self, context):
+ layout = self.layout
+ view = context.space_data
+ overlay = view.overlay
+
+ layout.prop(overlay, "use_debug_freeze_view_culling")
+
+
classes = (
VIEW3D_HT_header,
VIEW3D_HT_tool_header,
@@ -8046,6 +8078,7 @@ classes = (
TOPBAR_PT_annotation_layers,
VIEW3D_PT_curves_sculpt_add_shape,
VIEW3D_PT_curves_sculpt_grow_shrink_scaling,
+ VIEW3D_PT_viewport_debug,
)
diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
index 892dc9a1e42..3357676bf2f 100644
--- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py
+++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py
@@ -1,5 +1,5 @@
# SPDX-License-Identifier: GPL-2.0-or-later
-from bpy.types import Menu, Panel, UIList
+from bpy.types import Menu, Panel, UIList, WindowManager
from bl_ui.properties_grease_pencil_common import (
GreasePencilSculptAdvancedPanel,
GreasePencilDisplayPanel,
@@ -278,7 +278,7 @@ class TEXTURE_UL_texpaintslots(UIList):
# mat = data
if self.layout_type in {'DEFAULT', 'COMPACT'}:
- layout.prop(item, "name", text="", emboss=False, icon_value=item.icon_value)
+ layout.label(text=item.name, icon_value=item.icon_value)
elif self.layout_type == 'GRID':
layout.alignment = 'CENTER'
layout.label(text="")
@@ -967,10 +967,48 @@ class VIEW3D_PT_sculpt_options(Panel, View3DPaintPanel):
col.separator()
col = layout.column(heading="Auto-Masking", align=True)
+
col.prop(sculpt, "use_automasking_topology", text="Topology")
col.prop(sculpt, "use_automasking_face_sets", text="Face Sets")
col.prop(sculpt, "use_automasking_boundary_edges", text="Mesh Boundary")
col.prop(sculpt, "use_automasking_boundary_face_sets", text="Face Sets Boundary")
+ col.prop(sculpt, "use_automasking_cavity", text="Cavity")
+ col.prop(sculpt, "use_automasking_cavity_inverted", text="Cavity (Inverted)")
+ col.prop(sculpt, "use_automasking_start_normal", text="Area Normal")
+ col.prop(sculpt, "use_automasking_view_normal", text="View Normal")
+
+ if sculpt.use_automasking_start_normal:
+ col.separator()
+
+ col.prop(sculpt, "automasking_start_normal_limit")
+ col.prop(sculpt, "automasking_start_normal_falloff")
+
+ if sculpt.use_automasking_view_normal:
+ col.separator()
+
+ col.prop(sculpt, "use_automasking_view_occlusion", text="Occlusion")
+ col.prop(sculpt, "automasking_view_normal_limit")
+ col.prop(sculpt, "automasking_view_normal_falloff")
+
+ col.separator()
+ col.prop(sculpt.brush, "automasking_boundary_edges_propagation_steps")
+
+ if sculpt.use_automasking_cavity or sculpt.use_automasking_cavity_inverted:
+ col.separator()
+
+ col2 = col.column()
+ props = col2.operator("sculpt.mask_from_cavity", text="Mask From Cavity")
+ props.use_automask_settings = True
+
+ col2 = col.column()
+
+ col2.prop(sculpt, "automasking_cavity_factor", text="Cavity Factor")
+ col2.prop(sculpt, "automasking_cavity_blur_steps", text="Cavity Blur")
+
+ col2.prop(sculpt, "use_automasking_custom_cavity_curve", text="Use Curve")
+
+ if sculpt.use_automasking_custom_cavity_curve:
+ col2.template_curve_mapping(sculpt, "automasking_cavity_curve")
class VIEW3D_PT_sculpt_options_gravity(Panel, View3DPaintPanel):
@@ -1606,19 +1644,6 @@ class VIEW3D_PT_tools_grease_pencil_brush_advanced(View3DPanel, Panel):
row.prop(gp_settings, "fill_layer_mode", text="Layers")
col.separator()
- row = col.row(align=True)
- row.prop(gp_settings, "extend_stroke_factor")
- row.prop(
- gp_settings,
- "show_fill_extend",
- icon='HIDE_OFF' if gp_settings.show_fill_extend else 'HIDE_ON',
- text="",
- )
-
- col.separator()
- col.prop(gp_settings, "fill_leak", text="Leak Size")
-
- col.separator()
col.prop(gp_settings, "fill_simplify_level", text="Simplify")
if gp_settings.fill_draw_mode != 'STROKE':
col = layout.column(align=False, heading="Ignore Transparent")
@@ -1742,6 +1767,18 @@ class VIEW3D_PT_tools_grease_pencil_brush_post_processing(View3DPanel, Panel):
col1 = col.column(align=True)
col1.prop(gp_settings, "use_trim")
+ col.separator()
+
+ row = col.row(heading="Outline", align=True)
+ row.prop(gp_settings, "use_settings_outline", text="")
+ row2 = row.row(align=True)
+ row2.enabled = gp_settings.use_settings_outline
+ row2.prop(gp_settings, "material_alt", text="")
+
+ row2 = col.row(align=True)
+ row2.enabled = gp_settings.use_settings_outline
+ row2.prop(gp_settings, "outline_thickness_factor")
+
class VIEW3D_PT_tools_grease_pencil_brush_random(View3DPanel, Panel):
bl_context = ".greasepencil_paint"
@@ -1866,6 +1903,39 @@ class VIEW3D_PT_tools_grease_pencil_brush_paint_falloff(GreasePencilBrushFalloff
return (settings and settings.brush and settings.brush.curve and gptool == 'TINT')
+class VIEW3D_PT_tools_grease_pencil_brush_gap_closure(View3DPanel, Panel):
+ bl_context = ".greasepencil_paint"
+ bl_parent_id = 'VIEW3D_PT_tools_grease_pencil_brush_advanced'
+ bl_label = "Gap Closure"
+ bl_category = "Tool"
+
+ @classmethod
+ def poll(cls, context):
+ brush = context.tool_settings.gpencil_paint.brush
+ return brush is not None and brush.gpencil_tool == 'FILL'
+
+ def draw(self, context):
+ layout = self.layout
+ layout.use_property_split = True
+ layout.use_property_decorate = False
+
+ tool_settings = context.tool_settings
+ brush = tool_settings.gpencil_paint.brush
+ gp_settings = brush.gpencil_settings
+
+ col = layout.column()
+
+ col.prop(gp_settings, "extend_stroke_factor", text="Size")
+ row = col.row(align=True)
+ row.prop(gp_settings, "fill_extend_mode", text="Mode")
+ row = col.row(align=True)
+ row.prop(gp_settings, "show_fill_extend", text="Visual Aids")
+
+ if gp_settings.fill_extend_mode == 'EXTEND':
+ row = col.row(align=True)
+ row.prop(gp_settings, "use_collide_strokes")
+
+
# Grease Pencil stroke sculpting tools
class GreasePencilSculptPanel:
bl_context = ".greasepencil_sculpt"
@@ -1905,7 +1975,7 @@ class VIEW3D_PT_tools_grease_pencil_sculpt_select(Panel, View3DPanel, GreasePenc
if brush is not None:
col.prop(brush, "use_custom_icon", toggle=True, icon='FILE_IMAGE', text="")
- if(brush.use_custom_icon):
+ if (brush.use_custom_icon):
layout.row().prop(brush, "icon_filepath", text="")
@@ -2014,7 +2084,7 @@ class VIEW3D_PT_tools_grease_pencil_weight_paint_select(View3DPanel, Panel, Grea
if brush is not None:
col.prop(brush, "use_custom_icon", toggle=True, icon='FILE_IMAGE', text="")
- if(brush.use_custom_icon):
+ if (brush.use_custom_icon):
layout.row().prop(brush, "icon_filepath", text="")
@@ -2089,7 +2159,7 @@ class VIEW3D_PT_tools_grease_pencil_vertex_paint_select(View3DPanel, Panel, Grea
if brush is not None:
col.prop(brush, "use_custom_icon", toggle=True, icon='FILE_IMAGE', text="")
- if(brush.use_custom_icon):
+ if (brush.use_custom_icon):
layout.row().prop(brush, "icon_filepath", text="")
@@ -2418,6 +2488,7 @@ classes = (
VIEW3D_PT_tools_grease_pencil_brush_post_processing,
VIEW3D_PT_tools_grease_pencil_brush_random,
VIEW3D_PT_tools_grease_pencil_brush_stabilizer,
+ VIEW3D_PT_tools_grease_pencil_brush_gap_closure,
VIEW3D_PT_tools_grease_pencil_paint_appearance,
VIEW3D_PT_tools_grease_pencil_sculpt_select,
VIEW3D_PT_tools_grease_pencil_sculpt_settings,
diff --git a/release/scripts/startup/nodeitems_builtins.py b/release/scripts/startup/nodeitems_builtins.py
index 2342ba33a3b..d1946b2f01d 100644
--- a/release/scripts/startup/nodeitems_builtins.py
+++ b/release/scripts/startup/nodeitems_builtins.py
@@ -40,21 +40,14 @@ class TextureNodeCategory(SortedNodeCategory):
context.space_data.tree_type == 'TextureNodeTree')
-class GeometryNodeCategory(SortedNodeCategory):
- @classmethod
- def poll(cls, context):
- return (context.space_data.type == 'NODE_EDITOR' and
- context.space_data.tree_type == 'GeometryNodeTree')
-
-
-# menu entry for node group tools
+# Menu entry for node group tools.
def group_tools_draw(_self, layout, _context):
layout.operator("node.group_make")
layout.operator("node.group_ungroup")
layout.separator()
-# maps node tree type to group node type
+# Maps node tree type to group node type.
node_tree_group_type = {
'CompositorNodeTree': 'CompositorNodeGroup',
'ShaderNodeTree': 'ShaderNodeGroup',
@@ -63,192 +56,6 @@ node_tree_group_type = {
}
-# Custom Menu for Geometry Node Curves.
-def curve_node_items(context):
- if context is None:
- return
- space = context.space_data
- if not space:
- return
- yield NodeItem("GeometryNodeCurveLength")
- yield NodeItem("GeometryNodeCurveToMesh")
- yield NodeItem("GeometryNodeCurveToPoints")
- yield NodeItem("GeometryNodeDeformCurvesOnSurface")
- yield NodeItem("GeometryNodeFillCurve")
- yield NodeItem("GeometryNodeFilletCurve")
- yield NodeItem("GeometryNodeResampleCurve")
- yield NodeItem("GeometryNodeReverseCurve")
- yield NodeItem("GeometryNodeSampleCurve")
- yield NodeItem("GeometryNodeSubdivideCurve")
- yield NodeItem("GeometryNodeTrimCurve")
- yield NodeItemCustom(draw=lambda self, layout, context: layout.separator())
- yield NodeItem("GeometryNodeInputCurveHandlePositions")
- yield NodeItem("GeometryNodeInputTangent")
- yield NodeItem("GeometryNodeInputCurveTilt")
- yield NodeItem("GeometryNodeCurveEndpointSelection")
- yield NodeItem("GeometryNodeCurveHandleTypeSelection")
- yield NodeItem("GeometryNodeInputSplineCyclic")
- yield NodeItem("GeometryNodeSplineLength")
- yield NodeItem("GeometryNodeSplineParameter")
- yield NodeItem("GeometryNodeInputSplineResolution")
- yield NodeItemCustom(draw=lambda self, layout, context: layout.separator())
- yield NodeItem("GeometryNodeSetCurveRadius")
- yield NodeItem("GeometryNodeSetCurveTilt")
- yield NodeItem("GeometryNodeSetCurveHandlePositions")
- yield NodeItem("GeometryNodeCurveSetHandles")
- yield NodeItem("GeometryNodeSetSplineCyclic")
- yield NodeItem("GeometryNodeSetSplineResolution")
- yield NodeItem("GeometryNodeCurveSplineType")
-
-
-# Custom Menu for Geometry Node Mesh.
-def mesh_node_items(context):
- if context is None:
- return
- space = context.space_data
- if not space:
- return
- yield NodeItem("GeometryNodeDualMesh")
- yield NodeItem("GeometryNodeEdgePathsToCurves")
- yield NodeItem("GeometryNodeEdgePathsToSelection")
- yield NodeItem("GeometryNodeExtrudeMesh")
- yield NodeItem("GeometryNodeFlipFaces")
- yield NodeItem("GeometryNodeMeshBoolean")
- yield NodeItem("GeometryNodeMeshToCurve")
- yield NodeItem("GeometryNodeMeshToPoints")
- yield NodeItem("GeometryNodeMeshToVolume")
- yield NodeItem("GeometryNodeSplitEdges")
- yield NodeItem("GeometryNodeSubdivideMesh")
- yield NodeItem("GeometryNodeSubdivisionSurface")
- yield NodeItem("GeometryNodeTriangulate")
- yield NodeItem("GeometryNodeScaleElements")
- yield NodeItemCustom(draw=lambda self, layout, context: layout.separator())
- yield NodeItem("GeometryNodeInputMeshEdgeAngle")
- yield NodeItem("GeometryNodeInputMeshEdgeNeighbors")
- yield NodeItem("GeometryNodeInputMeshEdgeVertices")
- yield NodeItem("GeometryNodeInputMeshFaceArea")
- yield NodeItem("GeometryNodeInputMeshFaceNeighbors")
- yield NodeItem("GeometryNodeInputMeshFaceIsPlanar")
- yield NodeItem("GeometryNodeInputMeshIsland")
- yield NodeItem("GeometryNodeInputShadeSmooth")
- yield NodeItem("GeometryNodeInputShortestEdgePaths")
- yield NodeItem("GeometryNodeInputMeshVertexNeighbors")
- yield NodeItemCustom(draw=lambda self, layout, context: layout.separator())
- yield NodeItem("GeometryNodeSetShadeSmooth")
-
-
-# Custom Menu for Geometry Nodes "Geometry" category.
-def geometry_node_items(context):
- if context is None:
- return
- space = context.space_data
- if not space:
- return
- yield NodeItem("GeometryNodeBoundBox")
- yield NodeItem("GeometryNodeConvexHull")
- yield NodeItem("GeometryNodeDeleteGeometry")
- yield NodeItem("GeometryNodeDuplicateElements")
- yield NodeItem("GeometryNodeProximity")
- yield NodeItem("GeometryNodeGeometryToInstance")
- yield NodeItem("GeometryNodeJoinGeometry")
- yield NodeItem("GeometryNodeMergeByDistance")
- yield NodeItem("GeometryNodeRaycast")
- yield NodeItem("GeometryNodeSeparateComponents")
- yield NodeItem("GeometryNodeSeparateGeometry")
- yield NodeItem("GeometryNodeTransform")
- yield NodeItemCustom(draw=lambda self, layout, context: layout.separator())
- yield NodeItem("GeometryNodeSetID")
- yield NodeItem("GeometryNodeSetPosition")
-
-
-# Custom Menu for UV Nodes.
-def uv_node_items(context):
- if context is None:
- return
- space = context.space_data
- if not space:
- return
- yield NodeItem("GeometryNodeUVPackIslands")
- yield NodeItem("GeometryNodeUVUnwrap")
-
-
-# Custom Menu for Geometry Node Input Nodes.
-def geometry_input_node_items(context):
- if context is None:
- return
- space = context.space_data
- if not space:
- return
- yield NodeItem("FunctionNodeInputBool")
- yield NodeItem("GeometryNodeCollectionInfo")
- yield NodeItem("FunctionNodeInputColor")
- yield NodeItem("FunctionNodeInputInt")
- yield NodeItem("GeometryNodeIsViewport")
- yield NodeItem("GeometryNodeInputMaterial")
- yield NodeItem("GeometryNodeObjectInfo")
- yield NodeItem("FunctionNodeInputString")
- yield NodeItem("ShaderNodeValue")
- yield NodeItem("FunctionNodeInputVector")
- yield NodeItemCustom(draw=lambda self, layout, context: layout.separator())
- yield NodeItem("GeometryNodeInputID")
- yield NodeItem("GeometryNodeInputIndex")
- yield NodeItem("GeometryNodeInputNamedAttribute")
- yield NodeItem("GeometryNodeInputNormal")
- yield NodeItem("GeometryNodeInputPosition")
- yield NodeItem("GeometryNodeInputRadius")
- yield NodeItem("GeometryNodeInputSceneTime")
-
-
-# Custom Menu for Geometry Node Instance Nodes.
-def geometry_instance_node_items(context):
- if context is None:
- return
- space = context.space_data
- if not space:
- return
- yield NodeItem("GeometryNodeInstanceOnPoints")
- yield NodeItem("GeometryNodeInstancesToPoints")
- yield NodeItem("GeometryNodeRealizeInstances")
- yield NodeItem("GeometryNodeRotateInstances")
- yield NodeItem("GeometryNodeScaleInstances")
- yield NodeItem("GeometryNodeTranslateInstances")
- yield NodeItemCustom(draw=lambda self, layout, context: layout.separator())
- yield NodeItem("GeometryNodeInputInstanceRotation")
- yield NodeItem("GeometryNodeInputInstanceScale")
-
-
-# Custom Menu for Material Nodes.
-def geometry_material_node_items(context):
- if context is None:
- return
- space = context.space_data
- if not space:
- return
- yield NodeItem("GeometryNodeReplaceMaterial")
- yield NodeItemCustom(draw=lambda self, layout, context: layout.separator())
- yield NodeItem("GeometryNodeInputMaterialIndex")
- yield NodeItem("GeometryNodeMaterialSelection")
- yield NodeItemCustom(draw=lambda self, layout, context: layout.separator())
- yield NodeItem("GeometryNodeSetMaterial")
- yield NodeItem("GeometryNodeSetMaterialIndex")
-
-
-# Custom Menu for Geometry Node Points.
-def point_node_items(context):
- if context is None:
- return
- space = context.space_data
- if not space:
- return
- yield NodeItem("GeometryNodeDistributePointsOnFaces")
- yield NodeItem("GeometryNodePoints")
- yield NodeItem("GeometryNodePointsToVertices")
- yield NodeItem("GeometryNodePointsToVolume")
- yield NodeItemCustom(draw=lambda self, layout, context: layout.separator())
- yield NodeItemCustom(draw=lambda self, layout, context: layout.separator())
- yield NodeItem("GeometryNodeSetPointRadius")
-
-
# Generic node group items generator for shader, compositor, geometry and texture node groups.
def node_group_items(context):
if context is None:
@@ -259,8 +66,9 @@ def node_group_items(context):
yield NodeItemCustom(draw=group_tools_draw)
- yield NodeItem("NodeGroupInput", poll=group_input_output_item_poll)
- yield NodeItem("NodeGroupOutput", poll=group_input_output_item_poll)
+ if group_input_output_item_poll(context):
+ yield NodeItem("NodeGroupInput")
+ yield NodeItem("NodeGroupOutput")
ntree = space.edit_tree
if not ntree:
@@ -424,7 +232,7 @@ shader_node_categories = [
NodeItem("ShaderNodeTexWhiteNoise"),
]),
ShaderNodeCategory("SH_NEW_OP_COLOR", "Color", items=[
- NodeItem("ShaderNodeMixRGB"),
+ NodeItem("ShaderNodeMix", label="Mix Color", settings={"data_type": "'RGBA'"}),
NodeItem("ShaderNodeRGBCurve"),
NodeItem("ShaderNodeInvert"),
NodeItem("ShaderNodeLightFalloff"),
@@ -448,6 +256,7 @@ shader_node_categories = [
NodeItem("ShaderNodeFloatCurve"),
NodeItem("ShaderNodeClamp"),
NodeItem("ShaderNodeMath"),
+ NodeItem("ShaderNodeMix"),
NodeItem("ShaderNodeValToRGB"),
NodeItem("ShaderNodeRGBToBW"),
NodeItem("ShaderNodeShaderToRGB", poll=object_eevee_shader_nodes_poll),
@@ -640,122 +449,17 @@ texture_node_categories = [
]),
]
-geometry_node_categories = [
- # Geometry Nodes
- GeometryNodeCategory("GEO_ATTRIBUTE", "Attribute", items=[
- NodeItem("GeometryNodeCaptureAttribute"),
- NodeItem("GeometryNodeAttributeDomainSize"),
- NodeItem("GeometryNodeAttributeStatistic"),
- NodeItem("GeometryNodeAttributeTransfer"),
- NodeItem("GeometryNodeRemoveAttribute"),
- NodeItem("GeometryNodeStoreNamedAttribute"),
- ]),
- GeometryNodeCategory("GEO_COLOR", "Color", items=[
- NodeItem("ShaderNodeMixRGB"),
- NodeItem("ShaderNodeRGBCurve"),
- NodeItem("ShaderNodeValToRGB"),
- NodeItem("FunctionNodeSeparateColor"),
- NodeItem("FunctionNodeCombineColor"),
- ]),
- GeometryNodeCategory("GEO_CURVE", "Curve", items=curve_node_items),
- GeometryNodeCategory("GEO_PRIMITIVES_CURVE", "Curve Primitives", items=[
- NodeItem("GeometryNodeCurvePrimitiveLine"),
- NodeItem("GeometryNodeCurvePrimitiveCircle"),
- NodeItem("GeometryNodeCurveStar"),
- NodeItem("GeometryNodeCurveSpiral"),
- NodeItem("GeometryNodeCurveArc"),
- NodeItem("GeometryNodeCurveQuadraticBezier"),
- NodeItem("GeometryNodeCurvePrimitiveQuadrilateral"),
- NodeItem("GeometryNodeCurvePrimitiveBezierSegment"),
- ]),
- GeometryNodeCategory("GEO_GEOMETRY", "Geometry", items=geometry_node_items),
- GeometryNodeCategory("GEO_INPUT", "Input", items=geometry_input_node_items),
- GeometryNodeCategory("GEO_INSTANCE", "Instances", items=geometry_instance_node_items),
- GeometryNodeCategory("GEO_MATERIAL", "Material", items=geometry_material_node_items),
- GeometryNodeCategory("GEO_MESH", "Mesh", items=mesh_node_items),
- GeometryNodeCategory("GEO_PRIMITIVES_MESH", "Mesh Primitives", items=[
- NodeItem("GeometryNodeMeshCircle"),
- NodeItem("GeometryNodeMeshCone"),
- NodeItem("GeometryNodeMeshCube"),
- NodeItem("GeometryNodeMeshCylinder"),
- NodeItem("GeometryNodeMeshGrid"),
- NodeItem("GeometryNodeMeshIcoSphere"),
- NodeItem("GeometryNodeMeshLine"),
- NodeItem("GeometryNodeMeshUVSphere"),
- ]),
- GeometryNodeCategory("GEO_OUTPUT", "Output", items=[
- NodeItem("GeometryNodeViewer"),
- ]),
- GeometryNodeCategory("GEO_POINT", "Point", items=point_node_items),
- GeometryNodeCategory("GEO_TEXT", "Text", items=[
- NodeItem("FunctionNodeStringLength"),
- NodeItem("FunctionNodeSliceString"),
- NodeItem("FunctionNodeValueToString"),
- NodeItem("GeometryNodeStringJoin"),
- NodeItem("FunctionNodeInputSpecialCharacters"),
- NodeItem("GeometryNodeStringToCurves"),
- NodeItem("FunctionNodeReplaceString"),
- ]),
- GeometryNodeCategory("GEO_TEXTURE", "Texture", items=[
- NodeItem("ShaderNodeTexBrick"),
- NodeItem("ShaderNodeTexChecker"),
- NodeItem("ShaderNodeTexGradient"),
- NodeItem("ShaderNodeTexMagic"),
- NodeItem("ShaderNodeTexMusgrave"),
- NodeItem("ShaderNodeTexNoise"),
- NodeItem("ShaderNodeTexVoronoi"),
- NodeItem("ShaderNodeTexWave"),
- NodeItem("ShaderNodeTexWhiteNoise"),
- NodeItem("GeometryNodeImageTexture"),
- ]),
- GeometryNodeCategory("GEO_UTILITIES", "Utilities", items=[
- NodeItem("GeometryNodeAccumulateField"),
- NodeItem("GeometryNodeFieldAtIndex"),
- NodeItem("GeometryNodeFieldOnDomain"),
- NodeItem("ShaderNodeMapRange"),
- NodeItem("ShaderNodeFloatCurve"),
- NodeItem("ShaderNodeClamp"),
- NodeItem("ShaderNodeMath"),
- NodeItem("FunctionNodeBooleanMath"),
- NodeItem("FunctionNodeRotateEuler"),
- NodeItem("FunctionNodeCompare"),
- NodeItem("FunctionNodeFloatToInt"),
- NodeItem("GeometryNodeSwitch"),
- NodeItem("FunctionNodeRandomValue"),
- NodeItem("FunctionNodeAlignEulerToVector"),
- ]),
- GeometryNodeCategory("GEO_UV", "UV", items=uv_node_items),
- GeometryNodeCategory("GEO_VECTOR", "Vector", items=[
- NodeItem("ShaderNodeVectorCurve"),
- NodeItem("ShaderNodeSeparateXYZ"),
- NodeItem("ShaderNodeCombineXYZ"),
- NodeItem("ShaderNodeVectorMath"),
- NodeItem("ShaderNodeVectorRotate"),
- ]),
- GeometryNodeCategory("GEO_VOLUME", "Volume", items=[
- NodeItem("GeometryNodeVolumeCube"),
- NodeItem("GeometryNodeVolumeToMesh"),
- ]),
- GeometryNodeCategory("GEO_GROUP", "Group", items=node_group_items),
- GeometryNodeCategory("GEO_LAYOUT", "Layout", items=[
- NodeItem("NodeFrame"),
- NodeItem("NodeReroute"),
- ]),
-]
-
def register():
nodeitems_utils.register_node_categories('SHADER', shader_node_categories)
nodeitems_utils.register_node_categories('COMPOSITING', compositor_node_categories)
nodeitems_utils.register_node_categories('TEXTURE', texture_node_categories)
- nodeitems_utils.register_node_categories('GEOMETRY', geometry_node_categories)
def unregister():
nodeitems_utils.unregister_node_categories('SHADER')
nodeitems_utils.unregister_node_categories('COMPOSITING')
nodeitems_utils.unregister_node_categories('TEXTURE')
- nodeitems_utils.unregister_node_categories('GEOMETRY')
if __name__ == "__main__":
diff --git a/release/scripts/templates_py/custom_nodes.py b/release/scripts/templates_py/custom_nodes.py
index fba94e23d0d..fd2dfe91b39 100644
--- a/release/scripts/templates_py/custom_nodes.py
+++ b/release/scripts/templates_py/custom_nodes.py
@@ -61,7 +61,7 @@ class MyCustomTreeNode:
# Derived from the Node base type.
-class MyCustomNode(Node, MyCustomTreeNode):
+class MyCustomNode(MyCustomTreeNode, Node):
# === Basics ===
# Description string
'''A custom node'''
diff --git a/release/scripts/templates_py/operator_modal_draw.py b/release/scripts/templates_py/operator_modal_draw.py
index 20e888ad5f3..77371a75605 100644
--- a/release/scripts/templates_py/operator_modal_draw.py
+++ b/release/scripts/templates_py/operator_modal_draw.py
@@ -15,11 +15,10 @@ def draw_callback_px(self, context):
blf.draw(font_id, "Hello Word " + str(len(self.mouse_path)))
# 50% alpha, 2 pixel width line
- shader = gpu.shader.from_builtin('2D_UNIFORM_COLOR')
+ shader = gpu.shader.from_builtin('UNIFORM_COLOR')
gpu.state.blend_set('ALPHA')
gpu.state.line_width_set(2.0)
batch = batch_for_shader(shader, 'LINE_STRIP', {"pos": self.mouse_path})
- shader.bind()
shader.uniform_float("color", (0.0, 0.0, 0.0, 0.5))
batch.draw(shader)