From f7a194270e25deeb3ce9c9b9fbce0da8b6be71ca Mon Sep 17 00:00:00 2001 From: Fox Caminiti Date: Sun, 5 Mar 2023 13:29:14 -0500 Subject: v4.6 --- src/createcalls.cpp | 78 ++++++++++++++++++++++++++--------------------- src/imgui_ui.cpp | 14 +++++++++ src/imgui_ui_timeline.cpp | 16 +++++----- src/imgui_ui_viewport.cpp | 12 +++++--- src/include/all.h | 2 +- src/include/main.h | 4 +++ src/main.cpp | 33 +++++++++++++++----- src/sorted.cpp | 28 ++++------------- 8 files changed, 111 insertions(+), 76 deletions(-) diff --git a/src/createcalls.cpp b/src/createcalls.cpp index ffb4c0f..c082bda 100644 --- a/src/createcalls.cpp +++ b/src/createcalls.cpp @@ -789,9 +789,46 @@ Property_IsGraphSelected(memory *Memory, uint16 *Block_Bezier_Index, uint16 *Arr } static void -Sort_OffsetDupes(memory *Memory, sorted_layer_array *SortedLayerStart, block_layer *StartLayer, - int i, int FauxIncrement, int LayerCount, int Mode) +Sort_OffsetDupes(project_state *State, memory *Memory, sorted_layer_array *SortedLayerStart, + int Direction, int FirstDupeIdx, int LayerCount, int FakeLayerCount) { + int FauxIncrement = 0; + int FurthestMark = -1; + { + sorted_layer_array SortEntry = SortedLayerStart[FirstDupeIdx]; + uint32 Index_Physical = SortEntry.Block_Layer_Index; + block_layer *Layer = (block_layer *)Memory_Block_AddressAtIndex(Memory, F_Layers, Index_Physical); + FurthestMark = Layer->Vertical_Offset; + } + // TODO(fox): make this less ghetto + if (State->DuplicateMode & sortflag_furthest && !(State->DuplicateMode & sortflag_up)) + { + FauxIncrement = -FakeLayerCount; + } + int i = (Direction > 0) ? 0 : LayerCount - 1; + int Test = 0; + for (;;) + { + sorted_layer_array SortEntry = SortedLayerStart[i]; + uint32 Index_Physical = SortEntry.Block_Layer_Index; + block_layer *Layer = (block_layer *)Memory_Block_AddressAtIndex(Memory, F_Layers, Index_Physical); + if (Layer->IsSelected) + Test = 1; + if (Test) + History_Action_Swap(Memory, F_Layers, sizeof(Layer->Vertical_Offset), &Layer->Vertical_Offset); + if (Layer->IsSelected) { + if (State->DuplicateMode & sortflag_furthest) + Layer->Vertical_Offset = FurthestMark; + FauxIncrement += Direction; + if (State->DuplicateMode & sortflag_furthest && !(State->DuplicateMode & sortflag_up)) + Layer->Vertical_Offset += 1; + } + Layer->Vertical_Offset -= FauxIncrement; + int a = 0; + i += Direction; + if ((Direction > 0) ? (i >= LayerCount) : (i < 0)) + break; + } } // NOTE(fox): PrecompLayer is assumed to be untouched from the layer it was duplicated from! @@ -853,7 +890,7 @@ Project_Layer_Duplicate(project_data *File, project_state *State, memory *Memory int LayerCount = SortedCompStart.LayerCount + SortedCompStart.FakeLayerCount; int FirstDupe = -1; int DupeCount = 0; - int Direction = (State->DuplicateMode & sortflag_up) ? 1 : -1; + int Direction = (State->DuplicateMode & sortflag_up) ? -1 : -1; if (State->DuplicateMode & sortflag_furthest && !(State->DuplicateMode & sortflag_up)) Direction *= -1; int i = (Direction > 0) ? 0 : LayerCount - 1; @@ -905,39 +942,10 @@ Project_Layer_Duplicate(project_data *File, project_state *State, memory *Memory break; i += Direction; } + if (State->DuplicateMode & sortflag_up) + Direction *= -1; if (FirstDupe > -1) { - int FauxIncrement = 0; - int FurthestMark = -1; - { - sorted_layer_array SortEntry = SortedLayerStart[FirstDupe]; - uint32 Index_Physical = SortEntry.Block_Layer_Index; - block_layer *Layer = (block_layer *)Memory_Block_AddressAtIndex(Memory, F_Layers, Index_Physical); - FurthestMark = Layer->Vertical_Offset; - } - if (State->DuplicateMode & sortflag_furthest && !(State->DuplicateMode & sortflag_up)) - { - FauxIncrement = -SortedCompStart.FakeLayerCount; - } - int i = (Direction > 0) ? 0 : LayerCount - 1; - for (;;) - { - sorted_layer_array SortEntry = SortedLayerStart[i]; - uint32 Index_Physical = SortEntry.Block_Layer_Index; - block_layer *Layer = (block_layer *)Memory_Block_AddressAtIndex(Memory, F_Layers, Index_Physical); - History_Action_Swap(Memory, F_Layers, sizeof(Layer->Vertical_Offset), &Layer->Vertical_Offset); - if (Layer->IsSelected) { - if (State->DuplicateMode & sortflag_furthest) - Layer->Vertical_Offset = FurthestMark; - FauxIncrement += Direction; - if (State->DuplicateMode & sortflag_furthest && !(State->DuplicateMode & sortflag_up)) - Layer->Vertical_Offset += 1; - } - Layer->Vertical_Offset -= FauxIncrement; - int a = 0; - if ((Direction > 0) ? !(i < LayerCount) : (i <= 0)) - break; - i += Direction; - } + Sort_OffsetDupes(State, Memory, SortedLayerStart, Direction, FirstDupe, LayerCount, SortedCompArray->FakeLayerCount); } } } diff --git a/src/imgui_ui.cpp b/src/imgui_ui.cpp index aa09bfb..6bc6d85 100644 --- a/src/imgui_ui.cpp +++ b/src/imgui_ui.cpp @@ -749,6 +749,20 @@ ImGui_Menu(project_data *File, project_state *State, ui *UI, memory *Memory, ImG } if (ImGui::BeginMenu("Window")) { + if (ImGui::BeginMenu("Background viewport color")) + { + ImGuiColorEditFlags flags_primary = ImGuiColorEditFlags_AlphaPreview | + ImGuiColorEditFlags_Float; + ImGuiColorEditFlags flags_picker = ImGuiColorEditFlags_PickerHueBar | + ImGuiColorEditFlags_AlphaBar | + ImGuiColorEditFlags_NoSmallPreview | + ImGuiColorEditFlags_NoSidePreview | + ImGuiColorEditFlags_DisplayRGB | + ImGuiColorEditFlags_DisplayHSV | + ImGuiColorEditFlags_DisplayHex; + ImGui::ColorPicker4("##bgcolorpicker", &UI->BGColor.r, flags_primary | flags_picker); + ImGui::EndMenu(); + } if (ImGui::Selectable("Standard view", UI->Mode == 0)) UI->Mode = 0; if (ImGui::Selectable("Vector view", UI->Mode == 1)) diff --git a/src/imgui_ui_timeline.cpp b/src/imgui_ui_timeline.cpp index 8b8ca36..ab38bae 100644 --- a/src/imgui_ui_timeline.cpp +++ b/src/imgui_ui_timeline.cpp @@ -513,7 +513,7 @@ ImGui_Timeline_DrawPrecomp(project_data *File, project_state *State, memory *Mem Test &= (Layer_ScreenPos_Min.x <= io.MouseClickedPos[0].x && Layer_ScreenPos_Max.x >= io.MousePos.x); if (Test) { - if (!(Layer->IsSelected & 0x01) && !(Layer->IsSelected & 0x02) && !Layer->IsLocked) { + if (!(Layer->IsSelected & 0x01) && !(Layer->IsSelected & 0x02) && (!Layer->IsLocked || io.KeyCtrl)) { Layer_Select(Memory, State, Index_Physical); } } else if (!io.KeyShift) { @@ -599,15 +599,16 @@ ImGui_Timeline_DrawPrecomp(project_data *File, project_state *State, memory *Mem if (ImGui::MenuItem("Visible", NULL, Layer->IsVisible)) { bool32 Commit = false; int h = 0, z = 0, i = 0; + bool32 Val = Layer->IsVisible ^ 1; while (Block_Loop(Memory, F_Layers, File->Layer_Count, &h, &z, &i)) { - block_layer *Layer = (block_layer *)Memory_Block_AddressAtIndex(Memory, F_Layers, i); - if (Layer->IsSelected & 0x01) { + block_layer *CurLayer = (block_layer *)Memory_Block_AddressAtIndex(Memory, F_Layers, i); + if (CurLayer->IsVisible != Val && CurLayer->IsSelected & 0x01) { if (!Commit) { History_Entry_Commit(Memory, "Toggle visibility"); Commit = true; } - History_Action_Swap(Memory, F_Layers, sizeof(Layer->IsVisible), &Layer->IsVisible); - Layer->IsVisible ^= 1; + History_Action_Swap(Memory, F_Layers, sizeof(CurLayer->IsVisible), &CurLayer->IsVisible); + CurLayer->IsVisible = Val; } } if (Commit) { @@ -618,15 +619,16 @@ ImGui_Timeline_DrawPrecomp(project_data *File, project_state *State, memory *Mem if (ImGui::MenuItem("Lock", NULL, Layer->IsLocked)) { bool32 Commit = false; int h = 0, z = 0, i = 0; + bool32 Val = Layer->IsLocked ^ 1; while (Block_Loop(Memory, F_Layers, File->Layer_Count, &h, &z, &i)) { block_layer *CurLayer = (block_layer *)Memory_Block_AddressAtIndex(Memory, F_Layers, i); - if ((CurLayer->IsSelected & 0x01) || (Layer == CurLayer)) { + if (CurLayer->IsLocked != Val && ((CurLayer->IsSelected & 0x01) || (Layer == CurLayer))) { if (!Commit) { History_Entry_Commit(Memory, "Toggle lock"); Commit = true; } History_Action_Swap(Memory, F_Layers, sizeof(CurLayer->IsLocked), &CurLayer->IsLocked); - CurLayer->IsLocked ^= 1; + CurLayer->IsLocked = Val; } } if (Commit) { diff --git a/src/imgui_ui_viewport.cpp b/src/imgui_ui_viewport.cpp index 0cfc7da..9b9942a 100644 --- a/src/imgui_ui_viewport.cpp +++ b/src/imgui_ui_viewport.cpp @@ -648,6 +648,8 @@ ImGui_Viewport_TransformUI2(project_data *File, project_state *State, memory *Me // mouse's transform. History_Entry_Commit(Memory, "Transform layers"); + State->Interact_Transform_Prev = State->Interact_Transform; + interact_transform Interact = State->Interact_Transform; v2 BoxLength = Interact.Max - Interact.Min; v2 Center = Interact.Max - (BoxLength/2); @@ -663,7 +665,7 @@ ImGui_Viewport_TransformUI2(project_data *File, project_state *State, memory *Me layer_transforms T = {}; T.scale = 1.0f; - LayerIterate(State, Memory, File->PrincipalCompIndex, T, Center, SortedCompArray, SortedLayerArray); + LayerIterate(State, Memory, File->PrincipalCompIndex, State->Interact_Transform, T, Center, SortedCompArray, SortedLayerArray); History_Entry_End(Memory); State->UpdateFrame = true; State->UncommitedKeyframe = 1; @@ -828,8 +830,8 @@ ImGui_Viewport_SelectedLayerUI(project_state *State, memory *Memory, ui *UI, ImG if (State->Interact_Active != interact_type_viewport_transform_gizmo) { if (State->Tool != tool_brush) { ImU32 wcol2 = IM_COL32(10, 10, 10, 128); - draw_list->AddNgon(ScreenPoint[0], 10, wcol2, 8, 9.0f); - draw_list->AddNgon(ScreenPoint[0], 10, wcol, 8, 5.0f); + draw_list->AddNgonFilled(ScreenPoint[0], 5, wcol2, 6); + draw_list->AddNgonFilled(ScreenPoint[0], 3, wcol, 6); } draw_list->AddLine(ScreenPoint[1], ScreenPoint[2], wcol, 1.0f); draw_list->AddLine(ScreenPoint[2], ScreenPoint[4], wcol, 1.0f); @@ -901,7 +903,7 @@ ImGui_Viewport(project_data *File, project_state *State, ui *UI, memory *Memory, Data += sizeof(gl_viewport_data); *RenderData = { ViewportMin, ViewportMax, ImGui::GetMainViewport()->Size, State->ViewportEnabled, Comp->Width, Comp->Height, Comp->BytesPerPixel, - UI->CompPos, UI->CompZoom, UI->CompZoom.x / Comp->Width, {} }; + UI->CompPos, UI->CompZoom, UI->CompZoom.x / Comp->Width, UI->BGColor, {} }; layer_transforms ExtraT = {}; Render_UI(File, State, Memory, UI, draw_list, Data, RenderData, SortedCompArray, SortedLayerArray, ExtraT, @@ -1307,6 +1309,8 @@ ImGui_Viewport(project_data *File, project_state *State, ui *UI, memory *Memory, State->Interact_Offset[0] = 0; State->Interact_Offset[1] = 0; State->Interact_Transform = {}; + State->Interact_Transform_Prev = {}; + State->Interact_Transform_Prev.Position = Offset; History_Entry_End(Memory); } else { Assert(IsActive); diff --git a/src/include/all.h b/src/include/all.h index 8182b26..4382d17 100644 --- a/src/include/all.h +++ b/src/include/all.h @@ -526,7 +526,7 @@ static void Transform_ApplyInteractive(interact_transform Interact, real32 *OutputX, real32 *OutputY, real32 *OutputRotation, real32 *OutputScale); static void -LayerIterate(project_state *State, memory *Memory, uint32 CompIndex, layer_transforms ExtraT, v2 Center, +LayerIterate(project_state *State, memory *Memory, uint32 CompIndex, interact_transform Interact_Transform, layer_transforms ExtraT, v2 Center, sorted_comp_array *SortedCompArray, sorted_layer_array *SortedLayerArray); static void diff --git a/src/include/main.h b/src/include/main.h index 8debbb0..375d8da 100644 --- a/src/include/main.h +++ b/src/include/main.h @@ -441,6 +441,7 @@ struct gl_viewport_data ImVec2 UIPos; ImVec2 UIZoom; real32 UIScale; + v4 BGColor; gl_data *LayerEntry[MAX_LAYERS]; int LayerCount; }; @@ -563,6 +564,7 @@ struct project_state selection_type RecentSelectionType = selection_type_none; interact_transform Interact_Transform; + interact_transform Interact_Transform_Prev; interact_type Interact_Active; int32 Interact_Modifier; bool32 Interact_OutOfDrag; // TODO(fox): replace this @@ -612,6 +614,7 @@ struct project_state focused_window FocusedWindow; // Convenience for adding window-specific hotkeys. bool32 SetFocus; v2 LastClickedPoint = V2(1, 1); + }; // UI info that's saved to the file and is not part of the history tree @@ -632,6 +635,7 @@ struct ui v4 Color = {1, 1, 1, 1}; v4 AltColor = {0, 0, 0, 1}; bool32 IsPrimary; + v4 BGColor = {0, 0, 0, 1}; #if STABLE sd_state SD; diff --git a/src/main.cpp b/src/main.cpp index 42c07a9..7cc4745 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -329,7 +329,7 @@ GL_Test(const ImDrawList* parent_list, const ImDrawCmd* cmd) GL_UpdateTexture2(&MSBuffer2, NULL, A[2], A[3], RenderData->BytesPerPixel, 0); glBindFramebuffer(GL_FRAMEBUFFER, MSBuffer.FramebufferObject); glBindTexture(GL_TEXTURE_2D, 0); - glClearColor(0.0f, 0.0f, 0.0f, 0.0f); + glClearColor(RenderData->BGColor.r, RenderData->BGColor.g, RenderData->BGColor.b, 0.0f); glClear(GL_COLOR_BUFFER_BIT); glUseProgram(DefaultShaderProgram); @@ -565,7 +565,7 @@ LayerIterate_TestSelection(project_state *State, memory *Memory, uint32 Principa // finding the inverse transform-- i.e. transforming the layers locally rather // than transforming them in comp space. static void -LayerIterate(project_state *State, memory *Memory, uint32 CompIndex, layer_transforms ExtraT, v2 Center, +LayerIterate(project_state *State, memory *Memory, uint32 CompIndex, interact_transform Interact_Transform, layer_transforms ExtraT, v2 Center, sorted_comp_array *SortedCompArray, sorted_layer_array *SortedLayerArray) { block_composition *Comp = (block_composition *)Memory_Block_AddressAtIndex(Memory, F_Precomps, CompIndex); @@ -585,14 +585,14 @@ LayerIterate(project_state *State, memory *Memory, uint32 CompIndex, layer_trans v2 NewCenter = T_CompPosToLayerPos(NewExtraT, Comp->Width, Comp->Height, Width, Height, Center.x, Center.y); NewExtraT.rotation = ExtraT.rotation - NewExtraT.rotation; NewExtraT.scale = ExtraT.scale / NewExtraT.scale; - LayerIterate(State, Memory, Layer->Block_Source_Index, NewExtraT, NewCenter, SortedCompArray, SortedLayerArray); + LayerIterate(State, Memory, Layer->Block_Source_Index, Interact_Transform, NewExtraT, NewCenter, SortedCompArray, SortedLayerArray); } if (Layer->IsSelected & 0x01) { #if DEBUG if (Layer->IsPrecomp) PostMsg(State, "DEBUG: Precomp transformed!"); #endif - v2 Position = State->Interact_Transform.Position; + v2 Position = Interact_Transform.Position; real32 Rad = (ExtraT.rotation * (PI / 180)); v2 XAxis = Position.x * ExtraT.scale * V2(cos(Rad), sin(Rad)); v2 YAxis = Position.y * -ExtraT.scale * V2(sin(Rad), -cos(Rad)); @@ -602,7 +602,7 @@ LayerIterate(project_state *State, memory *Memory, uint32 CompIndex, layer_trans History_Action_Swap(Memory, F_Layers, sizeof(Layer->y.CurrentValue), &Layer->y.CurrentValue); History_Action_Swap(Memory, F_Layers, sizeof(Layer->scale.CurrentValue), &Layer->scale.CurrentValue); History_Action_Swap(Memory, F_Layers, sizeof(Layer->rotation.CurrentValue), &Layer->rotation.CurrentValue); - Transform_ApplyLocal(State->Interact_Transform, Position, Center, + Transform_ApplyLocal(Interact_Transform, Position, Center, &Layer->x.CurrentValue, &Layer->y.CurrentValue, &Layer->rotation.CurrentValue, &Layer->scale.CurrentValue); } } @@ -1242,6 +1242,8 @@ int main(int argc, char *argv[]) { File->Comp_Count = 1; + File->UI.BGColor= V4(0.1, 0.1, 0.1, 0.0); + SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO); SDL_AudioSpec Audio = {0}; @@ -1508,8 +1510,25 @@ int main(int argc, char *argv[]) { State->Interact_Active = interact_type_viewport_duplicate; sorted_file Sorted = File_Sort_Push(File, State, &Memory); History_Entry_Commit(&Memory, "Duplicate layers"); - v2 Offset = V2(State->Interact_Dup_Previous[0], State->Interact_Dup_Previous[1]); - Project_Layer_Duplicate(File, State, &Memory, Sorted.CompArray, Sorted.LayerArray, Offset, io.KeyCtrl); + Project_Layer_Duplicate(File, State, &Memory, Sorted.CompArray, Sorted.LayerArray, V2(0, 0), 0); + if (!io.KeyCtrl) + { + interact_transform Interact = State->Interact_Transform_Prev; + v2 BoxLength = Interact.Max - Interact.Min; + v2 Center = Interact.Max - (BoxLength/2); + if (Interact.RadianOffset != 0.0f) { + v2 LocalCenter = Interact.NewCenter; + real32 Rad = Interact.RadianOffset; + real32 Point0X = Center.x - Interact.OGCenter.x; + real32 Point0Y = Center.y - Interact.OGCenter.y; + v2 XAxis = (Point0X * 1.0f)*V2(cos(Rad), sin(Rad)); + v2 YAxis = (Point0Y * 1.0f)*V2(sin(Rad), -cos(Rad)); + Center = Interact.OGCenter + XAxis + YAxis; + } + layer_transforms T = {}; + T.scale = 1.0f; + LayerIterate(State, &Memory, File->PrincipalCompIndex, Interact, T, Center, Sorted.CompArray, Sorted.LayerArray); + } State->Interact_Transform = {}; History_Entry_End(&Memory); File_Sort_Pop(&Memory, Sorted.Layer_SortSize, Sorted.Property_SortSize, Sorted.Source_SortSize); diff --git a/src/sorted.cpp b/src/sorted.cpp index c039c08..b9bbb25 100644 --- a/src/sorted.cpp +++ b/src/sorted.cpp @@ -314,7 +314,8 @@ Layer_SortAll(project_state *State, memory *Memory, Arbitrary_ShiftData(Address_Start, Address_End, sizeof(sorted_layer_array) * SortedCompStart->FakeLayerCount, 1); FurthestMark = i + ((Direction > 0) ? 0 : -Direction); } - sorted_layer_array *FakeLayerEntry = &SortedLayerStart[FurthestMark + (FauxIncrement * ((Direction > 0) ? 1 : -Direction))]; + int FakeIdx = FurthestMark + ((Direction > 0) ? FauxIncrement : (SortedCompStart->FakeLayerCount - 1) - FauxIncrement); + sorted_layer_array *FakeLayerEntry = &SortedLayerStart[FakeIdx]; *FakeLayerEntry = *LayerEntry; FakeLayerEntry->IsFake = true; FauxIncrement++; @@ -329,30 +330,13 @@ Layer_SortAll(project_state *State, memory *Memory, FauxIncrement++; } } - if ((Direction > 0) ? !(i < SortedCompStart->LayerCount) : (i <= 0)) - break; i += Direction; - } - if (Furthest) { Direction *= -1; } - i = FauxIncrement = 0; - int LayerCount = SortedCompStart->LayerCount + SortedCompStart->FakeLayerCount; - FurthestMark = -1; - i = (Direction > 0) ? 0 : LayerCount - 1; - for (;;) { - sorted_layer_array *LayerEntry = &SortedLayerStart[i]; - block_layer *Layer = (block_layer *)Memory_Block_AddressAtIndex(Memory, F_Layers, LayerEntry->Block_Layer_Index); - if (LayerEntry->IsFake) { - if (FurthestMark == -1) - FurthestMark = Layer->Vertical_Offset; - if (Furthest) - LayerEntry->SortedOffset = FurthestMark; - FauxIncrement += Direction; - } - LayerEntry->SortedOffset -= FauxIncrement; - if ((Direction > 0) ? !(i < LayerCount) : (i <= 0)) + if ((Direction > 0) ? (i >= SortedCompStart->LayerCount) : (i < 0)) break; - i += Direction; } + // TODO(fox): Intermediate offset? + // Sort_OffsetDupes(State, Memory, SortedLayerStart, + // Direction, DupeIdx, LayerCount, SortedCompStart->FakeLayerCount) } } } -- cgit v1.2.3