200 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			200 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from lnx.logicnode.lnx_advanced_draw import *
 | |
| from lnx.logicnode.lnx_nodes import *
 | |
| from bpy.props import *
 | |
| from bpy.types import Node
 | |
| 
 | |
| class BlendSpaceNode(LnxLogicTreeNode):
 | |
|     """Activates the output when the given event is received.
 | |
| 
 | |
|     @seeNode Send Event to Object
 | |
|     @seeNode Send Event"""
 | |
|     bl_idname = 'LNBlendSpaceNode'
 | |
|     bl_label = 'Blend Space'
 | |
|     lnx_version = 1
 | |
|     lnx_section = 'custom'
 | |
| 
 | |
|     property2: HaxeBoolProperty(
 | |
|         'property2',
 | |
|         name="Enable or Disable",
 | |
|         description="A bool property",
 | |
|         default = False
 | |
|     )
 | |
| 
 | |
|     advanced_draw_run: BoolProperty(
 | |
|         name = "Advance draw enabled",
 | |
|         description="",
 | |
|         default = False
 | |
|     )
 | |
| 
 | |
|     def stop_modal(self):
 | |
|         self.property2 = False
 | |
|     
 | |
|     def my_float_update(self, context):
 | |
|         if self.property2:
 | |
|             self.set_x_y_socket()
 | |
| 
 | |
|     property0: HaxeFloatVectorProperty(
 | |
|         'property0',
 | |
|         name = "Point Coordionates",
 | |
|         description="",
 | |
|         default = (0.0, 0.0, 
 | |
|                    0.0, 1.0,
 | |
|                    1.0, 1.0,
 | |
|                    1.0, 0.0,
 | |
|                    0.0, 0.0,
 | |
|                    0.0, 0.0,
 | |
|                    0.0, 0.0, 
 | |
|                    0.0, 0.0, 
 | |
|                    0.0, 0.0, 
 | |
|                    0.0, 0.0,
 | |
|                    0.5, 0.5),
 | |
|         size = 22,
 | |
|         update = my_float_update
 | |
|     )
 | |
| 
 | |
|     active_point_index: IntProperty(
 | |
|         default = -1
 | |
|     )
 | |
| 
 | |
|     show_numbers: BoolProperty(
 | |
|         name = "Show Point Numbers",
 | |
|         description="",
 | |
|         default = False
 | |
|     )
 | |
| 
 | |
|     active_point_index_ref: IntProperty(
 | |
|         default = 0
 | |
|     )
 | |
| 
 | |
|     gui_bounds: FloatVectorProperty(
 | |
|         name = "GUI bounds",
 | |
|         description = "",
 | |
|         default = (0.0, 0.0, 0.0),
 | |
|         size = 3
 | |
|     )
 | |
| 
 | |
|     point_size: FloatProperty(
 | |
|         name = "Point Size",
 | |
|         description = "",
 | |
|         default = 0.015
 | |
|     )
 | |
| 
 | |
|     property1: HaxeBoolVectorProperty(
 | |
|         'property1',
 | |
|         name = "Point enabled for view",
 | |
|         description = "",
 | |
|         default = (True,True,True,True, False, False, False, False, False, False, True),
 | |
|         size = 11
 | |
|     )
 | |
| 
 | |
|     draw_handler_dict = {}
 | |
|     modal_handler_dict = {}
 | |
| 
 | |
|     def __init__(self, *args, **kwargs):
 | |
|         super(BlendSpaceNode, self).__init__(*args, **kwargs)
 | |
|         array_nodes[str(id(self))] = self
 | |
|         if self.advanced_draw_run:
 | |
|             self.add_advanced_draw()
 | |
|     
 | |
|     def create_blend_space(self):
 | |
|         self.blend_space = BlendSpaceGUI(self)
 | |
|     
 | |
|     def free(self):
 | |
|         self.remove_advanced_draw()
 | |
|     
 | |
|     def get_blend_space_points(self):
 | |
|         if bpy.context.space_data.edit_tree == self.get_tree():
 | |
|             return self.blend_space.points
 | |
|     
 | |
|     def draw_advanced(self):
 | |
|         if bpy.context.space_data.edit_tree == self.get_tree():
 | |
|             self.blend_space.draw()
 | |
| 
 | |
|     def lnx_init(self, context):
 | |
|         self.add_input('LnxNodeSocketObject', 'Object')
 | |
|         self.add_input('LnxNodeSocketArray', 'Actions')
 | |
|         self.add_input('LnxBlendSpaceSocket', 'Cursor X')
 | |
|         self.add_input('LnxBlendSpaceSocket', 'Cursor Y')
 | |
|         self.add_output('LnxNodeSocketAnimTree', 'Out')
 | |
| 
 | |
|     def add_advanced_draw(self):
 | |
|         self.advanced_draw_run = True
 | |
|         handler = self.draw_handler_dict.get(str(self.as_pointer()))
 | |
|         if handler is None:
 | |
|             self.create_blend_space()
 | |
|             editor = getattr(bpy.types, 'SpaceNodeEditor')
 | |
|             handler = editor.draw_handler_add(self.draw_advanced, (), 'WINDOW', 'POST_VIEW')
 | |
|             self.draw_handler_dict[str(self.as_pointer())] = handler
 | |
|             self.property2 = False
 | |
| 
 | |
| 
 | |
|     def remove_advanced_draw(self):
 | |
|         self.advanced_draw_run = False
 | |
|         handler = self.draw_handler_dict.get(str(self.as_pointer()))
 | |
|         if handler is not None:
 | |
|             editor = getattr(bpy.types, 'SpaceNodeEditor')
 | |
|             editor.draw_handler_remove(handler, 'WINDOW')
 | |
|             self.draw_handler_dict.pop(str(self.as_pointer()))
 | |
| 
 | |
|     def set_x_y_cursor(self):
 | |
|         self.property0[20] = self.inputs[2].get_default_value()
 | |
|         self.property0[21] = self.inputs[3].get_default_value()
 | |
|     
 | |
|     def set_x_y_socket(self):
 | |
|         self.inputs[2].set_default_value(self.property0[20])
 | |
|         self.inputs[3].set_default_value(self.property0[21])
 | |
| 
 | |
| 
 | |
|     def add_point(self):
 | |
|         for i in range(len(self.property1)):
 | |
|             if not self.property1[i]:
 | |
|                 self.property1[i] = True
 | |
|                 self.property0[i * 2] = 0.5
 | |
|                 self.property0[i * 2 + 1] = 0.5
 | |
|                 break  
 | |
|     
 | |
|     def remove_point(self):
 | |
|         for i in range(len(self.property1) - 2, 2, -1):
 | |
|             if self.property1[i]:
 | |
|                 self.property1[i] = False
 | |
|                 self.active_point_index_ref = i - 1
 | |
|                 break
 | |
| 
 | |
|         
 | |
|     def draw_buttons(self, context, layout):
 | |
|         row = layout.row(align=True)
 | |
|         row.alignment = 'EXPAND'
 | |
|         op = row.operator('lnx.node_call_func', text='Show', icon='FULLSCREEN_ENTER', emboss=True, depress = self.advanced_draw_run)
 | |
|         op.node_index = str(id(self))
 | |
|         op.callback_name = 'add_advanced_draw'
 | |
|         op = row.operator('lnx.node_call_func', text='Hide', icon='FULLSCREEN_EXIT', emboss=True, depress = not self.advanced_draw_run)
 | |
|         op.node_index = str(id(self))
 | |
|         op.callback_name = 'remove_advanced_draw'
 | |
|         if self.advanced_draw_run:
 | |
|             col = layout.column()
 | |
|             row = col.row(align=True)
 | |
|             op = row.operator('lnx.blend_space_operator', text = 'Edit', icon = 'EDITMODE_HLT', emboss = True, depress = self.property2)
 | |
|             op.node_index = str(id(self))
 | |
|             op = row.operator('lnx.node_call_func', text = 'Exit Edit', icon = 'OBJECT_DATAMODE', emboss = True, depress = not self.property2)
 | |
|             op.node_index = str(id(self))
 | |
|             op.callback_name = 'stop_modal'
 | |
|             layout.prop(self, 'show_numbers')
 | |
|             if self.property2:
 | |
|                 col = layout.column()
 | |
|                 row = col.row(align=True)
 | |
|                 op = row.operator('lnx.node_call_func', text = 'Add Point', icon = 'PLUS', emboss = True)
 | |
|                 op.node_index = str(id(self))
 | |
|                 op.callback_name = 'add_point'
 | |
|                 op = row.operator('lnx.node_call_func', text = 'Remove Point', icon = 'X', emboss = True)
 | |
|                 op.node_index = str(id(self))
 | |
|                 op.callback_name = 'remove_point'
 | |
|                 cl =layout.column()
 | |
|                 actie_point = self.active_point_index_ref
 | |
|                 pos = ", Pos = " + str(round(self.property0[actie_point * 2], 2)) + ", " + str(round(self.property0[actie_point * 2 + 1], 2))
 | |
|                 if actie_point > 9:
 | |
|                     cl.label(text = "Selected: Cursor" + pos)
 | |
|                 else:
 | |
|                     cl.label(text = "Selected: " + str(self.active_point_index_ref + 1) + pos)
 | |
|             else:
 | |
|                 self.set_x_y_cursor()
 |