fix mouse_under in picker_group

This commit is contained in:
ChristopheSeux
2024-02-20 13:48:24 +01:00
parent c31a73f80f
commit 917531f59a
5 changed files with 244 additions and 84 deletions
+103 -23
View File
@@ -1,5 +1,5 @@
import bpy
from bpy.props import EnumProperty, IntProperty
from bpy.props import EnumProperty, IntProperty, BoolProperty
from ..constants import PICKERS
from ..core.bl_utils import get_view_3d_override
from ..core.geometry_utils import bounding_rect
@@ -9,7 +9,7 @@ from ..core.picker import get_picker_path, pack_picker, unpack_picker
#from core.picker import *
#from .utils import is_over_region
import gpu
from mathutils import Vector
from mathutils import Vector, Euler, Matrix
from gpu_extras.batch import batch_for_shader
from pathlib import Path
import json
@@ -196,13 +196,14 @@ class RP_OT_picker_transform(bpy.types.Operator):
"""Tooltip"""
bl_idname = "node.picker_transform"
bl_label = "Move Bone in Picker View"
mode : EnumProperty(items=[(m, m.title(), '') for m in ('TRANSLATE', 'ROTATE', 'SCALE')])
@classmethod
def poll(cls, context):
return is_picker_space(context)
'''
def execute(self, context):
with context.temp_override(**get_view_3d_override()):
if self.mode == 'TRANSLATE':
@@ -213,36 +214,105 @@ class RP_OT_picker_transform(bpy.types.Operator):
bpy.ops.transform.resize("INVOKE_DEFAULT")
return {"FINISHED"}
'''
# def invoke(self, context, event):
# self.mouse = event.mouse_region_x, event.mouse_region_y
def invoke(self, context, event):
self.override = get_view_3d_override()
# self.bone_data = {b: b.matrix.copy() for b in context.selected_pose_bones}
if self.mode == 'TRANSLATE':
with context.temp_override(**self.override):
if event.alt:
bpy.ops.pose.loc_clear()
else:
bpy.ops.transform.translate("INVOKE_DEFAULT")
return {"FINISHED"}
# context.window_manager.modal_handler_add(self)
# return {'RUNNING_MODAL'}
elif self.mode == 'ROTATE' and event.alt:
with context.temp_override(**self.override):
bpy.ops.pose.rot_clear()
return {"FINISHED"}
# def modal(self, context, event):
elif self.mode == 'SCALE' and event.alt:
with context.temp_override(**self.override):
bpy.ops.pose.scale_clear()
return {"FINISHED"}
# delta_x = (event.mouse_region_x - self.mouse[0]) / 1000
# delta_y = (event.mouse_region_y - self.mouse[1]) / 1000
self.mouse = event.mouse_region_x, event.mouse_region_y
# for bone, matrix in self.bone_data.items():
# bone.matrix.translation = matrix.translation + Vector((delta_x, 0, delta_y))
self.center = context.active_pose_bone.matrix.translation.copy()
self.bone_data = {b: b.matrix.copy() for b in context.selected_pose_bones}
# #print(delta_x, delta_y)
context.window_manager.modal_handler_add(self)
return {'RUNNING_MODAL'}
# if event.type=="LEFTMOUSE" and event.value == 'RELEASE':
# return {'FINISHED'}
def modal(self, context, event):
# if event.type=="RIGHTMOUSE":
# for bone, matrix in self.bone_data.items():
# bone.matrix = matrix
delta_x = (event.mouse_region_x - self.mouse[0]) / 100
#delta_y = (event.mouse_region_y - self.mouse[1]) / 1000
# return {'CANCELLED'}
#for bone, matrix in self.bone_data.items():
# bone.matrix.#translation = matrix.translation + Vector((delta_x, 0, delta_y))
center = context.active_pose_bone.tail
# return {'RUNNING_MODAL'}
scn = context.scene
cam = scn.camera
#rotation_axis = cam.matrix_world.to_3x3().transposed().col[2]
#rotation_matrix = Matrix.Rotation(delta_x, 4, Vector((0, 0, -1)) @ cam.matrix_world)
view_vec = Vector((0, 0, 1))
view_vec.rotate(cam.matrix_world)
rotation_matrix = Matrix.Rotation(delta_x, 4, view_vec)
#rot_mat = Matrix.Rotation(delta_x, 4, "Z")
#rot_mat = scn.camera.matrix_world.inverted() @ rot_mat
#rot_mat = Matrix.LocRotScale(center, Euler((0, 0, delta_x)), (1, 1, 1))
if event.type == "MOUSEMOVE":
for bone, matrix in self.bone_data.items():
#center =
mat = matrix.copy()
mat.translation -= self.center
mat = rotation_matrix @ mat
mat.translation += self.center
bone.matrix = mat
#rotation_matrix.translation = matrix.translation
#mat = matrix.copy().to_3x3()
#mat.rotate(rotation_matrix)
#mat = mat.to_4x4()
#mat.translation = matrix.translation
#bone.matrix = mat
#bone.matrix = matrix.inverted() @ (rotation_matrix @ bone_mat)
#bone.matrix.translation = 0, 0, 0
#bone.matrix = rotation_matrix @ matrix
#bone.matrix = matrix @ (matrix.inverted() @ rotation_matrix)
#bone.matrix.translation = matrix.translation
#print('Rotate', delta_x)
#with context.temp_override(**get_view_3d_override()):
#for bone, matrix in self.bone_data.items():
# bone.rotation_euler.x = delta_x
#bpy.ops.transform.rotate(value=delta_x)
#print(delta_x, delta_y)
if event.type=="LEFTMOUSE" and event.value == 'RELEASE':
return {'FINISHED'}
if event.type == "RIGHTMOUSE":
for bone, matrix in self.bone_data.items():
bone.matrix = matrix
return {'CANCELLED'}
return {'RUNNING_MODAL'}
class RP_OT_function_execute(bpy.types.Operator):
@@ -534,18 +604,28 @@ def register_keymaps():
kmi.properties.mode = 'TRANSLATE'
keymaps.append((km, kmi))
kmi = km.keymap_items.new("node.picker_transform", type="G", value="PRESS", alt=True)
kmi.properties.mode = 'TRANSLATE'
keymaps.append((km, kmi))
kmi = km.keymap_items.new("node.picker_transform", type="R", value="PRESS")
kmi.properties.mode = 'ROTATE'
keymaps.append((km, kmi))
kmi = km.keymap_items.new("node.picker_transform", type="R", value="PRESS", alt=True)
kmi.properties.mode = 'ROTATE'
keymaps.append((km, kmi))
kmi = km.keymap_items.new("node.picker_transform", type="S", value="PRESS")
kmi.properties.mode = 'SCALE'
keymaps.append((km, kmi))
kmi = km.keymap_items.new("node.context_menu_picker", type="RIGHTMOUSE", value="PRESS")
kmi = km.keymap_items.new("node.picker_transform", type="S", value="PRESS", alt=True)
kmi.properties.mode = 'SCALE'
keymaps.append((km, kmi))
kmi = km.keymap_items.new("node.context_menu_picker", type="RIGHTMOUSE", value="PRESS")
keymaps.append((km, kmi))
kmi = km.keymap_items.new("node.rp_box_select", type="LEFTMOUSE", value="PRESS")
kmi.properties.mode = 'SET'
+21 -2
View File
@@ -1,9 +1,11 @@
import json
from os.path import abspath
from pathlib import Path
from mathutils import Matrix
import bpy
from bpy.types import Operator
from bpy.props import IntProperty
from mathutils import Matrix
from ..core.shape import get_picker_data
from ..core.addon_utils import is_shape
@@ -184,10 +186,27 @@ class RP_OT_save_picker(Operator):
bl_label = 'Store UI Data'
bl_idname = 'rigpicker.save_picker'
index : IntProperty(default=-1)
def execute(self, context):
scn = context.scene
ob = context.object
collection = next((c for c in ob.users_collection if c.rig_picker.enabled), None)
print('SAve Picker', self.index)
if self.index == -1:
collection = next((c for c in ob.users_collection if c.rig_picker.enabled), None)
else:
source = context.active_object.data.rig_picker.sources[self.index].source
source = Path(bpy.path.abspath(source, library=ob.data.library)).resolve()
collection = next((c for c in set(scn.collection.children_recursive) if c.rig_picker.enabled
and Path(bpy.path.abspath(c.rig_picker.destination)).resolve() == source), None)
print('source', source)
print('colleciton', collection)
if not collection:
self.report({"ERROR"}, 'No Picker found')
return {'CANCELLED'}
canvas = collection.rig_picker.canvas
rig = collection.rig_picker.rig