188 lines
3.5 KiB
C
188 lines
3.5 KiB
C
typedef enum node_type node_type;
|
|
|
|
#define IsInputMember 1 << 0
|
|
#define IsOutputMember 1 << 1
|
|
|
|
#define DEFAULT_NODE_DIMENSION v2{125, 150}
|
|
|
|
#define NODE_COLOR_BUFFER \
|
|
led* LEDs; \
|
|
sacn_pixel* Colors; \
|
|
s32 LEDCount;
|
|
|
|
#define NAMED_NODE_COLOR_BUFFER(name) \
|
|
led* name##LEDs; \
|
|
sacn_pixel* name##Colors; \
|
|
s32 name##LEDCount;
|
|
|
|
#define NODE_COLOR_BUFFER_INOUT NODE_COLOR_BUFFER
|
|
#define NODE_COLOR_BUFFER_IN(name) NAMED_NODE_COLOR_BUFFER(name)
|
|
#define NODE_COLOR_BUFFER_OUT(name) NAMED_NODE_COLOR_BUFFER(name)
|
|
|
|
enum mouse_node_interaction
|
|
{
|
|
NodeInteraction_None,
|
|
NodeInteraction_MouseDragNode,
|
|
NodeInteraction_MouseDragInput,
|
|
NodeInteraction_KeyboardEnterPortValue,
|
|
MouseNodeInteraction_Count,
|
|
};
|
|
|
|
enum node_port_direction
|
|
{
|
|
NodePort_Input,
|
|
NodePort_Output,
|
|
};
|
|
|
|
// TODO(Peter): Generate this
|
|
enum struct_member_type
|
|
{
|
|
MemberType_Invalid,
|
|
MemberType_s32,
|
|
MemberType_r32,
|
|
MemberType_v4,
|
|
MemberType_NODE_COLOR_BUFFER,
|
|
MemberTypeCount,
|
|
};
|
|
|
|
struct node_led_color_connection
|
|
{
|
|
NODE_COLOR_BUFFER;
|
|
};
|
|
|
|
struct node_connection
|
|
{
|
|
struct_member_type Type;
|
|
// NOTE(Peter): Offset from the head of the node list that the connected node
|
|
// is stored at. See GetNodeAtOffset for example of how this is used
|
|
s32 UpstreamNodeOffset;
|
|
s32 UpstreamNodePortIndex;
|
|
s32 DownstreamNodeOffset;
|
|
s32 DownstreamNodePortIndex;
|
|
b32 DirectionMask;
|
|
|
|
union
|
|
{
|
|
s32 S32Value;
|
|
r32 R32Value;
|
|
v4 V4Value;
|
|
node_led_color_connection LEDsValue;
|
|
};
|
|
};
|
|
|
|
// TODO(Peter): cant decide if this needs to be dynamic or just a really big number
|
|
// reevaluate once you have some examples
|
|
#define NODE_CONNECTIONS_MAX 8
|
|
struct interface_node
|
|
{
|
|
string Name;
|
|
|
|
v2 Min, Dim;
|
|
v2 MinAfterUpdate;
|
|
|
|
s32 ConnectionsCount;
|
|
node_connection* Connections;
|
|
|
|
node_type Type;
|
|
b32 UpdatedThisFrame;
|
|
|
|
u8* PersistentData;
|
|
};
|
|
|
|
struct node_list
|
|
{
|
|
u8* Memory;
|
|
s32 Max;
|
|
s32 Used;
|
|
|
|
node_list* Next;
|
|
};
|
|
|
|
struct node_offset
|
|
{
|
|
interface_node* Node;
|
|
s32 Offset;
|
|
};
|
|
|
|
struct node_list_iterator
|
|
{
|
|
node_list List;
|
|
interface_node* At;
|
|
};
|
|
|
|
enum node_interaction_flag
|
|
{
|
|
NodeInteraction_AllUpstream = 0x1,
|
|
NodeInteraction_AllDownstream = 0x2,
|
|
};
|
|
|
|
struct node_interaction
|
|
{
|
|
s32 NodeOffset;
|
|
v2 MouseOffset;
|
|
b32 Flags;
|
|
|
|
// TODO(Peter): Inputs and outputs are all stored in the same array. Should this just be flags,
|
|
// and we store the Port and Value?
|
|
s32 InputPort;
|
|
s32 InputValue;
|
|
s32 OutputPort;
|
|
s32 OutputValue;
|
|
};
|
|
|
|
struct node_struct_member
|
|
{
|
|
struct_member_type Type;
|
|
char* Name;
|
|
u64 Offset;
|
|
b32 IsInput;
|
|
};
|
|
|
|
struct node_specification
|
|
{
|
|
node_type Type;
|
|
|
|
char* Name;
|
|
s32 NameLength;
|
|
|
|
node_struct_member* MemberList;
|
|
s32 DataStructSize;
|
|
|
|
s32 MemberListLength;
|
|
b32 IsPattern;
|
|
};
|
|
|
|
struct node_render_settings
|
|
{
|
|
v2 PortDim;
|
|
r32 PortStep;
|
|
v4 PortColors[MemberTypeCount];
|
|
bitmap_font* Font;
|
|
b32 Display;
|
|
};
|
|
|
|
v4 DragButtonColors[] = {
|
|
v4{.7f, .7f, .7f, 1},
|
|
BlackV4,
|
|
v4{.7f, .7f, .7f, 1},
|
|
};
|
|
|
|
#define NODE_HEADER_HEIGHT 20
|
|
|
|
///////////////////////////////////////////////
|
|
// Pre Processor Macros
|
|
///////////////////////////////////////////////
|
|
|
|
#define NODE_STRUCT(data_name) \
|
|
struct data_name
|
|
|
|
#define NODE_PATTERN_STRUCT(data_name) \
|
|
struct data_name
|
|
|
|
#define NODE_PROC(proc_name, input_type) \
|
|
void proc_name(input_type* Data, r32 DeltaTime)
|
|
|
|
#define NODE_IN(type, name) type name
|
|
#define NODE_OUT(type, name) type name
|
|
|