From 09e6d4d15ba099592576b4000ab41717b8cac3dc Mon Sep 17 00:00:00 2001 From: Peter Slattery Date: Sat, 22 Feb 2020 18:54:28 -0800 Subject: [PATCH] Working on meta - got nodes fully in place again. Still need to store meta tags on struct members --- meta/foldhaus_meta.cpp | 32 ++++++---- meta/gs_meta_include.h | 46 ++++++++++++++ msdev.bat | 2 +- src/foldhaus_app.cpp | 4 -- src/foldhaus_app.h | 8 ++- src/foldhaus_node.cpp | 14 ++++ src/foldhaus_node.h | 15 ++++- src/generated/foldhaus_nodes_generated.h | 6 ++ src/generated/gs_meta_generated_typeinfo.h | 62 ++++++++++++------ src/panels/foldhaus_panel_node_graph.h | 74 ++++++++++++++-------- src/test_patterns.h | 6 +- 11 files changed, 199 insertions(+), 70 deletions(-) diff --git a/meta/foldhaus_meta.cpp b/meta/foldhaus_meta.cpp index 36e66e6..9efd752 100644 --- a/meta/foldhaus_meta.cpp +++ b/meta/foldhaus_meta.cpp @@ -9,11 +9,13 @@ #include "gs_meta_typeinfo_generator.h" internal void -GenerateNodeMetaInfo (gsm_code_generator* NodeTypeGen, string_builder* CallNodeProcGen, gs_meta_preprocessor Meta) +GenerateNodeMetaInfo (gsm_code_generator* NodeTypeGen, string_builder* NodeSpecificationGen, string_builder* CallNodeProcGen, gs_meta_preprocessor Meta) { // TODO(Peter): Create a FilterTypesByTag function to create a contiguous array // of type_definition** + WriteF(NodeSpecificationGen, "static node_specification_ NodeSpecifications[] = {\n"); + WriteF(CallNodeProcGen, "void CallNodeProc(node_type Type, u8* NodeData)\n{\n"); WriteF(CallNodeProcGen, " switch(Type) { \n"); for (u32 b = 0; b < Meta.TypeTable.TypeBucketsCount; b++) @@ -35,24 +37,24 @@ GenerateNodeMetaInfo (gsm_code_generator* NodeTypeGen, string_builder* CallNodeP AddEnumElement(NodeTypeGen, Decl->Identifier); + variable_decl* Param = Decl->Function.Parameters.GetElementAtIndex(0); + type_table_handle ParamTypeHandle = Param->TypeHandle; + type_definition* ParamType = GetTypeDefinition(ParamTypeHandle, Meta.TypeTable); + type_table_handle ReturnTypeHandle = Decl->Function.ReturnTypeHandle; type_definition* ReturnType = GetTypeDefinition(ReturnTypeHandle, Meta.TypeTable); + WriteF(NodeSpecificationGen, "{ NodeType_%S, {\"%S\", %d}, gsm_StructType_%S }, \n", + Decl->Identifier, + Decl->Identifier, + Decl->Identifier.Length, + ParamType->Identifier); + WriteF(CallNodeProcGen, " case NodeType_%.*s:\n", StringExpand(Decl->Identifier)); WriteF(CallNodeProcGen, " {\n"); WriteF(CallNodeProcGen, " %.*s(", StringExpand(Decl->Identifier)); + WriteF(CallNodeProcGen, "(%.*s*)NodeData", StringExpand(ParamType->Identifier)); - for (u32 j = 0; j < Decl->Function.Parameters.Used; j++) - { - variable_decl* Param = Decl->Function.Parameters.GetElementAtIndex(j); - type_table_handle ParamTypeHandle = Param->TypeHandle; - type_definition* ParamType = GetTypeDefinition(ParamTypeHandle, Meta.TypeTable); - WriteF(CallNodeProcGen, "(%.*s*)NodeData", StringExpand(ParamType->Identifier)); - if (j + 1 < Decl->Function.Parameters.Used) - { - WriteF(CallNodeProcGen, ", "); - } - } WriteF(CallNodeProcGen, ");\n"); WriteF(CallNodeProcGen, " } break;\n"); } @@ -61,6 +63,8 @@ GenerateNodeMetaInfo (gsm_code_generator* NodeTypeGen, string_builder* CallNodeP WriteF(CallNodeProcGen, " }\n"); WriteF(CallNodeProcGen, "}\n\n"); + WriteF(NodeSpecificationGen, "};\n\n"); + FinishEnumGeneration(NodeTypeGen); } @@ -80,8 +84,9 @@ int main(int ArgCount, char* Args[]) FinishGeneratingTypes(&TypeGenerator); gsm_code_generator NodeTypeGen = BeginEnumGeneration("node_type", "NodeType", false, true); + string_builder NodeSpecificationGen = {0}; string_builder CallNodeProcGen = {0}; - GenerateNodeMetaInfo(&NodeTypeGen, &CallNodeProcGen, Meta); + GenerateNodeMetaInfo(&NodeTypeGen, &NodeSpecificationGen, &CallNodeProcGen, Meta); string_builder PanelInfoGen = {0}; @@ -98,6 +103,7 @@ int main(int ArgCount, char* Args[]) if (NodeInfoH) { WriteStringBuilderToFile(*NodeTypeGen.Builder, NodeInfoH); + WriteStringBuilderToFile(NodeSpecificationGen, NodeInfoH); WriteStringBuilderToFile(CallNodeProcGen, NodeInfoH); fclose(NodeInfoH); } diff --git a/meta/gs_meta_include.h b/meta/gs_meta_include.h index 8e3b0fa..4400eb2 100644 --- a/meta/gs_meta_include.h +++ b/meta/gs_meta_include.h @@ -12,8 +12,10 @@ // in your application // +typedef int gsm_s32; typedef unsigned int gsm_u32; typedef unsigned long long int gsm_u64; +typedef enum gsm_struct_type gsm_struct_type; #define GSMetaTag(ident, ...) @@ -28,6 +30,9 @@ struct gsm_struct_member_type_info char* Identifier; gsm_u32 IdentifierLength; gsm_u64 Offset; + + gsm_meta_tag* Tags; + gsm_u32 TagsCount; }; struct gsm_struct_type_info @@ -45,6 +50,47 @@ struct gsm_struct_type_info gsm_u32 MembersCount; }; +static bool +gsm_CharArraysEqual(char* A, char* B) +{ + bool Result = true; + + char* AAt = A; + char* BAt = B; + + while (*AAt && *BAt) + { + if (*AAt != *BAt) + { + Result = false; + break; + } + } + + // NOTE(Peter): In case we get to the end of A or B, but not both. + // ie. the strings are equal up to a point, but one is longer. + if (*AAt != *BAt) + { + Result = false; + } + + return Result; +} + +static gsm_s32 +gsm_GetMetaTagIndex(char* Tag, gsm_meta_tag* Tags, gsm_u32 TagCount) +{ + gsm_s32 Result = -1; + for (gsm_u32 i = 0; i < TagCount; i++) + { + if (gsm_CharArraysEqual(Tag, Tags[i].Tag)) + { + Result = (gsm_s32)i; + break; + } + } + return Result; +} #define FOLDHAUS_META_INCLUDE_H #endif // FOLDHAUS_META_INCLUDE_H \ No newline at end of file diff --git a/msdev.bat b/msdev.bat index 5d06e5e..31ca5aa 100644 --- a/msdev.bat +++ b/msdev.bat @@ -1,3 +1,3 @@ @echo off -remedybg build\debug_lumenarium.rdbg \ No newline at end of file +remedybg build\win32_foldhaus.rdbg \ No newline at end of file diff --git a/src/foldhaus_app.cpp b/src/foldhaus_app.cpp index b7afdc7..06f5f7a 100644 --- a/src/foldhaus_app.cpp +++ b/src/foldhaus_app.cpp @@ -5,13 +5,9 @@ // #ifndef FOLDHAUS_APP_CPP -#include "../meta/gs_meta_include.h" - #include "foldhaus_platform.h" #include "foldhaus_app.h" -#include "./generated/gs_meta_generated_typeinfo.h" - internal v4 MouseToWorldRay(r32 MouseX, r32 MouseY, camera* Camera, rect WindowBounds) { diff --git a/src/foldhaus_app.h b/src/foldhaus_app.h index b45dc4f..6692f09 100644 --- a/src/foldhaus_app.h +++ b/src/foldhaus_app.h @@ -5,6 +5,7 @@ // #ifndef FOLDHAUS_APP_H +#include "../meta/gs_meta_include.h" #include "../meta/gs_meta_lexer.h" #include "../gs_libs/gs_font.h" @@ -23,8 +24,8 @@ #include "foldhaus_node.h" // TODO(Peter): TEMPORARY -u32 NodeSpecificationsCount = 0; -node_specification* NodeSpecifications = 0; +//u32 NodeSpecificationsCount = 0; +//node_specification* NodeSpecifications = 0; #include "assembly_parser.cpp" @@ -228,6 +229,8 @@ struct panel_definition panel_render_proc* Render; input_command* InputCommands; }; +#include "./generated/gs_meta_generated_typeinfo.h" +#include "generated/foldhaus_nodes_generated.h" #include "panels/foldhaus_panel_sculpture_view.h" #include "panels/foldhaus_panel_profiler.h" @@ -237,7 +240,6 @@ struct panel_definition #include "panels/foldhaus_panel_node_graph.h" #include "generated/foldhaus_panels_generated.h" -#include "generated/foldhaus_nodes_generated.h" #include "foldhaus_interface.cpp" diff --git a/src/foldhaus_node.cpp b/src/foldhaus_node.cpp index 1f6aa3a..7078e32 100644 --- a/src/foldhaus_node.cpp +++ b/src/foldhaus_node.cpp @@ -5,6 +5,20 @@ // #ifndef FOLDHAUS_NODE_CPP +internal b32 +MemberIsInput(gsm_struct_member_type_info Member) +{ + b32 Result = (0 <= gsm_GetMetaTagIndex("node_input", Member.Tags, Member.TagsCount)); + return Result; +} + +internal b32 +MemberIsOutput(gsm_struct_member_type_info Member) +{ + b32 Result = (0 <= gsm_GetMetaTagIndex("node_output", Member.Tags, Member.TagsCount)); + return Result; +} + internal void ClearNodeWorkspaceStorage(pattern_node_workspace* Workspace) { diff --git a/src/foldhaus_node.h b/src/foldhaus_node.h index bda5a9f..b51b9ca 100644 --- a/src/foldhaus_node.h +++ b/src/foldhaus_node.h @@ -19,7 +19,8 @@ struct color_buffer s32 LEDCount; }; -// TODO(Peter): Generate this +// TODO(Peter): Use the Meta RTTI +// :UseMetaInfo enum struct_member_type { MemberType_Invalid, @@ -30,6 +31,8 @@ enum struct_member_type MemberTypeCount, }; +// TODO(Peter): Use the Meta RTTI +// :UseMetaInfo struct node_struct_member { struct_member_type Type; @@ -38,6 +41,7 @@ struct node_struct_member b32 IsInput; }; +// :UseMetaInfo struct node_specification { node_type Type; @@ -52,6 +56,13 @@ struct node_specification b32 IsPattern; }; +struct node_specification_ +{ + node_type Type; + string Identifier; + gsm_struct_type DataType; +}; + struct pattern_node { // TODO(Peter): Something to think about further down the line is the fact that @@ -59,6 +70,8 @@ struct pattern_node // an application, let alone across separate runs. If you recompile (hot load or not) // with a new specification, the indecies all get thrown off. Should we hash the spec // names or something? + + // TODO(Peter): A more immediate thing to handle is that u32 should really be node_type u32 SpecificationIndex; }; diff --git a/src/generated/foldhaus_nodes_generated.h b/src/generated/foldhaus_nodes_generated.h index 9446c20..3a659fa 100644 --- a/src/generated/foldhaus_nodes_generated.h +++ b/src/generated/foldhaus_nodes_generated.h @@ -6,6 +6,12 @@ enum node_type NodeType_Count, }; +static node_specification_ NodeSpecifications[] = { +{ NodeType_RevolvingDiscs, {"RevolvingDiscs", 14}, gsm_StructType_revolving_discs_data }, +{ NodeType_VerticalColorFadeProc, {"VerticalColorFadeProc", 21}, gsm_StructType_vertical_color_fade_data }, +{ NodeType_SolidColorProc, {"SolidColorProc", 14}, gsm_StructType_solid_color_data }, +}; + void CallNodeProc(node_type Type, u8* NodeData) { switch(Type) { diff --git a/src/generated/gs_meta_generated_typeinfo.h b/src/generated/gs_meta_generated_typeinfo.h index 7fcc15b..0bf3101 100644 --- a/src/generated/gs_meta_generated_typeinfo.h +++ b/src/generated/gs_meta_generated_typeinfo.h @@ -1,25 +1,21 @@ enum gsm_struct_type { - gsm_StructType_sin_wave_data, - gsm_StructType_r32, - gsm_StructType_multiply_patterns_data, + gsm_StructType_solid_color_data, + gsm_StructType_v4, + gsm_StructType_float, gsm_StructType_color_buffer, gsm_StructType_led, gsm_StructType_s32, - gsm_StructType_v4, - gsm_StructType_float, gsm_StructType_pixel, gsm_StructType_u8, + gsm_StructType_vertical_color_fade_data, + gsm_StructType_r32, + gsm_StructType_sin_wave_data, + gsm_StructType_multiply_patterns_data, + gsm_StructType_revolving_discs_data, gsm_StructType_Count, }; -static gsm_struct_member_type_info StructMembers_sin_wave_data[] = { -{ "Period", 6, (u64)&((sin_wave_data*)0)->Period }, -{ "Min", 3, (u64)&((sin_wave_data*)0)->Min }, -{ "Max", 3, (u64)&((sin_wave_data*)0)->Max }, -{ "Result", 6, (u64)&((sin_wave_data*)0)->Result }, -{ "Accumulator", 11, (u64)&((sin_wave_data*)0)->Accumulator }, -}; static gsm_struct_member_type_info StructMembers_v4[] = { { "x", 1, (u64)&((v4*)0)->x }, { "y", 1, (u64)&((v4*)0)->y }, @@ -46,22 +42,52 @@ static gsm_struct_member_type_info StructMembers_color_buffer[] = { { "Colors", 6, (u64)&((color_buffer*)0)->Colors }, { "LEDCount", 8, (u64)&((color_buffer*)0)->LEDCount }, }; +static gsm_struct_member_type_info StructMembers_solid_color_data[] = { +{ "Color", 5, (u64)&((solid_color_data*)0)->Color }, +{ "Result", 6, (u64)&((solid_color_data*)0)->Result }, +}; +static gsm_struct_member_type_info StructMembers_vertical_color_fade_data[] = { +{ "Color", 5, (u64)&((vertical_color_fade_data*)0)->Color }, +{ "Min", 3, (u64)&((vertical_color_fade_data*)0)->Min }, +{ "Max", 3, (u64)&((vertical_color_fade_data*)0)->Max }, +{ "Result", 6, (u64)&((vertical_color_fade_data*)0)->Result }, +}; +static gsm_struct_member_type_info StructMembers_sin_wave_data[] = { +{ "Period", 6, (u64)&((sin_wave_data*)0)->Period }, +{ "Min", 3, (u64)&((sin_wave_data*)0)->Min }, +{ "Max", 3, (u64)&((sin_wave_data*)0)->Max }, +{ "Result", 6, (u64)&((sin_wave_data*)0)->Result }, +{ "Accumulator", 11, (u64)&((sin_wave_data*)0)->Accumulator }, +}; static gsm_struct_member_type_info StructMembers_multiply_patterns_data[] = { { "A", 1, (u64)&((multiply_patterns_data*)0)->A }, { "B", 1, (u64)&((multiply_patterns_data*)0)->B }, { "Result", 6, (u64)&((multiply_patterns_data*)0)->Result }, }; +static gsm_struct_member_type_info StructMembers_revolving_discs_data[] = { +{ "Rotation", 8, (u64)&((revolving_discs_data*)0)->Rotation }, +{ "ThetaZ", 6, (u64)&((revolving_discs_data*)0)->ThetaZ }, +{ "ThetaY", 6, (u64)&((revolving_discs_data*)0)->ThetaY }, +{ "DiscWidth", 9, (u64)&((revolving_discs_data*)0)->DiscWidth }, +{ "InnerRadius", 11, (u64)&((revolving_discs_data*)0)->InnerRadius }, +{ "OuterRadius", 11, (u64)&((revolving_discs_data*)0)->OuterRadius }, +{ "Color", 5, (u64)&((revolving_discs_data*)0)->Color }, +{ "Result", 6, (u64)&((revolving_discs_data*)0)->Result }, +}; static gsm_struct_type_info StructTypes[] = { -{ gsm_StructType_sin_wave_data, "sin_wave_data", 13, 20, 0, 0, StructMembers_sin_wave_data, 5 }, -{ gsm_StructType_r32, "r32", 3, 4, 0, 0, 0, 0 }, -{ gsm_StructType_multiply_patterns_data, "multiply_patterns_data", 22, 60, 0, 0, StructMembers_multiply_patterns_data, 3 }, +{ gsm_StructType_solid_color_data, "solid_color_data", 16, 36, 0, 0, StructMembers_solid_color_data, 2 }, +{ gsm_StructType_v4, "v4", 2, 16, 0, 0, StructMembers_v4, 3 }, +{ gsm_StructType_float, "float", 5, 4, 0, 0, 0, 0 }, { gsm_StructType_color_buffer, "color_buffer", 12, 20, 0, 0, StructMembers_color_buffer, 3 }, { gsm_StructType_led, "led", 3, 20, 0, 0, StructMembers_led, 2 }, { gsm_StructType_s32, "s32", 3, 4, 0, 0, 0, 0 }, -{ gsm_StructType_v4, "v4", 2, 16, 0, 0, StructMembers_v4, 3 }, -{ gsm_StructType_float, "float", 5, 4, 0, 0, 0, 0 }, { gsm_StructType_pixel, "pixel", 5, 3, 0, 0, StructMembers_pixel, 2 }, { gsm_StructType_u8, "u8", 2, 1, 0, 0, 0, 0 }, +{ gsm_StructType_vertical_color_fade_data, "vertical_color_fade_data", 24, 44, 0, 0, StructMembers_vertical_color_fade_data, 4 }, +{ gsm_StructType_r32, "r32", 3, 4, 0, 0, 0, 0 }, +{ gsm_StructType_sin_wave_data, "sin_wave_data", 13, 20, 0, 0, StructMembers_sin_wave_data, 5 }, +{ gsm_StructType_multiply_patterns_data, "multiply_patterns_data", 22, 60, 0, 0, StructMembers_multiply_patterns_data, 3 }, +{ gsm_StructType_revolving_discs_data, "revolving_discs_data", 20, 60, 0, 0, StructMembers_revolving_discs_data, 8 }, }; -static gsm_u32 StructTypesCount = 10; +static gsm_u32 StructTypesCount = 13; diff --git a/src/panels/foldhaus_panel_node_graph.h b/src/panels/foldhaus_panel_node_graph.h index b954cc2..2481149 100644 --- a/src/panels/foldhaus_panel_node_graph.h +++ b/src/panels/foldhaus_panel_node_graph.h @@ -7,7 +7,7 @@ struct visual_node { - node_specification Spec; + node_specification_ Spec; v2 Position; }; @@ -229,19 +229,19 @@ DrawGrid (v2 Offset, v2 GridSquareDim, rect PanelBounds, render_command_buffer* } internal void -DrawNodePorts(node_specification Spec, b32 InputMask, v2 Position, r32 LineHeight, string_alignment TextAlign, v2 TextOffset, interface_config Interface, render_command_buffer* RenderBuffer, mouse_state Mouse) +DrawNodePorts(gsm_struct_type_info NodeDataTypeInfo, b32 InputMask, v2 Position, r32 LineHeight, string_alignment TextAlign, v2 TextOffset, interface_config Interface, render_command_buffer* RenderBuffer, mouse_state Mouse) { rect PortBounds = rect{v2{0, 0}, v2{6, 6}}; v2 LinePosition = Position; - for (u32 i = 0; i < Spec.MemberListLength; i++) + for (u32 i = 0; i < NodeDataTypeInfo.MembersCount; i++) { - node_struct_member Member = Spec.MemberList[i]; - if ((Member.IsInput & InputMask) > 0) + gsm_struct_member_type_info Member = NodeDataTypeInfo.Members[i]; + if (MemberIsInput(Member)) { // TODO(Peter): Can we make this rely on the same data that we use to // render the actual connection points? - string MemberName = MakeString(Member.Name, CharArrayLength(Member.Name)); + string MemberName = MakeString(Member.Identifier, Member.IdentifierLength); DrawString(RenderBuffer, MemberName, Interface.Font, LinePosition + TextOffset, WhiteV4, TextAlign); LinePosition.y -= LineHeight; } @@ -249,15 +249,17 @@ DrawNodePorts(node_specification Spec, b32 InputMask, v2 Position, r32 LineHeigh } internal void -DrawNode (v2 Position, node_specification NodeSpecification, gs_list_handle NodeHandle, r32 NodeWidth, r32 LineHeight, interface_config Interface, render_command_buffer* RenderBuffer, mouse_state Mouse, memory_arena* Scratch) +DrawNode (v2 Position, node_specification_ NodeSpecification, gs_list_handle NodeHandle, r32 NodeWidth, r32 LineHeight, interface_config Interface, render_command_buffer* RenderBuffer, mouse_state Mouse, memory_arena* Scratch) { + gsm_struct_type_info NodeDataTypeInfo = StructTypes[NodeSpecification.DataType]; + u32 InputMembers = 0; u32 OutputMembers = 0; - for (u32 i = 0; i < NodeSpecification.MemberListLength; i++) + for (u32 i = 0; i < NodeDataTypeInfo.MembersCount; i++) { - node_struct_member Member = NodeSpecification.MemberList[i]; - if ((Member.IsInput & IsOutputMember) > 0) { OutputMembers++; } - if ((Member.IsInput & IsInputMember) > 0) { InputMembers++; } + gsm_struct_member_type_info Member = NodeDataTypeInfo.Members[i]; + if (MemberIsInput(Member)) { InputMembers++; } + if (MemberIsOutput(Member)) { OutputMembers++; } } u32 LineCount = 1 + GSMax(InputMembers, OutputMembers); @@ -277,17 +279,32 @@ DrawNode (v2 Position, node_specification NodeSpecification, gs_list_handle Node PushRenderQuad2D(RenderBuffer, LinePosition, LinePosition + v2{NodeWidth, LineHeight}, v4{1.f, .24f, .39f, 1.f}); - string NodeName = MakeString(NodeSpecification.Name, NodeSpecification.NameLength); string NodePrintName = MakeString(PushArray(Scratch, char, 256), 0, 256); - PrintF(&NodePrintName, "%S [%d]", NodeName, NodeHandle.Index); + PrintF(&NodePrintName, "%S [%d]", NodeSpecification.Identifier, NodeHandle.Index); DrawString(RenderBuffer, NodePrintName, Interface.Font, LinePosition + TextOffset, WhiteV4); LinePosition.y -= LineHeight; - DrawNodePorts(NodeSpecification, IsInputMember, LinePosition, LineHeight, Align_Left, TextOffset, Interface, RenderBuffer, Mouse); - + v2 InputLinePosition = LinePosition; v2 OutputLinePosition = v2{LinePosition.x + NodeDim.x, LinePosition.y }; v2 OutputTextOffset = v2{-TextOffset.x, TextOffset.y}; - DrawNodePorts(NodeSpecification, IsOutputMember, OutputLinePosition, LineHeight, Align_Right, OutputTextOffset, Interface, RenderBuffer, Mouse); + for (u32 i = 0; i < NodeDataTypeInfo.MembersCount; i++) + { + gsm_struct_member_type_info Member = NodeDataTypeInfo.Members[i]; + string MemberName = MakeString(Member.Identifier, Member.IdentifierLength); + + // TODO(Peter): Can we make this rely on the same data that we use to + // render the actual connection points? + if (MemberIsInput(Member)) + { + DrawString(RenderBuffer, MemberName, Interface.Font, LinePosition + TextOffset, WhiteV4, Align_Left); + InputLinePosition.y -= LineHeight; + } + else if (MemberIsOutput(Member)) + { + DrawString(RenderBuffer, MemberName, Interface.Font, LinePosition + TextOffset, WhiteV4, Align_Right); + OutputLinePosition.y -= LineHeight; + } + } } internal s32 @@ -319,8 +336,10 @@ ArrangeNodes(pattern_node_workspace Workspace, r32 NodeWidth, r32 LayerDistance, pattern_node Node = *Workspace.Nodes.GetElementWithHandle(NodeHandle); u32 SpecIndex = Node.SpecificationIndex; - node_specification Spec = NodeSpecifications[SpecIndex]; - Result.VisualPortsCount += Spec.MemberListLength; + + node_specification_ Spec = NodeSpecifications[SpecIndex]; + gsm_struct_type_info NodeDataTypeInfo = StructTypes[Spec.DataType]; + Result.VisualPortsCount += NodeDataTypeInfo.MembersCount;; } // Place nodes and connections @@ -336,7 +355,9 @@ ArrangeNodes(pattern_node_workspace Workspace, r32 NodeWidth, r32 LayerDistance, pattern_node Node = *Workspace.Nodes.GetElementWithHandle(NodeHandle); u32 SpecIndex = Node.SpecificationIndex; - node_specification Spec = NodeSpecifications[SpecIndex]; + + node_specification_ Spec = NodeSpecifications[SpecIndex]; + gsm_struct_type_info NodeDataTypeInfo = StructTypes[Spec.DataType]; visual_node* VisualNode = Result.VisualNodes + n; VisualNode->Spec = Spec; @@ -345,19 +366,19 @@ ArrangeNodes(pattern_node_workspace Workspace, r32 NodeWidth, r32 LayerDistance, // NOTE(Peter): These start at 2 to account for the offset past the node title s32 InputsCount = 2; s32 OutputsCount = 2; - for (u32 p = 0; p < Spec.MemberListLength; p++) + for (u32 p = 0; p < NodeDataTypeInfo.MembersCount; p++) { - node_struct_member Member = Spec.MemberList[p]; + gsm_struct_member_type_info Member = NodeDataTypeInfo.Members[p]; rect PortBounds = {0}; v2 PortDim = v2{8, 8}; PortBounds.Min = VisualNode->Position + v2{0, PortDim.y / 2}; - if ((Member.IsInput & IsInputMember) > 0) + if (MemberIsInput(Member)) { PortBounds.Min.y -= LineHeight * InputsCount++; PortBounds.Min.x -= PortDim.x; } - else if ((Member.IsInput & IsOutputMember) > 0) + else if (MemberIsOutput(Member)) { PortBounds.Min.y -= LineHeight * OutputsCount++; PortBounds.Min.x += NodeWidth; @@ -496,11 +517,10 @@ NodeGraph_Render(panel Panel, rect PanelBounds, render_command_buffer* RenderBuf string TitleString = MakeStringLiteral("Available Nodes"); DrawListElement(TitleString, &List, Mouse, RenderBuffer, State->Interface); - for (u32 i = 0; i < NodeSpecificationsCount; i++) + for (u32 i = 0; i < NodeType_Count; i++) { - node_specification Spec = NodeSpecifications[i]; - string NodeName = MakeString(Spec.Name, Spec.NameLength); - rect ElementBounds = DrawListElement(NodeName, &List, Mouse, RenderBuffer, State->Interface); + node_specification_ Spec = NodeSpecifications[i]; + rect ElementBounds = DrawListElement(Spec.Identifier, &List, Mouse, RenderBuffer, State->Interface); if (MouseButtonTransitionedDown(Mouse.LeftButtonState) && PointIsInRect(Mouse.DownPos, ElementBounds)) diff --git a/src/test_patterns.h b/src/test_patterns.h index d385ece..4215ae0 100644 --- a/src/test_patterns.h +++ b/src/test_patterns.h @@ -5,7 +5,7 @@ // #ifndef TEST_PATTERNS_H -GSMetaTag(node_struct) +GSMetaTag(node_struct); struct solid_color_data { GSMetaTag(node_input); @@ -34,7 +34,7 @@ void SolidColorProc(solid_color_data* Data) } } -GSMetaTag(node_struct) +GSMetaTag(node_struct); struct vertical_color_fade_data { GSMetaTag(node_input); @@ -75,7 +75,7 @@ void VerticalColorFadeProc(vertical_color_fade_data* Data) } // Original -> DiscPatterns.pde : Revolving Discs -GSMetaTag(node_struct) +GSMetaTag(node_struct); struct revolving_discs_data { GSMetaTag(node_input);