127 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			127 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
 | |
| 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 |