diff options
Diffstat (limited to 'release')
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 Binary files differnew file mode 100644 index 00000000000..afbe2b7f62b --- /dev/null +++ b/release/datafiles/fonts/NotoSansHebrew-Regular.woff2 diff --git a/release/datafiles/fonts/NotoSansHebrew-VariableFont_wdth,wght.woff2 b/release/datafiles/fonts/NotoSansHebrew-VariableFont_wdth,wght.woff2 Binary files differdeleted file mode 100644 index 4f6033c916f..00000000000 --- a/release/datafiles/fonts/NotoSansHebrew-VariableFont_wdth,wght.woff2 +++ /dev/null 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) |