From 8c5f06c37f3c267ecd8f867cd49765c366b5f47c Mon Sep 17 00:00:00 2001 From: Fox Caminiti Date: Thu, 18 Aug 2022 23:11:29 -0400 Subject: many additions --- keyframes.cpp | 78 ++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 48 insertions(+), 30 deletions(-) (limited to 'keyframes.cpp') 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); - */ } -- cgit v1.2.3