import bpy import gpu from gpu_extras.batch import batch_for_shader import blf from pathlib import Path from .constants import PICKERS from .core.picker import Picker, PickerGroup, load_picker_data import json def draw_rect_2d(position, width, height, color): """ Draw a 2d rectangele. :arg position: Position of the lower left corner. :type position: 2D Vector :arg width: Width of the rect. :type width: float :arg height: Height of the rect. :type height: float """ coords = ((0, 0), (1, 0), (1, 1), (0, 1)) shader = gpu.shader.from_builtin("UNIFORM_COLOR") batch = batch_for_shader( shader, "TRI_FAN", {"pos": coords}, ) with gpu.matrix.push_pop(): gpu.matrix.translate(position) gpu.matrix.scale((width, height)) shader.uniform_float("color", color) batch.draw(shader) def draw_callback_view(): space_data = bpy.context.space_data if not space_data or not space_data.tree_type == "RigPickerTree": return # Use the pin to know if this is the first time this picker window in created to hide the n panel if not space_data.pin: space_data.pin = True space_data.show_region_ui = False ob = bpy.context.object if not ob or ob.type != "ARMATURE" or not ob.data.rig_picker.sources: return if ob not in PICKERS: load_picker_data(ob) picker_group = PICKERS[ob] picker_group.draw() def draw_callback_px(): sp = bpy.context.space_data if not sp.tree_type == "RigPickerTree": return ob = bpy.context.object picker_group = PICKERS.get(ob) if not picker_group or not picker_group.tooltip: return region = bpy.context.region text = picker_group.tooltip ui_scale = bpy.context.preferences.system.ui_scale # print('Draw text', text) font_id = 0 blf.size(font_id, int(13 * ui_scale)) margins = [12, 5] text_size = blf.dimensions(font_id, text) text_pos = (region.width - text_size[0] - margins[0], margins[1]) bg_pos = (text_pos[0] - margins[0], text_pos[1] - margins[1] - 1) bg_size = (text_size[0] + 2 * margins[0], text_size[1] + 2 * margins[1]) gpu.state.blend_set("ALPHA") draw_rect_2d(bg_pos, *bg_size, (0.1, 0.1, 0.1, 0.66)) gpu.state.blend_set("NONE") # blf.dimensions(font_id, text) blf.enable(font_id, blf.SHADOW) # BLF drawing routine blf.position(font_id, round(text_pos[0]), round(text_pos[1]), 0) blf.color(font_id, 0.85, 0.85, 0.85, 1) blf.shadow(font_id, 5, 0.0, 0.0, 0.0, 1) blf.shadow_offset(font_id, 2, -2) blf.draw(font_id, text) blf.disable(font_id, blf.SHADOW) handle_view = None handle_pixel = None def register(): global handle_view global handle_pixel handle_view = bpy.types.SpaceNodeEditor.draw_handler_add( draw_callback_view, (), "WINDOW", "POST_VIEW" ) handle_pixel = bpy.types.SpaceNodeEditor.draw_handler_add( draw_callback_px, (), "WINDOW", "POST_PIXEL" ) def unregister(): global handle_view global handle_pixel bpy.types.SpaceNodeEditor.draw_handler_remove(handle_view, "WINDOW") bpy.types.SpaceNodeEditor.draw_handler_remove(handle_pixel, "WINDOW") handle_view = None handle_pixel = None