From 33eabb82207e165de45fb6a0ea74dec962de7265 Mon Sep 17 00:00:00 2001 From: Alexander Gavrilov Date: Sat, 23 Nov 2019 13:11:39 +0300 Subject: Action Constraint: introduce a mix mode setting. Currently the action channels are applied after the existing transformation, as if the action controlled a child of the bone. This is not very natural, but more importantly, the transform tools are not designed to work conveniently with an additional 'pseudo-child' transformation, resulting in effects like an unexpected pivot location. Implementing a Before mode that integrates the action channels as if applied to a parent allows using the special transform tool code intended for dealing with such constraints. Note that in either mode, Action constraints should be added in reverse order, putting a new constraint before the existing ones that the Action was keyframed to work together. In order to implement the option, extract a utility from the Copy Transform constraint code for combining transforms with special anti-shear scale handling that matches the Aligned Inherit Scale mode. The Before mode also requires switching the constraint to the Local owner space, while the After mode can still use the World space for efficiency as before. Since the constraint doesn't have an Owner space option in the UI, this has to be handled in an RNA setter. For full backward compatibility, the original simple matrix multiplication mode is preserved as the third option, but it is not recommended due to creating shear. Differential Revision: https://developer.blender.org/D6297 --- release/scripts/startup/bl_ui/properties_constraint.py | 2 ++ 1 file changed, 2 insertions(+) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/properties_constraint.py b/release/scripts/startup/bl_ui/properties_constraint.py index b75d67b5350..3fc54ff6d12 100644 --- a/release/scripts/startup/bl_ui/properties_constraint.py +++ b/release/scripts/startup/bl_ui/properties_constraint.py @@ -492,6 +492,8 @@ class ConstraintButtonsPanel: col.prop(con, "frame_start", text="Start") col.prop(con, "frame_end", text="End") + layout.prop(con, "mix_mode", text="Mix") + def LOCKED_TRACK(self, _context, layout, con): self.target_template(layout, con) -- cgit v1.2.3 From c2a37867f21be164a059552678ff3339bac39a7c Mon Sep 17 00:00:00 2001 From: Aaron Carlisle Date: Fri, 27 Dec 2019 14:38:45 -0600 Subject: UI: Remove leftover look dev (rename to HDRI preview) In Blender 2.81 Look Dev was renamed to Material Preview also the old look dev HDRIs could also be used in both cycles and eevee. A more generic name was need. --- release/scripts/startup/bl_ui/space_userpref.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py index 9527c7f4de8..03450fc44fb 100644 --- a/release/scripts/startup/bl_ui/space_userpref.py +++ b/release/scripts/startup/bl_ui/space_userpref.py @@ -2003,7 +2003,7 @@ class USERPREF_PT_studiolight_matcaps(StudioLightPanel, StudioLightPanelMixin, P class USERPREF_PT_studiolight_world(StudioLightPanel, StudioLightPanelMixin, Panel): - bl_label = "LookDev HDRIs" + bl_label = "HDRIs" sl_type = 'WORLD' def draw_header_preset(self, _context): -- cgit v1.2.3 From 86832ececcb9d5ed8fa05a02415f7c31905eae4a Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 2 Jan 2020 17:00:17 +1100 Subject: Tool System: adjust Smooth/Randomize modal operator behavior Previously the default values were left non-zero to avoid having to update scripts. However, this meant it wasn't possible to setup non-modal key bindings for smooth & randomize. Now these operators follow logic of many other operators where setting the value executes immediately, leaving unset runs modal. Existing keymaps & scripts will need to be updated. Addresses issue raised in f4a4ec84255a. --- release/scripts/startup/bl_ui/space_view3d.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index fee8845d88e..02dc03be127 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -918,7 +918,7 @@ class VIEW3D_MT_transform_base(Menu): if context.mode != 'OBJECT': layout.operator("transform.vertex_warp", text="Warp") layout.operator_context = 'EXEC_DEFAULT' - layout.operator("transform.vertex_random", text="Randomize") + layout.operator("transform.vertex_random", text="Randomize").offset = 0.1 layout.operator_context = 'INVOKE_REGION_WIN' @@ -3530,8 +3530,8 @@ class VIEW3D_MT_edit_mesh_context_menu(Menu): col.operator("transform.shear", text="Shear") col.operator("transform.vert_slide", text="Slide Vertices") col.operator_context = 'EXEC_DEFAULT' - col.operator("transform.vertex_random", text="Randomize Vertices") - col.operator("mesh.vertices_smooth", text="Smooth Vertices") + col.operator("transform.vertex_random", text="Randomize Vertices").offset = 0.1 + col.operator("mesh.vertices_smooth", text="Smooth Vertices").factor = 0.5 col.operator_context = 'INVOKE_REGION_WIN' col.operator("mesh.vertices_smooth_laplacian", text="Smooth Laplacian") @@ -3747,7 +3747,7 @@ class VIEW3D_MT_edit_mesh_vertices(Menu): layout.operator("transform.vert_slide", text="Slide Vertices") layout.operator_context = 'EXEC_DEFAULT' - layout.operator("mesh.vertices_smooth", text="Smooth Vertices") + layout.operator("mesh.vertices_smooth", text="Smooth Vertices").factor = 0.5 layout.operator_context = 'INVOKE_REGION_WIN' layout.separator() -- cgit v1.2.3 From de530a95dc7b482dc22c933b9b8b2a98c79b5663 Mon Sep 17 00:00:00 2001 From: mano-wii Date: Thu, 2 Jan 2020 12:48:30 -0300 Subject: Transform: Pose: Partial support for Auto IK + X-Mirror Fix T69572 TODO: support `Relative-Mirror` as well. Maniphest Tasks: T69572 Differential Revision: https://developer.blender.org/D5862 --- release/scripts/startup/bl_ui/space_view3d_toolbar.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py index f0c4aaa9344..011c2a8b39a 100644 --- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py +++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py @@ -313,7 +313,7 @@ class VIEW3D_PT_tools_posemode_options(View3DPanel, Panel): layout.prop(pose, "use_auto_ik") layout.prop(pose, "use_mirror_x") col = layout.column() - col.active = pose.use_mirror_x + col.active = pose.use_mirror_x and not pose.use_auto_ik col.prop(pose, "use_mirror_relative") layout.label(text="Affect Only") -- cgit v1.2.3 From a8ce9a143abbb51eae28e5d0cae1fb310bd0c24c Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 3 Jan 2020 12:26:36 +1100 Subject: Tool System: store the fallback tool for re-use The fallback tool was run-time only data, now it's stored in the blend file. --- .../startup/bl_ui/space_toolsystem_common.py | 28 +++++++++++++++++----- 1 file changed, 22 insertions(+), 6 deletions(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/space_toolsystem_common.py b/release/scripts/startup/bl_ui/space_toolsystem_common.py index 7b0a769ae62..0a42e1232d3 100644 --- a/release/scripts/startup/bl_ui/space_toolsystem_common.py +++ b/release/scripts/startup/bl_ui/space_toolsystem_common.py @@ -354,6 +354,16 @@ class ToolSelectPanelHelper: i += 1 return None, -1 + @classmethod + def _tool_group_active_set_by_id(cls, context, idname_group, idname): + item_group = cls._tool_get_group_by_id(context, idname_group, coerce=True) + if item_group: + for i, item in enumerate(item_group): + if item and item.idname == idname: + cls._tool_group_active[item_group[0].idname] = i + return True + return False + @staticmethod def _tool_active_from_context(context, space_type, mode=None, create=False): if space_type in {'VIEW_3D', 'PROPERTIES'}: @@ -660,10 +670,10 @@ class ToolSelectPanelHelper: *, is_horizontal_layout=False, ): - tool_fallback = tool.tool_fallback + idname_fallback = tool.idname_fallback space_type = tool.space_type cls = ToolSelectPanelHelper._tool_class_from_space_type(space_type) - item_fallback, _index = cls._tool_get_by_id(context, tool_fallback) + item_fallback, _index = cls._tool_get_by_id(context, idname_fallback) if item_fallback is not None: draw_settings = item_fallback.draw_settings if draw_settings is not None: @@ -700,11 +710,11 @@ class ToolSelectPanelHelper: draw_settings(context, layout, tool) if context.preferences.experimental.use_tool_fallback: - tool_fallback = tool.tool_fallback + idname_fallback = tool.idname_fallback else: - tool_fallback = None + idname_fallback = None - if tool_fallback and tool_fallback != item.idname: + if idname_fallback and idname_fallback != item.idname: tool_settings = context.tool_settings # Show popover which looks like an enum but isn't one. @@ -862,6 +872,7 @@ class WM_MT_toolsystem_submenu(Menu): def _activate_by_item(context, space_type, item, index, *, as_fallback=False): cls = ToolSelectPanelHelper._tool_class_from_space_type(space_type) + tool = ToolSelectPanelHelper._tool_active_from_context(context, space_type, create=True) tool_fallback_id = cls.tool_fallback_id if as_fallback: @@ -889,6 +900,12 @@ def _activate_by_item(context, space_type, item, index, *, as_fallback=False): # Done, now get the current tool to replace the item & index. tool_active = ToolSelectPanelHelper._tool_active_from_context(context, space_type) item, index = cls._tool_get_by_id(context, getattr(tool_active, "idname", None)) + else: + # Ensure the active fallback tool is read from saved state (even if the fallback tool is not in use). + stored_idname_fallback = tool.idname_fallback + if stored_idname_fallback: + cls._tool_group_active_set_by_id(context, tool_fallback_id, stored_idname_fallback) + del stored_idname_fallback # Find fallback keymap. item_fallback = None @@ -897,7 +914,6 @@ def _activate_by_item(context, space_type, item, index, *, as_fallback=False): item_fallback, _index = cls._tool_get_active_by_index(context, select_index) # End calculating fallback. - tool = ToolSelectPanelHelper._tool_active_from_context(context, space_type, create=True) tool.setup( idname=item.idname, keymap=item.keymap[0] if item.keymap is not None else "", -- cgit v1.2.3 From b423b891274af6262565e28199c5e53b0cde4374 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 3 Jan 2020 14:04:11 +1100 Subject: Tool System: enable fallback tool by default This defaults to selection when not using a gizmo. The previous behavior to drag anywhere can be set in the tool settings or by selecting the fallback tool (Alt-W). See: T66304 --- release/scripts/startup/bl_operators/wm.py | 3 --- .../startup/bl_ui/space_toolsystem_common.py | 6 +---- .../startup/bl_ui/space_toolsystem_toolbar.py | 7 +++--- release/scripts/startup/bl_ui/space_userpref.py | 27 ++++------------------ 4 files changed, 9 insertions(+), 34 deletions(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_operators/wm.py b/release/scripts/startup/bl_operators/wm.py index a677d9932b6..335a2a633cd 100644 --- a/release/scripts/startup/bl_operators/wm.py +++ b/release/scripts/startup/bl_operators/wm.py @@ -1804,9 +1804,6 @@ class WM_OT_toolbar_fallback_pie(Operator): return context.space_data is not None def invoke(self, context, event): - if not context.preferences.experimental.use_tool_fallback: - return {'PASS_THROUGH'} - from bl_ui.space_toolsystem_common import ToolSelectPanelHelper space_type = context.space_data.type cls = ToolSelectPanelHelper._tool_class_from_space_type(space_type) diff --git a/release/scripts/startup/bl_ui/space_toolsystem_common.py b/release/scripts/startup/bl_ui/space_toolsystem_common.py index 0a42e1232d3..05785b85dfc 100644 --- a/release/scripts/startup/bl_ui/space_toolsystem_common.py +++ b/release/scripts/startup/bl_ui/space_toolsystem_common.py @@ -709,11 +709,7 @@ class ToolSelectPanelHelper: if draw_settings is not None: draw_settings(context, layout, tool) - if context.preferences.experimental.use_tool_fallback: - idname_fallback = tool.idname_fallback - else: - idname_fallback = None - + idname_fallback = tool.idname_fallback if idname_fallback and idname_fallback != item.idname: tool_settings = context.tool_settings diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py index 5f017e61db7..e0f3a03733e 100644 --- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py +++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py @@ -298,10 +298,9 @@ class _defs_transform: layout.label(text="Gizmos:") show_drag = True - if context.preferences.experimental.use_tool_fallback: - tool_settings = context.tool_settings - if tool_settings.workspace_tool_type == 'FALLBACK': - show_drag = False + tool_settings = context.tool_settings + if tool_settings.workspace_tool_type == 'FALLBACK': + show_drag = False if show_drag: props = tool.gizmo_group_properties("VIEW3D_GGT_xform_gizmo") diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py index 03450fc44fb..b497d688339 100644 --- a/release/scripts/startup/bl_ui/space_userpref.py +++ b/release/scripts/startup/bl_ui/space_userpref.py @@ -2087,26 +2087,6 @@ class ExperimentalPanel: url_prefix = "https://developer.blender.org/" - -class USERPREF_PT_experimental_ui(ExperimentalPanel, Panel): - bl_label = "User Interface" - - def draw(self, context): - prefs = context.preferences - experimental = prefs.experimental - - layout = self.layout - layout.use_property_split = True - layout.use_property_decorate = False - - task = "T66304" - split = layout.split(factor=0.66) - col = split.column() - col.prop(experimental, "use_tool_fallback", text="Use Tool Fallback") - col = split.column() - col.operator("wm.url_open", text=task, icon='URL').url = self.url_prefix + task - - """ # Example panel, leave it here so we always have a template to follow even # after the features are gone from the experimental panel. @@ -2114,10 +2094,14 @@ class USERPREF_PT_experimental_ui(ExperimentalPanel, Panel): class USERPREF_PT_experimental_virtual_reality(ExperimentalPanel, Panel): bl_label = "Virtual Reality" - def draw_centered(self, context, layout): + def draw(self, context): prefs = context.preferences experimental = prefs.experimental + layout = self.layout + layout.use_property_split = True + layout.use_property_decorate = False + task = "T71347" split = layout.split(factor=0.66) col = split.split() @@ -2242,7 +2226,6 @@ classes = ( USERPREF_PT_studiolight_matcaps, USERPREF_PT_studiolight_world, - USERPREF_PT_experimental_ui, USERPREF_PT_experimental_usd, # Popovers. -- cgit v1.2.3 From 5c66739b782e991034c872c4f7175093e98c9982 Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Sat, 4 Jan 2020 22:02:03 +0100 Subject: Fix T72897: Move Channels operator moves Grease Pencil Layers wrongly This operator was pending of fix. --- release/scripts/startup/bl_ui/space_dopesheet.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/space_dopesheet.py b/release/scripts/startup/bl_ui/space_dopesheet.py index 5a73ff094a2..a09e263fd87 100644 --- a/release/scripts/startup/bl_ui/space_dopesheet.py +++ b/release/scripts/startup/bl_ui/space_dopesheet.py @@ -542,8 +542,8 @@ class DOPESHEET_MT_gpencil_channel(Menu): # layout.operator("anim.channels_expand") # layout.operator("anim.channels_collapse") - # layout.separator() - #layout.operator_menu_enum("anim.channels_move", "direction", text="Move...") + layout.separator() + layout.operator_menu_enum("anim.channels_move", "direction", text="Move...") class DOPESHEET_MT_gpencil_frame(Menu): -- cgit v1.2.3 From 7f3e121926fdd985d37ce8371647d79e09e37917 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Mon, 6 Jan 2020 11:47:23 +0100 Subject: USD Exporter: removed from experimental features There were two reasons the USD Exporter was listed as experimental: - Originally there was no deduplication of mesh normals & UV coordinates (resolved in rBf5e00f735106b5ec635806a4c795a2bc46ae8369), and - the way materials were exported was incompatible with instancing with USD 19.07. This seems to be resolved with the current version of USD (19.11). Blender (more specifically, `makesdna`) doesn't seem to like empty DNA structs, so I couldn't remove all properties from `UserDef_Experimental`. Instead I have just kept `char _pad0[8]`. Reviewed by: campbellbarton Differential Revision: https://developer.blender.org/D6519 --- release/scripts/startup/bl_ui/space_topbar.py | 2 +- release/scripts/startup/bl_ui/space_userpref.py | 26 ------------------------- 2 files changed, 1 insertion(+), 27 deletions(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/space_topbar.py b/release/scripts/startup/bl_ui/space_topbar.py index 7dbf49d01e3..fd46bd53cd2 100644 --- a/release/scripts/startup/bl_ui/space_topbar.py +++ b/release/scripts/startup/bl_ui/space_topbar.py @@ -471,7 +471,7 @@ class TOPBAR_MT_file_export(Menu): text="Collada (Default) (.dae)") if bpy.app.build_options.alembic: self.layout.operator("wm.alembic_export", text="Alembic (.abc)") - if bpy.app.build_options.usd and context.preferences.experimental.use_usd_exporter: + if bpy.app.build_options.usd: self.layout.operator( "wm.usd_export", text="Universal Scene Description (.usd, .usdc, .usda)") diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py index b497d688339..4f35bcc29df 100644 --- a/release/scripts/startup/bl_ui/space_userpref.py +++ b/release/scripts/startup/bl_ui/space_userpref.py @@ -2118,30 +2118,6 @@ class USERPREF_PT_experimental_virtual_reality(ExperimentalPanel, Panel): """ -class USERPREF_PT_experimental_usd(ExperimentalPanel, Panel): - bl_label = "Universal Scene Description" - - @classmethod - def poll(cls, context): - # Only show the panel if Blender was actually built with USD support. - return getattr(bpy.app.build_options, "usd", False) - - def draw(self, context): - prefs = context.preferences - experimental = prefs.experimental - - layout = self.layout - layout.use_property_split = True - layout.use_property_decorate = False - - split = layout.split(factor=0.66) - col = split.split() - col.prop(experimental, "use_usd_exporter", text="USD Exporter") - col = split.split() - url = "https://devtalk.blender.org/t/universal-scene-description-usd-exporter-feedback/10920" - col.operator("wm.url_open", text='Give Feedback', icon='URL').url = url - - # ----------------------------------------------------------------------------- # Class Registration @@ -2226,8 +2202,6 @@ classes = ( USERPREF_PT_studiolight_matcaps, USERPREF_PT_studiolight_world, - USERPREF_PT_experimental_usd, - # Popovers. USERPREF_PT_ndof_settings, -- cgit v1.2.3 From 3a35301fd16d9230932a148f0cf64ed6bef9e38b Mon Sep 17 00:00:00 2001 From: William Reynish Date: Mon, 6 Jan 2020 21:54:56 +0100 Subject: Fix T70821: Hair Radius Is Actually Hair Diameter Renamed hair tip and root properties to be called diameter rather than radius. The old name was incorrect. --- release/scripts/startup/bl_ui/properties_particle.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/properties_particle.py b/release/scripts/startup/bl_ui/properties_particle.py index 21abf8bb34c..b83eca1ab74 100644 --- a/release/scripts/startup/bl_ui/properties_particle.py +++ b/release/scripts/startup/bl_ui/properties_particle.py @@ -1961,8 +1961,8 @@ class PARTICLE_PT_hair_shape(ParticleButtonsPanel, Panel): layout.prop(part, "shape", text="Strand Shape") col = layout.column(align=True) - col.prop(part, "root_radius", text="Radius Root") - col.prop(part, "tip_radius", text="Tip") + col.prop(part, "root_diameter", text="Diameter Root") + col.prop(part, "tip_diameter", text="Tip") col = layout.column() col.prop(part, "radius_scale") -- cgit v1.2.3 From fa3a0697b846bd0ed3766fcabd1bf6f260aa425a Mon Sep 17 00:00:00 2001 From: Antonio Vazquez Date: Tue, 7 Jan 2020 11:29:42 +0100 Subject: Annotations: Split annotation operators and pointer functions This allows to have annotation panels and grease pencil object panel at the same time. Differential Revision: https://developer.blender.org/D6467 --- .../bl_ui/properties_grease_pencil_common.py | 32 +++++++++++----------- .../startup/bl_ui/space_toolsystem_toolbar.py | 8 +++++- 2 files changed, 23 insertions(+), 17 deletions(-) (limited to 'release/scripts/startup') 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 45cb10bb3bd..2001f46820f 100644 --- a/release/scripts/startup/bl_ui/properties_grease_pencil_common.py +++ b/release/scripts/startup/bl_ui/properties_grease_pencil_common.py @@ -581,9 +581,9 @@ class AnnotationDataPanel: def poll(cls, context): # Show this panel as long as someone that might own this exists # AND the owner isn't an object (e.g. GP Object) - if context.gpencil_data_owner is None: + if context.annotation_data_owner is None: return False - elif type(context.gpencil_data_owner) is bpy.types.Object: + elif type(context.annotation_data_owner) is bpy.types.Object: return False else: return True @@ -597,14 +597,14 @@ class AnnotationDataPanel: layout.use_property_decorate = False # Grease Pencil owner. - gpd_owner = context.gpencil_data_owner - gpd = context.gpencil_data + gpd_owner = context.annotation_data_owner + gpd = context.annotation_data # Owner selector. if context.space_data.type == 'CLIP_EDITOR': layout.row().prop(context.space_data, "grease_pencil_source", expand=True) - layout.template_ID(gpd_owner, "grease_pencil", new="gpencil.data_add", unlink="gpencil.data_unlink") + layout.template_ID(gpd_owner, "grease_pencil", new="gpencil.annotation_add", unlink="gpencil.data_unlink") # List of layers/notes. if gpd and gpd.layers: @@ -624,17 +624,17 @@ class AnnotationDataPanel: col = row.column() sub = col.column(align=True) - sub.operator("gpencil.layer_add", icon='ADD', text="") - sub.operator("gpencil.layer_remove", icon='REMOVE', text="") + sub.operator("gpencil.layer_annotation_add", icon='ADD', text="") + sub.operator("gpencil.layer_annotation_remove", icon='REMOVE', text="") - gpl = context.active_gpencil_layer + gpl = context.active_annotation_layer if gpl: if len(gpd.layers) > 1: col.separator() sub = col.column(align=True) - sub.operator("gpencil.layer_move", icon='TRIA_UP', text="").type = 'UP' - sub.operator("gpencil.layer_move", icon='TRIA_DOWN', text="").type = 'DOWN' + sub.operator("gpencil.layer_annotation_move", icon='TRIA_UP', text="").type = 'UP' + sub.operator("gpencil.layer_annotation_move", icon='TRIA_DOWN', text="").type = 'DOWN' tool_settings = context.tool_settings if gpd and gpl: @@ -653,7 +653,7 @@ class AnnotationDataPanel: else: lock_label = iface_("Lock Frame") row.prop(gpl, "lock_frame", text=lock_label, icon='UNLOCKED') - row.operator("gpencil.active_frame_delete", text="", icon='X') + row.operator("gpencil.annotation_active_frame_delete", text="", icon='X') class AnnotationOnionSkin: @@ -665,26 +665,26 @@ class AnnotationOnionSkin: def poll(cls, context): # Show this panel as long as someone that might own this exists # AND the owner isn't an object (e.g. GP Object) - if context.gpencil_data_owner is None: + if context.annotation_data_owner is None: return False - elif type(context.gpencil_data_owner) is bpy.types.Object: + elif type(context.annotation_data_owner) is bpy.types.Object: return False else: - gpl = context.active_gpencil_layer + gpl = context.active_annotation_layer if gpl is None: return False return True def draw_header(self, context): - gpl = context.active_gpencil_layer + gpl = context.active_annotation_layer self.layout.prop(gpl, "use_annotation_onion_skinning", text="") def draw(self, context): layout = self.layout layout.use_property_decorate = False - gpl = context.active_gpencil_layer + gpl = context.active_annotation_layer col = layout.column() split = col.split(factor=0.5) split.active = gpl.use_annotation_onion_skinning diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py index e0f3a03733e..170b635f7e1 100644 --- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py +++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py @@ -2115,6 +2115,8 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel): _defs_gpencil_paint.curve, _defs_gpencil_paint.box, _defs_gpencil_paint.circle, + None, + *_tools_annotate, ], 'EDIT_GPENCIL': [ *_tools_gpencil_select, @@ -2129,11 +2131,13 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel): _defs_gpencil_edit.shear, _defs_gpencil_edit.tosphere, ), - + None, + *_tools_annotate, ], 'SCULPT_GPENCIL': [ _defs_gpencil_sculpt.generate_from_brushes, None, + *_tools_annotate, lambda context: ( VIEW3D_PT_tools_active._tools_gpencil_select if _defs_gpencil_sculpt.poll_select_mask(context) @@ -2142,6 +2146,8 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel): ], 'WEIGHT_GPENCIL': [ _defs_gpencil_weight.generate_from_brushes, + None, + *_tools_annotate, ], } -- cgit v1.2.3 From e665c2c89326f4b13270d0d5d5082b5368413371 Mon Sep 17 00:00:00 2001 From: mano-wii Date: Tue, 7 Jan 2020 11:52:44 -0300 Subject: Fix T69314: Broken Rotation to Deltas for Quaternions --- release/scripts/startup/bl_operators/object.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_operators/object.py b/release/scripts/startup/bl_operators/object.py index c42d5970ed9..12d7984b3b2 100644 --- a/release/scripts/startup/bl_operators/object.py +++ b/release/scripts/startup/bl_operators/object.py @@ -743,7 +743,9 @@ class TransformsToDeltas(Operator): def transfer_rotation(self, obj): # TODO: add transforms together... if obj.rotation_mode == 'QUATERNION': - obj.delta_rotation_quaternion += obj.rotation_quaternion + delta = obj.delta_rotation_quaternion.copy() + obj.delta_rotation_quaternion = obj.rotation_quaternion + obj.delta_rotation_quaternion.rotate(delta) if self.reset_values: obj.rotation_quaternion.identity() -- cgit v1.2.3 From fdf89acc8634ecba4dfe66e20ff595c0c24ffdee Mon Sep 17 00:00:00 2001 From: Pablo Dobarro Date: Tue, 7 Jan 2020 16:46:56 +0100 Subject: Sculpt: Pose Brush with Inverse Kinematics This commits introduces the pose_ik_segments brush property in the Pose Brush. When increasing the IK segments count, the brush generates more segments and weights associations following the topology of the mesh. When moving the brush, these segments are transformed using an IK solver and they are used to deform the mesh. When pressing Ctrl, the brush controls the segments' roll rotation instead of using the IK solver. The brush falloff controls how much rotation is propagated from the first to the last segment in the chain. Reviewed By: jbakker Differential Revision: https://developer.blender.org/D6389 --- release/scripts/startup/bl_ui/properties_paint_common.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/properties_paint_common.py b/release/scripts/startup/bl_ui/properties_paint_common.py index 327df079d3b..b15a244eefd 100644 --- a/release/scripts/startup/bl_ui/properties_paint_common.py +++ b/release/scripts/startup/bl_ui/properties_paint_common.py @@ -616,9 +616,12 @@ def brush_settings(layout, context, brush, popover=False): layout.separator() if brush.sculpt_tool == 'POSE': - row = layout.row() - row.prop(brush, "pose_offset") - + layout.separator() + layout.prop(brush, "pose_offset") + layout.prop(brush, "pose_smooth_iterations") + layout.prop(brush, "pose_ik_segments") + layout.separator() + if brush.sculpt_tool == 'SCRAPE': row = layout.row() row.prop(brush, "invert_to_scrape_fill", text="Invert to Fill") -- cgit v1.2.3 From c3b406a7c331e68978eacac543f3be564f7601ac Mon Sep 17 00:00:00 2001 From: William Reynish Date: Wed, 8 Jan 2020 20:37:35 +0100 Subject: Revert recent change to the particles RNA, and only affect the UI. Even though the name change is more correct, we don't want to change the API at this time. --- release/scripts/startup/bl_ui/properties_particle.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/properties_particle.py b/release/scripts/startup/bl_ui/properties_particle.py index b83eca1ab74..2028857640e 100644 --- a/release/scripts/startup/bl_ui/properties_particle.py +++ b/release/scripts/startup/bl_ui/properties_particle.py @@ -1961,8 +1961,8 @@ class PARTICLE_PT_hair_shape(ParticleButtonsPanel, Panel): layout.prop(part, "shape", text="Strand Shape") col = layout.column(align=True) - col.prop(part, "root_diameter", text="Diameter Root") - col.prop(part, "tip_diameter", text="Tip") + col.prop(part, "root_radius", text="Diameter Root") + col.prop(part, "tip_radius", text="Tip") col = layout.column() col.prop(part, "radius_scale") -- cgit v1.2.3 From 9b920938bbca806d978cc6d24ecffc3b4a9b0e6d Mon Sep 17 00:00:00 2001 From: Jacques Lucke Date: Thu, 9 Jan 2020 17:07:27 +0100 Subject: Fix T71630: Add Delete Tracks to Edit menu in NLA editor Reviewers: billreynish, lichtwerk Differential Revision: https://developer.blender.org/D6550 --- release/scripts/startup/bl_ui/space_nla.py | 1 + 1 file changed, 1 insertion(+) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/space_nla.py b/release/scripts/startup/bl_ui/space_nla.py index 28b67c93666..4ecc4e7fdd9 100644 --- a/release/scripts/startup/bl_ui/space_nla.py +++ b/release/scripts/startup/bl_ui/space_nla.py @@ -167,6 +167,7 @@ class NLA_MT_edit(Menu): layout.operator("nla.duplicate", text="Linked Duplicate").linked = True layout.operator("nla.split") layout.operator("nla.delete") + layout.operator("nla.tracks_delete") layout.separator() layout.operator("nla.mute_toggle") -- cgit v1.2.3 From f4beab71927c91a6ba96920e473b4f806b5333cd Mon Sep 17 00:00:00 2001 From: Pablo Dobarro Date: Mon, 13 Jan 2020 21:52:07 +0100 Subject: Fix T73070: Disable falloff_shape in the Pose Brush The Falloff property in the pose brush controls how much deformation propagates through the ik chain, not by using the distance to the vertices, so this option does not make sense (it does nothing in the pose brush code and it disables the 3d paint cursor). Reviewed By: jbakker Maniphest Tasks: T73070 Differential Revision: https://developer.blender.org/D6574 --- release/scripts/startup/bl_ui/properties_paint_common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/properties_paint_common.py b/release/scripts/startup/bl_ui/properties_paint_common.py index b15a244eefd..93bf5eca052 100644 --- a/release/scripts/startup/bl_ui/properties_paint_common.py +++ b/release/scripts/startup/bl_ui/properties_paint_common.py @@ -438,7 +438,7 @@ class FalloffPanel(BrushPanel): row.operator("brush.curve_preset", icon='LINCURVE', text="").shape = 'LINE' row.operator("brush.curve_preset", icon='NOCURVE', text="").shape = 'MAX' - if mode in {'SCULPT', 'PAINT_VERTEX', 'PAINT_WEIGHT'}: + if mode in {'SCULPT', 'PAINT_VERTEX', 'PAINT_WEIGHT'} and brush.sculpt_tool != 'POSE': col.separator() row = col.row(align=True) row.use_property_split = True -- cgit v1.2.3 From cdd937c6dd988feed1d9e5d023b8b7b8bec7665c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Barschkis?= Date: Wed, 15 Jan 2020 15:51:33 +0100 Subject: Fluid: Fix T72971 Incorporated suggestions from the task discussion --- release/scripts/startup/bl_operators/object_quick_effects.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_operators/object_quick_effects.py b/release/scripts/startup/bl_operators/object_quick_effects.py index e49ca0320c7..009ae53fa80 100644 --- a/release/scripts/startup/bl_operators/object_quick_effects.py +++ b/release/scripts/startup/bl_operators/object_quick_effects.py @@ -499,7 +499,6 @@ class QuickLiquid(Operator): # setup liquid domain bpy.ops.object.modifier_add(type='FLUID') obj.modifiers[-1].fluid_type = 'DOMAIN' - obj.modifiers[-1].domain_settings.domain_type = 'LIQUID' # set all domain borders to obstacle obj.modifiers[-1].domain_settings.use_collision_border_front = True obj.modifiers[-1].domain_settings.use_collision_border_back = True @@ -511,8 +510,8 @@ class QuickLiquid(Operator): # set correct cache file format for liquid obj.modifiers[-1].domain_settings.cache_mesh_format = 'BOBJECT' - # allocate and show particle system for FLIP - obj.modifiers[-1].domain_settings.use_flip_particles = True + # change domain type, will also allocate and show particle system for FLIP + obj.modifiers[-1].domain_settings.domain_type = 'LIQUID' # make the domain smooth so it renders nicely bpy.ops.object.shade_smooth() -- cgit v1.2.3 From 216291ddb39e3460361b8bd7350878a30e34945b Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 16 Jan 2020 15:09:07 +0100 Subject: Fix T68000: load previous settings error if config folder already exists This happened when opening Blender and not clicking Load Previous Settings or Next, and then reopening Blender again and using Load Previous Settings. --- release/scripts/startup/bl_operators/userpref.py | 45 ++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 3 deletions(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_operators/userpref.py b/release/scripts/startup/bl_operators/userpref.py index 4c5c269955a..4cb6ddd3fa3 100644 --- a/release/scripts/startup/bl_operators/userpref.py +++ b/release/scripts/startup/bl_operators/userpref.py @@ -49,6 +49,44 @@ def module_filesystem_remove(path_base, module_name): else: os.remove(f_full) +# This duplicates shutil.copytree from Python 3.8, with the new dirs_exist_ok +# argument that we need. Once we upgrade to 3.8 we can remove this. +def _preferences_copytree(entries, src, dst): + import shutil + import os + os.makedirs(dst, exist_ok=True) + errors = [] + + for srcentry in entries: + srcname = os.path.join(src, srcentry.name) + dstname = os.path.join(dst, srcentry.name) + srcobj = srcentry + try: + if srcentry.is_symlink(): + linkto = os.readlink(srcname) + os.symlink(linkto, dstname) + shutil.copystat(srcobj, dstname, follow_symlinks=False) + elif srcentry.is_dir(): + preferences_copytree(srcobj, dstname) + else: + shutil.copy2(srcentry, dstname) + except Error as err: + errors.extend(err.args[0]) + except OSError as why: + errors.append((srcname, dstname, str(why))) + try: + shutil.copystat(src, dst) + except OSError as why: + if getattr(why, 'winerror', None) is None: + errors.append((src, dst, str(why))) + if errors: + raise Error(errors) + return dst + +def preferences_copytree(src, dst): + import os + with os.scandir(src) as entries: + return _preferences_copytree(entries=entries, src=src, dst=dst) class PREFERENCES_OT_keyconfig_activate(Operator): bl_idname = "preferences.keyconfig_activate" @@ -110,9 +148,10 @@ class PREFERENCES_OT_copy_prev(Operator): return os.path.isfile(old_userpref) and not os.path.isfile(new_userpref) def execute(self, _context): - import shutil - - shutil.copytree(self._old_path(), self._new_path(), symlinks=True) + # Use this instead once we upgrade to Python 3.8 with dirs_exist_ok. + # import shutil + # shutil.copytree(self._old_path(), self._new_path(), dirs_exist_ok=True) + preferences_copytree(self._old_path(), self._new_path()) # reload preferences and recent-files.txt bpy.ops.wm.read_userpref() -- cgit v1.2.3 From f60d97d42663d9578ed284b7be337a6b5afc600d Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Fri, 17 Jan 2020 19:27:05 +1100 Subject: Fix T73176: No options for Centre Action Safe Margins --- release/scripts/startup/bl_ui/properties_data_camera.py | 1 + 1 file changed, 1 insertion(+) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/properties_data_camera.py b/release/scripts/startup/bl_ui/properties_data_camera.py index eef70056be8..aee909e3a6c 100644 --- a/release/scripts/startup/bl_ui/properties_data_camera.py +++ b/release/scripts/startup/bl_ui/properties_data_camera.py @@ -501,6 +501,7 @@ class DATA_PT_camera_safe_areas_center_cut(CameraButtonsPanel, Panel): col = layout.column() col.prop(safe_data, "title_center", slider=True) + col.prop(safe_data, "action_center", slider=True) class DATA_PT_custom_props_camera(CameraButtonsPanel, PropertyPanel, Panel): -- cgit v1.2.3 From 966383138a42924b155e237a6dc32c22ace49b68 Mon Sep 17 00:00:00 2001 From: Alexander Gavrilov Date: Tue, 17 Dec 2019 16:11:31 +0300 Subject: Weight Paint: implement a red shade for bones with locked weights. Blender supports locking vertex groups to prevent changes to the weights. However, as mentioned in comments for D3837, it is hard to use this because there is no interface for locking in 3D View. This adds a red shade to bones that are associated with a locked weight group during weight paint mode, as the first step to adding such interface. The next step is adding a pie menu for lock/unlock. Differential Revision: https://developer.blender.org/D6533 --- release/scripts/startup/bl_ui/space_userpref.py | 1 + 1 file changed, 1 insertion(+) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/space_userpref.py b/release/scripts/startup/bl_ui/space_userpref.py index 4f35bcc29df..ad5e7b5442c 100644 --- a/release/scripts/startup/bl_ui/space_userpref.py +++ b/release/scripts/startup/bl_ui/space_userpref.py @@ -997,6 +997,7 @@ class PreferenceThemeSpacePanel: "freestyle_face_mark", "split_normal", "bone_solid", + "bone_locked_weight", "paint_curve_pivot", }, 'GRAPH_EDITOR': { -- cgit v1.2.3 From c7596cd820e32747372378a511cd95894c4829e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Barschkis?= Date: Sun, 19 Jan 2020 23:41:02 +0100 Subject: Fluid: Improved cache file loading Cache file loading for mesh and particle files now works through the direct update_structures functions. The final cache mode now also only bakes the most essential files and is therefore not resumable anymore. --- release/scripts/startup/bl_ui/properties_physics_fluid.py | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/properties_physics_fluid.py b/release/scripts/startup/bl_ui/properties_physics_fluid.py index 6b0dd7ac36f..6252ba3bb74 100644 --- a/release/scripts/startup/bl_ui/properties_physics_fluid.py +++ b/release/scripts/startup/bl_ui/properties_physics_fluid.py @@ -1088,13 +1088,7 @@ class PHYSICS_PT_cache(PhysicButtonsPanel, Panel): col.separator() split = layout.split() - bake_incomplete = (domain.cache_frame_pause_data < domain.cache_frame_end) - if domain.has_cache_baked_data and not domain.is_cache_baking_data and bake_incomplete: - col = split.column() - col.operator("fluid.bake_all", text="Resume") - col = split.column() - col.operator("fluid.free_all", text="Free") - elif domain.is_cache_baking_data and not domain.has_cache_baked_data: + if domain.is_cache_baking_data and not domain.has_cache_baked_data: split.enabled = False split.operator("fluid.pause_bake", text="Baking All - ESC to pause") elif not domain.has_cache_baked_data and not domain.is_cache_baking_data: -- cgit v1.2.3 From 31e2786707049c40b9d8639639fd16a5cc0dce13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Mon, 20 Jan 2020 17:32:16 +0100 Subject: Fix T71825: Custom Animation Player path overrides chosen player Thanks @mano-wii for providing the patch! The original code assumed that when `animation_player_preset` was not `CUSTOM`, the `animation_player` path would be empty. This is a bad assumption, as it can be quite useful to be able to toggle between a custom and a built-in player. As such, `animation_player` should not be reset to an empty string when a non-custom player is chosen. --- release/scripts/startup/bl_operators/screen_play_rendered_anim.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_operators/screen_play_rendered_anim.py b/release/scripts/startup/bl_operators/screen_play_rendered_anim.py index 756d2ff1eeb..3900fc3f2c2 100644 --- a/release/scripts/startup/bl_operators/screen_play_rendered_anim.py +++ b/release/scripts/startup/bl_operators/screen_play_rendered_anim.py @@ -85,12 +85,13 @@ class PlayRenderedAnim(Operator): fps_final = rd.fps / rd.fps_base preset = prefs.filepaths.animation_player_preset - player_path = prefs.filepaths.animation_player # file_path = bpy.path.abspath(rd.filepath) # UNUSED is_movie = rd.is_movie_format # try and guess a command line if it doesn't exist - if player_path == "": + if preset == 'CUSTOM': + player_path = prefs.filepaths.animation_player + else: player_path = guess_player_path(preset) if is_movie is False and preset in {'FRAMECYCLER', 'RV', 'MPLAYER'}: -- cgit v1.2.3 From ed4bf2dc61ac1f1da71815b542749243101069db Mon Sep 17 00:00:00 2001 From: William Reynish Date: Tue, 21 Jan 2020 09:59:22 +0100 Subject: Fix T73283: Shadows checkbox affects Custom Distance active state This appears to just have been a simple copy/paste mistake --- release/scripts/startup/bl_ui/properties_data_light.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/properties_data_light.py b/release/scripts/startup/bl_ui/properties_data_light.py index 6f730cf3307..cf894b48e1e 100644 --- a/release/scripts/startup/bl_ui/properties_data_light.py +++ b/release/scripts/startup/bl_ui/properties_data_light.py @@ -134,17 +134,15 @@ class DATA_PT_EEVEE_light_distance(DataButtonsPanel, Panel): light = context.light layout = self.layout - layout.active = light.use_shadow layout.prop(light, "use_custom_distance", text="") def draw(self, context): layout = self.layout light = context.light + layout.active = light.use_custom_distance layout.use_property_split = True - col = layout.column() - - col.prop(light, "cutoff_distance", text="Distance") + layout.prop(light, "cutoff_distance", text="Distance") class DATA_PT_EEVEE_shadow(DataButtonsPanel, Panel): @@ -311,7 +309,8 @@ class DATA_PT_falloff_curve(DataButtonsPanel, Panel): def draw(self, context): light = context.light - self.layout.template_curve_mapping(light, "falloff_curve", use_negative_slope=True) + self.layout.template_curve_mapping( + light, "falloff_curve", use_negative_slope=True) class DATA_PT_custom_props_light(DataButtonsPanel, PropertyPanel, Panel): -- cgit v1.2.3 From 0de07c98143ad5b3581018b2e7e2e3ffdf3dc828 Mon Sep 17 00:00:00 2001 From: Keith Boshoff Date: Wed, 22 Jan 2020 04:00:21 +1100 Subject: Docs: describe vertex dirt method --- release/scripts/startup/bl_operators/vertexpaint_dirt.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_operators/vertexpaint_dirt.py b/release/scripts/startup/bl_operators/vertexpaint_dirt.py index 39d792bd557..a249599b5d7 100644 --- a/release/scripts/startup/bl_operators/vertexpaint_dirt.py +++ b/release/scripts/startup/bl_operators/vertexpaint_dirt.py @@ -37,6 +37,20 @@ def applyVertexDirt(me, blur_iterations, blur_strength, clamp_dirt, clamp_clean, from math import acos import array + # We simulate the accumulation of dirt in the creases of geometric surfaces + # by comparing the vertex normal to the average direction of all vertices + # connected to that vertex. We can also simulate surfaces being buffed or + # worn by testing protruding surfaces. + # + # So if the angle between the normal and geometric direction is: + # < 90 - dirt has accumulated in the crease + # > 90 - surface has been worn or buffed + # ~ 90 - surface is flat and is generally unworn and clean + # + # This method is limited by the complexity or lack there of in the geometry. + # + # Original code and method by Keith "Wahooney" Boshoff. + vert_tone = array.array("f", [0.0]) * len(me.vertices) # create lookup table for each vertex's connected vertices (via edges) -- cgit v1.2.3 From a4cf2cf2decc29f2ca829f57254b3087e438eb5a Mon Sep 17 00:00:00 2001 From: Richard Antalik Date: Wed, 22 Jan 2020 02:07:54 +0100 Subject: VSE: Add Adjust Last Operation panel to the video sequencer Add Adjust Last Operation panel to Sequencer. `OPTYPE_REGISTER` was removed form some operators and few properties were hidden So they don't show up on the panel Author: a.monti Reviewed By: ISS Differential Revision: http://developer.blender.org/D6210 --- release/scripts/startup/bl_ui/space_sequencer.py | 3 +++ 1 file changed, 3 insertions(+) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py index 097564444d0..5f23c7bca20 100644 --- a/release/scripts/startup/bl_ui/space_sequencer.py +++ b/release/scripts/startup/bl_ui/space_sequencer.py @@ -228,6 +228,9 @@ class SEQUENCER_MT_view(Menu): layout.prop(st, "show_region_ui") layout.operator_context = 'INVOKE_DEFAULT' + if is_sequencer_view: + layout.prop(st, "show_region_hud") + if st.view_type == 'SEQUENCER': layout.prop(st, "show_backdrop", text="Preview as Backdrop") -- cgit v1.2.3 From 69828cba533d486d3c00578cd0bd03a5e2b8d1c6 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 22 Jan 2020 17:43:15 +1100 Subject: UI: rename transparency to opacity Calling it transparency makes value seem inverted, resolves T73306. --- release/scripts/startup/bl_ui/properties_data_empty.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/properties_data_empty.py b/release/scripts/startup/bl_ui/properties_data_empty.py index 4ce87b85410..dc9c170c65b 100644 --- a/release/scripts/startup/bl_ui/properties_data_empty.py +++ b/release/scripts/startup/bl_ui/properties_data_empty.py @@ -49,7 +49,7 @@ class DATA_PT_empty(DataButtonsPanel, Panel): col = layout.column() col.active = ob.use_empty_image_alpha - col.prop(ob, "color", text="Transparency", index=3, slider=True) + col.prop(ob, "color", text="Opacity", index=3, slider=True) col = layout.column(align=True) col.prop(ob, "empty_image_offset", text="Offset X", index=0) -- cgit v1.2.3 From 6a49161c8c60cb63d9e3ed8dbe700163ff858436 Mon Sep 17 00:00:00 2001 From: Richard Antalik Date: Wed, 22 Jan 2020 14:54:44 +0100 Subject: VSE: Tool system integration Add toolbar to sequencer regions. A bit of refactoring has to be done in RNA space. Currently there is only cut tool implemented to serve as template for anybody who would like to add more. --- release/scripts/startup/bl_ui/space_sequencer.py | 41 +++++++- .../startup/bl_ui/space_toolsystem_common.py | 10 ++ .../startup/bl_ui/space_toolsystem_toolbar.py | 104 +++++++++++++++++++++ 3 files changed, 153 insertions(+), 2 deletions(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py index 5f23c7bca20..0e78ddfb648 100644 --- a/release/scripts/startup/bl_ui/space_sequencer.py +++ b/release/scripts/startup/bl_ui/space_sequencer.py @@ -30,6 +30,9 @@ from bpy.app.translations import ( from bl_ui.properties_grease_pencil_common import ( AnnotationDataPanel, ) +from bl_ui.space_toolsystem_common import ( + ToolActivePanelHelper, +) from rna_prop_ui import PropertyPanel @@ -89,6 +92,35 @@ def draw_color_balance(layout, color_balance): split.template_color_picker(color_balance, "gain", value_slider=True, lock_luminosity=True, cubic=True) +class SEQUENCER_PT_active_tool(ToolActivePanelHelper, Panel): + bl_space_type = 'SEQUENCE_EDITOR' + bl_region_type = 'UI' + bl_category = "Tool" + + +class SEQUENCER_HT_tool_header(Header): + bl_space_type = 'SEQUENCE_EDITOR' + bl_region_type = 'TOOL_HEADER' + + def draw(self, context): + layout = self.layout + + layout.template_header() + + self.draw_tool_settings(context) + + # TODO: options popover. + + def draw_tool_settings(self, context): + layout = self.layout + + # Active Tool + # ----------- + from bl_ui.space_toolsystem_common import ToolSelectPanelHelper + tool = ToolSelectPanelHelper.draw_active_tool_header(context, layout) + tool_mode = context.mode if tool is None else tool.mode + + class SEQUENCER_HT_header(Header): bl_space_type = 'SEQUENCE_EDITOR' @@ -97,7 +129,10 @@ class SEQUENCER_HT_header(Header): st = context.space_data - layout.template_header() + show_region_tool_header = st.show_region_tool_header + + if not show_region_tool_header: + layout.template_header() layout.prop(st, "view_type", text="") @@ -226,6 +261,7 @@ class SEQUENCER_MT_view(Menu): # wm_keymap_item_find_props() (see #32595). layout.operator_context = 'INVOKE_REGION_PREVIEW' layout.prop(st, "show_region_ui") + layout.prop(st, "show_region_toolbar") layout.operator_context = 'INVOKE_DEFAULT' if is_sequencer_view: @@ -2131,6 +2167,7 @@ class SEQUENCER_PT_custom_props(SequencerButtonsPanel, PropertyPanel, Panel): classes = ( SEQUENCER_MT_change, + SEQUENCER_HT_tool_header, SEQUENCER_HT_header, SEQUENCER_MT_editor_menus, SEQUENCER_MT_range, @@ -2156,7 +2193,7 @@ classes = ( SEQUENCER_MT_strip_input, SEQUENCER_MT_strip_lock_mute, SEQUENCER_MT_context_menu, - + SEQUENCER_PT_active_tool, SEQUENCER_PT_strip, SEQUENCER_PT_effect, diff --git a/release/scripts/startup/bl_ui/space_toolsystem_common.py b/release/scripts/startup/bl_ui/space_toolsystem_common.py index 05785b85dfc..4dc724299f0 100644 --- a/release/scripts/startup/bl_ui/space_toolsystem_common.py +++ b/release/scripts/startup/bl_ui/space_toolsystem_common.py @@ -390,6 +390,14 @@ class ToolSelectPanelHelper: if tool is not None: tool.refresh_from_context() return tool + elif space_type == 'SEQUENCE_EDITOR': + space_data = context.space_data + if mode is None: + mode = space_data.view_type + tool = context.workspace.tools.from_space_sequencer(mode, create=create) + if tool is not None: + tool.refresh_from_context() + return tool return None @staticmethod @@ -656,6 +664,8 @@ class ToolSelectPanelHelper: return space_type, space_data.mode elif space_type == 'NODE_EDITOR': return space_type, None + elif space_type == 'SEQUENCE_EDITOR': + return space_type, context.space_data.view_type else: return None, None diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py index 170b635f7e1..c03d681f2b2 100644 --- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py +++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py @@ -1707,6 +1707,51 @@ class _defs_node_edit: keymap="Node Tool: Links Cut", ) +class _defs_sequencer_generic: + + @ToolDef.from_fn + def cut(): + def draw_settings(_context, layout, tool): + props = tool.operator_properties("sequencer.cut") + row = layout.row() + row.use_property_split = False + row.prop(props, "type", expand=True) + return dict( + idname="builtin.cut", + label="Cut", + icon="ops.mesh.knife_tool", + widget=None, + keymap="Sequencer Tool: Cut", + draw_settings=draw_settings, + ) + +class _defs_sequencer_select: + @ToolDef.from_fn + def select(): + return dict( + idname="builtin.select", + label="Select", + icon="ops.generic.select", + widget=None, + keymap="Sequencer Tool: Select", + ) + @ToolDef.from_fn + def box(): + def draw_settings(_context, layout, tool): + props = tool.operator_properties("sequencer.select_box") + row = layout.row() + row.use_property_split = False + row.prop(props, "mode", text="", expand=True, icon_only=True) + pass + return dict( + idname="builtin.select_box", + label="Select Box", + icon="ops.generic.select_box", + widget=None, + keymap="Sequencer Tool: Select Box", + draw_settings=draw_settings, + ) + class IMAGE_PT_tools_active(ToolSelectPanelHelper, Panel): bl_space_type = 'IMAGE_EDITOR' @@ -2150,12 +2195,71 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel): *_tools_annotate, ], } +class SEQUENCER_PT_tools_active(ToolSelectPanelHelper, Panel): + bl_space_type = 'SEQUENCE_EDITOR' + bl_region_type = 'TOOLS' + bl_label = "Tools" # not visible + bl_options = {'HIDE_HEADER'} + + # Satisfy the 'ToolSelectPanelHelper' API. + keymap_prefix = "Sequence Editor Tool:" + + # Default group to use as a fallback. + tool_fallback_id = "builtin.select" + + @classmethod + def tools_from_context(cls, context, mode=None): + if mode is None: + if context.space_data: + mode = context.space_data.view_type + for tools in (cls._tools[None], cls._tools.get(mode, ())): + for item in tools: + if not (type(item) is ToolDef) and callable(item): + yield from item(context) + else: + yield item + + @classmethod + def tools_all(cls): + yield from cls._tools.items() + _tools_select = ( + ( + _defs_sequencer_select.select, + _defs_sequencer_select.box, + ), + ) + _tools_annotate = ( + ( + _defs_annotate.scribble, + _defs_annotate.line, + _defs_annotate.poly, + _defs_annotate.eraser, + ), + ) + + _tools = { + None: [ + ], + 'PREVIEW': [ + *_tools_annotate, + ], + 'SEQUENCER': [ + *_tools_select, + _defs_sequencer_generic.cut, + ], + 'SEQUENCER_PREVIEW': [ + *_tools_select, + *_tools_annotate, + _defs_sequencer_generic.cut, + ], + } classes = ( IMAGE_PT_tools_active, NODE_PT_tools_active, VIEW3D_PT_tools_active, + SEQUENCER_PT_tools_active, ) if __name__ == "__main__": # only for live edit. -- cgit v1.2.3 From 452834f1e3a0253afd27339511f9b864818d3dde Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Wed, 22 Jan 2020 13:48:25 -0800 Subject: UI: Area Duplicate Icon Changes the icon used for 'duplicate into new window' to a new one created for this purpose. Differential Revision: https://developer.blender.org/D6463 Reviewed by Julian Eisel --- release/scripts/startup/bl_ui/space_info.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/space_info.py b/release/scripts/startup/bl_ui/space_info.py index 82ed701aa4c..cd65980fc0d 100644 --- a/release/scripts/startup/bl_ui/space_info.py +++ b/release/scripts/startup/bl_ui/space_info.py @@ -92,7 +92,7 @@ class INFO_MT_area(Menu): layout.separator() - layout.operator("screen.area_dupli", icon='DUPLICATE') + layout.operator("screen.area_dupli", icon='WINDOW') layout.separator() -- cgit v1.2.3 From fe772bf8186c5fc990752c4199a4ec38128e0816 Mon Sep 17 00:00:00 2001 From: William Reynish Date: Thu, 23 Jan 2020 10:34:29 +0100 Subject: UI: Change 'Lock Time to Other Windows' > 'Sync Visible Range' + add to Sequencer As pointed out by user @Peter Fog (tintwotin): The current name for this property is wrong for two reasons: - Because it makes incorrect use of the term 'window' (in Blender these are called 'editors') - 'Lock Time' is incorrect, because it has nothing to do with locking the time at all. In Blender, the time is already locked and always the same across editors, no matter what. This property only syncs the visible range, which is something quite different. For this reason, this is changed to 'Sync Visible Range' instead. I also added a tooltip, which was completely missing. This patch also adds this property to the Sequencer, where it was missing. Differential Revision: https://developer.blender.org/D6632 Reviewed by Julian Eisel --- release/scripts/startup/bl_ui/space_sequencer.py | 1 + 1 file changed, 1 insertion(+) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/space_sequencer.py b/release/scripts/startup/bl_ui/space_sequencer.py index 0e78ddfb648..af0c23e7892 100644 --- a/release/scripts/startup/bl_ui/space_sequencer.py +++ b/release/scripts/startup/bl_ui/space_sequencer.py @@ -307,6 +307,7 @@ class SEQUENCER_MT_view(Menu): layout.operator_context = 'INVOKE_DEFAULT' layout.prop(st, "show_seconds") + layout.prop(st, "show_locked_time") layout.prop(st, "show_strip_offset") layout.separator() layout.prop(st, "show_markers") -- cgit v1.2.3 From 1f6ab32196d7cdd78e55f51ccc4304994b78b5c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Thu, 23 Jan 2020 10:37:32 +0100 Subject: Fix T73279: Particle Rotation checkbox enabled when a bake exists The contents of the Rotation panel was already disabled when a bake exists, but the checkbox in the header wasn't. Since rotations are part of the baked data, it doesn't make sense to enable/disable rotations after baking. --- release/scripts/startup/bl_ui/properties_particle.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/properties_particle.py b/release/scripts/startup/bl_ui/properties_particle.py index 2028857640e..34ff386893b 100644 --- a/release/scripts/startup/bl_ui/properties_particle.py +++ b/release/scripts/startup/bl_ui/properties_particle.py @@ -582,7 +582,10 @@ class PARTICLE_PT_rotation(ParticleButtonsPanel, Panel): else: part = context.space_data.pin_id - self.layout.prop(part, "use_rotations", text="") + layout = self.layout + layout.prop(part, "use_rotations", text="") + layout.enabled = particle_panel_enabled(context, psys) and part.use_rotations + def draw(self, context): layout = self.layout -- cgit v1.2.3 From c01246f6c0fa09d20bfc1f966466b74998045dfa Mon Sep 17 00:00:00 2001 From: William Reynish Date: Thu, 23 Jan 2020 11:45:48 +0100 Subject: UI: Consolidate masking-related brush controls In the brush properties, some masking-related controls are currently available as a sub-panel in the Options panel, while others are in the Mask panel. I want to generally lessen the amount of controls in generic 'options' panels, since it's non-descriptive and rather a rather random grab bag of various controls. Better to group things in terms of their functionality with descriptive names. This change consolidates the masking-related controls under one panel. Differential Revision: https://developer.blender.org/D6577 Reviewers: Pablo Dobarro, Julien Kaspar --- .../scripts/startup/bl_ui/space_view3d_toolbar.py | 23 ++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/space_view3d_toolbar.py b/release/scripts/startup/bl_ui/space_view3d_toolbar.py index 011c2a8b39a..19d5e3da309 100644 --- a/release/scripts/startup/bl_ui/space_view3d_toolbar.py +++ b/release/scripts/startup/bl_ui/space_view3d_toolbar.py @@ -560,12 +560,23 @@ class VIEW3D_PT_slots_projectpaint(View3DPanel, Panel): layout.operator("image.save_all_modified", text="Save All Images", icon='FILE_TICK') +class VIEW3D_PT_mask(View3DPanel, Panel): + bl_category = "Tool" + bl_context = ".imagepaint" # dot on purpose (access from topbar) + bl_label = "Masking" + bl_options = {'DEFAULT_CLOSED'} + + def draw(self, context): + pass + + # TODO, move to space_view3d.py class VIEW3D_PT_stencil_projectpaint(View3DPanel, Panel): bl_category = "Tool" bl_context = ".imagepaint" # dot on purpose (access from topbar) - bl_label = "Mask" + bl_label = "Stencil Mask" bl_options = {'DEFAULT_CLOSED'} + bl_parent_id = "VIEW3D_PT_mask" bl_ui_units_x = 14 @classmethod @@ -1192,6 +1203,7 @@ class VIEW3D_PT_tools_imagepaint_options_cavity(View3DPaintPanel, Panel): bl_context = ".imagepaint" # dot on purpose (access from topbar) bl_label = "Cavity Mask" bl_parent_id = "VIEW3D_PT_tools_imagepaint_options" + bl_parent_id = "VIEW3D_PT_mask" bl_options = {'DEFAULT_CLOSED'} def draw_header(self, context): @@ -1876,7 +1888,7 @@ classes = ( VIEW3D_PT_tools_curveedit_options_stroke, VIEW3D_PT_tools_armatureedit_options, VIEW3D_PT_tools_posemode_options, - + VIEW3D_PT_slots_projectpaint, VIEW3D_PT_tools_brush_select, VIEW3D_PT_tools_brush_settings, @@ -1886,7 +1898,6 @@ classes = ( VIEW3D_PT_tools_brush_clone, TEXTURE_UL_texpaintslots, VIEW3D_MT_tools_projectpaint_uvlayer, - VIEW3D_PT_stencil_projectpaint, VIEW3D_PT_tools_brush_texture, VIEW3D_PT_tools_mask_texture, VIEW3D_PT_tools_brush_stroke, @@ -1912,9 +1923,13 @@ classes = ( VIEW3D_PT_tools_vertexpaint_symmetry_for_topbar, VIEW3D_PT_tools_vertexpaint_options, + VIEW3D_PT_mask, + VIEW3D_PT_stencil_projectpaint, + VIEW3D_PT_tools_imagepaint_options_cavity, + VIEW3D_PT_tools_imagepaint_symmetry, VIEW3D_PT_tools_imagepaint_options, - VIEW3D_PT_tools_imagepaint_options_cavity, + VIEW3D_PT_tools_imagepaint_options_external, VIEW3D_MT_tools_projectpaint_stencil, -- cgit v1.2.3 From 8482ba6d2e1a97e038175a7fb693ed40c03ca5d9 Mon Sep 17 00:00:00 2001 From: William Reynish Date: Thu, 23 Jan 2020 14:53:19 +0100 Subject: UI: Text Editor header cleanup - Register toggle is in the Text menu - Run Script and Refresh OSL become an icon buttons next to ID block Differential Revision: https://developer.blender.org/D5686 Reviewed by Campbell Barton --- release/scripts/startup/bl_ui/space_text.py | 33 ++++++++++++----------------- 1 file changed, 13 insertions(+), 20 deletions(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/space_text.py b/release/scripts/startup/bl_ui/space_text.py index 81ccc9216a1..b7c5dcd5437 100644 --- a/release/scripts/startup/bl_ui/space_text.py +++ b/release/scripts/startup/bl_ui/space_text.py @@ -30,7 +30,7 @@ class TEXT_HT_header(Header): st = context.space_data text = st.text - + is_syntax_highlight_supported = st.is_syntax_highlight_supported() layout.template_header() TEXT_MT_editor_menus.draw_collapsible(context, layout) @@ -43,7 +43,18 @@ class TEXT_HT_header(Header): layout.separator_spacer() row = layout.row(align=True) - row.template_ID(st, "text", new="text.new", unlink="text.unlink", open="text.open") + row.template_ID(st, "text", new="text.new", + unlink="text.unlink", open="text.open") + + if text: + is_osl = text.name.endswith((".osl", ".osl")) + if is_osl: + row.operator("node.shader_script_update", + text="", icon='FILE_REFRESH') + else: + row = layout.row() + row.active = is_syntax_highlight_supported + row.operator("text.run_script", text="", icon='PLAY') layout.separator_spacer() @@ -51,28 +62,10 @@ class TEXT_HT_header(Header): row.prop(st, "show_line_numbers", text="") row.prop(st, "show_word_wrap", text="") - is_syntax_highlight_supported = st.is_syntax_highlight_supported() syntax = row.row(align=True) syntax.active = is_syntax_highlight_supported syntax.prop(st, "show_syntax_highlight", text="") - if text: - text_name = text.name - is_osl = text_name.endswith((".osl", ".oso")) - - row = layout.row() - if is_osl: - row = layout.row() - row.operator("node.shader_script_update") - else: - row = layout.row() - row.active = text_name.endswith(".py") - row.prop(text, "use_module") - - row = layout.row() - row.active = is_syntax_highlight_supported - row.operator("text.run_script") - class TEXT_HT_footer(Header): bl_space_type = 'TEXT_EDITOR' -- cgit v1.2.3 From 8d3df01e9dc098c3660491e73da9d6901fd422a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Barschkis?= Date: Fri, 24 Jan 2020 17:15:53 +0100 Subject: Fix T53205: Show Smoke Advance Panel at Outflow type Now hiding the initial velocity and texture panel when flow behavior is set to outflow. --- .../scripts/startup/bl_ui/properties_physics_fluid.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/properties_physics_fluid.py b/release/scripts/startup/bl_ui/properties_physics_fluid.py index 6252ba3bb74..c1b8ae1a36a 100644 --- a/release/scripts/startup/bl_ui/properties_physics_fluid.py +++ b/release/scripts/startup/bl_ui/properties_physics_fluid.py @@ -95,6 +95,16 @@ class PhysicButtonsPanel: md = context.fluid return md and (md.fluid_type == 'FLOW') + @staticmethod + def poll_fluid_flow_outflow(context): + if not PhysicButtonsPanel.poll_fluid_flow(context): + return False + + md = context.fluid + flow = md.flow_settings + if (flow.flow_behavior == 'OUTFLOW'): + return True + class PHYSICS_PT_fluid(PhysicButtonsPanel, Panel): bl_label = "Fluid" @@ -507,6 +517,9 @@ class PHYSICS_PT_flow_initial_velocity(PhysicButtonsPanel, Panel): if not PhysicButtonsPanel.poll_fluid_flow(context): return False + if PhysicButtonsPanel.poll_fluid_flow_outflow(context): + return False + return (context.engine in cls.COMPAT_ENGINES) def draw_header(self, context): @@ -546,6 +559,9 @@ class PHYSICS_PT_flow_texture(PhysicButtonsPanel, Panel): if not PhysicButtonsPanel.poll_fluid_flow(context): return False + if PhysicButtonsPanel.poll_fluid_flow_outflow(context): + return False + return (context.engine in cls.COMPAT_ENGINES) def draw_header(self, context): -- cgit v1.2.3 From 4aa703aa1430bc53f19e2cc7182e70db1a916f13 Mon Sep 17 00:00:00 2001 From: Harley Acheson Date: Fri, 24 Jan 2020 12:17:57 -0800 Subject: UI: View3D Cursor Changes Changes the default View3D mouse cursor to the OS-supplied arrow pointer. Subsequent cursor changes will now be set per-tool instead. Differential Revision: https://developer.blender.org/D6485 Reviewed by Campbell Barton --- release/scripts/startup/bl_ui/space_toolsystem_toolbar.py | 3 +++ 1 file changed, 3 insertions(+) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py index c03d681f2b2..8429d30aeec 100644 --- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py +++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py @@ -134,6 +134,7 @@ class _defs_view3d_generic: idname="builtin.measure", label="Measure", description=description, + cursor='CROSSHAIR', icon="ops.view3d.ruler", widget="VIEW3D_GGT_ruler", keymap="3D View Tool: Measure", @@ -361,6 +362,7 @@ class _defs_view3d_select: label="Select Lasso", icon="ops.generic.select_lasso", widget=None, + cursor='DEFAULT', keymap="3D View Tool: Select Lasso", draw_settings=draw_settings, ) @@ -385,6 +387,7 @@ class _defs_view3d_select: label="Select Circle", icon="ops.generic.select_circle", widget=None, + cursor='DEFAULT', keymap="3D View Tool: Select Circle", draw_settings=draw_settings, draw_cursor=draw_cursor, -- cgit v1.2.3 From 1094e560413d38e9834ae563ef248f898cb8b201 Mon Sep 17 00:00:00 2001 From: Cody Winchester Date: Mon, 27 Jan 2020 14:03:24 +0100 Subject: Cast modifier: Add invert vgroup option. Adds the Invert Vertex Group weight option to the Cast modifier. Uses the same setup as similar modifiers invert weight. Adds a boolean invert property next to the vertex group string in the modifier and subtracts the current vertex weight from 1.0f if it is turned on. Differential Revision: https://developer.blender.org/D6671 Minor modifications by @mont29. --- release/scripts/startup/bl_ui/properties_data_modifier.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/properties_data_modifier.py b/release/scripts/startup/bl_ui/properties_data_modifier.py index d4b2c39bd5e..197566f16f3 100644 --- a/release/scripts/startup/bl_ui/properties_data_modifier.py +++ b/release/scripts/startup/bl_ui/properties_data_modifier.py @@ -293,7 +293,9 @@ class DATA_PT_modifiers(ModifierButtonsPanel, Panel): col = split.column() col.label(text="Vertex Group:") - col.prop_search(md, "vertex_group", ob, "vertex_groups", text="") + row = col.row(align=True) + row.prop_search(md, "vertex_group", ob, "vertex_groups", text="") + row.prop(md, "invert_vertex_group", text="", icon='ARROW_LEFTRIGHT') col = split.column() col.label(text="Control Object:") col.prop(md, "object", text="") -- cgit v1.2.3 From acb576c762d46d945e1bafe85d3f166c6c07955b Mon Sep 17 00:00:00 2001 From: William Reynish Date: Tue, 28 Jan 2020 10:25:46 +0100 Subject: UI: Empty image Properties layout tweaks - Enable decorators - Use sub-panel for transparency Differential Revision: https://developer.blender.org/D6692 Reviewed by Brecht van Lommel --- .../scripts/startup/bl_ui/properties_data_empty.py | 36 ++++++++++++++++------ 1 file changed, 26 insertions(+), 10 deletions(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/properties_data_empty.py b/release/scripts/startup/bl_ui/properties_data_empty.py index dc9c170c65b..d686c55407a 100644 --- a/release/scripts/startup/bl_ui/properties_data_empty.py +++ b/release/scripts/startup/bl_ui/properties_data_empty.py @@ -37,7 +37,6 @@ class DATA_PT_empty(DataButtonsPanel, Panel): def draw(self, context): layout = self.layout layout.use_property_split = True - layout.use_property_decorate = False ob = context.object @@ -45,12 +44,6 @@ class DATA_PT_empty(DataButtonsPanel, Panel): layout.prop(ob, "empty_display_size", text="Size") if ob.empty_display_type == 'IMAGE': - layout.prop(ob, "use_empty_image_alpha") - - col = layout.column() - col.active = ob.use_empty_image_alpha - col.prop(ob, "color", text="Opacity", index=3, slider=True) - col = layout.column(align=True) col.prop(ob, "empty_image_offset", text="Offset X", index=0) col.prop(ob, "empty_image_offset", text="Y", index=1) @@ -58,11 +51,32 @@ class DATA_PT_empty(DataButtonsPanel, Panel): col = layout.column() col.row().prop(ob, "empty_image_depth", text="Depth", expand=True) 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_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_alpha(DataButtonsPanel, Panel): + bl_label = "Transparency" + bl_parent_id = "DATA_PT_empty" + + def draw_header(self, context): + ob = context.object + + self.layout.prop(ob, "use_empty_image_alpha", text="") + + def draw(self, context): + layout = self.layout + layout.use_property_split = True + + ob = context.object + + layout.active = ob.use_empty_image_alpha + layout.prop(ob, "color", text="Opacity", index=3, slider=True) + + class DATA_PT_empty_image(DataButtonsPanel, Panel): bl_label = "Image" @@ -74,13 +88,15 @@ class DATA_PT_empty_image(DataButtonsPanel, Panel): def draw(self, context): layout = self.layout ob = context.object - layout.template_ID(ob, "data", open="image.open", unlink="object.unlink_data") + layout.template_ID(ob, "data", open="image.open", + unlink="object.unlink_data") layout.separator() layout.template_image(ob, "data", ob.image_user, compact=True) classes = ( DATA_PT_empty, + DATA_PT_empty_alpha, DATA_PT_empty_image, ) -- cgit v1.2.3 From f9e1e088a4c7000158aa1e99d32a7785bc36e9e5 Mon Sep 17 00:00:00 2001 From: William Reynish Date: Wed, 29 Jan 2020 10:25:09 +1100 Subject: Tool System: add shear tool to non-mesh edit-modes --- .../startup/bl_ui/space_toolsystem_toolbar.py | 38 +++++++++++++--------- 1 file changed, 23 insertions(+), 15 deletions(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py index 170b635f7e1..0759d37e2b8 100644 --- a/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py +++ b/release/scripts/startup/bl_ui/space_toolsystem_toolbar.py @@ -291,6 +291,20 @@ class _defs_transform: draw_settings=draw_settings, ) + @ToolDef.from_fn + def shear(): + def draw_settings(context, layout, _tool): + # props = tool.operator_properties("transform.shear") + _template_widget.VIEW3D_GGT_xform_gizmo.draw_settings_with_index(context, layout, 2) + return dict( + idname="builtin.shear", + label="Shear", + icon="ops.transform.shear", + widget="VIEW3D_GGT_xform_shear", + keymap="3D View Tool: Shear", + draw_settings=draw_settings, + ) + @ToolDef.from_fn def transform(): def draw_settings(context, layout, tool): @@ -762,20 +776,6 @@ class _defs_edit_mesh: draw_settings=draw_settings, ) - @ToolDef.from_fn - def shear(): - def draw_settings(context, layout, _tool): - # props = tool.operator_properties("transform.shear") - _template_widget.VIEW3D_GGT_xform_gizmo.draw_settings_with_index(context, layout, 2) - return dict( - idname="builtin.shear", - label="Shear", - icon="ops.transform.shear", - widget="VIEW3D_GGT_xform_shear", - keymap=(), - draw_settings=draw_settings, - ) - @ToolDef.from_fn def tosphere(): return dict( @@ -1960,6 +1960,7 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel): _defs_edit_armature.extrude, _defs_edit_armature.extrude_cursor, ), + _defs_transform.shear, ], 'EDIT_MESH': [ *_tools_default, @@ -1998,7 +1999,7 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel): _defs_edit_mesh.push_pull, ), ( - _defs_edit_mesh.shear, + _defs_transform.shear, _defs_edit_mesh.tosphere, ), ( @@ -2018,16 +2019,23 @@ class VIEW3D_PT_tools_active(ToolSelectPanelHelper, Panel): _defs_edit_curve.curve_radius, _defs_edit_curve.tilt, None, + _defs_transform.shear, _defs_edit_curve.curve_vertex_randomize, ], 'EDIT_SURFACE': [ *_tools_default, + None, + _defs_transform.shear, ], 'EDIT_METABALL': [ *_tools_default, + None, + _defs_transform.shear, ], 'EDIT_LATTICE': [ *_tools_default, + None, + _defs_transform.shear, ], 'EDIT_TEXT': [ _defs_view3d_generic.cursor, -- cgit v1.2.3 From deb5b00e1b1928bb841838f7eccc11bfa0c1c4fc Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 29 Jan 2020 11:11:09 +1100 Subject: Cleanup: revert wrapping from D6692 --- release/scripts/startup/bl_ui/properties_data_empty.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/properties_data_empty.py b/release/scripts/startup/bl_ui/properties_data_empty.py index d686c55407a..72946ed1268 100644 --- a/release/scripts/startup/bl_ui/properties_data_empty.py +++ b/release/scripts/startup/bl_ui/properties_data_empty.py @@ -51,10 +51,8 @@ class DATA_PT_empty(DataButtonsPanel, Panel): col = layout.column() col.row().prop(ob, "empty_image_depth", text="Depth", expand=True) 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_orthographic", text="Display Orthographic") + col.prop(ob, "show_empty_image_perspective", text="Display Perspective") col.prop(ob, "show_empty_image_only_axis_aligned") @@ -88,8 +86,7 @@ class DATA_PT_empty_image(DataButtonsPanel, Panel): def draw(self, context): layout = self.layout ob = context.object - layout.template_ID(ob, "data", open="image.open", - unlink="object.unlink_data") + layout.template_ID(ob, "data", open="image.open", unlink="object.unlink_data") layout.separator() layout.template_image(ob, "data", ob.image_user, compact=True) -- cgit v1.2.3 From dee9c3cc25419146bd38016f0e2ec98eea282962 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 29 Jan 2020 16:56:21 +1100 Subject: UI: pose X-ray state wasn't shown in the header --- release/scripts/startup/bl_ui/space_view3d.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/space_view3d.py b/release/scripts/startup/bl_ui/space_view3d.py index 02dc03be127..3a3869068b0 100644 --- a/release/scripts/startup/bl_ui/space_view3d.py +++ b/release/scripts/startup/bl_ui/space_view3d.py @@ -621,15 +621,19 @@ class VIEW3D_HT_header(Header): tool_settings = context.tool_settings view = context.space_data shading = view.shading - # mode_string = context.mode - obj = context.active_object show_region_tool_header = view.show_region_tool_header if not show_region_tool_header: layout.row(align=True).template_header() row = layout.row(align=True) + obj = context.active_object + # mode_string = context.mode object_mode = 'OBJECT' if obj is None else obj.mode + has_pose_mode = ( + (object_mode == 'POSE') or + (object_mode == 'WEIGHT_PAINT' and context.pose_object is not None) + ) # Note: This is actually deadly in case enum_items have to be dynamically generated # (because internal RNA array iterator will free everything immediately...). @@ -780,10 +784,13 @@ class VIEW3D_HT_header(Header): "view3d.toggle_xray", text="", icon='XRAY', - depress=getattr( - shading, - "show_xray_wireframe" if shading.type == 'WIREFRAME' else - "show_xray" + depress=( + overlay.show_xray_bone if has_pose_mode else + getattr( + shading, + "show_xray_wireframe" if shading.type == 'WIREFRAME' else + "show_xray" + ) ), ) -- cgit v1.2.3 From e4faed120d9c294ea5d6061b3213ed4f6784db52 Mon Sep 17 00:00:00 2001 From: Philipp Oeser Date: Wed, 29 Jan 2020 10:26:45 +0100 Subject: Fix T73466: Unable to set particle rotation Error in rB1f6ab32196d7. Maniphest Tasks: T73466 Differential Revision: https://developer.blender.org/D6706 --- release/scripts/startup/bl_ui/properties_particle.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/properties_particle.py b/release/scripts/startup/bl_ui/properties_particle.py index 34ff386893b..3384032e332 100644 --- a/release/scripts/startup/bl_ui/properties_particle.py +++ b/release/scripts/startup/bl_ui/properties_particle.py @@ -584,7 +584,7 @@ class PARTICLE_PT_rotation(ParticleButtonsPanel, Panel): layout = self.layout layout.prop(part, "use_rotations", text="") - layout.enabled = particle_panel_enabled(context, psys) and part.use_rotations + layout.enabled = particle_panel_enabled(context, psys) def draw(self, context): -- cgit v1.2.3 From a8bfa916334177531168e15eb6f8d6a8040164cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Barschkis?= Date: Wed, 29 Jan 2020 12:25:22 +0100 Subject: Fluid: Removed wireframe drawtype setter for fluid domains Fluid domains with (auto-generated) particle systems were set to wireframe drawtype automatically. This was a convenience feature that made particles visible immediately. As the auto switching is sometimes a bit annoying though this has been removed. Instead, the Quick Liquid Operator switches the viewport shading type to wireframe. --- release/scripts/startup/bl_operators/object_quick_effects.py | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_operators/object_quick_effects.py b/release/scripts/startup/bl_operators/object_quick_effects.py index 009ae53fa80..71153ba8b74 100644 --- a/release/scripts/startup/bl_operators/object_quick_effects.py +++ b/release/scripts/startup/bl_operators/object_quick_effects.py @@ -466,6 +466,13 @@ class QuickLiquid(Operator): self.report({'ERROR'}, "Select at least one mesh object") return {'CANCELLED'} + # set shading type to wireframe so that liquid particles are visible + for area in bpy.context.screen.areas: + if area.type == 'VIEW_3D': + for space in area.spaces: + if space.type == 'VIEW_3D': + space.shading.type = 'WIREFRAME' + for obj in mesh_objects: fake_context["object"] = obj # make each selected object a liquid flow -- cgit v1.2.3 From 88b14fdf6057452e962b14f853303d7928430588 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Barschkis?= Date: Wed, 29 Jan 2020 12:41:48 +0100 Subject: Fluid: Updated UI UI updates include: - More descriptive tool tips - Removed texture panel for liquid flow objects - Adjusted alignment for some smoke / fire parameters --- .../startup/bl_ui/properties_physics_fluid.py | 35 ++++++++++++++-------- 1 file changed, 23 insertions(+), 12 deletions(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/properties_physics_fluid.py b/release/scripts/startup/bl_ui/properties_physics_fluid.py index c1b8ae1a36a..28c9895f53b 100644 --- a/release/scripts/startup/bl_ui/properties_physics_fluid.py +++ b/release/scripts/startup/bl_ui/properties_physics_fluid.py @@ -105,6 +105,16 @@ class PhysicButtonsPanel: if (flow.flow_behavior == 'OUTFLOW'): return True + @staticmethod + def poll_fluid_flow_liquid(context): + if not PhysicButtonsPanel.poll_fluid_flow(context): + return False + + md = context.fluid + flow = md.flow_settings + if (flow.flow_type == 'LIQUID'): + return True + class PHYSICS_PT_fluid(PhysicButtonsPanel, Panel): bl_label = "Fluid" @@ -323,9 +333,9 @@ class PHYSICS_PT_smoke(PhysicButtonsPanel, Panel): flow = layout.grid_flow(row_major=True, columns=0, even_columns=True, even_rows=False, align=False) flow.enabled = not is_baking_any and not has_baked_data - col = flow.column() - col.prop(domain, "alpha") - col.prop(domain, "beta", text="Temperature Diff.") + col = flow.column(align=True) + col.prop(domain, "alpha", text="Buoyancy Density") + col.prop(domain, "beta", text="Heat") col = flow.column() col.prop(domain, "vorticity") @@ -399,14 +409,12 @@ class PHYSICS_PT_fire(PhysicButtonsPanel, Panel): col = flow.column() col.prop(domain, "burning_rate", text="Reaction Speed") - col = flow.column() + col = flow.column(align=True) col.prop(domain, "flame_smoke", text="Flame Smoke") - col = flow.column() - col.prop(domain, "flame_vorticity", text="Flame Vorticity") - col = flow.column() - col.prop(domain, "flame_ignition", text="Temperature Ignition") - col = flow.column() - col.prop(domain, "flame_max_temp", text="Maximum Temperature") + col.prop(domain, "flame_vorticity", text="Vorticity") + col = flow.column(align=True) + col.prop(domain, "flame_max_temp", text="Temperature Maximum") + col.prop(domain, "flame_ignition", text="Minimum") col = flow.column() col.prop(domain, "flame_smoke_color", text="Flame Color") @@ -495,10 +503,10 @@ class PHYSICS_PT_flow_source(PhysicButtonsPanel, Panel): col = grid.column() if flow.flow_source == 'MESH': col.prop(flow, "use_plane_init", text="Is Planar") - col.prop(flow, "surface_distance", text="Surface Thickness") + col.prop(flow, "surface_distance", text="Surface Emission") if flow.flow_type in {'SMOKE', 'BOTH', 'FIRE'}: col = grid.column() - col.prop(flow, "volume_density", text="Volume Density") + col.prop(flow, "volume_density", text="Volume Emission") if flow.flow_source == 'PARTICLES': col.prop(flow, "use_particle_size", text="Set Size") @@ -562,6 +570,9 @@ class PHYSICS_PT_flow_texture(PhysicButtonsPanel, Panel): if PhysicButtonsPanel.poll_fluid_flow_outflow(context): return False + if PhysicButtonsPanel.poll_fluid_flow_liquid(context): + return False + return (context.engine in cls.COMPAT_ENGINES) def draw_header(self, context): -- cgit v1.2.3 From 65761487229c61e5d043326cb5fd96cfca274e26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Foucault?= Date: Wed, 29 Jan 2020 21:36:58 +0100 Subject: Fix T65146: Curve Texture Coordinates in Cycles and Eevee differ Remove the use UV for mapping option. --- release/scripts/startup/bl_ui/properties_data_curve.py | 1 - 1 file changed, 1 deletion(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/properties_data_curve.py b/release/scripts/startup/bl_ui/properties_data_curve.py index d1975919d7e..b694062dfc5 100644 --- a/release/scripts/startup/bl_ui/properties_data_curve.py +++ b/release/scripts/startup/bl_ui/properties_data_curve.py @@ -144,7 +144,6 @@ class DATA_PT_curve_texture_space(CurveButtonsPanel, Panel): curve = context.curve col = layout.column() - col.prop(curve, "use_uv_as_generated") col.prop(curve, "use_auto_texspace") col = layout.column() -- cgit v1.2.3 From 2de704da6883dc89766d6b766b215596d38f8839 Mon Sep 17 00:00:00 2001 From: Simon G Date: Thu, 30 Jan 2020 15:23:37 +0100 Subject: Fix preset tracking setttings missing a comma Preset tracking settings is missing a comma here. Without a comma this will result in an implicit string concatenation. This was probably not wanted. Reviewed By: sergey, Blendify Differential Revision: https://developer.blender.org/D6717 --- release/scripts/startup/bl_operators/presets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_operators/presets.py b/release/scripts/startup/bl_operators/presets.py index c811f542a3a..6a21f7db654 100644 --- a/release/scripts/startup/bl_operators/presets.py +++ b/release/scripts/startup/bl_operators/presets.py @@ -501,7 +501,7 @@ class AddPresetTrackingSettings(AddPresetBase, Operator): "settings.use_default_mask", "settings.use_default_red_channel", "settings.use_default_green_channel", - "settings.use_default_blue_channel" + "settings.use_default_blue_channel", "settings.default_weight" ] -- cgit v1.2.3 From fd959bf658c36eebad32fd4d2cfa493f30eda4ea Mon Sep 17 00:00:00 2001 From: William Reynish Date: Thu, 30 Jan 2020 17:18:07 +0100 Subject: Fix unreported: Missing Empty Transparency panel poll Own mistake in recent change --- release/scripts/startup/bl_ui/properties_data_empty.py | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/properties_data_empty.py b/release/scripts/startup/bl_ui/properties_data_empty.py index 72946ed1268..88fdaae0433 100644 --- a/release/scripts/startup/bl_ui/properties_data_empty.py +++ b/release/scripts/startup/bl_ui/properties_data_empty.py @@ -60,6 +60,11 @@ class DATA_PT_empty_alpha(DataButtonsPanel, Panel): bl_label = "Transparency" bl_parent_id = "DATA_PT_empty" + @classmethod + def poll(cls, context): + ob = context.object + return (ob and ob.type == 'EMPTY' and ob.empty_display_type == 'IMAGE') + def draw_header(self, context): ob = context.object -- cgit v1.2.3 From eea3751c5bb2aef421cb7117add0f860da06d7af Mon Sep 17 00:00:00 2001 From: William Reynish Date: Fri, 31 Jan 2020 13:06:36 +0100 Subject: UI: Icons update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - New bespoke icon for the universal brush toggles - New icon for Redirected Folder (currently unused) - New icons for handle types (Auto Clamped, Auto, Aligned, Vector, Free) - New icons for Sequencer Text Strip anchor (Top, Bottom, Left, Right, Centre) Thanks to Andrzej Ambroż for the new icons --- release/scripts/startup/bl_ui/properties_paint_common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/properties_paint_common.py b/release/scripts/startup/bl_ui/properties_paint_common.py index 93bf5eca052..a9e8cae3c8b 100644 --- a/release/scripts/startup/bl_ui/properties_paint_common.py +++ b/release/scripts/startup/bl_ui/properties_paint_common.py @@ -121,7 +121,7 @@ class UnifiedPaintPanel: if unified_name and not header: # NOTE: We don't draw UnifiedPaintSettings in the header to reduce clutter. D5928#136281 - row.prop(ups, unified_name, text="", icon="WORLD") + row.prop(ups, unified_name, text="", icon="BRUSHES_ALL") return row -- cgit v1.2.3 From eee5a0e4ecd3e326c1169f636526040aa964f402 Mon Sep 17 00:00:00 2001 From: Philipp Oeser Date: Fri, 31 Jan 2020 21:49:24 +0100 Subject: UI: use full width for ID blocks in speaker properties rBb6a97baa0efa already did this for World, Light, Camera, Texture. rBb196c42d4ade already did this for Lattice. --- release/scripts/startup/bl_ui/properties_data_speaker.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'release/scripts/startup') diff --git a/release/scripts/startup/bl_ui/properties_data_speaker.py b/release/scripts/startup/bl_ui/properties_data_speaker.py index 5de133f184a..10645bdd214 100644 --- a/release/scripts/startup/bl_ui/properties_data_speaker.py +++ b/release/scripts/startup/bl_ui/properties_data_speaker.py @@ -45,12 +45,10 @@ class DATA_PT_context_speaker(DataButtonsPanel, Panel): speaker = context.speaker space = context.space_data - split = layout.split(factor=0.65) - if ob: - split.template_ID(ob, "data") + layout.template_ID(ob, "data") elif speaker: - split.template_ID(space, "pin_id") + layout.template_ID(space, "pin_id") class DATA_PT_speaker(DataButtonsPanel, Panel): -- cgit v1.2.3