This commit is contained in:
Peter Slattery 2021-03-20 21:49:02 -07:00
parent d81b809970
commit e6042b7a01
5 changed files with 116 additions and 65 deletions

View File

@ -157,7 +157,6 @@ struct animation_system
// NOTE(Peter): The frame currently being displayed/processed. you // NOTE(Peter): The frame currently being displayed/processed. you
// can see which frame you're on by looking at the time slider on the timeline // can see which frame you're on by looking at the time slider on the timeline
// panel // panel
animation_handle ActiveAnimationHandle_;
animation_fade_group ActiveFadeGroup; animation_fade_group ActiveFadeGroup;
s32 CurrentFrame; s32 CurrentFrame;
@ -561,7 +560,9 @@ AnimationFadeGroup_Update(animation_fade_group* Group, r32 DeltaTime)
{ {
if (IsValid(Group->To)) if (IsValid(Group->To))
{ {
r32 FadeBefore = Group->FadeElapsed;
Group->FadeElapsed += DeltaTime; Group->FadeElapsed += DeltaTime;
if (Group->FadeElapsed >= Group->FadeDuration) if (Group->FadeElapsed >= Group->FadeDuration)
{ {
AnimationFadeGroup_Advance(Group); AnimationFadeGroup_Advance(Group);

View File

@ -980,7 +980,7 @@ Pattern_Patchy(led_buffer* Leds, assembly Assembly, r32 Time, gs_memory_arena* T
v3 Pp = P.xyz; v3 Pp = P.xyz;
r32 Noise = Fbm3D((Pp / 1000) + (v3{Time, -Time, SinR32(Time)} * 0.1f)); r32 Noise = Fbm3D((Pp / 1000) + (v3{Time, -Time, Time} * 0.01f));
Noise = RemapR32(Noise, -1, 1, 0, 1); Noise = RemapR32(Noise, -1, 1, 0, 1);
Noise = Smoothstep(Noise, 0, 1); Noise = Smoothstep(Noise, 0, 1);
u8 NV = (u8)(Noise * 255); u8 NV = (u8)(Noise * 255);
@ -991,6 +991,7 @@ Pattern_Patchy(led_buffer* Leds, assembly Assembly, r32 Time, gs_memory_arena* T
v4 C = GetColor(&FlowerAColors[0], FLOWER_COLORS_COUNT, Noise); v4 C = GetColor(&FlowerAColors[0], FLOWER_COLORS_COUNT, Noise);
C = C * BNoise; C = C * BNoise;
//Leds->Colors[LedIndex] = V4ToRGBPixel(v4{Noise, Noise, Noise, 1});
Leds->Colors[LedIndex] = V4ToRGBPixel(C); Leds->Colors[LedIndex] = V4ToRGBPixel(C);
//Leds->Colors[LedIndex] = pixel{NV, NV, NV}; //Leds->Colors[LedIndex] = pixel{NV, NV, NV};
} }
@ -1001,11 +1002,13 @@ Pattern_Leafy(led_buffer* Leds, assembly Assembly, r32 Time, gs_memory_arena* Tr
{ {
v4* Colors = &FlowerBColors[0]; v4* Colors = &FlowerBColors[0];
#if 1
for (u32 LedIndex = 0; LedIndex < Leds->LedCount; LedIndex++) for (u32 LedIndex = 0; LedIndex < Leds->LedCount; LedIndex++)
{ {
v4 P = Leds->Positions[LedIndex]; v4 P = Leds->Positions[LedIndex];
r32 RefPos = P.y; // + Noise2D(v2{P.x, P.z} * 10);
#if 0
r32 RefPos = P.y + Noise2D(v2{P.x, P.z} * 10);
v4 C = {}; v4 C = {};
r32 B = 0; r32 B = 0;
@ -1015,18 +1018,19 @@ Pattern_Leafy(led_buffer* Leds, assembly Assembly, r32 Time, gs_memory_arena* Tr
u32 BandCount = 10; u32 BandCount = 10;
for (u32 Band = 0; Band < BandCount; Band++) for (u32 Band = 0; Band < BandCount; Band++)
{ {
r32 BandSeed = RemapR32(Hash1((r32)Band), -1, 1, 0, 1); r32 BandSeed = Hash1((r32)Band);
r32 BandDelay = BandSeed * TransitionPeriod; r32 BandSeedPos = RemapR32(BandSeed, -1, 1, 0, 1);
r32 BandDelay = BandSeedPos * TransitionPeriod;
r32 BandTransitionPeriod = RemapR32(Hash1((r32)Band * 3.413f), -1, 1, 0, 1) * TransitionPeriod; r32 BandTransitionPeriod = RemapR32(Hash1((r32)Band * 3.413f), -1, 1, 0, 1) * TransitionPeriod;
r32 BandOffset = Time + BandDelay; r32 BandOffset = Time + BandDelay;
r32 BandPercent = ModR32(BandOffset, BandTransitionPeriod) / BandTransitionPeriod; r32 BandPercent = ModR32(BandOffset, BandTransitionPeriod) / BandTransitionPeriod;
r32 BandSmoothed = Smoothstep(BandPercent, 0, 1); r32 BandSmoothed = Smoothstep(BandPercent, 0, 1);
r32 BandHeight = 125 - BandPercent * 250; r32 BandHeight = -125 + BandPercent * 250;
r32 BandDist = Abs(RefPos - (BandHeight + BandSeed * 5)); r32 BandDist = Abs(RefPos - BandHeight);
B += Max(0, BandWidth - BandDist); B += Max(0, (BandWidth + BandSeed * 2.5) - BandDist);
} }
B = Clamp(0, B, 1); B = Clamp(0, B, 1);
@ -1039,31 +1043,17 @@ Pattern_Leafy(led_buffer* Leds, assembly Assembly, r32 Time, gs_memory_arena* Tr
GradientB = Clamp(0, GradientB, 1); GradientB = Clamp(0, GradientB, 1);
C = (GradientC * GradientB) + (BandC * B); C = (GradientC * GradientB) + (BandC * B);
#endif
//v4 C = GetColor(&FlowerBColors[0], FLOWER_COLORS_COUNT, 0);
v4 C = v4{ 255, 100, 3 };
C /= 255.f;
//r32 B = Fbm3D(P.xyz / 200);
//C *= B; //C *= B;
if (P.y < 75) {
C = v4{ 139 / 255.f, 69 / 255.f, 19 / 255.f, 1.0f} * .25f;
}
Leds->Colors[LedIndex] = V4ToRGBPixel(C); Leds->Colors[LedIndex] = V4ToRGBPixel(C);
} }
#else
r32 FadeTop = 150;
r32 FadeBottom = -50;
v4 C = GetColor(&FlowerAColors[0], FLOWER_COLORS_COUNT, 0);
for (u32 LedIndex = 0; LedIndex < Leds->LedCount; LedIndex++)
{
v4 P = Leds->Positions[LedIndex];
r32 Brightness = RemapR32(P.y, 200, 0, 1, 0);
Brightness = Clamp(Brightness, 0, 1);
u8 B = (u8)(Brightness * 255);
v4 CB = C * Brightness;
Leds->Colors[LedIndex] = V4ToRGBPixel(CB);
}
#endif
} }
internal void internal void

View File

@ -681,6 +681,12 @@ WinMain (
RenderBuffer.ViewHeight = MainWindow.Height; RenderBuffer.ViewHeight = MainWindow.Height;
Context.DeltaTime = LastFrameSecondsElapsed; Context.DeltaTime = LastFrameSecondsElapsed;
#if 0
gs_string T = PushStringF(Context.ThreadContext.Transient, 256, "%f\n", Context.DeltaTime);
NullTerminate(&T);
OutputDebugStringA(T.Str);
#endif
Context.UpdateAndRender(&Context, InputQueue, &RenderBuffer, &OutputData); Context.UpdateAndRender(&Context, InputQueue, &RenderBuffer, &OutputData);
bool Multithread = true; bool Multithread = true;

View File

@ -223,9 +223,9 @@ BlumenLumen_CustomInit(app_state* State, context Context)
for (u32 i = 0; i < FLOWER_COLORS_COUNT; i++) for (u32 i = 0; i < FLOWER_COLORS_COUNT; i++)
{ {
FlowerAColors[i] = TEMP_Saturate(FlowerAColors[i]); //FlowerAColors[i] = TEMP_Saturate(FlowerAColors[i]);
FlowerBColors[i] = TEMP_Saturate(FlowerBColors[i]); //FlowerBColors[i] = TEMP_Saturate(FlowerBColors[i]);
FlowerCColors[i] = TEMP_Saturate(FlowerCColors[i]); //FlowerCColors[i] = TEMP_Saturate(FlowerCColors[i]);
} }
return Result; return Result;
@ -236,8 +236,11 @@ BlumenLumen_CustomUpdate(gs_data UserData, app_state* State, context* Context)
{ {
blumen_lumen_state* BLState = (blumen_lumen_state*)UserData.Memory; blumen_lumen_state* BLState = (blumen_lumen_state*)UserData.Memory;
MotorTimeElapsed += Context->DeltaTime; bool SendMotorCommand = false;
blumen_packet MotorCommand = {};
#if 0 #if 0
MotorTimeElapsed += Context->DeltaTime;
BLState->TimeElapsed += Context->DeltaTime; BLState->TimeElapsed += Context->DeltaTime;
if (BLState->TimeElapsed > 5) if (BLState->TimeElapsed > 5)
@ -249,10 +252,6 @@ BlumenLumen_CustomUpdate(gs_data UserData, app_state* State, context* Context)
} }
#endif #endif
gs_string BlueString = MakeString("blue");
gs_string GreenString = MakeString("green");
gs_string ILoveYouString = MakeString("i_love_you");
while (MessageQueue_CanRead(&BLState->IncomingMsgQueue)) while (MessageQueue_CanRead(&BLState->IncomingMsgQueue))
{ {
gs_data PacketData = MessageQueue_Read(&BLState->IncomingMsgQueue); gs_data PacketData = MessageQueue_Read(&BLState->IncomingMsgQueue);
@ -262,27 +261,47 @@ BlumenLumen_CustomUpdate(gs_data UserData, app_state* State, context* Context)
case PacketType_PatternCommand: case PacketType_PatternCommand:
{ {
microphone_packet Mic = Packet.MicPacket; microphone_packet Mic = Packet.MicPacket;
u32 NameLen = CStringLength(Mic.AnimationFileName); u32 NameLen = CStringLength(Mic.AnimationFileName);
if (StringEqualsCharArray(BlueString.ConstString, Mic.AnimationFileName, NameLen))
{
State->AnimationSystem.ActiveFadeGroup.From.Index = 0;
}
else if (StringEqualsCharArray(GreenString.ConstString, Mic.AnimationFileName, NameLen))
{
State->AnimationSystem.ActiveFadeGroup.From.Index = 1;
}
else if (StringEqualsCharArray(ILoveYouString.ConstString, Mic.AnimationFileName, NameLen))
{
State->AnimationSystem.ActiveFadeGroup.From.Index = 2;
}
OutputDebugStringA("\nReceived Pattern Packet\n"); for (u32 i = 0; i < PhraseToAnimMapCount; i++)
{
gs_const_string PhraseStr = ConstString(PhraseToAnimMap[i].Phrase);
u32 PhraseIndex = PhraseToAnimMap[i].PatternIndex;
if (StringEqualsCharArray(PhraseStr, Mic.AnimationFileName, NameLen))
{
AnimationFadeGroup_FadeTo(&State->AnimationSystem.ActiveFadeGroup,
animation_handle{(s32)PhraseIndex},
3.0f);
OutputDebugStringA("\nReceived Pattern Packet\n");
{
// DEBUG CODE
u8 MotorState = BLState->LastKnownMotorState.FlowerPositions[0];
if (MotorState == 2) {
OutputDebugStringA("Sending 1\n");
MotorState = 1;
}
else
{
OutputDebugStringA("Sending 1\n");
MotorState = 2;
}
blumen_packet MPacket = {};
MPacket.Type = PacketType_MotorState;
MPacket.MotorPacket.FlowerPositions[0] = MotorState;
MPacket.MotorPacket.FlowerPositions[1] = MotorState;
MPacket.MotorPacket.FlowerPositions[2] = MotorState;
MotorCommand = MPacket;
SendMotorCommand = true;
}
}
}
}break; }break;
case PacketType_MotorState: case PacketType_MotorState:
{ {
motor_packet Motor = Packet.MotorPacket; motor_status_packet Motor = Packet.MotorStatusPacket;
// NOTE(pjs): Python sends multi-byte integers in little endian // NOTE(pjs): Python sends multi-byte integers in little endian
// order. Have to unpack // order. Have to unpack
@ -290,12 +309,12 @@ BlumenLumen_CustomUpdate(gs_data UserData, app_state* State, context* Context)
Motor.Temperature = (T[0] << 8 | Motor.Temperature = (T[0] << 8 |
T[1] << 0); T[1] << 0);
BLState->LastKnownMotorState = Motor; BLState->LastKnownMotorState = Motor.Pos;
gs_string Temp = PushStringF(State->Transient, 256, "\nReceived Motor States: \n\tPos: %d %d %d\n\tErr: %d %d %d\n\tTemp: %d\n\n", gs_string Temp = PushStringF(State->Transient, 256, "\nReceived Motor States: \n\tPos: %d %d %d\n\tErr: %d %d %d\n\tTemp: %d\n\n",
Motor.FlowerPositions[0], Motor.Pos.FlowerPositions[0],
Motor.FlowerPositions[1], Motor.Pos.FlowerPositions[1],
Motor.FlowerPositions[2], Motor.Pos.FlowerPositions[2],
Motor.MotorStatus[0], Motor.MotorStatus[0],
Motor.MotorStatus[1], Motor.MotorStatus[1],
Motor.MotorStatus[2], Motor.MotorStatus[2],
@ -334,6 +353,7 @@ BlumenLumen_CustomUpdate(gs_data UserData, app_state* State, context* Context)
if (MessageQueue_CanWrite(BLState->OutgoingMsgQueue)) if (MessageQueue_CanWrite(BLState->OutgoingMsgQueue))
{ {
#if 0
for (u32 i = 0; i < MotorOpenTimesCount; i++) for (u32 i = 0; i < MotorOpenTimesCount; i++)
{ {
time_range Range = MotorOpenTimes[i]; time_range Range = MotorOpenTimes[i];
@ -347,33 +367,42 @@ BlumenLumen_CustomUpdate(gs_data UserData, app_state* State, context* Context)
r64 NanosSinceLastSend = ((r64)Context->SystemTime_Current.NanosSinceEpoch - (r64)BLState->LastSendTime.NanosSinceEpoch); r64 NanosSinceLastSend = ((r64)Context->SystemTime_Current.NanosSinceEpoch - (r64)BLState->LastSendTime.NanosSinceEpoch);
r64 SecondsSinceLastSend = NanosSinceLastSend / PowR32(10, 8); r64 SecondsSinceLastSend = NanosSinceLastSend / PowR32(10, 8);
SendOpen = SecondsSinceLastSend > 2; //SendOpen = SecondsSinceLastSend > 2;
if (SendOpen) if (SendOpen)
{ {
SendMotorCommand = true;
BLState->LastSendTime = Context->SystemTime_Current; BLState->LastSendTime = Context->SystemTime_Current;
OutputDebugString("Motors: Open\n"); OutputDebugString("Motors: Open\n");
blumen_packet Packet = {}; blumen_packet Packet = {};
Packet.Type = PacketType_MotorState; Packet.Type = PacketType_MotorState;
Packet.MotorPacket.FlowerPositions[0] = 2; Packet.MotorPacket.FlowerPositions[0] = 2;
Packet.MotorPacket.FlowerPositions[1] = 2; Packet.MotorPacket.FlowerPositions[1] = 2;
Packet.MotorPacket.FlowerPositions[2] = 2; Packet.MotorPacket.FlowerPositions[2] = 2;
gs_data Msg = StructToData(&Packet, blumen_packet); MotorCommand = Packet;
MessageQueue_Write(&BLState->OutgoingMsgQueue, Msg);
} }
else if (!CurrTimeInRange && LastTimeInRange) else if (!CurrTimeInRange && LastTimeInRange)
{ {
SendMotorCommand = true;
OutputDebugString("Motors: Close\n"); OutputDebugString("Motors: Close\n");
blumen_packet Packet = {}; blumen_packet Packet = {};
Packet.Type = PacketType_MotorState; Packet.Type = PacketType_MotorState;
Packet.MotorPacket.FlowerPositions[0] = 1; Packet.MotorPacket.FlowerPositions[0] = 1;
Packet.MotorPacket.FlowerPositions[1] = 1; Packet.MotorPacket.FlowerPositions[1] = 1;
Packet.MotorPacket.FlowerPositions[2] = 1; Packet.MotorPacket.FlowerPositions[2] = 1;
gs_data Msg = StructToData(&Packet, blumen_packet); MotorCommand = Packet;
MessageQueue_Write(&BLState->OutgoingMsgQueue, Msg);
} }
} }
#endif
if (SendMotorCommand)
{
gs_data Msg = StructToData(&MotorCommand, blumen_packet);
MessageQueue_Write(&BLState->OutgoingMsgQueue, Msg);
}
} }
// Dim the leds based on temp data // Dim the leds based on temp data
#if DIM_LED_BRIGHTNESS #if DIM_LED_BRIGHTNESS
for (u32 i = 0; i < State->LedSystem.BuffersCount; i++) for (u32 i = 0; i < State->LedSystem.BuffersCount; i++)
@ -387,6 +416,8 @@ BlumenLumen_CustomUpdate(gs_data UserData, app_state* State, context* Context)
Color->B = Color->B * BLState->BrightnessPercent; Color->B = Color->B * BLState->BrightnessPercent;
} }
} }
// TODO(pjs): dim stem to 50%
#endif #endif
// Send Status Packet // Send Status Packet

View File

@ -18,6 +18,11 @@ enum bl_python_packet_type
typedef struct motor_packet typedef struct motor_packet
{ {
u8 FlowerPositions[3]; u8 FlowerPositions[3];
} motor_packet;
typedef struct motor_status_packet
{
motor_packet Pos;
/* /*
u8 Motor1Pos; u8 Motor1Pos;
u8 Motor2Pos; u8 Motor2Pos;
@ -26,7 +31,7 @@ u8 Motor3Pos;
u8 MotorStatus[3]; u8 MotorStatus[3];
u16 Temperature; u16 Temperature;
} motor_packet; } motor_status_packet;
typedef struct microphone_packet typedef struct microphone_packet
{ {
@ -66,6 +71,7 @@ typedef struct blumen_packet
union union
{ {
motor_packet MotorPacket; motor_packet MotorPacket;
motor_status_packet MotorStatusPacket;
microphone_packet MicPacket; microphone_packet MicPacket;
temp_packet TempPacket; temp_packet TempPacket;
status_packet StatusPacket; status_packet StatusPacket;
@ -121,6 +127,23 @@ global time_range MotorOpenTimes[] = {
}; };
global u32 MotorOpenTimesCount = 3; global u32 MotorOpenTimesCount = 3;
struct phrase_string_to_anim_file
{
char* Phrase;
u32 PatternIndex;
};
phrase_string_to_anim_file PhraseToAnimMap[] = {
{ "begonia", 0},
{ "hyacinth", 1 },
{ "tulip", 1 },
{ "calla lilly", 0 },
{ "sunflower", 1 },
{ "salvia", 2 },
{ "freesia", 2 },
};
u32 PhraseToAnimMapCount = sizeof(PhraseToAnimMap) / sizeof(PhraseToAnimMap[0]);
struct blumen_lumen_state struct blumen_lumen_state
{ {
bool Running; bool Running;