updated sculpture file parsing

This commit is contained in:
Peter Slattery 2020-01-13 17:04:40 -08:00
parent 0164fea691
commit af68881e04
11 changed files with 277 additions and 31 deletions

23
data/test_meta.cpp Normal file
View File

@ -0,0 +1,23 @@
struct hello_struct_t
{
const int x;
float* y;
char hello;
};
union Vector
{
struct {
int X;
int Y;
int Z;
};
int E[3];
};
struct test_def;
int main (int ArgCount, char* Args[])
{
return 0;
}

View File

@ -1,3 +1,3 @@
@echo off
remedybg build\remedy_win32_foldhaus.rdbg
remedybg build\debug_lumenarium.rdbg

View File

@ -15,6 +15,7 @@ blacklist_patterns = {
load_paths_base = {
{ "src", .relative = true, .recursive = true, },
{ "meta", .relative = true, .recursive = true, },
{ "C:\programs-dev\gs_libs\src", .relative = false, .recursive = true, }
};
load_paths = {
{ load_paths_base, .os = "win", },
@ -39,5 +40,5 @@ command_list = {
{ "build/main.exe" , .os = "linux" },
{ "build/main.exe" , .os = "mac" }, }, },
};
fkey_command[1] = "build";
fkey_command[2] = "run";
fkey_command[1] = "build_application";
fkey_command[2] = "build_meta";

View File

@ -86,6 +86,7 @@ ParseAssemblyVector (char* String)
internal void
ParseAssemblyFileHeader (assembly_definition* Assembly, tokenizer* Tokenizer)
{
if (CharArraysEqualUpToLength(Tokenizer->At, LED_STRIP_COUNT_IDENTIFIER, CharArrayLength(LED_STRIP_COUNT_IDENTIFIER)))
{
Tokenizer->At += CharArrayLength(LED_STRIP_COUNT_IDENTIFIER);
@ -213,21 +214,237 @@ ParseAssemblyFileBody (assembly_definition* Assembly, tokenizer* Tokenizer)
Assert(Assembly->LEDStripCount == Assembly->LEDStripSize);
}
inline b32
ParseTokenEquals (tokenizer* T, char* Validate)
{
b32 Result = true;
char* TAt = T->At;
char* VAt = Validate;
while (((TAt - T->Memory) < T->MemoryLength) && *VAt)
{
if (*VAt != *TAt)
{
Result = false;
break;
}
TAt++;
*VAt++;
}
if (Result)
{
T->At = TAt;
EatWhitespace(T);
}
return Result;
}
internal b32
ParseComma(tokenizer* T)
{
b32 Result = ParseTokenEquals(T, ",");
return Result;
}
internal b32
ParseOpenCurlyBrace(tokenizer* T)
{
b32 Result = ParseTokenEquals(T, "{");
return Result;
}
internal b32
ParseCloseCurlyBrace(tokenizer* T)
{
b32 Result = ParseTokenEquals(T, "}");
return Result;
}
internal b32
ParseOpenParen(tokenizer* T)
{
b32 Result = ParseTokenEquals(T, "(");
return Result;
}
internal b32
ParseCloseParen(tokenizer* T)
{
b32 Result = ParseTokenEquals(T, ")");
return Result;
}
internal b32
ParseUnsignedInteger(tokenizer* T, u32* Value)
{
parse_result Result = ParseUnsignedIntUnsafe(T->At);
*Value = Result.UnsignedIntValue;
T->At = Result.OnePastLast;
// TODO(Peter): Parse functions in gs_string don't actually check for errors or
// whether or not they actually parsed an int.
// :GSStringParseErrors
return true;
}
internal b32
ParseFloat(tokenizer* T, r32* Value)
{
parse_result ParseResult = ParseFloatUnsafe(T->At);
*Value = ParseResult.FloatValue;
T->At = ParseResult.OnePastLast;
// TODO(Peter):
// :GSStringParseErrors
return true;
}
internal b32
ParseVector(tokenizer* T, v3* Value)
{
b32 Result = true;
if (ParseOpenParen(T))
{
for (u32 i = 0; i < 3; i++)
{
b32 ValueSuccess = ParseFloat(T, &(Value->E[i]));
if (!ValueSuccess)
{
Result = false;
break;
}
b32 CommaSuccess = ParseComma(T);
if (!CommaSuccess)
{
break;
}
}
if (!ParseCloseParen(T))
{
Result = false;
}
}
else
{
Result = false;
}
return Result;
}
// TODO(Peter): Error reporting
#define ParseLEDStripToken(tokenizer, parse_expr, error_msg) \
(parse_expr) && (ParseComma(tokenizer))
internal b32
ParseLEDStripCount (tokenizer* T, u32* Value)
{
b32 Result = false;
if (ParseTokenEquals(T, LED_STRIP_COUNT_IDENTIFIER))
{
EatWhitespace(T);
if (ParseUnsignedInteger(T, Value))
{
Result = true;
}
}
return Result;
}
internal b32
ParseLEDStrip (led_strip_definition* Strip, tokenizer* T, memory_arena* Arena)
{
b32 Result = false;
if (ParseTokenEquals(T, LED_STRIP_IDENTIFIER) &&
ParseOpenCurlyBrace(T))
{
Result = true;
u32 ControlBoxIndex, StartUniverse, StartChannel;
ParseLEDStripToken(T, ParseUnsignedInteger(T, &Strip->ControlBoxID), "Control Box Error");
ParseLEDStripToken(T, ParseUnsignedInteger(T, &Strip->StartUniverse), "Start Universe Error");
ParseLEDStripToken(T, ParseUnsignedInteger(T, &Strip->StartChannel), "Start Channel Error");
if (ParseTokenEquals(T, INTERPOLATE_POINTS_IDENTIFIER) &&
ParseComma(T))
{
Strip->InterpolationType = StripInterpolate_Points;
ParseLEDStripToken(T, ParseVector(T, &Strip->InterpolatePositionStart), "Position Start Error");
ParseLEDStripToken(T, ParseVector(T, &Strip->InterpolatePositionEnd), "Position End Error");
}
ParseLEDStripToken(T, ParseUnsignedInteger(T, &Strip->LEDsPerStrip), "LEDs Per Strip Error");
EatWhitespace(T);
if (!ParseCloseCurlyBrace(T))
{
Result = false;
}
}
return Result;
}
internal assembly_definition
ParseAssemblyFile (u8* FileBase, s32 FileSize, memory_arena* Arena)
{
assembly_definition AssemblyDefinition = {};
assembly_definition Assembly = {};
tokenizer AssemblyFileTokenizer = {};
AssemblyFileTokenizer.At = (char*)FileBase;
AssemblyFileTokenizer.Memory = (char*)FileBase;
AssemblyFileTokenizer.MemoryLength = FileSize;
tokenizer Tokenizer = {};
Tokenizer.At = (char*)FileBase;
Tokenizer.Memory = (char*)FileBase;
Tokenizer.MemoryLength = FileSize;
ParseAssemblyFileHeader(&AssemblyDefinition, &AssemblyFileTokenizer);
AssemblyDefinition.LEDStrips = PushArray(Arena, led_strip_definition, AssemblyDefinition.LEDStripSize);
ParseAssemblyFileBody(&AssemblyDefinition, &AssemblyFileTokenizer);
if (ParseLEDStripCount(&Tokenizer, &Assembly.LEDStripSize))
{
Assembly.LEDStrips = PushArray(Arena, led_strip_definition, Assembly.LEDStripSize);
while (AtValidPosition(Tokenizer))
{
EatWhitespace(&Tokenizer);
if (Assembly.LEDStripCount < Assembly.LEDStripSize)
{
led_strip_definition* LEDStrip = Assembly.LEDStrips + Assembly.LEDStripCount++;
if (ParseLEDStrip(LEDStrip, &Tokenizer, Arena))
{
Assembly.TotalLEDCount += LEDStrip->LEDsPerStrip;
}
else
{
InvalidCodePath;
}
}
else
{
if (ParseTokenEquals(&Tokenizer, END_ASSEMBLY_FILE_IDENTIFIER))
{
break;
}
else
{
InvalidCodePath;
}
}
}
}
else
{
// TODO(Peter): Error reporting
InvalidCodePath;
}
return AssemblyDefinition;
return Assembly;
}
#define ASSEMBLY_PARSER_CPP

View File

@ -47,23 +47,28 @@ enum strip_interpolation_type
struct led_strip_definition
{
s32 ControlBoxID;
s32 StartUniverse, StartChannel;
u32 ControlBoxID;
u32 StartUniverse;
u32 StartChannel;
strip_interpolation_type InterpolationType;
// Interpolate Boxes
s32 StartBoxIndex, EndBoxIndex;
u32 StartBoxIndex;
u32 EndBoxIndex;
// Interpolate Positions
v3 InterpolatePositionStart, InterpolatePositionEnd;
v3 InterpolatePositionStart;
v3 InterpolatePositionEnd;
// Universal Interpolation
s32 LEDsPerStrip;
u32 LEDsPerStrip;
};
struct assembly_definition
{
s32 LEDStripSize;
s32 LEDStripCount;
s32 TotalLEDCount;
u32 LEDStripSize;
u32 LEDStripCount;
u32 TotalLEDCount;
led_strip_definition* LEDStrips;
};

View File

@ -269,7 +269,7 @@ CreateDMXBuffers(assembly Assembly, s32 BufferHeaderSize, memory_arena* Arena)
s32 BufferSize = BufferHeaderSize + 512;
for (s32 Range = 0; Range < Assembly.LEDUniverseMapCount; Range++)
for (u32 Range = 0; Range < Assembly.LEDUniverseMapCount; Range++)
{
leds_in_universe_range LEDUniverseRange = Assembly.LEDUniverseMap[Range];

View File

@ -87,7 +87,7 @@ internal void OpenColorPicker(app_state* State, v4* Address);
internal void
TestPatternOne(assembly* Assembly, r32 Time)
{
for (s32 Range = 0; Range < Assembly->LEDUniverseMapCount; Range++)
for (u32 Range = 0; Range < Assembly->LEDUniverseMapCount; Range++)
{
leds_in_universe_range LEDUniverseRange = Assembly->LEDUniverseMap[Range];
for (s32 LEDIdx = LEDUniverseRange.RangeStart;
@ -122,7 +122,7 @@ TestPatternTwo(assembly* Assembly, r32 Time)
r32 OuterRadiusSquared = 1000000;
r32 InnerRadiusSquared = 0;
for (s32 Range = 0; Range < Assembly->LEDUniverseMapCount; Range++)
for (u32 Range = 0; Range < Assembly->LEDUniverseMapCount; Range++)
{
leds_in_universe_range LEDUniverseRange = Assembly->LEDUniverseMap[Range];
for (s32 LEDIdx = LEDUniverseRange.RangeStart;
@ -173,7 +173,7 @@ TestPatternThree(assembly* Assembly, r32 Time)
r32 BluePosition = -BlueSize + (Time * 25);
r32 RedPosition = (100 + RedSize) + (Time * -35);
for (s32 Range = 0; Range < Assembly->LEDUniverseMapCount; Range++)
for (u32 Range = 0; Range < Assembly->LEDUniverseMapCount; Range++)
{
leds_in_universe_range LEDUniverseRange = Assembly->LEDUniverseMap[Range];
for (s32 LEDIdx = LEDUniverseRange.RangeStart;

View File

@ -37,7 +37,7 @@ ConstructAssemblyFromDefinition (assembly_definition Definition,
Assembly.LEDUniverseMap = PushArray(&Assembly.Arena, leds_in_universe_range, Definition.LEDStripCount);
// Add LEDs
for (s32 StripIdx = 0; StripIdx < Definition.LEDStripCount; StripIdx++)
for (u32 StripIdx = 0; StripIdx < Definition.LEDStripCount; StripIdx++)
{
led_strip_definition StripDef = Definition.LEDStrips[StripIdx];

View File

@ -36,11 +36,11 @@ struct assembly
string Name;
string FilePath;
s32 LEDCount;
u32 LEDCount;
pixel* Colors;
led* LEDs;
s32 LEDUniverseMapCount;
u32 LEDUniverseMapCount;
leds_in_universe_range* LEDUniverseMap;
};

View File

@ -36,7 +36,7 @@ PANEL_RENDER_PROC(HierarchyView_Render)
};
v2 TextOffset = v2{10, 4};
string TempString = MakeString(PushArray(&State->Transient, char, 256), 256);
string TempString = MakeString(PushArray(&State->Transient, char, 256), 0, 256);
u32 LineCount = (u32)(PanelHeight / List.ListElementDimensions.y) + 1;
for (u32 i = 0; i < LineCount; i++)

View File

@ -141,16 +141,16 @@ PANEL_RENDER_PROC(SculptureView_Render)
m44 FaceCameraMatrix = GetLookAtMatrix(v4{0, 0, 0, 1}, V4(State->Camera.Position, 1));
FaceCameraMatrix = FaceCameraMatrix;
s32 MaxLEDsPerJob = 2048;
u32 MaxLEDsPerJob = 2048;
render_quad_batch_constructor RenderLEDsBatch = PushRenderQuad3DBatch(RenderBuffer, State->TotalLEDsCount);
for (u32 i = 0; i < State->ActiveAssemblyIndecies.Used; i++)
{
gs_list_handle AssemblyHandle = *State->ActiveAssemblyIndecies.GetElementAtIndex(i);
assembly Assembly = *State->AssemblyList.GetElementWithHandle(AssemblyHandle);
s32 JobsNeeded = IntegerDivideRoundUp(Assembly.LEDCount, MaxLEDsPerJob);
u32 JobsNeeded = IntegerDivideRoundUp(Assembly.LEDCount, MaxLEDsPerJob);
for (s32 Job = 0; Job < JobsNeeded; Job++)
for (u32 Job = 0; Job < JobsNeeded; Job++)
{
draw_leds_job_data* JobData = PushStruct(&State->Transient, draw_leds_job_data);
JobData->LEDs = Assembly.LEDs;