// // Created by martin on 11.02.22. // #ifndef ANIMTESTBED_ANIMGRAPHEDITOR_H #define ANIMTESTBED_ANIMGRAPHEDITOR_H namespace ax::NodeEditor { struct EditorContext; } // namespace ax::NodeEditor struct SkinnedMesh; struct AnimGraphBlendTree; struct SyncTrack; inline int GenerateInputAttributeId(int node_id, int input_index) { return ((input_index + 1) << 14) + node_id; } inline void SplitInputAttributeId(int attribute_id, int* node_id, int* input_index) { *node_id = attribute_id & ((1 << 14) - 1); *input_index = (attribute_id >> 14) - 1; } inline int GenerateOutputAttributeId(int node_id, int output_index) { return ((output_index + 1) << 23) + node_id; } inline void SplitOutputAttributeId(int attribute_id, int* node_id, int* output_index) { *node_id = attribute_id & ((1 << 14) - 1); *output_index = (attribute_id >> 23) - 1; } inline int NodeIndexAndSocketIndexToInputPinId( int node_index, int input_socket_index) { return node_index * 1000 + input_socket_index; } inline int NodeIndexAndSocketIndexToOutputPinId( int node_index, int output_socket_index) { return node_index * 1000 + 500 + output_socket_index; } inline void InputPinIdToNodeIndexAndSocketIndex( unsigned long input_pin_id, int* node_index, int* socket_index) { *socket_index = input_pin_id % 1000; *node_index = (input_pin_id - *socket_index) / 1000; } inline void OutputPinIdToNodeIndexAndSocketIndex( unsigned long output_pin_id, int* node_index, int* socket_index) { *socket_index = ((output_pin_id - 500) % 1000); *node_index = (output_pin_id - *socket_index) / 1000; } void SyncTrackEditor(SyncTrack* sync_track); void SkinnedMeshWidget(SkinnedMesh* skinned_mesh); void AnimGraphEditorClear(); void AnimGraphEditorUpdate(ax::NodeEditor::EditorContext* context); void AnimGraphEditorGetRuntimeGraph(AnimGraphBlendTree& anim_graph); #endif //ANIMTESTBED_ANIMGRAPHEDITOR_H