diff --git a/core/src/partassembly.cpp b/core/src/partassembly.cpp index 3da0322..fc4f03d 100644 --- a/core/src/partassembly.cpp +++ b/core/src/partassembly.cpp @@ -1,6 +1,7 @@ #include "partassembly.h" #include "common.h" #include "datatypes/cframe.h" +#include "datatypes/meta.h" #include "datatypes/vector.h" #include "math_helper.h" #include "objects/base/instance.h" @@ -48,6 +49,7 @@ void PartAssembly::SetOrigin(CFrame newOrigin) { for (auto part : parts) { part->cframe = newOrigin * (_assemblyOrigin.Inverse() * part->cframe); part->UpdateProperty("CFrame"); + // sendPropertyUpdatedSignal(part, "CFrame", Data::Variant(part->cframe)); } _assemblyOrigin = newOrigin; @@ -57,6 +59,7 @@ void PartAssembly::TransformBy(CFrame transform) { for (auto part : parts) { part->cframe = transform * part->cframe; part->UpdateProperty("CFrame"); + sendPropertyUpdatedSignal(part, "CFrame", Data::Variant(part->cframe)); } _assemblyOrigin = transform * _assemblyOrigin; @@ -66,6 +69,7 @@ void PartAssembly::Scale(Vector3 newSize, bool scaleUp) { if (parts.size() == 1) { parts[0]->size = newSize; parts[0]->UpdateProperty("Size"); + sendPropertyUpdatedSignal(parts[0], "Size", Data::Variant((Data::Vector3)parts[0]->size)); _bounds = newSize; return; } @@ -78,8 +82,10 @@ void PartAssembly::Scale(Vector3 newSize, bool scaleUp) { localOff = localOff * factor; part->cframe = part->cframe.Rotation() + _assemblyOrigin * localOff; part->UpdateProperty("CFrame"); + sendPropertyUpdatedSignal(part, "CFrame", Data::Variant(part->cframe)); part->size *= factor; part->UpdateProperty("Size"); + sendPropertyUpdatedSignal(part, "Size", Data::Variant((Data::Vector3)part->size)); } _bounds = _bounds * factor; diff --git a/core/src/rendering/renderer.cpp b/core/src/rendering/renderer.cpp index 0ac8f43..5c52920 100644 --- a/core/src/rendering/renderer.cpp +++ b/core/src/rendering/renderer.cpp @@ -556,16 +556,14 @@ void renderRotationArcs() { // Pass in the camera position handleShader->set("viewPos", camera.cameraPos); - // TODO: This won't do... Doesn't support rotating multiple objects, and expects the first selected item to be a part, - // which isn't always the case - std::shared_ptr part = std::dynamic_pointer_cast(getSelection()[0]); + PartAssembly assembly = PartAssembly::FromSelection(); for (HandleFace face : HandleFace::Faces) { if (glm::any(glm::lessThan(face.normal, glm::vec3(0)))) continue; - glm::mat4 model = part->cframe * CFrame(glm::vec3(0), face.normal, glm::vec3(0, 1.01, 0.1)); + glm::mat4 model = assembly.assemblyOrigin() * CFrame(glm::vec3(0), face.normal, glm::vec3(0, 1.01, 0.1)); handleShader->set("model", model); - float radius = glm::max(part->size.x, part->size.y, part->size.z) / 2.f + 2.f; + float radius = glm::max(assembly.bounds().X(), assembly.bounds().Y(), assembly.bounds().Z()) / 2.f + 2.f; handleShader->set("material", Material { .diffuse = glm::abs(face.normal), diff --git a/editor/mainglwidget.cpp b/editor/mainglwidget.cpp index fe805ce..024cc10 100755 --- a/editor/mainglwidget.cpp +++ b/editor/mainglwidget.cpp @@ -121,6 +121,7 @@ std::optional draggingHandle; Vector3 initialHitPos; Vector3 initialHitNormal; CFrame initialFrame; +PartAssembly initialAssembly({}); void MainGLWidget::handleObjectDrag(QMouseEvent* evt) { if (!isMouseDragging || draggingObject.expired() || mainWindow()->selectedTool >= TOOL_SMOOTH) return; @@ -271,7 +272,6 @@ void MainGLWidget::handleRotationalTransform(QMouseEvent* evt) { if (!isMouseDragging || !draggingHandle || !editorToolHandles.active) return; glm::vec2 destPoint = glm::vec2(evt->pos().x(), evt->pos().y()); - auto part = getHandleAdornee(); // Calculate part pos as screen point glm::mat4 projection = glm::perspective(glm::radians(45.f), (float)width() / (float)height(), 0.1f, 1000.0f); @@ -303,11 +303,8 @@ void MainGLWidget::handleRotationalTransform(QMouseEvent* evt) { glm::vec3 angles = handleNormal * sign * glm::vec3(angle); - part->cframe = initialFrame * CFrame::FromEulerAnglesXYZ(-angles); - - gWorkspace()->SyncPartPhysics(part); - part->UpdateProperty("Rotation"); - sendPropertyUpdatedSignal(part, "Rotation", part->cframe.ToEulerAnglesXYZ()); + CFrame newFrame = initialFrame * CFrame::FromEulerAnglesXYZ(-angles); + initialAssembly.SetOrigin(newFrame); } std::optional MainGLWidget::raycastHandle(glm::vec3 pointDir) { @@ -375,7 +372,8 @@ void MainGLWidget::mousePressEvent(QMouseEvent* evt) { auto handle = raycastHandle(pointDir); if (handle.has_value()) { startPoint = glm::vec2(evt->pos().x(), evt->pos().y()); - initialFrame = getHandleAdornee()->cframe; + initialAssembly = PartAssembly::FromSelection(); + initialFrame = initialAssembly.assemblyOrigin(); isMouseDragging = true; draggingHandle = handle; startLinearTransform(evt);