import bpy
import bgl
import blf
import gpu
from gpu_extras.batch import batch_for_shader
def get_view_side(region_3d):
# Determine the side of the viewport
view_matrix = region_3d.view_matrix.normalized()
view_side = 'Perspective'
if view_matrix[2][2] > 0.95:
view_side = 'Bottom'
elif view_matrix[2][2] < -0.95:
view_side = 'Top'
elif view_matrix[0][0] > 0.95:
view_side = 'Right'
elif view_matrix[0][0] < -0.95:
view_side = 'Left'
elif view_matrix[1][1] > 0.95:
view_side = 'Front'
elif view_matrix[1][1] < -0.95:
view_side = 'Back'
return view_side
def draw_callback_px(self, context):
font_id = 0
blf.position(font_id, 15, 50, 0)
blf.size(font_id, 20)
blf.draw(font_id, f"Mouse Pos: {self.mouse_pos}")
view_side = get_view_side(context.region_data)
blf.position(font_id, 15, 30, 0)
blf.draw(font_id, f"View Side: {view_side}")
# Draw a dot at the clicked position
if self.dot_pos:
shader = gpu.shader.from_builtin('UNIFORM_COLOR')
batch = batch_for_shader(shader, 'POINTS', {"pos": [self.dot_pos]})
shader.bind()
shader.uniform_float("color", (1.0, 0.0, 0.0, 1.0)) # Red color
batch.draw(shader)
class MousePositionOperator(bpy.types.Operator):
bl_idname = "wm.mouse_position"
bl_label = "Mouse Position Operator"
def __init__(self):
self.dot_pos = None
self.mouse_pos = (0, 0)
self.dragging = False
def modal(self, context, event):
context.area.tag_redraw()
if event.type == 'MOUSEMOVE':
region = context.region
if (0 <= event.mouse_region_x <= region.width and
0 <= event.mouse_region_y <= region.height):
self.mouse_pos = (event.mouse_region_x, event.mouse_region_y)
if self.dragging:
self.dot_pos = (event.mouse_region_x, event.mouse_region_y)
else:
self.mouse_pos = ("Out of View", "Out of View")
elif event.type == 'LEFTMOUSE':
if event.value == 'PRESS' and event.alt:
self.dot_pos = (event.mouse_region_x, event.mouse_region_y)
self.dragging = True
elif event.value == 'RELEASE':
self.dragging = False
elif event.type in {'RIGHTMOUSE', 'ESC'}:
bpy.types.SpaceView3D.draw_handler_remove(self._handle, 'WINDOW')
return {'CANCELLED'}
return {'RUNNING_MODAL'}
def invoke(self, context, event):
args = (self, context)
self._handle = bpy.types.SpaceView3D.draw_handler_add(draw_callback_px, args, 'WINDOW', 'POST_PIXEL')
context.window_manager.modal_handler_add(self)
return {'RUNNING_MODAL'}
class MousePositionPanel(bpy.types.Panel):
bl_label = "Mouse Position Panel"
bl_idname = "VIEW3D_PT_mouse_position"
bl_space_type = 'VIEW_3D'
bl_region_type = 'UI'
bl_category = 'Tool'
def draw(self, context):
layout = self.layout
layout.operator("wm.mouse_position")
def register():
bpy.utils.register_class(MousePositionOperator)
bpy.utils.register_class(MousePositionPanel)
def unregister():
bpy.utils.unregister_class(MousePositionOperator)
bpy.utils.unregister_class(MousePositionPanel)
if __name__ == "__main__":
register()
Không có nhận xét nào:
Đăng nhận xét