Thứ Năm, 14 tháng 12, 2023

debug

 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