fix bone select
This commit is contained in:
parent
cc60a25aca
commit
465a22d5a9
18
constants.py
18
constants.py
@ -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)
|
||||||
|
)
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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"]
|
||||||
|
|||||||
@ -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,9 +412,10 @@ class RP_OT_reload_picker(Operator):
|
|||||||
# print('Reload', rig)
|
# print('Reload', rig)
|
||||||
load_picker_data(rig)
|
load_picker_data(rig)
|
||||||
|
|
||||||
for area in context.screen.areas:
|
if context.screen:
|
||||||
if is_picker_space(area.spaces.active):
|
for area in context.screen.areas:
|
||||||
area.tag_redraw()
|
if is_picker_space(area.spaces.active):
|
||||||
|
area.tag_redraw()
|
||||||
|
|
||||||
return {"FINISHED"}
|
return {"FINISHED"}
|
||||||
|
|
||||||
@ -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(
|
||||||
|
|||||||
@ -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;
|
||||||
@ -12,4 +12,4 @@ void main()
|
|||||||
gl_Position = outPos;
|
gl_Position = outPos;
|
||||||
vertPos = pos.xy / outPos.w;
|
vertPos = pos.xy / outPos.w;
|
||||||
startPos = vertPos;
|
startPos = vertPos;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user