From 4c51ee69046ecc192408645a305775d5e7440e1d Mon Sep 17 00:00:00 2001 From: maelstrom Date: Thu, 27 Feb 2025 22:35:06 +0100 Subject: [PATCH] fix: buggy handles 2/2 (scaling and moving implemented) --- editor/mainglwidget.cpp | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/editor/mainglwidget.cpp b/editor/mainglwidget.cpp index c3a5f67..a780d98 100644 --- a/editor/mainglwidget.cpp +++ b/editor/mainglwidget.cpp @@ -138,11 +138,33 @@ void MainGLWidget::handleHandleDrag(QMouseEvent* evt) { // Apply snapping in the current frame glm::vec3 diff = centerPoint - (glm::vec3)editorToolHandles->adornee->lock()->position(); - // auto odiff = diff; - if (snappingFactor()) diff = frame * (glm::round(glm::vec3(frame.Inverse() * diff) * snappingFactor()) / snappingFactor()); + if (snappingFactor()) diff = frame * (glm::round(glm::vec3(frame.Inverse() * diff) / snappingFactor()) * snappingFactor()); - // Add difference - editorToolHandles->adornee->lock()->cframe = editorToolHandles->adornee->lock()->cframe + diff; + switch (mainWindow()->selectedTool) { + case SelectedTool::SELECT: break; + case SelectedTool::MOVE: { + // Add difference + editorToolHandles->adornee->lock()->cframe = editorToolHandles->adornee->lock()->cframe + diff; + } break; + + case SelectedTool::SCALE: { + // Find local difference + glm::vec3 localDiff = frame.Inverse() * diff; + // Find outwarwd difference + localDiff = localDiff * glm::sign(draggingHandle->normal); + + // Add local difference to size + part->size += localDiff; + + // If ctrl is not pressed, offset the part by half the size difference to keep the other bound where it was originally + if (!(evt->modifiers() & Qt::ControlModifier)) + part->cframe = part->cframe + diff * 0.5f; + } break; + + case SelectedTool::ROTATE: { + // TODO: Implement rotation + } break; + } syncPartPhysics(std::dynamic_pointer_cast(editorToolHandles->adornee->lock())); }