2019-07-19 20:56:21 +00:00
|
|
|
NODE_STRUCT(float_value_data)
|
|
|
|
{
|
|
|
|
NODE_IN(r32, Value);
|
|
|
|
NODE_OUT(r32, Result);
|
|
|
|
};
|
|
|
|
|
|
|
|
NODE_PROC(FloatValueProc, float_value_data)
|
|
|
|
{
|
|
|
|
Data->Result = Data->Value;
|
|
|
|
}
|
|
|
|
|
|
|
|
NODE_STRUCT(solid_color_data)
|
|
|
|
{
|
|
|
|
NODE_IN(v4, Color);
|
|
|
|
NODE_COLOR_BUFFER_INOUT;
|
|
|
|
};
|
|
|
|
|
|
|
|
NODE_PROC(SolidColorProc, solid_color_data)
|
|
|
|
{
|
2019-08-03 23:40:20 +00:00
|
|
|
u8 R = (u8)GSClamp(0.f, (Data->Color.r * 255), 255.f);
|
|
|
|
u8 G = (u8)GSClamp(0.f, (Data->Color.g * 255), 255.f);
|
|
|
|
u8 B = (u8)GSClamp(0.f, (Data->Color.b * 255), 255.f);
|
2019-07-19 20:56:21 +00:00
|
|
|
|
|
|
|
led* LED = Data->LEDs;
|
|
|
|
for (s32 l = 0; l < Data->LEDCount; l++)
|
|
|
|
{
|
|
|
|
Assert(LED->Index >= 0 && LED->Index < Data->LEDCount);
|
|
|
|
|
|
|
|
Data->Colors[LED->Index].R = R;
|
|
|
|
Data->Colors[LED->Index].G = G;
|
|
|
|
Data->Colors[LED->Index].B = B;
|
|
|
|
LED++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-08-03 23:40:20 +00:00
|
|
|
NODE_STRUCT(sin_wave_data)
|
|
|
|
{
|
|
|
|
NODE_IN(r32, Period);
|
|
|
|
NODE_IN(r32, Min);
|
|
|
|
NODE_IN(r32, Max);
|
|
|
|
NODE_OUT(r32, Result);
|
|
|
|
|
|
|
|
r32 Accumulator;
|
|
|
|
};
|
|
|
|
|
|
|
|
NODE_PROC(SinWaveProc, sin_wave_data)
|
|
|
|
{
|
|
|
|
Data->Accumulator += DeltaTime;
|
|
|
|
if (Data->Period > 0)
|
|
|
|
{
|
|
|
|
while (Data->Accumulator > Data->Period)
|
|
|
|
{
|
|
|
|
Data->Accumulator -= Data->Period;
|
|
|
|
}
|
|
|
|
|
|
|
|
r32 ActualMin = GSMin(Data->Min, Data->Max);
|
|
|
|
r32 ActualMax = GSMax(Data->Min, Data->Max);
|
|
|
|
r32 SinResult = GSSin((Data->Accumulator / Data->Period) * PI * 2);
|
|
|
|
Data->Result = GSRemap(SinResult, -1.f, 1.f, ActualMin, ActualMax);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Data->Result = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
NODE_STRUCT(vector_data)
|
|
|
|
{
|
|
|
|
NODE_IN(r32, X);
|
|
|
|
NODE_IN(r32, Y);
|
|
|
|
NODE_IN(r32, Z);
|
|
|
|
NODE_IN(r32, W);
|
|
|
|
NODE_OUT(v4, Result);
|
|
|
|
};
|
|
|
|
|
|
|
|
NODE_PROC(VectorProc, vector_data)
|
|
|
|
{
|
|
|
|
Data->Result = v4{Data->X, Data->Y, Data->Z, Data->W};
|
|
|
|
}
|
|
|
|
|
2019-07-19 20:56:21 +00:00
|
|
|
NODE_STRUCT(multiply_patterns_data)
|
|
|
|
{
|
|
|
|
NODE_COLOR_BUFFER_IN(A);
|
|
|
|
NODE_COLOR_BUFFER_IN(B);
|
|
|
|
NODE_COLOR_BUFFER_OUT(Result);
|
|
|
|
};
|
|
|
|
|
|
|
|
NODE_PROC(MultiplyPatterns, multiply_patterns_data)
|
|
|
|
{
|
|
|
|
led* LED = Data->ResultLEDs;
|
|
|
|
for (s32 l = 0; l < Data->ResultLEDCount; l++)
|
|
|
|
{
|
|
|
|
Assert(LED->Index >= 0 && LED->Index < Data->ResultLEDCount);
|
|
|
|
|
2019-08-03 23:40:20 +00:00
|
|
|
s32 AR = Data->AColors[LED->Index].R;
|
|
|
|
s32 AG = Data->AColors[LED->Index].G;
|
|
|
|
s32 AB = Data->AColors[LED->Index].B;
|
2019-08-03 22:08:19 +00:00
|
|
|
|
2019-08-03 23:40:20 +00:00
|
|
|
s32 BR = Data->BColors[LED->Index].R;
|
|
|
|
s32 BG = Data->BColors[LED->Index].G;
|
|
|
|
s32 BB = Data->BColors[LED->Index].B;
|
2019-08-03 22:08:19 +00:00
|
|
|
|
2019-08-03 23:40:20 +00:00
|
|
|
s32 RCombined = (AR * BR) / 255;
|
|
|
|
s32 GCombined = (AG * BG) / 255;
|
|
|
|
s32 BCombined = (AB * BB) / 255;
|
2019-08-03 22:08:19 +00:00
|
|
|
|
2019-08-03 23:40:20 +00:00
|
|
|
Data->ResultColors[LED->Index].R = (u8)RCombined;
|
|
|
|
Data->ResultColors[LED->Index].G = (u8)GCombined;
|
|
|
|
Data->ResultColors[LED->Index].B = (u8)BCombined;
|
2019-08-03 22:08:19 +00:00
|
|
|
|
2019-07-19 20:56:21 +00:00
|
|
|
LED++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-08-03 23:40:20 +00:00
|
|
|
NODE_STRUCT(vertical_color_fade_data)
|
2019-07-19 20:56:21 +00:00
|
|
|
{
|
|
|
|
NODE_IN(v4, Color);
|
|
|
|
NODE_IN(r32, Min);
|
|
|
|
NODE_IN(r32, Max);
|
2019-08-03 23:40:20 +00:00
|
|
|
NODE_COLOR_BUFFER_OUT(Result);
|
2019-07-19 20:56:21 +00:00
|
|
|
};
|
|
|
|
|
2019-08-03 23:40:20 +00:00
|
|
|
NODE_PROC(VerticalColorFadeProc, vertical_color_fade_data)
|
2019-07-19 20:56:21 +00:00
|
|
|
{
|
|
|
|
r32 R = (Data->Color.r * 255);
|
|
|
|
r32 G = (Data->Color.g * 255);
|
|
|
|
r32 B = (Data->Color.b * 255);
|
|
|
|
|
|
|
|
r32 Range = Data->Max - Data->Min;
|
|
|
|
|
2019-08-03 23:40:20 +00:00
|
|
|
led* LED = Data->ResultLEDs;
|
|
|
|
for (s32 l = 0; l < Data->ResultLEDCount; l++)
|
2019-07-19 20:56:21 +00:00
|
|
|
{
|
2019-08-03 23:40:20 +00:00
|
|
|
Assert(LED->Index >= 0 && LED->Index < Data->ResultLEDCount);
|
|
|
|
|
2019-07-19 20:56:21 +00:00
|
|
|
r32 Amount = (LED->Position.y - Data->Min) / Range;
|
|
|
|
Amount = GSClamp01(1.0f - Amount);
|
|
|
|
|
2019-08-03 23:40:20 +00:00
|
|
|
Data->ResultColors[LED->Index].R = (u8)(R * Amount);
|
|
|
|
Data->ResultColors[LED->Index].G = (u8)(G * Amount);
|
|
|
|
Data->ResultColors[LED->Index].B = (u8)(B * Amount);
|
2019-07-19 20:56:21 +00:00
|
|
|
LED++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ^^^ New ^^^
|
|
|
|
// vvv Old vvv
|
|
|
|
|
|
|
|
PATTERN_INIT_PROC(SolidPatternInitProc)
|
|
|
|
{
|
|
|
|
Pattern->Memory = (void*)PushArray(Storage, u8, 3);
|
|
|
|
|
|
|
|
u8* Color = (u8*)Pattern->Memory;
|
|
|
|
Color[0] = 0;
|
|
|
|
Color[1] = 0;
|
|
|
|
Color[2] = 128;
|
|
|
|
}
|
|
|
|
|
|
|
|
PATTERN_UPDATE_PROC(SolidPatternUpdateProc)
|
|
|
|
{
|
|
|
|
u8* Color = (u8*)Memory;
|
|
|
|
u8 R = Color[0];
|
|
|
|
u8 G = Color[1];
|
|
|
|
u8 B = Color[2];
|
|
|
|
|
|
|
|
led* LED = LEDs;
|
|
|
|
for (s32 l = 0; l < LEDCount; l++)
|
|
|
|
{
|
|
|
|
PushColor(LED++, Colors, R, G, B);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
struct rainbow_pattern_memory
|
|
|
|
{
|
|
|
|
r32 TimeAccumulator;
|
|
|
|
r32 Period;
|
|
|
|
};
|
|
|
|
|
|
|
|
PATTERN_INIT_PROC(InitRainbowPatternProc)
|
|
|
|
{
|
|
|
|
Pattern->Memory = (void*)PushStruct(Storage, rainbow_pattern_memory);
|
|
|
|
rainbow_pattern_memory* Mem = (rainbow_pattern_memory*)Pattern->Memory;
|
|
|
|
Mem->TimeAccumulator = 0;
|
|
|
|
Mem->Period = 6.0f;
|
|
|
|
}
|
|
|
|
|
|
|
|
PATTERN_UPDATE_PROC(RainbowPatternProc)
|
|
|
|
{
|
|
|
|
DEBUG_TRACK_SCOPE(RainbowPatternProc);
|
|
|
|
|
|
|
|
rainbow_pattern_memory* Mem = (rainbow_pattern_memory*)Memory;
|
|
|
|
Mem->TimeAccumulator += DeltaTime;
|
|
|
|
if (Mem->TimeAccumulator >= Mem->Period)
|
|
|
|
{
|
|
|
|
Mem->TimeAccumulator -= Mem->Period;
|
|
|
|
}
|
|
|
|
|
|
|
|
r32 Percent = Mem->TimeAccumulator / Mem->Period;
|
|
|
|
r32 HueAdd = Percent * 360.0f;
|
|
|
|
|
|
|
|
r32 HueScale = 360.0f / 100;
|
|
|
|
|
|
|
|
led* LED = LEDs;
|
|
|
|
for (s32 l = 0; l < LEDCount; l++)
|
|
|
|
{
|
|
|
|
r32 Hue = (LED->Position.y * HueScale) + HueAdd;
|
|
|
|
v4 Color = HSVToRGB(v4{Hue, 1, 1, 1}) * .75f;
|
|
|
|
|
|
|
|
PushColor(LED++, Colors, (u8)(Color.r * 255), (u8)(Color.g * 255), (u8)(Color.b * 255));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
PATTERN_INIT_PROC(InitRadialProc)
|
|
|
|
{
|
|
|
|
Pattern->Memory = (void*)PushStruct(Storage, rainbow_pattern_memory);
|
|
|
|
rainbow_pattern_memory* Mem = (rainbow_pattern_memory*)Pattern->Memory;
|
|
|
|
Mem->TimeAccumulator = 0;
|
|
|
|
Mem->Period = 10.0;
|
|
|
|
}
|
|
|
|
|
|
|
|
PATTERN_UPDATE_PROC(UpdateRadialProc)
|
|
|
|
{
|
|
|
|
|
|
|
|
rainbow_pattern_memory* Mem = (rainbow_pattern_memory*)Memory;
|
|
|
|
Mem->TimeAccumulator += DeltaTime;
|
|
|
|
if (Mem->TimeAccumulator >= Mem->Period)
|
|
|
|
{
|
|
|
|
Mem->TimeAccumulator -= Mem->Period;
|
|
|
|
}
|
|
|
|
|
|
|
|
r32 Percent = Mem->TimeAccumulator / Mem->Period;
|
|
|
|
r32 AngleAdd = Percent * PI * 2;
|
|
|
|
r32 HueAdd = Percent * 360;
|
|
|
|
|
|
|
|
v2 DirectionVector = v2{GSSin(AngleAdd), GSCos(AngleAdd)};
|
|
|
|
|
|
|
|
led* LED = LEDs;
|
|
|
|
for (s32 l = 0; l < LEDCount; l++)
|
|
|
|
{
|
|
|
|
v4 Color = {0, 0, 0, 1};
|
|
|
|
|
|
|
|
if (LED->Position.y >= 70)
|
|
|
|
{
|
|
|
|
v2 TwoDPos = v2{LED->Position.x, LED->Position.z};
|
|
|
|
r32 Angle = Dot(Normalize(TwoDPos), DirectionVector) * .25f;
|
|
|
|
r32 Hue = Angle * 360 + HueAdd;
|
|
|
|
Color = HSVToRGB(v4{Hue, 1, 1, 1}) * .9f;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Color = HSVToRGB(v4{HueAdd, 1, 1, 1}) * .9f;
|
|
|
|
}
|
|
|
|
|
|
|
|
PushColor(LED++, Colors, (u8)(Color.r * 255), (u8)(Color.g * 255), (u8)(Color.b * 255));
|
|
|
|
}
|
|
|
|
}
|