diff --git a/src/document.h b/src/document.h index 71f64b2..e2339b1 100644 --- a/src/document.h +++ b/src/document.h @@ -18,6 +18,7 @@ namespace anm2ed LAYERS, NULLS, SPRITESHEETS, + TEXTURES, EVENTS, ANIMATIONS, ITEMS, diff --git a/src/imgui/window/animation_preview.cpp b/src/imgui/window/animation_preview.cpp index 3f23c24..41ee915 100644 --- a/src/imgui/window/animation_preview.cpp +++ b/src/imgui/window/animation_preview.cpp @@ -648,20 +648,32 @@ namespace anm2ed::imgui : ImGuiMouseCursor_NotAllowed; ImGui::SetMouseCursor(cursor); ImGui::SetKeyboardFocusHere(); - + if (useTool != tool::MOVE) isMoveDragging = false; switch (useTool) { case tool::PAN: - if (isMouseDown || isMouseMiddleDown) pan += mouseDelta; + if (isMouseDown || isMouseMiddleDown) pan += vec2(mouseDelta.x, mouseDelta.y); break; case tool::MOVE: if (!frame) break; - if (isBegin) document.snapshot("Frame Position"); - if (isMouseDown) frame->position = mousePos; + if (isBegin) + { + document.snapshot("Frame Position"); + if (isMouseClicked) + { + moveOffset = mousePos - frame->position; + isMoveDragging = true; + } + } + if (isMouseDown && isMoveDragging) + { + frame->position = ivec2(mousePos - moveOffset); + } if (isLeftPressed) frame->position.x -= step; if (isRightPressed) frame->position.x += step; if (isUpPressed) frame->position.y -= step; if (isDownPressed) frame->position.y += step; + if (isMouseReleased) isMoveDragging = false; if (isEnd) document.change(Document::FRAMES); if (isDuring) { @@ -679,7 +691,7 @@ namespace anm2ed::imgui if (isBegin) document.snapshot("Frame Scale"); if (isMouseDown) { - frame->scale += mouseDelta; + frame->scale += vec2(mouseDelta.x, mouseDelta.y); if (isMod) frame->scale = {frame->scale.x, frame->scale.x}; } if (isLeftPressed) frame->scale.x -= step; diff --git a/src/imgui/window/animation_preview.h b/src/imgui/window/animation_preview.h index cc1fa68..61395c6 100644 --- a/src/imgui/window/animation_preview.h +++ b/src/imgui/window/animation_preview.h @@ -18,12 +18,14 @@ namespace anm2ed::imgui float savedZoom{}; glm::vec2 savedPan{}; int savedOverlayIndex{}; - glm::ivec2 mousePos{}; + glm::vec2 mousePos{}; glm::vec2 checkerPan{}; glm::vec2 checkerSyncPan{}; float checkerSyncZoom{}; bool isCheckerPanInitialized{}; bool hasPendingZoomPanAdjust{}; + bool isMoveDragging{}; + glm::vec2 moveOffset{}; std::vector renderFrames{}; public: diff --git a/src/util/math_.cpp b/src/util/math_.cpp index a34b62a..5a4f99f 100644 --- a/src/util/math_.cpp +++ b/src/util/math_.cpp @@ -11,10 +11,7 @@ namespace anm2ed::util::math constexpr auto FLOAT_FORMAT_EPSILON = 1e-7f; constexpr float FLOAT_FORMAT_POW10[] = {1.f, 10.f, 100.f, 1000.f, 10000.f, 100000.f, 1000000.f, 10000000.f}; - float round_nearest_multiple(float value, float multiple) - { - return (roundf((value) / (multiple)) * (multiple)); - } + float round_nearest_multiple(float value, float multiple) { return (roundf((value) / (multiple)) * (multiple)); } int float_decimals_needed(float value) { @@ -51,12 +48,13 @@ namespace anm2ed::util::math vec2 scaleSign = glm::sign(scale); vec2 pivotScaled = pivot * scaleAbsolute; vec2 sizeScaled = size * scaleAbsolute; + float handedness = (scaleSign.x * scaleSign.y) < 0.0f ? -1.0f : 1.0f; mat4 model(1.0f); model = glm::translate(model, vec3(position - pivotScaled, 0.0f)); model = glm::translate(model, vec3(pivotScaled, 0.0f)); model = glm::scale(model, vec3(scaleSign, 1.0f)); - model = glm::rotate(model, glm::radians(rotation), vec3(0, 0, 1)); + model = glm::rotate(model, glm::radians(rotation) * handedness, vec3(0, 0, 1)); model = glm::translate(model, vec3(-pivotScaled, 0.0f)); model = glm::scale(model, vec3(sizeScaled, 1.0f)); return model;