summaryrefslogtreecommitdiff
path: root/keyframes.cpp
diff options
context:
space:
mode:
authorFox Caminiti <fox@foxcam.net>2022-08-18 23:11:29 -0400
committerFox Caminiti <fox@foxcam.net>2022-08-18 23:11:29 -0400
commit8c5f06c37f3c267ecd8f867cd49765c366b5f47c (patch)
treef8ec31daa1e050c0f5205d32cebe68ce5df65f6f /keyframes.cpp
parent9062e0aae9f2f576b7a237c28028aa6b09feee5e (diff)
many additions
Diffstat (limited to 'keyframes.cpp')
-rw-r--r--keyframes.cpp78
1 files changed, 48 insertions, 30 deletions
diff --git a/keyframes.cpp b/keyframes.cpp
index 25c41c0..c9f7813 100644
--- a/keyframes.cpp
+++ b/keyframes.cpp
@@ -1,5 +1,5 @@
static keyframe*
-KeyframeLookupMemory(property_channel *Property, int16 i) {
+KeyframeLookup(property_channel *Property, int16 i) {
int16 b = i / MAX_KEYFRAMES_PER_BLOCK;
int16 k = i - b*MAX_KEYFRAMES_PER_BLOCK;
return &Property->KeyframeBlock[b]->Keyframe[k];
@@ -21,7 +21,7 @@ GetSelectedKeyframes(project_data *File)
for (int i = 0; i < File->NumberOfLayers; i++) {
for (int a = 0; a < AmountOf(File->Layer[i]->Property); a++) {
for (int l = 0; l < File->Layer[i]->Property[a].NumberOfTotalKeyframes; l++) {
- keyframe *Keyframe = KeyframeLookupMemory(&File->Layer[i]->Property[a], l);
+ keyframe *Keyframe = KeyframeLookup(&File->Layer[i]->Property[a], l);
if (Keyframe->IsSelected) {
KeyframeList.SelectedKeyframe[z] = Keyframe;
z++;
@@ -104,8 +104,8 @@ DeleteKeyframeFromMemory(property_channel *Property, int16 Increment, int16 Stop
if (Increment > 0) {
int16 i = Property->NumberOfTotalKeyframes - 1;
while (i > StopAt) {
- keyframe *CurrentKeyframe = KeyframeLookupMemory(Property, i);
- keyframe *NextKeyframe = KeyframeLookupMemory(Property, i + Increment);
+ keyframe *CurrentKeyframe = KeyframeLookup(Property, i);
+ keyframe *NextKeyframe = KeyframeLookup(Property, i + Increment);
*NextKeyframe = *CurrentKeyframe;
i--;
}
@@ -113,8 +113,8 @@ DeleteKeyframeFromMemory(property_channel *Property, int16 Increment, int16 Stop
} else {
int16 i = StopAt;
while (i < Property->NumberOfTotalKeyframes - 1) {
- keyframe *CurrentKeyframe = KeyframeLookupMemory(Property, i);
- keyframe *NextKeyframe = KeyframeLookupMemory(Property, i - Increment);
+ keyframe *CurrentKeyframe = KeyframeLookup(Property, i);
+ keyframe *NextKeyframe = KeyframeLookup(Property, i - Increment);
*CurrentKeyframe = *NextKeyframe;
i++;
}
@@ -155,12 +155,12 @@ DeleteSelectedKeyframes(project_data *File, memory *Memory)
for (int a = 0; a < AmountOf(File->Layer[i]->Property); a++) {
property_channel *Property = &File->Layer[i]->Property[a];
for (int l = 0; l < Property->NumberOfTotalKeyframes; l++) {
- keyframe *Keyframe = KeyframeLookupMemory(Property, l);
+ keyframe *Keyframe = KeyframeLookup(Property, l);
if (Keyframe->IsSelected) {
int16 ToShift = 1;
bool32 Until = true;
while (Until) {
- keyframe *KeyframeN = KeyframeLookupMemory(Property, l + ToShift);
+ keyframe *KeyframeN = KeyframeLookup(Property, l + ToShift);
if (KeyframeN->IsSelected) {
ToShift += 1;
} else {
@@ -180,7 +180,7 @@ CalculatePropertyMinMax(property_channel *Property) {
Property->LocalMaxVal = Property->MinVal;
Property->LocalMinVal = Property->MaxVal;
for (int16 i = 0; i < Property->NumberOfTotalKeyframes; i++) {
- keyframe *Keyframe = KeyframeLookupMemory(Property, i);
+ keyframe *Keyframe = KeyframeLookup(Property, i);
Property->LocalMinVal.f = Ceil(Property->LocalMinVal.f, Keyframe->Value.f);
Property->LocalMaxVal.f = Floor(Property->LocalMaxVal.f, Keyframe->Value.f);
}
@@ -220,8 +220,8 @@ static void
ClampKeyframeHandles(property_channel *Property, int16 b, int16 dir) {
if (dir == 0) {
if (b > 0) {
- keyframe *Keyframe = KeyframeLookupMemory(Property, b - 1);
- keyframe *NextKeyframe = KeyframeLookupMemory(Property, b);
+ keyframe *Keyframe = KeyframeLookup(Property, b - 1);
+ keyframe *NextKeyframe = KeyframeLookup(Property, b);
real32 XSpan = NextKeyframe->FrameNumber - Keyframe->FrameNumber;
// TODO(fox): Fix this!
#if WINDOWS
@@ -236,8 +236,8 @@ ClampKeyframeHandles(property_channel *Property, int16 b, int16 dir) {
}
if (dir == 1) {
if (b < Property->NumberOfTotalKeyframes - 1) {
- keyframe *Keyframe = KeyframeLookupMemory(Property, b);
- keyframe *NextKeyframe = KeyframeLookupMemory(Property, b + 1);
+ keyframe *Keyframe = KeyframeLookup(Property, b);
+ keyframe *NextKeyframe = KeyframeLookup(Property, b + 1);
real32 XSpan = NextKeyframe->FrameNumber - Keyframe->FrameNumber;
if (Keyframe->TangentRight.x > XSpan)
Keyframe->TangentRight.x = XSpan;
@@ -266,36 +266,55 @@ ClampSurroundingKeyframeHandles(property_channel *Property, int16 b) {
static void
ManualKeyframeInsertF(property_channel *Property, memory *Memory, int32 CurrentFrame, real32 Val)
{
- /*
if (!(Property->NumberOfTotalKeyframes % MAX_KEYFRAMES_PER_BLOCK)) {
CreateKeyframeBlock(Property, Memory);
}
keyframe *Keyframe = NULL;
if (Property->NumberOfTotalKeyframes == 0) {
Keyframe = &Property->KeyframeBlock[0]->Keyframe[0];
- } else if (Property->NumberOfTotalKeyframes == 1) {
- keyframe *FirstKeyframe = &Property->KeyframeBlock[0]->Keyframe[0];
- if (CurrentFrame > FirstKeyframe->FrameNumber) {
- Keyframe = &Property->KeyframeBlock[0]->Keyframe[1];
- } else {
- Keyframe = &Property->KeyframeBlock[0]->Keyframe[0];
- }
+ Property->NumberOfTotalKeyframes++;
} else {
- uint32 Index = Property->NumberOfTotalKeyframes - 1;
+ uint32 Index = Property->NumberOfTotalKeyframes;
bool32 Found = false;
while (!Found) {
- keyframe *CurrentKeyframe = KeyframeLookupMemory(Property, Index);
- if (CurrentKeyframe->FrameNumber < CurrentFrame) {
- ShiftKeyframes(Property, 1, i - 1);
+ keyframe *PreviousKeyframe = KeyframeLookup(Property, Index - 1);
+ keyframe *NextKeyframe = KeyframeLookup(Property, Index + 1);
+ if (PreviousKeyframe->FrameNumber < CurrentFrame) {
+ if (NextKeyframe->FrameNumber >= CurrentFrame || Index == Property->NumberOfTotalKeyframes) {
+ keyframe *CurrentKeyframe = KeyframeLookup(Property, Index);
+ if (CurrentKeyframe->FrameNumber == CurrentFrame || Index == Property->NumberOfTotalKeyframes) {
+ Keyframe = CurrentKeyframe;
+ Property->NumberOfTotalKeyframes++;
+ } else {
+ if (CurrentKeyframe->FrameNumber > CurrentFrame) {
+ Keyframe = KeyframeLookup(Property, Index);
+ } else {
+ Keyframe = KeyframeLookup(Property, Index + 1);
+ }
+ }
+ Found = true;
+ } else {
+ Index += (Property->NumberOfTotalKeyframes - Index) / 2;
+ }
+ // We can only progress from this first if statement if
+ // NextKeyframe is valid, so we need to check for these conditions.
+ } else if (Property->NumberOfTotalKeyframes == 1) {
+ Property->NumberOfTotalKeyframes++;
+ Keyframe = KeyframeLookup(Property, 0);
+ Found = true;
+ } else if (Property->NumberOfTotalKeyframes == 2) {
+ keyframe *FirstKeyframe = KeyframeLookup(Property, Index + 1);
+ if (FirstKeyframe->FrameNumber > CurrentFrame)
+ Keyframe = KeyframeLookup(Property, 0);
+ else
+ Keyframe = KeyframeLookup(Property, 1);
+ Property->NumberOfTotalKeyframes++;
Found = true;
} else {
- Index--;
+ Index = Index / 2;
}
}
- Keyframe = PushKeyframe(Property);
}
- if (Keyframe->FrameNumber != CurrentFrame)
- Property->NumberOfTotalKeyframes++;
Assert(!(Keyframe == NULL))
Keyframe->FrameNumber = CurrentFrame;
@@ -305,7 +324,6 @@ ManualKeyframeInsertF(property_channel *Property, memory *Memory, int32 CurrentF
Keyframe->TangentRight = V2(1, 0);
Keyframe->ImguiID = RandomGlobalIncrement++;
CalculatePropertyMinMax(Property);
- */
}