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