fix mouse_under in picker_group
This commit is contained in:
+103
-23
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user