From 465a22d5a953f633f34d875829f5c1e5d09eed1d Mon Sep 17 00:00:00 2001 From: Joseph HENRY Date: Fri, 5 Dec 2025 17:59:06 +0100 Subject: [PATCH] fix bone select --- constants.py | 18 +++++++++++++++++- core/addon_utils.py | 5 ++++- core/picker.py | 32 +++++++------------------------- operators/picker.py | 23 +++++++++++------------ shaders/dash_shader.vert | 4 ++-- 5 files changed, 41 insertions(+), 41 deletions(-) diff --git a/constants.py b/constants.py index 88b41a2..6d1beab 100644 --- a/constants.py +++ b/constants.py @@ -27,4 +27,20 @@ SHADERS = LazyDict() vertex_shader = Path(SHADER_DIR, "dash_shader.vert").read_text(encoding="utf-8") fragment_shader = Path(SHADER_DIR, "dash_shader.frag").read_text(encoding="utf-8") -SHADERS["dashed_line"] = lambda: gpu.types.GPUShader(vertex_shader, fragment_shader) + +def create_dashed_line_shader() -> gpu.types.GPUShader: + shader_info = gpu.types.GPUShaderCreateInfo() + + shader_info.vertex_in(0, "VEC2", "pos") + + shader_info.vertex_source(vertex_shader) + shader_info.fragment_source(fragment_shader) + + shader = gpu.shader.create_from_info(shader_info) + del shader_info + return shader + + +SHADERS["dashed_line"] = ( + create_dashed_line_shader # lambda: gpu.types.GPUShader(vertex_shader, fragment_shader) +) diff --git a/core/addon_utils.py b/core/addon_utils.py index 7bfcd7f..752b5e2 100644 --- a/core/addon_utils.py +++ b/core/addon_utils.py @@ -2,12 +2,15 @@ import bpy from .bl_utils import get_mat, get_collection_parents -def get_picker_collection(ob=None): +def get_picker_collection(ob: bpy.types.Object | None = None): """Return the picker collection of an object""" if not ob: ob = bpy.context.object + if not ob: + raise Exception("No object in context") + for col in ob.users_collection: if col.rig_picker.enabled: return col diff --git a/core/picker.py b/core/picker.py index 79156f7..5e27de2 100644 --- a/core/picker.py +++ b/core/picker.py @@ -31,7 +31,6 @@ class Shape: color=None, source_name="", ): - self.type = "display" self.picker = picker self.rig = picker.rig @@ -93,7 +92,6 @@ class Shape: self._color = color def draw(self): - # self.shader.bind() self.shader.uniform_float("color", self.color) @@ -196,7 +194,6 @@ class BoneShape(Shape): return self.bone_colors["normal"] def get_bone_colors(self): - theme = bpy.context.preferences.themes["Default"] bone_colors = { "select": [*theme.view_3d.bone_pose, 1], @@ -294,7 +291,6 @@ class BoneShape(Shape): gpu.state.line_width_set(1.0) def assign_bone_event(self): - # print('assign_bone_event', self) scn = bpy.context.scene @@ -324,9 +320,8 @@ class BoneShape(Shape): if mode == "SUBSTRACT": select = False - self.bone.bone.select = select + self.rig.pose.bones.get(self.bone.bone.name).select = select if self.hover: - if mode != "SUBSTRACT": self.rig.data.bones.active = self.bone.bone @@ -360,25 +355,13 @@ class BoneShape(Shape): points = [self.points[i] for i in polygon] if intersect_tri_tri_2d(*border_tri1, *points): - self.bone.bone.select = select + self.rig.pose.bones.get(self.bone.bone.name).select = select return if intersect_tri_tri_2d(*border_tri2, *points): - self.bone.bone.select = select + self.rig.pose.bones.get(self.bone.bone.name).select = select return - """ - for b in border: - if intersect_point_tri_2d(b, *points): - self.bone.bone.select = select - return - - for p in points: - if intersect_point_quad_2d(p, *border): - self.bone.bone.select = select - return - """ - class OperatorShape(Shape): def __init__( @@ -521,7 +504,6 @@ class Picker: shape.press = False def release_event(self, mode="SET"): - # bpy.ops.pose.select_all(action='DESELECT') # print('PICKER release event', mode) @@ -615,7 +597,6 @@ class Picker: class PickerGroup: def __init__(self, rig, pickers): - # self.view_location = Vector((0, 0)) self.region = bpy.context.region self.rig = rig @@ -696,7 +677,8 @@ class PickerGroup: def release_event(self, mode="SET"): if mode == "SET": - for bone in self.rig.data.bones: + print(list(self.rig.pose.bones)) + for bone in self.rig.pose.bones: bone.select = False for picker in self.pickers: @@ -715,7 +697,7 @@ class PickerGroup: border = [self.region.view2d.region_to_view(*b) for b in border] if mode == "SET": - for bone in self.rig.data.bones: + for bone in self.rig.pose.bones: bone.select = False for picker in self.pickers: @@ -762,7 +744,7 @@ class PickerGroup: return center -def load_picker_data(rig): +def load_picker_data(rig: bpy.types.Object): if "pickers" in rig.data.rig_picker: picker_datas = [ [s.to_dict() for s in p] for p in rig.data.rig_picker["pickers"] diff --git a/operators/picker.py b/operators/picker.py index 1a9a42a..d7e59b8 100644 --- a/operators/picker.py +++ b/operators/picker.py @@ -117,7 +117,6 @@ class RP_OT_box_select(Operator): return {"RUNNING_MODAL"} def modal(self, context, event): - self.mouse = event.mouse_region_x, event.mouse_region_y self.border = bounding_rect((self.start_mouse, self.mouse)) @@ -139,7 +138,6 @@ class RP_OT_box_select(Operator): return {"RUNNING_MODAL"} def release_event(self, context): - if get_picker_collection(): self.picker.assign_bone_event() @@ -313,7 +311,6 @@ class RP_OT_picker_transform(Operator): # transform_type = self.transform_orientation elif event.type == "MOUSEMOVE": - if self.mode == "ROTATE": transform_matrix = Matrix.Rotation(delta, 4, self.view_vector) elif self.mode == "SCALE": @@ -395,15 +392,17 @@ class RP_OT_toogle_property(Operator): class RP_OT_reload_picker(Operator): """Reload the picker shapes""" - bl_idname = "rigpicker.reload_picker" - bl_label = "Reload Picker" + bl_idname: str = "rigpicker.reload_picker" + bl_label: str = "Reload Picker" # @classmethod # def poll(cls, context): # if not is_picker_space(context): # return - def execute(self, context): + def execute(self, context: bpy.types.Context): + if not context.object: + return if context.object.type == "ARMATURE": rig = context.object else: @@ -413,9 +412,10 @@ class RP_OT_reload_picker(Operator): # print('Reload', rig) load_picker_data(rig) - for area in context.screen.areas: - if is_picker_space(area.spaces.active): - area.tag_redraw() + if context.screen: + for area in context.screen.areas: + if is_picker_space(area.spaces.active): + area.tag_redraw() return {"FINISHED"} @@ -423,8 +423,8 @@ class RP_OT_reload_picker(Operator): class RP_OT_toogle_bone_layer(Operator): """Toogle bone layer visibility when double clicking on a bone""" - bl_idname = "rigpicker.toogle_bone_layer" - bl_label = "Toogle Bone Layer" + bl_idname: str = "rigpicker.toogle_bone_layer" + bl_label: str = "Toogle Bone Layer" @classmethod def poll(cls, context): @@ -580,7 +580,6 @@ class RP_MT_context_menu(Menu): (s for s in space_switch.bones if s.data_path in data_paths), None ) if space_bone: - index = list(space_switch.bones).index(space_bone) value = ob.path_resolve(space_bone.data_path) space = next( diff --git a/shaders/dash_shader.vert b/shaders/dash_shader.vert index 705e629..fad9953 100644 --- a/shaders/dash_shader.vert +++ b/shaders/dash_shader.vert @@ -1,5 +1,5 @@ -layout (location = 0) in vec2 pos; +// layout (location = 0) in vec2 pos; flat out vec2 startPos; out vec2 vertPos; @@ -12,4 +12,4 @@ void main() gl_Position = outPos; vertPos = pos.xy / outPos.w; startPos = vertPos; -} \ No newline at end of file +}