summaryrefslogtreecommitdiff
path: root/src/createcalls.cpp
diff options
context:
space:
mode:
authorFox Caminiti <fox@foxcam.net>2023-02-07 00:21:06 -0500
committerFox Caminiti <fox@foxcam.net>2023-02-07 00:21:06 -0500
commitee654e9217487f6fca12356ec8af82319c309592 (patch)
tree7b87b83ed9087b73b733555243a66d3d0c93e900 /src/createcalls.cpp
parente2e0e630ca51a4fd80a8186c5795c96693a2815b (diff)
good changes
Diffstat (limited to 'src/createcalls.cpp')
-rw-r--r--src/createcalls.cpp90
1 files changed, 43 insertions, 47 deletions
diff --git a/src/createcalls.cpp b/src/createcalls.cpp
index e41a9d2..4761a94 100644
--- a/src/createcalls.cpp
+++ b/src/createcalls.cpp
@@ -683,15 +683,38 @@ Property_IsGraphSelected(memory *Memory, property_channel *Property, uint16 *Arr
return 0;
}
+// TODO(fox): Add different modes (all dupes on top, each dupe above its layer, two for bottom)
+void
+SortUnionTest(memory *Memory, sorted_layer_array *SortedLayerStart, block_layer *StartLayer,
+ int i, int FauxIncrement, int LayerCount, int Mode)
+{
+ block_layer *PrevLayer = StartLayer;
+ for (int a = i+1; a < LayerCount; a++) {
+ sorted_layer_array *NextSortEntry = &SortedLayerStart[a];
+ uint32 NextIndex_Physical = NextSortEntry->Block_Layer_Index;
+ block_layer *NextLayer = (block_layer *)Memory_Block_AddressAtIndex(Memory, F_Layers, NextIndex_Physical);
+ if (NextLayer->Vertical_Offset == PrevLayer->Vertical_Offset) {
+ if (Mode == 0) {
+ History_Action_Swap(Memory, F_Layers, sizeof(NextLayer->Vertical_Offset), &NextLayer->Vertical_Offset);
+ NextLayer->Vertical_Offset -= 1;
+ } else {
+ NextSortEntry->SortedOffset -= 1;
+ }
+ } else {
+ break;
+ }
+ PrevLayer = NextLayer;
+ }
+}
+
static void
Project_Layer_Duplicate(project_data *File, project_state *State, memory *Memory,
- sorted_comp_array *SortedCompArray, sorted_layer_array *SortedLayerArray, v2 Offset, bool32 FakeOnly)
+ sorted_comp_array *SortedCompArray, sorted_layer_array *SortedLayerArray, v2 Offset, bool32 FakeOnly, bool32 NewPrecomp)
{
for (int c = 0; c < File->Comp_Count; c++) {
sorted_comp_array SortedCompStart = SortedCompArray[c];
sorted_layer_array *SortedLayerStart = Sorted_GetLayerStart(SortedLayerArray, SortedCompArray, c);
int LayerCount = SortedCompStart.LayerCount + SortedCompStart.FakeLayerCount;
- int Increment = 0;
for (int i = 0; i < LayerCount; i++)
{
sorted_layer_array SortEntry = SortedLayerStart[i];
@@ -706,23 +729,16 @@ Project_Layer_Duplicate(project_data *File, project_state *State, memory *Memory
History_Action_Block_Swap(Memory, F_Layers, NewLayer);
*NewLayer = *Layer;
+ if (NewPrecomp && Layer->IsPrecomp) {
+ NewLayer->Block_Source_Index = Layer_Precomp_CopyContents();
+ }
+
Assert(Layer->Block_Effect_Count == 0);
Layer_Select(Memory, State, Memory_Block_LazyIndexAtAddress(Memory, F_Layers, NewLayer));
NewLayer->Vertical_Offset--;
- for (int a = i+1; a < LayerCount; a++) {
- sorted_layer_array PrevSortEntry = SortedLayerStart[a-1];
- uint32 PrevIndex_Physical = PrevSortEntry.Block_Layer_Index;
- block_layer *PrevLayer = (block_layer *)Memory_Block_AddressAtIndex(Memory, F_Layers, PrevIndex_Physical);
- sorted_layer_array NextSortEntry = SortedLayerStart[a];
- uint32 NextIndex_Physical = NextSortEntry.Block_Layer_Index;
- block_layer *NextLayer = (block_layer *)Memory_Block_AddressAtIndex(Memory, F_Layers, NextIndex_Physical);
- if (NextLayer->Vertical_Offset == PrevLayer->Vertical_Offset)
- NextLayer->Vertical_Offset -= 1;
- else
- break;
- }
+ SortUnionTest(Memory, SortedLayerStart, NewLayer, i, 0, LayerCount, 0);
Assert(!NewLayer->x.Keyframe_Count);
Assert(!NewLayer->y.Keyframe_Count);
@@ -738,15 +754,18 @@ Project_Layer_Duplicate(project_data *File, project_state *State, memory *Memory
History_Action_Swap(Memory, F_File, sizeof(File->Layer_Count), &File->Layer_Count);
File->Layer_Count++;
- Increment++;
} else {
- // History_Action_Swap(Memory, F_Layers, sizeof(Layer->Vertical_Offset), &Layer->Vertical_Offset);
Layer->IsSelected = false;
}
}
}
}
+// TODO(fox): We may need a way to recalculate width/height when points are
+// moved since selection depends on it.
+// TODO(fox): We could also write better selection code for shapes that
+// actually tests using the bezier path (preferrable).
+
static void
Project_ShapeLayer_New(project_data *File, project_state *State, memory *Memory)
{
@@ -767,6 +786,14 @@ Project_ShapeLayer_New(project_data *File, project_state *State, memory *Memory)
shape_layer *Shape = &File->UI.Shape;
+ Layer->Block_Composition_Index = File->PrincipalCompIndex;
+ if (State->MostRecentlySelectedLayer == -1) {
+ Layer->Block_Composition_Index = File->PrincipalCompIndex;
+ } else {
+ // LayerIterate_DeepestPrecomp(State, Memory, CompIndex, ExtraT, Center,
+ // SortedCompArray, SortedLayerArray, SelectionCount, SelectedLayerIndex, SelectedPrecompIndex)
+ }
+ // Rect mode
if (State->Interact_Modifier == 1) {
v2 *CompPoint = (v2 *)&State->Interact_Offset[0];
for (int i = 0; i < 4; i++) {
@@ -896,37 +923,6 @@ void Source_UICreateButton(project_data *File, project_state *State, memory *Mem
Source_DeselectAll(File, Memory);
}
-void Precomp_UIDuplicate(project_data *File, project_state *State, memory *Memory, uint16 CompIndex,
- sorted_comp_array SortedCompStart, sorted_layer_array *SortedLayerStart)
-{
- block_layer *Layer = NULL;
- for (int i = SortedCompStart.LayerCount - 1; i >= 0; i--)
- {
- sorted_layer_array SortEntry = SortedLayerStart[i];
- uint32 Index_Physical = SortEntry.Block_Layer_Index;
- Layer = (block_layer *)Memory_Block_AddressAtIndex(Memory, F_Layers, Index_Physical);
- if (Layer->IsSelected) {
- break;
- }
- }
- if (Layer) {
- block_layer *DupeLayer = Layer_Init(File, Memory);
- *DupeLayer = *Layer;
- DupeLayer->Vertical_Offset += 1;
- for (int h = 0; h < AmountOf(Layer->Property); h++) {
- property_channel *Property = &Layer->Property[h];
- if (Property->Block_Bezier_Count) {
- property_channel *DupeProperty = &DupeLayer->Property[h];
- DupeProperty->Block_Bezier_Index[0] = Memory_Block_AllocateNew(Memory, F_Bezier);
- block_bezier *Bezier = (block_bezier *)Memory_Block_AddressAtIndex(Memory, F_Bezier, Property->Block_Bezier_Index[0]);
- block_bezier *DupeBezier = (block_bezier *)Memory_Block_AddressAtIndex(Memory, F_Bezier, DupeProperty->Block_Bezier_Index[0], 0);
- Bezier->Occupied = true;
- *DupeBezier = *Bezier;
- }
- }
- }
-}
-
void Precomp_UIDelete(project_data *File, project_state *State, memory *Memory, uint16 CompIndex,
sorted_comp_array SortedCompStart, sorted_layer_array *SortedLayerStart)
{