fix bone select

This commit is contained in:
Joseph HENRY 2025-12-05 17:59:06 +01:00
parent cc60a25aca
commit 465a22d5a9
5 changed files with 41 additions and 41 deletions

View File

@ -27,4 +27,20 @@ SHADERS = LazyDict()
vertex_shader = Path(SHADER_DIR, "dash_shader.vert").read_text(encoding="utf-8") 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") 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)
)

View File

@ -2,12 +2,15 @@ import bpy
from .bl_utils import get_mat, get_collection_parents 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""" """Return the picker collection of an object"""
if not ob: if not ob:
ob = bpy.context.object ob = bpy.context.object
if not ob:
raise Exception("No object in context")
for col in ob.users_collection: for col in ob.users_collection:
if col.rig_picker.enabled: if col.rig_picker.enabled:
return col return col

View File

@ -31,7 +31,6 @@ class Shape:
color=None, color=None,
source_name="", source_name="",
): ):
self.type = "display" self.type = "display"
self.picker = picker self.picker = picker
self.rig = picker.rig self.rig = picker.rig
@ -93,7 +92,6 @@ class Shape:
self._color = color self._color = color
def draw(self): def draw(self):
# self.shader.bind() # self.shader.bind()
self.shader.uniform_float("color", self.color) self.shader.uniform_float("color", self.color)
@ -196,7 +194,6 @@ class BoneShape(Shape):
return self.bone_colors["normal"] return self.bone_colors["normal"]
def get_bone_colors(self): def get_bone_colors(self):
theme = bpy.context.preferences.themes["Default"] theme = bpy.context.preferences.themes["Default"]
bone_colors = { bone_colors = {
"select": [*theme.view_3d.bone_pose, 1], "select": [*theme.view_3d.bone_pose, 1],
@ -294,7 +291,6 @@ class BoneShape(Shape):
gpu.state.line_width_set(1.0) gpu.state.line_width_set(1.0)
def assign_bone_event(self): def assign_bone_event(self):
# print('assign_bone_event', self) # print('assign_bone_event', self)
scn = bpy.context.scene scn = bpy.context.scene
@ -324,9 +320,8 @@ class BoneShape(Shape):
if mode == "SUBSTRACT": if mode == "SUBSTRACT":
select = False select = False
self.bone.bone.select = select self.rig.pose.bones.get(self.bone.bone.name).select = select
if self.hover: if self.hover:
if mode != "SUBSTRACT": if mode != "SUBSTRACT":
self.rig.data.bones.active = self.bone.bone self.rig.data.bones.active = self.bone.bone
@ -360,25 +355,13 @@ class BoneShape(Shape):
points = [self.points[i] for i in polygon] points = [self.points[i] for i in polygon]
if intersect_tri_tri_2d(*border_tri1, *points): 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 return
if intersect_tri_tri_2d(*border_tri2, *points): 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 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): class OperatorShape(Shape):
def __init__( def __init__(
@ -521,7 +504,6 @@ class Picker:
shape.press = False shape.press = False
def release_event(self, mode="SET"): def release_event(self, mode="SET"):
# bpy.ops.pose.select_all(action='DESELECT') # bpy.ops.pose.select_all(action='DESELECT')
# print('PICKER release event', mode) # print('PICKER release event', mode)
@ -615,7 +597,6 @@ class Picker:
class PickerGroup: class PickerGroup:
def __init__(self, rig, pickers): def __init__(self, rig, pickers):
# self.view_location = Vector((0, 0)) # self.view_location = Vector((0, 0))
self.region = bpy.context.region self.region = bpy.context.region
self.rig = rig self.rig = rig
@ -696,7 +677,8 @@ class PickerGroup:
def release_event(self, mode="SET"): def release_event(self, mode="SET"):
if 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 bone.select = False
for picker in self.pickers: for picker in self.pickers:
@ -715,7 +697,7 @@ class PickerGroup:
border = [self.region.view2d.region_to_view(*b) for b in border] border = [self.region.view2d.region_to_view(*b) for b in border]
if mode == "SET": if mode == "SET":
for bone in self.rig.data.bones: for bone in self.rig.pose.bones:
bone.select = False bone.select = False
for picker in self.pickers: for picker in self.pickers:
@ -762,7 +744,7 @@ class PickerGroup:
return center return center
def load_picker_data(rig): def load_picker_data(rig: bpy.types.Object):
if "pickers" in rig.data.rig_picker: if "pickers" in rig.data.rig_picker:
picker_datas = [ picker_datas = [
[s.to_dict() for s in p] for p in rig.data.rig_picker["pickers"] [s.to_dict() for s in p] for p in rig.data.rig_picker["pickers"]

View File

@ -117,7 +117,6 @@ class RP_OT_box_select(Operator):
return {"RUNNING_MODAL"} return {"RUNNING_MODAL"}
def modal(self, context, event): def modal(self, context, event):
self.mouse = event.mouse_region_x, event.mouse_region_y self.mouse = event.mouse_region_x, event.mouse_region_y
self.border = bounding_rect((self.start_mouse, self.mouse)) self.border = bounding_rect((self.start_mouse, self.mouse))
@ -139,7 +138,6 @@ class RP_OT_box_select(Operator):
return {"RUNNING_MODAL"} return {"RUNNING_MODAL"}
def release_event(self, context): def release_event(self, context):
if get_picker_collection(): if get_picker_collection():
self.picker.assign_bone_event() self.picker.assign_bone_event()
@ -313,7 +311,6 @@ class RP_OT_picker_transform(Operator):
# transform_type = self.transform_orientation # transform_type = self.transform_orientation
elif event.type == "MOUSEMOVE": elif event.type == "MOUSEMOVE":
if self.mode == "ROTATE": if self.mode == "ROTATE":
transform_matrix = Matrix.Rotation(delta, 4, self.view_vector) transform_matrix = Matrix.Rotation(delta, 4, self.view_vector)
elif self.mode == "SCALE": elif self.mode == "SCALE":
@ -395,15 +392,17 @@ class RP_OT_toogle_property(Operator):
class RP_OT_reload_picker(Operator): class RP_OT_reload_picker(Operator):
"""Reload the picker shapes""" """Reload the picker shapes"""
bl_idname = "rigpicker.reload_picker" bl_idname: str = "rigpicker.reload_picker"
bl_label = "Reload Picker" bl_label: str = "Reload Picker"
# @classmethod # @classmethod
# def poll(cls, context): # def poll(cls, context):
# if not is_picker_space(context): # if not is_picker_space(context):
# return # return
def execute(self, context): def execute(self, context: bpy.types.Context):
if not context.object:
return
if context.object.type == "ARMATURE": if context.object.type == "ARMATURE":
rig = context.object rig = context.object
else: else:
@ -413,6 +412,7 @@ class RP_OT_reload_picker(Operator):
# print('Reload', rig) # print('Reload', rig)
load_picker_data(rig) load_picker_data(rig)
if context.screen:
for area in context.screen.areas: for area in context.screen.areas:
if is_picker_space(area.spaces.active): if is_picker_space(area.spaces.active):
area.tag_redraw() area.tag_redraw()
@ -423,8 +423,8 @@ class RP_OT_reload_picker(Operator):
class RP_OT_toogle_bone_layer(Operator): class RP_OT_toogle_bone_layer(Operator):
"""Toogle bone layer visibility when double clicking on a bone""" """Toogle bone layer visibility when double clicking on a bone"""
bl_idname = "rigpicker.toogle_bone_layer" bl_idname: str = "rigpicker.toogle_bone_layer"
bl_label = "Toogle Bone Layer" bl_label: str = "Toogle Bone Layer"
@classmethod @classmethod
def poll(cls, context): 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 (s for s in space_switch.bones if s.data_path in data_paths), None
) )
if space_bone: if space_bone:
index = list(space_switch.bones).index(space_bone) index = list(space_switch.bones).index(space_bone)
value = ob.path_resolve(space_bone.data_path) value = ob.path_resolve(space_bone.data_path)
space = next( space = next(

View File

@ -1,5 +1,5 @@
layout (location = 0) in vec2 pos; // layout (location = 0) in vec2 pos;
flat out vec2 startPos; flat out vec2 startPos;
out vec2 vertPos; out vec2 vertPos;