Fixed a Function Pointer address problem created by storing a pointer to the address of an animation procedure. When code is reloaded, that pointer becomes invalid, so we just store an index, and switch on the value
This commit is contained in:
parent
33338daab7
commit
51955ba765
|
@ -1,15 +1,15 @@
|
||||||
led_strip_count 12
|
led_strip_count 12
|
||||||
|
|
||||||
led_strip { 0, 0, 0, INTERPOLATE_POINTS, (0.000000, 1.000000, 0.000000), (0.000000, 0.050000, 1.000000), 70 }
|
led_strip { 0, 2, 0, INTERPOLATE_POINTS, (0.000000, 1.000000, 0.000000), (0.000000, 0.050000, 1.000000), 346 }
|
||||||
led_strip { 0, 1, 0, INTERPOLATE_POINTS, (0.500000, 0.866025, 0.000000), (0.025000, 0.043301, 1.000000), 70 }
|
led_strip { 0, 4, 0, INTERPOLATE_POINTS, (0.500000, 0.866025, 0.000000), (0.025000, 0.043301, 1.000000), 346 }
|
||||||
led_strip { 0, 2, 0, INTERPOLATE_POINTS, (0.866025, 0.499999, 0.000000), (0.043301, 0.024999, 1.000000), 70 }
|
led_strip { 0, 6, 0, INTERPOLATE_POINTS, (0.866025, 0.499999, 0.000000), (0.043301, 0.024999, 1.000000), 346 }
|
||||||
led_strip { 0, 3, 0, INTERPOLATE_POINTS, (1.000000, -0.000000, 0.000000), (0.050000, -0.000000, 1.000000), 70 }
|
led_strip { 0, 8, 0, INTERPOLATE_POINTS, (1.000000, -0.000000, 0.000000), (0.050000, -0.000000, 1.000000), 346 }
|
||||||
led_strip { 0, 4, 0, INTERPOLATE_POINTS, (0.866025, -0.500000, 0.000000), (0.043301, -0.025000, 1.000000), 70 }
|
led_strip { 0, 10, 0, INTERPOLATE_POINTS, (0.866025, -0.500000, 0.000000), (0.043301, -0.025000, 1.000000), 346 }
|
||||||
led_strip { 0, 5, 0, INTERPOLATE_POINTS, (0.500000, -0.866025, 0.000000), (0.025000, -0.043301, 1.000000), 70 }
|
led_strip { 0, 12, 0, INTERPOLATE_POINTS, (0.500000, -0.866025, 0.000000), (0.025000, -0.043301, 1.000000), 346 }
|
||||||
led_strip { 0, 6, 0, INTERPOLATE_POINTS, (-0.000000, -1.000000, 0.000000), (-0.000000, -0.050000, 1.000000), 70 }
|
led_strip { 0, 14, 0, INTERPOLATE_POINTS, (-0.000000, -1.000000, 0.000000), (-0.000000, -0.050000, 1.000000), 346 }
|
||||||
led_strip { 0, 7, 0, INTERPOLATE_POINTS, (-0.500000, -0.866025, 0.000000), (-0.025000, -0.043301, 1.000000), 70 }
|
led_strip { 0, 7, 0, INTERPOLATE_POINTS, (-0.500000, -0.866025, 0.000000), (-0.025000, -0.043301, 1.000000), 346 }
|
||||||
led_strip { 0, 8, 0, INTERPOLATE_POINTS, (-0.866025, -0.499999, 0.000000), (-0.043301, -0.024999, 1.000000), 70 }
|
led_strip { 0, 8, 0, INTERPOLATE_POINTS, (-0.866025, -0.499999, 0.000000), (-0.043301, -0.024999, 1.000000), 346 }
|
||||||
led_strip { 0, 9, 0, INTERPOLATE_POINTS, (-1.000000, 0.000000, 0.000000), (-0.050000, 0.000000, 1.000000), 70 }
|
led_strip { 0, 9, 0, INTERPOLATE_POINTS, (-1.000000, 0.000000, 0.000000), (-0.050000, 0.000000, 1.000000), 346 }
|
||||||
led_strip { 0, 10, 0, INTERPOLATE_POINTS, (-0.866025, 0.499999, 0.000000), (-0.043301, 0.024999, 1.000000), 70 }
|
led_strip { 0, 10, 0, INTERPOLATE_POINTS, (-0.866025, 0.499999, 0.000000), (-0.043301, 0.024999, 1.000000), 346 }
|
||||||
led_strip { 0, 11, 0, INTERPOLATE_POINTS, (-0.499999, 0.866025, 0.000000), (-0.024999, 0.043301, 1.000000), 70 }
|
led_strip { 0, 11, 0, INTERPOLATE_POINTS, (-0.499999, 0.866025, 0.000000), (-0.024999, 0.043301, 1.000000), 346 }
|
||||||
END_OF_ASSEMBLY_FILE
|
END_OF_ASSEMBLY_FILE
|
|
@ -24,9 +24,6 @@ class gs_bucket {
|
||||||
|
|
||||||
u32 Used;
|
u32 Used;
|
||||||
|
|
||||||
gs_bucket();
|
|
||||||
gs_bucket(u32 BucketSize);
|
|
||||||
|
|
||||||
void GrowBucket();
|
void GrowBucket();
|
||||||
|
|
||||||
T* GetElementAtIndex(u32 Index);
|
T* GetElementAtIndex(u32 Index);
|
||||||
|
@ -36,33 +33,9 @@ class gs_bucket {
|
||||||
void FreeElementAtIndex(u32 Index);
|
void FreeElementAtIndex(u32 Index);
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
gs_bucket<T>::gs_bucket()
|
|
||||||
{
|
|
||||||
this->BucketSize = 0;
|
|
||||||
this->BucketCount = 0;
|
|
||||||
this->Buckets = 0;
|
|
||||||
this->Used = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
gs_bucket<T>::gs_bucket(u32 BucketSize)
|
|
||||||
{
|
|
||||||
this->BucketSize = BucketSize;
|
|
||||||
this->BucketCount = 0;
|
|
||||||
this->Buckets = 0;
|
|
||||||
this->Used = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void gs_bucket<T>::GrowBucket()
|
void gs_bucket<T>::GrowBucket()
|
||||||
{
|
{
|
||||||
if (this->BucketCount == 0)
|
|
||||||
{
|
|
||||||
// First Grow Attempt
|
|
||||||
this->Buckets = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this->BucketSize == 0)
|
if (this->BucketSize == 0)
|
||||||
{
|
{
|
||||||
this->BucketSize = GS_LIST_DEFAULT_BUCKET_SIZE;
|
this->BucketSize = GS_LIST_DEFAULT_BUCKET_SIZE;
|
||||||
|
|
|
@ -19,7 +19,7 @@ struct animation_block
|
||||||
// TODO(Peter): Should we change this to frames??
|
// TODO(Peter): Should we change this to frames??
|
||||||
r32 StartTime;
|
r32 StartTime;
|
||||||
r32 EndTime;
|
r32 EndTime;
|
||||||
animation_proc* Proc;
|
u32 AnimationProcHandle;
|
||||||
|
|
||||||
u32 Layer;
|
u32 Layer;
|
||||||
};
|
};
|
||||||
|
|
|
@ -174,7 +174,7 @@ INITIALIZE_APPLICATION(InitializeApplication)
|
||||||
State->Camera.LookAt = v3{0, 0, 0};
|
State->Camera.LookAt = v3{0, 0, 0};
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
char Path[] = "radialumia.fold";
|
char Path[] = "blumen_lumen.fold";
|
||||||
LoadAssembly(State, Context, Path);
|
LoadAssembly(State, Context, Path);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -352,7 +352,28 @@ UPDATE_AND_RENDER(UpdateAndRender)
|
||||||
{
|
{
|
||||||
gs_list_handle AssemblyHandle = *State->ActiveAssemblyIndecies.GetElementAtIndex(j);
|
gs_list_handle AssemblyHandle = *State->ActiveAssemblyIndecies.GetElementAtIndex(j);
|
||||||
assembly* Assembly = State->AssemblyList.GetElementWithHandle(AssemblyHandle);
|
assembly* Assembly = State->AssemblyList.GetElementWithHandle(AssemblyHandle);
|
||||||
Block.Proc(Assembly, FrameTime - Block.StartTime);
|
|
||||||
|
// TODO(Peter): Temporary
|
||||||
|
switch(Block.AnimationProcHandle)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
{
|
||||||
|
TestPatternOne(Assembly, FrameTime - Block.StartTime);
|
||||||
|
}break;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
TestPatternTwo(Assembly, FrameTime - Block.StartTime);
|
||||||
|
}break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
{
|
||||||
|
TestPatternThree(Assembly, FrameTime - Block.StartTime);
|
||||||
|
}break;
|
||||||
|
|
||||||
|
// NOTE(Peter): Zero is invalid
|
||||||
|
InvalidDefaultCase;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -369,7 +390,7 @@ UPDATE_AND_RENDER(UpdateAndRender)
|
||||||
DMXBuffers = DMXBufferListAppend(DMXBuffers, NewDMXBuffers);
|
DMXBuffers = DMXBufferListAppend(DMXBuffers, NewDMXBuffers);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG_IF(GlobalDebugServices->Interface.SendSACNData)
|
//DEBUG_IF(GlobalDebugServices->Interface.SendSACNData)
|
||||||
{
|
{
|
||||||
switch (State->NetworkProtocol)
|
switch (State->NetworkProtocol)
|
||||||
{
|
{
|
||||||
|
|
|
@ -170,13 +170,13 @@ TestPatternTwo(assembly* Assembly, r32 Time)
|
||||||
internal void
|
internal void
|
||||||
TestPatternThree(assembly* Assembly, r32 Time)
|
TestPatternThree(assembly* Assembly, r32 Time)
|
||||||
{
|
{
|
||||||
r32 GreenSize = 20.0f;
|
v4 GreenCenter = v4{0, 0, 150, 1};
|
||||||
r32 BlueSize = 25.0f;
|
r32 GreenRadius = GSAbs(GSSin(Time)) * 200;
|
||||||
r32 RedSize = 25.0f;
|
|
||||||
|
|
||||||
r32 GreenPosition = -GreenSize + (Time * 45);
|
v4 TealCenter = v4{0, 0, 150, 1};
|
||||||
r32 BluePosition = -BlueSize + (Time * 25);
|
r32 TealRadius = GSAbs(GSSin(Time + 1.5)) * 200;
|
||||||
r32 RedPosition = (100 + RedSize) + (Time * -35);
|
|
||||||
|
r32 FadeDist = 35;
|
||||||
|
|
||||||
for (u32 Range = 0; Range < Assembly->LEDUniverseMapCount; Range++)
|
for (u32 Range = 0; Range < Assembly->LEDUniverseMapCount; Range++)
|
||||||
{
|
{
|
||||||
|
@ -190,24 +190,22 @@ TestPatternThree(assembly* Assembly, r32 Time)
|
||||||
u8 Green = 0;
|
u8 Green = 0;
|
||||||
u8 Blue = 0;
|
u8 Blue = 0;
|
||||||
|
|
||||||
r32 GreenDistance = GSAbs(LED.Position.z - GreenPosition);
|
r32 GreenDist = GSAbs(Mag(LED.Position - GreenCenter) - GreenRadius);
|
||||||
r32 GreenBrightness = GSClamp(0.0f, GreenSize - GreenDistance, GreenSize) / GreenSize;
|
r32 GreenBrightness = GSClamp(0.f, FadeDist - GSAbs(GreenDist), FadeDist);
|
||||||
Green = (u8)(GreenBrightness * 255);
|
Green = (u8)(GreenBrightness * 255);
|
||||||
|
|
||||||
r32 BlueDistance = GSAbs(LED.Position.z - BluePosition);
|
r32 TealDist = GSAbs(Mag(LED.Position - TealCenter) - TealRadius);
|
||||||
r32 BlueBrightness = GSClamp(0.0f, BlueSize - BlueDistance, BlueSize) / BlueSize;
|
r32 TealBrightness = GSClamp(0.f, FadeDist - GSAbs(TealDist), FadeDist);
|
||||||
Blue = (u8)(BlueBrightness * 255);
|
Red = (u8)(TealBrightness * 255);
|
||||||
|
Blue = (u8)(TealBrightness * 255);
|
||||||
r32 RedDistance = GSAbs(LED.Position.z - RedPosition);
|
|
||||||
r32 RedBrightness = GSClamp(0.0f, RedSize - RedDistance, RedSize) / RedSize;
|
|
||||||
Red = (u8)(RedBrightness * 255);
|
|
||||||
|
|
||||||
Assembly->Colors[LED.Index].R = Red;
|
Assembly->Colors[LED.Index].R = Red;
|
||||||
Assembly->Colors[LED.Index].B = Blue;
|
Assembly->Colors[LED.Index].B = Green;
|
||||||
Assembly->Colors[LED.Index].G = Green;
|
Assembly->Colors[LED.Index].G = Green;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// END TEMPORARY PATTERNS
|
// END TEMPORARY PATTERNS
|
||||||
|
|
||||||
#include "foldhaus_assembly.cpp"
|
#include "foldhaus_assembly.cpp"
|
||||||
|
|
|
@ -40,21 +40,21 @@ GetXPositionFromTimeInAnimationPanel (r32 Time, rect PanelBounds, s32 StartFrame
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
AddAnimationBlock(r32 StartTime, r32 EndTime, animation_proc* Proc, animation_system* AnimationSystem)
|
AddAnimationBlock(r32 StartTime, r32 EndTime, u32 AnimationProcHandle, animation_system* AnimationSystem)
|
||||||
{
|
{
|
||||||
animation_block NewBlock = {0};
|
animation_block NewBlock = {0};
|
||||||
NewBlock.StartTime = StartTime;
|
NewBlock.StartTime = StartTime;
|
||||||
NewBlock.EndTime = EndTime;
|
NewBlock.EndTime = EndTime;
|
||||||
NewBlock.Proc = Proc;
|
NewBlock.AnimationProcHandle = AnimationProcHandle;
|
||||||
AnimationSystem->Blocks.PushElementOnList(NewBlock);
|
AnimationSystem->Blocks.PushElementOnList(NewBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define NEW_ANIMATION_BLOCK_DURATION 3
|
#define NEW_ANIMATION_BLOCK_DURATION 3
|
||||||
internal void
|
internal void
|
||||||
AddAnimationBlockAtCurrentTime (animation_proc* Proc, animation_system* System)
|
AddAnimationBlockAtCurrentTime (u32 AnimationProcHandle, animation_system* System)
|
||||||
{
|
{
|
||||||
r32 CurrentTime = System->Time;
|
r32 CurrentTime = System->Time;
|
||||||
AddAnimationBlock(CurrentTime, CurrentTime + NEW_ANIMATION_BLOCK_DURATION, Proc, System);
|
AddAnimationBlock(CurrentTime, CurrentTime + NEW_ANIMATION_BLOCK_DURATION, AnimationProcHandle, System);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void
|
internal void
|
||||||
|
@ -202,7 +202,7 @@ FOLDHAUS_INPUT_COMMAND_PROC(AddAnimationBlockCommand)
|
||||||
animation_block Block = {0};
|
animation_block Block = {0};
|
||||||
Block.StartTime = NewBlockTimeStart;
|
Block.StartTime = NewBlockTimeStart;
|
||||||
Block.EndTime = NewBlockTimeEnd;
|
Block.EndTime = NewBlockTimeEnd;
|
||||||
Block.Proc = TestPatternThree;
|
Block.AnimationProcHandle = 4;
|
||||||
|
|
||||||
gs_list_handle NewBlockHandle = State->AnimationSystem.Blocks.PushElementOnList(Block);
|
gs_list_handle NewBlockHandle = State->AnimationSystem.Blocks.PushElementOnList(Block);
|
||||||
SelectAnimationBlock(NewBlockHandle, State);
|
SelectAnimationBlock(NewBlockHandle, State);
|
||||||
|
@ -418,7 +418,7 @@ DrawAnimationClipsList(rect PanelBounds, mouse_state Mouse, render_command_buffe
|
||||||
if (MouseButtonTransitionedDown(Mouse.LeftButtonState)
|
if (MouseButtonTransitionedDown(Mouse.LeftButtonState)
|
||||||
&& PointIsInRect(Mouse.DownPos, ElementBounds))
|
&& PointIsInRect(Mouse.DownPos, ElementBounds))
|
||||||
{
|
{
|
||||||
AddAnimationBlockAtCurrentTime(Clip.Proc, &State->AnimationSystem);
|
AddAnimationBlockAtCurrentTime(i + 1, &State->AnimationSystem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -194,7 +194,13 @@ PLATFORM_SEND_TO(Win32SendTo)
|
||||||
if (LengthSent == SOCKET_ERROR)
|
if (LengthSent == SOCKET_ERROR)
|
||||||
{
|
{
|
||||||
s32 Error = WSAGetLastError();
|
s32 Error = WSAGetLastError();
|
||||||
InvalidCodePath;
|
if (Error == 10051)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
InvalidCodePath;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return LengthSent;
|
return LengthSent;
|
||||||
|
|
9
todo.txt
9
todo.txt
|
@ -8,6 +8,12 @@ Ground Up Reengineering
|
||||||
- panels metaprogramming
|
- panels metaprogramming
|
||||||
- fix memory layout (remeber to profile before and after)
|
- fix memory layout (remeber to profile before and after)
|
||||||
|
|
||||||
|
- Hot Code Reloading
|
||||||
|
- Fix it
|
||||||
|
|
||||||
|
- File Loading
|
||||||
|
- Gracefully handle File Not found
|
||||||
|
s
|
||||||
- Buckets & Lists
|
- Buckets & Lists
|
||||||
- Allow them to use memory arenas
|
- Allow them to use memory arenas
|
||||||
- Zero is initialization
|
- Zero is initialization
|
||||||
|
@ -28,8 +34,11 @@ Ground Up Reengineering
|
||||||
- custom sculpture update functions (for motion)
|
- custom sculpture update functions (for motion)
|
||||||
- placing sculptures
|
- placing sculptures
|
||||||
- editing sculpture files (change universe output)
|
- editing sculpture files (change universe output)
|
||||||
|
- led groups & subgroups - defined in file
|
||||||
|
|
||||||
- Network
|
- Network
|
||||||
|
- Handle Error Cases
|
||||||
|
- Handle connecting a sculpture after launch
|
||||||
- Artnet
|
- Artnet
|
||||||
- Universe offsets (per sculpture)
|
- Universe offsets (per sculpture)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue