diff options
Diffstat (limited to 'src/imgui_ui_viewport.cpp')
-rw-r--r-- | src/imgui_ui_viewport.cpp | 44 |
1 files changed, 30 insertions, 14 deletions
diff --git a/src/imgui_ui_viewport.cpp b/src/imgui_ui_viewport.cpp index 2489cd5..ed26ce7 100644 --- a/src/imgui_ui_viewport.cpp +++ b/src/imgui_ui_viewport.cpp @@ -394,7 +394,11 @@ ImGui_Viewport_TransformUI2(project_data *File, project_state *State, memory *Me real32 U = LayerPoint.x / BoxLength.x; real32 V = LayerPoint.y / BoxLength.y; + ImVec2 BoxScreenDimensions = IV2(BoxLength)*CompScale; + real32 HandleSize = ImGui::GetFontSize() * 2; + if (BoxScreenDimensions.x < (HandleSize*2) || BoxScreenDimensions.y < (HandleSize*2)) + HandleSize *= 0.5; ImVec2 ScaleHandleSize(HandleSize, HandleSize); bool32 OtherActions = ImGui::IsKeyDown(ImGuiKey_Z); @@ -669,7 +673,7 @@ ImGui_Viewport_TransformUI2(project_data *File, project_state *State, memory *Me Assert(State->Tool == tool_default); if (!io.KeyShift) { - Layer_DeselectAll(File, State, Memory); + Layer_DeselectAll(File, State, Memory, 1); State->Interact_Transform = {}; } if (Selection != -1) @@ -928,7 +932,7 @@ ImGui_Viewport_TransformUI(project_data *File, project_state *State, memory *Mem History_Entry_Commit(Memory, "Transform layers"); while (Block_Loop(Memory, F_Layers, File->Layer_Count, &h, &c, &i)) { block_layer *Layer = (block_layer *)Memory_Block_AddressAtIndex(Memory, F_Layers, i); - if (Layer->IsSelected == 1) { + if (Layer->IsSelected & 0x01) { // if (io.KeyCtrl) { // layer_transforms T = Layer_GetTransforms(Layer); // Transform_ApplyInteractive(*(interact_transform *)&State->Interact_Offset[0], &T.x, &T.y, &T.rotation, &T.scale); @@ -987,7 +991,7 @@ ImGui_Viewport_SelectedLayerUI(project_state *State, memory *Memory, ui *UI, ImG } ImGui_Viewport_SelectedLayerUI(State, Memory, UI, io, draw_list, MainComp, Layer->Block_Source_Index, NewExtraT, PointCount, PointData, SortedCompArray, SortedLayerArray); } - if (Layer->IsSelected == 1) { + if (Layer->IsSelected & 0x01) { uint32 Width = 0, Height = 0; void *Data; uint32 NumberOfVerts; @@ -1017,11 +1021,11 @@ ImGui_Viewport_SelectedLayerUI(project_state *State, memory *Memory, ui *UI, ImG layer_transforms T = Layer_GetTransforms(Layer); if ((State->Interact_Active == interact_type_viewport_transform || - State->Interact_Active == interact_type_viewport_transform_gizmo) && Layer->IsSelected == 1) { + State->Interact_Active == interact_type_viewport_transform_gizmo) && Layer->IsSelected & 0x01) { Transform_ApplyInteractive(State->Interact_Transform, &T.x, &T.y, &T.rotation, &T.scale); } if (State->Interact_Active == interact_type_viewport_duplicate && SortEntry.IsFake) { - Assert(Layer->IsSelected); + Assert(Layer->IsSelected & 0x01); T.x += State->Interact_Offset[0]; T.y += State->Interact_Offset[1]; } @@ -1226,7 +1230,7 @@ ImGui_Viewport(project_data *File, project_state *State, ui *UI, memory *Memory, block_layer *Layer = (block_layer *)Memory_Block_AddressAtIndex(Memory, F_Layers, i); if (!Layer->IsPrecomp) { block_source *Source = (block_source *)Memory_Block_AddressAtIndex(Memory, F_Sources, Layer->Block_Source_Index); - if (Layer->IsSelected && Source->Type == source_type_principal) { + if ((Layer->IsSelected & 0x01) && Source->Type == source_type_principal) { Assert(Source->BytesPerPixel == 4); Arbitrary_Zero((uint8 *)State->Brush.TransientBitmap, 2048*2048*4); State->Interact_Active = interact_type_brush; @@ -1263,7 +1267,7 @@ ImGui_Viewport(project_data *File, project_state *State, ui *UI, memory *Memory, if (BoxMax.x - BoxMin.x > 0.1f && BoxMax.y - BoxMin.y > 0.1f) { Assert(BoxMax.x > BoxMin.x && BoxMax.y > BoxMin.y) - BoxMax.y = (MousePos.y > ClickedPos.y) ? MousePos.y : ClickedPos.y; + if (io.MouseDelta.x || io.MouseDelta.y) { if (State->Tool == tool_default && State->Interact_Active == interact_type_none) { layer_transforms T = {}; @@ -1271,22 +1275,26 @@ ImGui_Viewport(project_data *File, project_state *State, ui *UI, memory *Memory, v2 CompPoint = ImGui_ScreenPointToCompUV(ViewportMin, UI->CompPos, UI->CompZoom, io.MousePos) * V2(MainComp->Width, MainComp->Height); int32 Selection = LayerIterate_TestSelection(State, Memory, File->PrincipalCompIndex, T, CompPoint, SortedCompArray, SortedLayerArray, io.KeyShift); - if (!State->InteractTransformMode && Selection != -1) { - if (!io.KeyShift) - Layer_DeselectAll(File, State, Memory); + if (!io.KeyShift && !State->InteractTransformMode && Selection != -1) { + Layer_DeselectAll(File, State, Memory); Layer_Select(Memory, State, Selection); State->Interact_Active = interact_type_viewport_transform_gizmo; State->Interact_OutOfDrag = true; State->InteractTransformMode = 3; } else { State->Interact_Active = interact_type_viewport_selection; + if (io.KeyShift) { + Interact_BoxSelect_Start(File, State, Memory); + } } } if (State->Interact_Active == interact_type_viewport_selection) { - Layer_DeselectAll(File, State, Memory); + Layer_DeselectAll(File, State, Memory, 1); v2 MinPos_Comp = ImGui_ScreenPointToCompUV(ViewportMin, UI->CompPos, UI->CompZoom, BoxMin) * V2(MainComp->Width, MainComp->Height); v2 MaxPos_Comp = ImGui_ScreenPointToCompUV(ViewportMax, UI->CompPos, UI->CompZoom, BoxMax) * V2(MainComp->Width, MainComp->Height); - Layer_TestBoxSelect(Memory, State, UI, SortedCompArray, SortedLayerArray, File->PrincipalCompIndex, MinPos_Comp, MaxPos_Comp); + layer_transforms T = {}; + T.scale = 1.0f; + Layer_TestBoxSelect(Memory, State, UI, SortedCompArray, SortedLayerArray, File->PrincipalCompIndex, T, MinPos_Comp, MaxPos_Comp); } } if (State->Interact_Active == interact_type_viewport_selection) { @@ -1326,6 +1334,7 @@ ImGui_Viewport(project_data *File, project_state *State, ui *UI, memory *Memory, } if (IsDeactivated && State->Interact_Active == interact_type_viewport_selection) { + Interact_BoxSelect_End(File, State, Memory); State->Interact_Active = interact_type_none; } @@ -1465,8 +1474,15 @@ ImGui_Viewport(project_data *File, project_state *State, ui *UI, memory *Memory, real32 Distance = 0; if (IsActive) { - if (ImGui::IsMouseDragging(ImGuiMouseButton_Left, -1.0f)) + if (ImGui::IsMouseDragging(ImGuiMouseButton_Left, -1.0f)) { + real32 MouseVecLength = Length(io.MousePos - io.MouseClickedPos[0]); + real32 MouseMaxLength = ViewportScale.x; Distance = io.MouseDelta.x + io.MouseDelta.y; + real32 Multiplier = -log(1.0f - (MouseVecLength / MouseMaxLength)); + if (isnan(Multiplier)) + Multiplier = 0.0f; + Distance = Distance + (Distance * Multiplier); + } if (ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left)) Distance = 200; } @@ -1494,7 +1510,7 @@ ImGui_Viewport(project_data *File, project_state *State, ui *UI, memory *Memory, State->Interact_Active = interact_type_none; State->Interact_Modifier = 0; v2 Offset = V2(State->Interact_Offset[0], State->Interact_Offset[1]); - Project_Layer_Duplicate(File, State, Memory, SortedCompArray, SortedLayerArray, Offset, 1); + Project_Layer_Duplicate(File, State, Memory, SortedCompArray, SortedLayerArray, Offset, 1, io.KeyCtrl); State->Interact_Dup_Previous[0] = State->Interact_Offset[0]; State->Interact_Dup_Previous[1] = State->Interact_Offset[1]; State->Interact_Offset[0] = 0; |