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:
Peter Slattery 2020-02-04 22:50:12 -08:00
parent 33338daab7
commit 51955ba765
8 changed files with 73 additions and 66 deletions

View File

@ -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

View 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;

View File

@ -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;
}; };

View File

@ -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)
{ {

View File

@ -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"

View File

@ -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);
} }
} }

View File

@ -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;

View File

@ -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)