From a1b25d115aaf57db940b37ddd7e8e6eba5f51aff Mon Sep 17 00:00:00 2001 From: himdeez <96998938+himdeez@users.noreply.github.com> Date: Thu, 6 Oct 2022 16:28:38 +0300 Subject: [PATCH 1/2] Temporary physics bug fix (anchored parts not updating when moved) --- src/source/DataModelV2/PartInstance.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/source/DataModelV2/PartInstance.cpp b/src/source/DataModelV2/PartInstance.cpp index 7afab53..be6a146 100644 --- a/src/source/DataModelV2/PartInstance.cpp +++ b/src/source/DataModelV2/PartInstance.cpp @@ -233,6 +233,12 @@ void PartInstance::setPosition(Vector3 pos) { position = pos; setCFrame(CoordinateFrame(cFrame.rotation, pos)); + + if (anchored) + { + g_dataModel->getEngine()->deleteBody(this); + g_dataModel->getEngine()->createBody(this); + } } void PartInstance::setAnchored(bool anchored) From 36aba44b5126389708e192a5f7043ae37c620191 Mon Sep 17 00:00:00 2001 From: himdeez <96998938+himdeez@users.noreply.github.com> Date: Thu, 6 Oct 2022 18:52:26 +0300 Subject: [PATCH 2/2] improve dragging --- src/include/Tool/ArrowTool.h | 2 ++ src/source/Tool/ArrowTool.cpp | 57 ++++++++++++++++++++++++++++++++++- 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/src/include/Tool/ArrowTool.h b/src/include/Tool/ArrowTool.h index c46c635..bfe511f 100644 --- a/src/include/Tool/ArrowTool.h +++ b/src/include/Tool/ArrowTool.h @@ -13,6 +13,7 @@ public: void onSelect(Mouse mouse); void onKeyDown(int key); void onKeyUp(int key); + void roundDeg(float °ree); private: bool lctrlDown; bool rctrlDown; @@ -20,4 +21,5 @@ private: int mouseDownStarty; bool dragging; bool mouseDown; + Vector3 draggingPartOffset; }; diff --git a/src/source/Tool/ArrowTool.cpp b/src/source/Tool/ArrowTool.cpp index a446bf8..e83d5e3 100644 --- a/src/source/Tool/ArrowTool.cpp +++ b/src/source/Tool/ArrowTool.cpp @@ -25,7 +25,13 @@ void ArrowTool::onButton1MouseDown(Mouse mouse) g_dataModel->getSelectionService()->clearSelection(); PartInstance * target = mouse.getTarget(); if(target != NULL) + { + Vector3 mousePos = mouse.getPosition(g_dataModel->getSelectionService()->getSelection()); + Vector3 targetPos = target->getPosition(); + g_dataModel->getSelectionService()->addSelected(target); + draggingPartOffset = targetPos-mousePos; + } if(g_dataModel->getSelectionService()->getSelection().size() == 0) g_dataModel->getSelectionService()->addSelected(g_dataModel); } @@ -51,7 +57,40 @@ void ArrowTool::onMouseMoved(Mouse mouse) { if(PartInstance * part = dynamic_cast(g_dataModel->getSelectionService()->getSelection()[i])) { - part->setPosition(mouse.getPosition(g_dataModel->getSelectionService()->getSelection())); + Vector3 mousePos = mouse.getPosition(g_dataModel->getSelectionService()->getSelection()); + Vector3 vec = mousePos + draggingPartOffset; + + vec.x = (ceil(vec.x / 1) * 1); + vec.y = (ceil(vec.y / 1) * 1); + vec.z = (ceil(vec.z / 1) * 1); + + if ( ((int)part->getSize().x)%2 == 1 ) + vec.x += 0.5; + + vec.y = mousePos.y + part->getSize().y/2 - 0.5; + + if ( ((int)part->getSize().z)%2 == 1 ) + vec.z += 0.5; + + Matrix3 rot = part->getCFrame().rotation; + Vector3 rotEulerAngles; + + rot.toEulerAnglesXYZ(rotEulerAngles.x, rotEulerAngles.y, rotEulerAngles.z); + + rotEulerAngles = Vector3( + rotEulerAngles.x * 180 / M_PI, + rotEulerAngles.y * 180 / M_PI, + rotEulerAngles.z * 180 / M_PI + ); + + roundDeg(rotEulerAngles.x); + roundDeg(rotEulerAngles.y); + roundDeg(rotEulerAngles.z); + + rot = rot.fromEulerAnglesXYZ( rotEulerAngles.x * (M_PI / 180), rotEulerAngles.y * (M_PI / 180), rotEulerAngles.z * (M_PI / 180) ); + + part->setPosition(vec); + part->setCFrame(CoordinateFrame(rot, vec)); } } return; @@ -75,4 +114,20 @@ void ArrowTool::onKeyUp(int key) { if(key == VK_CONTROL) lctrlDown = false; +} + +void ArrowTool::roundDeg(float °ree) +{ + if ( ( degree < 0 && degree > -45 ) || ( degree > 0 && degree < 45 ) ) + { + degree = 0; + } + else if ( ( degree < 0 && degree > -90 ) || ( degree > 45 && degree < 90 ) ) + { + degree = 90; + } + else if ( ( degree < 0 && degree > -180 ) || ( degree > 90 && degree < 180 ) ) + { + degree = 180; + } } \ No newline at end of file