From f45be27edcac157f8683796dafca93db71985cd0 Mon Sep 17 00:00:00 2001 From: PS Date: Thu, 8 Apr 2021 10:07:41 -1000 Subject: [PATCH] Fixed some CSV parsing errors and implemented white and black colors --- src/app/foldhaus_app.h | 2 +- src/app/patterns/blumen_patterns.h | 35 +++--- src/app/ss_blumen_lumen/blumen_lumen.cpp | 12 ++- .../ss_blumen_lumen/blumen_lumen_settings.h | 4 +- src/app/ss_blumen_lumen/phrase_hue_map.h | 102 +++++++++++++----- 5 files changed, 107 insertions(+), 48 deletions(-) diff --git a/src/app/foldhaus_app.h b/src/app/foldhaus_app.h index 4123248..9d9e857 100644 --- a/src/app/foldhaus_app.h +++ b/src/app/foldhaus_app.h @@ -42,6 +42,7 @@ typedef struct panel panel; #include "engine/animation/foldhaus_animation_renderer.cpp" #include "engine/user_space.h" +#include "ss_blumen_lumen/gfx_math.h" #include "ss_blumen_lumen/phrase_hue_map.h" #include "ss_blumen_lumen/blumen_lumen.h" @@ -95,7 +96,6 @@ LoadAssembly(gs_const_string Path, app_state* State, context Context) #include "engine/user_space.cpp" -#include "ss_blumen_lumen/gfx_math.h" #include "ss_blumen_lumen/sdf.h" #include "patterns/blumen_patterns.h" #include "ss_blumen_lumen/blumen_lumen.cpp" diff --git a/src/app/patterns/blumen_patterns.h b/src/app/patterns/blumen_patterns.h index 7362394..b325d25 100644 --- a/src/app/patterns/blumen_patterns.h +++ b/src/app/patterns/blumen_patterns.h @@ -127,9 +127,9 @@ Pattern_BasicFlowers(led_buffer* Leds, led_buffer_range Range, assembly Assembly Time = Time * BLState->PatternSpeed; phrase_hue Hue = BLState->AssemblyColors[Assembly.AssemblyIndex % 3]; - v4 C0 = HSVToRGB({Hue.Hue0, 1, 1, 1}); - v4 C1 = HSVToRGB({Hue.Hue1, 1, 1, 1}); - v4 C2 = HSVToRGB({Hue.Hue2, 1, 1, 1}); + v4 C0 = RGBFromPhraseHue(Hue.Hue0); + v4 C1 = RGBFromPhraseHue(Hue.Hue1); + v4 C2 = RGBFromPhraseHue(Hue.Hue2); for (u32 StripIndex = 0; StripIndex < Assembly.StripCount; StripIndex++) { @@ -166,9 +166,9 @@ Pattern_Wavy(led_buffer* Leds, led_buffer_range Range, assembly Assembly, r32 Ti Time = Time * BLState->PatternSpeed; phrase_hue Hue = BlumenLumen_GetCurrentHue(BLState, Assembly); - v4 C0 = HSVToRGB({Hue.Hue0, 1, 1, 1}); - v4 C1 = HSVToRGB({Hue.Hue1, 1, 1, 1}); - v4 C2 = HSVToRGB({Hue.Hue2, 1, 1, 1}); + v4 C0 = RGBFromPhraseHue(Hue.Hue0); + v4 C1 = RGBFromPhraseHue(Hue.Hue1); + v4 C2 = RGBFromPhraseHue(Hue.Hue2); r32 Top = 120 + (SinR32(Time) * 10); r32 Mid = 70 + (CosR32(Time * 2.13) * 20); @@ -228,8 +228,9 @@ Pattern_Patchy(led_buffer* Leds, led_buffer_range Range, assembly Assembly, r32 Time = Time * BLState->PatternSpeed; phrase_hue Hue = BlumenLumen_GetCurrentHue(BLState, Assembly); - v4 C0 = HSVToRGB({Hue.Hue0, 1, 1, 1}); - v4 C1 = HSVToRGB({Hue.Hue1, 1, 1, 1}); + v4 C0 = RGBFromPhraseHue(Hue.Hue0); + v4 C1 = RGBFromPhraseHue(Hue.Hue1); + v4 C2 = RGBFromPhraseHue(Hue.Hue2); for (u32 LedIndex = Range.First; LedIndex < Range.OnePastLast; LedIndex++) { @@ -290,9 +291,9 @@ Pattern_Leafy(led_buffer* Leds, led_buffer_range Range, assembly Assembly, r32 T Time = Time * BLState->PatternSpeed; phrase_hue Hue = BlumenLumen_GetCurrentHue(BLState, Assembly); - v4 C0 = HSVToRGB({Hue.Hue0, 1, 1, 1}); - v4 C1 = HSVToRGB({Hue.Hue1, 1, 1, 1}); - v4 C2 = HSVToRGB({Hue.Hue2, 1, 1, 1}); + v4 C0 = RGBFromPhraseHue(Hue.Hue0); + v4 C1 = RGBFromPhraseHue(Hue.Hue1); + v4 C2 = RGBFromPhraseHue(Hue.Hue2); for (u32 LedIndex = Range.First; LedIndex < Range.OnePastLast; LedIndex++) { @@ -326,9 +327,9 @@ Pattern_LeafyPatchy(led_buffer* Leds, led_buffer_range Range, assembly Assembly, Time = Time * BLState->PatternSpeed; phrase_hue Hue = BlumenLumen_GetCurrentHue(BLState, Assembly); - v4 C0 = HSVToRGB({Hue.Hue0, 1, 1, 1}); - v4 C1 = HSVToRGB({Hue.Hue1, 1, 1, 1}); - v4 C2 = HSVToRGB({Hue.Hue2, 1, 1, 1}); + v4 C0 = RGBFromPhraseHue(Hue.Hue0); + v4 C1 = RGBFromPhraseHue(Hue.Hue1); + v4 C2 = RGBFromPhraseHue(Hue.Hue2); for (u32 LedIndex = Range.First; LedIndex < Range.OnePastLast; LedIndex++) { @@ -609,9 +610,9 @@ Pattern_VoicePattern(led_buffer* Leds, led_buffer_range Range, assembly Assembly Time = Time * BLState->PatternSpeed; phrase_hue Hue = BlumenLumen_GetCurrentHue(BLState, Assembly); - v4 C0 = HSVToRGB({Hue.Hue0, 1, 1, 1}); - v4 C1 = HSVToRGB({Hue.Hue1, 1, 1, 1}); - v4 C2 = HSVToRGB({Hue.Hue2, 1, 1, 1}); + v4 C0 = RGBFromPhraseHue(Hue.Hue0); + v4 C1 = RGBFromPhraseHue(Hue.Hue1); + v4 C2 = RGBFromPhraseHue(Hue.Hue2); for (u32 LedIndex = Range.First; LedIndex < Range.OnePastLast; LedIndex++) { diff --git a/src/app/ss_blumen_lumen/blumen_lumen.cpp b/src/app/ss_blumen_lumen/blumen_lumen.cpp index e807938..a257bf4 100644 --- a/src/app/ss_blumen_lumen/blumen_lumen.cpp +++ b/src/app/ss_blumen_lumen/blumen_lumen.cpp @@ -380,10 +380,14 @@ BlumenLumen_CustomInit(app_state* State, context Context) BLState->ModeAnimations[BlumenPattern_VoiceCommand] = LoadAllAnimationsInDir(VoicePatternFolder, BLState, State, Context); AnimationSystem_LoadAnimationFromFile(&State->AnimationSystem, State->Patterns, Context, ConstString("data/blumen_animations/anim_demo.foldanim")); - BlumenLumen_SetPatternMode(BlumenPattern_VoiceCommand, 5, &State->AnimationSystem, BLState); + BlumenLumen_SetPatternMode(BlumenPattern_Standard, 5, &State->AnimationSystem, BLState); #endif State->AnimationSystem.TimelineShouldAdvance = true; + BLState->StandardPatternHues.Hue0.Flags = Hue_Value; + BLState->StandardPatternHues.Hue1.Flags = Hue_Value; + BLState->StandardPatternHues.Hue2.Flags = Hue_Value; + BlumenLumen_AppendBootupLog(State, BLState, Context); return Result; } @@ -510,9 +514,9 @@ BlumenLumen_CustomUpdate(gs_data UserData, app_state* State, context* Context) r32 ColorRelOscSpeed = 1 * ColorSpeed;; r32 ColorOscillation = (SinR32(BaseTime * ColorOscSpeed) + 1) / 2; r32 ColorRelationship = 30 + (((1 + SinR32(BaseTime * ColorRelOscSpeed)) / 2) * 300); - BLState->StandardPatternHues.Hue0 = ModR32(ColorOscillation * 360, 360); - BLState->StandardPatternHues.Hue1 = ModR32(BaseTime + ColorRelationship, 360); - BLState->StandardPatternHues.Hue2 = LerpR32(.3f, BLState->StandardPatternHues.Hue0, BLState->StandardPatternHues.Hue1); + BLState->StandardPatternHues.Hue0.Hue = ModR32(ColorOscillation * 360, 360); + BLState->StandardPatternHues.Hue1.Hue = ModR32(BaseTime + ColorRelationship, 360); + BLState->StandardPatternHues.Hue2.Hue = LerpR32(.3f, BLState->StandardPatternHues.Hue0.Hue, BLState->StandardPatternHues.Hue1.Hue); // Transition back to standard mode after some time if (BLState->PatternMode == BlumenPattern_VoiceCommand) diff --git a/src/app/ss_blumen_lumen/blumen_lumen_settings.h b/src/app/ss_blumen_lumen/blumen_lumen_settings.h index 3fbefc3..b7d7aa7 100644 --- a/src/app/ss_blumen_lumen/blumen_lumen_settings.h +++ b/src/app/ss_blumen_lumen/blumen_lumen_settings.h @@ -16,8 +16,8 @@ gs_const_string Flower2AssemblyPath = ConstString("data/ss_blumen_three.fold"); // The path to the phrase map CSV. Can be an absolute path, or relative // to the app_run_tree folder -gs_const_string PhraseMapCSVPath = ConstString("data/flower_codes.csv"); -char PhraseMapCSVSeparator = ','; +gs_const_string PhraseMapCSVPath = ConstString("data/flower_codes.tsv"); +char PhraseMapCSVSeparator = '\t'; // Search Strings for which folders to find ambient animation files and // voice animation files in. diff --git a/src/app/ss_blumen_lumen/phrase_hue_map.h b/src/app/ss_blumen_lumen/phrase_hue_map.h index 0d7d66c..29390be 100644 --- a/src/app/ss_blumen_lumen/phrase_hue_map.h +++ b/src/app/ss_blumen_lumen/phrase_hue_map.h @@ -3,58 +3,112 @@ #ifndef PHRASE_HUE_MAP_H #define PHRASE_HUE_MAP_H +enum p_hue_flag +{ + Hue_Value = 0, + Hue_White = 1, + Hue_Black = 2, +}; + +typedef struct p_hue +{ + r64 Hue; + p_hue_flag Flags; +} p_hue; + typedef struct phrase_hue_map { + u64 CountMax; u64 Count; gs_const_string* Phrases; u64* PhraseHashes; - r32* Hue0; - r32* Hue1; - r32* Hue2; + p_hue* Hue0; + p_hue* Hue1; + p_hue* Hue2; } phrase_hue_map; typedef struct phrase_hue { gs_const_string Phrase; u64 PhraseHash; - r32 Hue0; - r32 Hue1; - r32 Hue2; + p_hue Hue0; + p_hue Hue1; + p_hue Hue2; } phrase_hue; +internal p_hue +CreateHueFromString(gs_const_string Str) +{ + p_hue Result = {}; + if (Str.Str[0] == 'b') { + Result.Flags = Hue_Black; + } else if (Str.Str[0] == 'w') { + Result.Flags = Hue_White; + } else { + Result.Flags = Hue_Value; + Result.Hue = (r64)ParseFloat(Str); + } + return Result; +} + +internal v4 +RGBFromPhraseHue (p_hue H) +{ + v4 Result = {}; + switch (H.Flags) + { + case Hue_Black: { Result = v4{1, 0, 0, 1}; } break; + case Hue_White: { Result = v4{1, 0, 1, 1}; } break; + case Hue_Value: { Result = v4{(r32)H.Hue, 1, 1, 1}; } break; + InvalidDefaultCase; + } + Result = HSVToRGB(Result); + return Result; +} + internal phrase_hue_map PhraseHueMap_GenFromCSV(gscsv_sheet Sheet, gs_memory_arena* Arena) { phrase_hue_map Result = {}; - Result.Count = Sheet.RowCount - 1; // we don't include the header row - Result.Phrases = PushArray(Arena, gs_const_string, Result.Count); - Result.PhraseHashes = PushArray(Arena, u64, Result.Count); - Result.Hue0 = PushArray(Arena, r32, Result.Count); - Result.Hue1 = PushArray(Arena, r32, Result.Count); - Result.Hue2 = PushArray(Arena, r32, Result.Count); + Result.CountMax = Sheet.RowCount - 1; // we don't include the header row + Result.Phrases = PushArray(Arena, gs_const_string, Result.CountMax); + Result.PhraseHashes = PushArray(Arena, u64, Result.CountMax); + Result.Hue0 = PushArray(Arena, p_hue, Result.CountMax); + Result.Hue1 = PushArray(Arena, p_hue, Result.CountMax); + Result.Hue2 = PushArray(Arena, p_hue, Result.CountMax); + s32 DestOffset = 0; for (u32 Row = 1; Row < Sheet.RowCount; Row++) { - u32 Index = Row - 1; + s32 Index = (Row - 1) - DestOffset; + Assert(Index >= 0 && Index < Result.CountMax); + gs_const_string Phrase = CSVSheet_GetCell(Sheet, 0, Row); u64 PhraseHash = HashDJB2ToU32(StringExpand(Phrase)); - gs_const_string Hue0Str = CSVSheet_GetCell(Sheet, - 1, Row); - gs_const_string Hue1Str = CSVSheet_GetCell(Sheet, - 2, Row); - gs_const_string Hue2Str = CSVSheet_GetCell(Sheet, - 3, Row); - gs_const_string Homonyms = CSVSheet_GetCell(Sheet, - 4, Row); + + gs_const_string Hue0Str = CSVSheet_GetCell(Sheet, 1, Row); + gs_const_string Hue1Str = CSVSheet_GetCell(Sheet, 2, Row); + gs_const_string Hue2Str = CSVSheet_GetCell(Sheet, 3, Row); + gs_const_string Homonyms = CSVSheet_GetCell(Sheet, 4, Row); + if (Phrase.Length == 0 || + Hue0Str.Length == 0 || + Hue1Str.Length == 0 || + Hue2Str.Length == 0) + { + DestOffset++; + continue; + } Result.Phrases[Index] = PushStringF(Arena, Phrase.Length, "%S", Phrase).ConstString; Result.PhraseHashes[Index] = PhraseHash; - Result.Hue0[Index] = (r64)ParseFloat(Hue0Str); - Result.Hue1[Index] = (r64)ParseFloat(Hue1Str); - Result.Hue2[Index] = (r64)ParseFloat(Hue2Str); + Result.Hue0[Index] = CreateHueFromString(Hue0Str); + Result.Hue1[Index] = CreateHueFromString(Hue1Str); + Result.Hue2[Index] = CreateHueFromString(Hue2Str); } + Result.Count = Result.CountMax + DestOffset; + return Result; }