From 788c883c027297bc2d3f2650873a2655eb3b5457 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 19 Sep 2018 13:38:35 -0700 Subject: [PATCH 1/3] Fix Circle3DOverlay not rendering solid circle to exact degrees --- interface/src/ui/overlays/Circle3DOverlay.cpp | 48 +++++++++++-------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/interface/src/ui/overlays/Circle3DOverlay.cpp b/interface/src/ui/overlays/Circle3DOverlay.cpp index 2e06229276..0d62601089 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.cpp +++ b/interface/src/ui/overlays/Circle3DOverlay.cpp @@ -75,6 +75,7 @@ void Circle3DOverlay::render(RenderArgs* args) { const float FULL_CIRCLE = 360.0f; const float SLICES = 180.0f; // The amount of segment to create the circle const float SLICE_ANGLE = FULL_CIRCLE / SLICES; + const float SLICE_ANGLE_RADIANS = glm::radians(FULL_CIRCLE / SLICES); const float MAX_COLOR = 255.0f; auto geometryCache = DependencyManager::get(); @@ -111,28 +112,38 @@ void Circle3DOverlay::render(RenderArgs* args) { vec4 innerEndColor = vec4(toGlm(_innerEndColor), _innerEndAlpha) * pulseModifier; vec4 outerEndColor = vec4(toGlm(_outerEndColor), _outerEndAlpha) * pulseModifier; + const auto startAtRadians = glm::radians(_startAt); + const auto endAtRadians = glm::radians(_endAt); + + const auto totalRange = _endAt - _startAt; if (_innerRadius <= 0) { _solidPrimitive = gpu::TRIANGLE_FAN; points << vec2(); colors << innerStartColor; - for (float angle = _startAt; angle <= _endAt; angle += SLICE_ANGLE) { - float range = (angle - _startAt) / (_endAt - _startAt); - float angleRadians = glm::radians(angle); + for (float angleRadians = startAtRadians; angleRadians < endAtRadians; angleRadians += SLICE_ANGLE_RADIANS) { + float range = (angleRadians - startAtRadians) / totalRange; points << glm::vec2(cosf(angleRadians) * _outerRadius, sinf(angleRadians) * _outerRadius); colors << glm::mix(outerStartColor, outerEndColor, range); } + points << glm::vec2(cosf(endAtRadians) * _outerRadius, sinf(endAtRadians) * _outerRadius); + colors << outerEndColor; + } else { _solidPrimitive = gpu::TRIANGLE_STRIP; - for (float angle = _startAt; angle <= _endAt; angle += SLICE_ANGLE) { - float range = (angle - _startAt) / (_endAt - _startAt); + for (float angleRadians = startAtRadians; angleRadians < endAtRadians; angleRadians += SLICE_ANGLE_RADIANS) { + float range = (angleRadians - startAtRadians) / totalRange; - float angleRadians = glm::radians(angle); points << glm::vec2(cosf(angleRadians) * _innerRadius, sinf(angleRadians) * _innerRadius); colors << glm::mix(innerStartColor, innerEndColor, range); points << glm::vec2(cosf(angleRadians) * _outerRadius, sinf(angleRadians) * _outerRadius); colors << glm::mix(outerStartColor, outerEndColor, range); } + points << glm::vec2(cosf(endAtRadians) * _innerRadius, sinf(endAtRadians) * _innerRadius); + colors << innerEndColor; + + points << glm::vec2(cosf(endAtRadians) * _outerRadius, sinf(endAtRadians) * _outerRadius); + colors << outerEndColor; } geometryCache->updateVertices(_quadVerticesID, points, colors); } @@ -147,29 +158,28 @@ void Circle3DOverlay::render(RenderArgs* args) { if (geometryChanged) { QVector points; - float angle = _startAt; - float angleInRadians = glm::radians(angle); - glm::vec2 firstPoint(cosf(angleInRadians) * _outerRadius, sinf(angleInRadians) * _outerRadius); + const auto startAtRadians = glm::radians(_startAt); + const auto endAtRadians = glm::radians(_endAt); + + float angleRadians = startAtRadians; + glm::vec2 firstPoint(cosf(angleRadians) * _outerRadius, sinf(angleRadians) * _outerRadius); points << firstPoint; - while (angle < _endAt) { - angle += SLICE_ANGLE; - angleInRadians = glm::radians(angle); - glm::vec2 thisPoint(cosf(angleInRadians) * _outerRadius, sinf(angleInRadians) * _outerRadius); + while (angleRadians < endAtRadians) { + angleRadians += SLICE_ANGLE_RADIANS; + glm::vec2 thisPoint(cosf(angleRadians) * _outerRadius, sinf(angleRadians) * _outerRadius); points << thisPoint; if (getIsDashedLine()) { - angle += SLICE_ANGLE / 2.0f; // short gap - angleInRadians = glm::radians(angle); - glm::vec2 dashStartPoint(cosf(angleInRadians) * _outerRadius, sinf(angleInRadians) * _outerRadius); + angleRadians += SLICE_ANGLE_RADIANS / 2.0f; // short gap + glm::vec2 dashStartPoint(cosf(angleRadians) * _outerRadius, sinf(angleRadians) * _outerRadius); points << dashStartPoint; } } // get the last slice portion.... - angle = _endAt; - angleInRadians = glm::radians(angle); - glm::vec2 lastPoint(cosf(angleInRadians) * _outerRadius, sinf(angleInRadians) * _outerRadius); + angleRadians = endAtRadians; + glm::vec2 lastPoint(cosf(angleRadians) * _outerRadius, sinf(angleRadians) * _outerRadius); points << lastPoint; geometryCache->updateVertices(_lineVerticesID, points, vec4(toGlm(getColor()), getAlpha())); } From 431daecd8ed5528cfb6db45ae6d1d9e5f913137b Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 19 Sep 2018 13:38:53 -0700 Subject: [PATCH 2/3] Fix shifting of yaw rotation handle --- interface/src/ui/overlays/Circle3DOverlay.cpp | 1 - scripts/system/libraries/entitySelectionTool.js | 14 ++++---------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/interface/src/ui/overlays/Circle3DOverlay.cpp b/interface/src/ui/overlays/Circle3DOverlay.cpp index 0d62601089..1d418d966e 100644 --- a/interface/src/ui/overlays/Circle3DOverlay.cpp +++ b/interface/src/ui/overlays/Circle3DOverlay.cpp @@ -74,7 +74,6 @@ void Circle3DOverlay::render(RenderArgs* args) { const float FULL_CIRCLE = 360.0f; const float SLICES = 180.0f; // The amount of segment to create the circle - const float SLICE_ANGLE = FULL_CIRCLE / SLICES; const float SLICE_ANGLE_RADIANS = glm::radians(FULL_CIRCLE / SLICES); const float MAX_COLOR = 255.0f; diff --git a/scripts/system/libraries/entitySelectionTool.js b/scripts/system/libraries/entitySelectionTool.js index 5bca58b1ac..930f33f8d9 100644 --- a/scripts/system/libraries/entitySelectionTool.js +++ b/scripts/system/libraries/entitySelectionTool.js @@ -2622,6 +2622,10 @@ SelectionDisplay = (function() { updateSelectionsRotation(rotationChange, rotationCenter); updateRotationDegreesOverlay(-angleFromZero, rotationDegreesPosition); + if (direction === ROTATE_DIRECTION.YAW) { + angleFromZero *= -1; + } + var startAtCurrent = 0; var endAtCurrent = angleFromZero; var maxDegrees = 360; @@ -2635,16 +2639,6 @@ SelectionDisplay = (function() { }); // not sure why but this seems to be needed to fix an reverse rotation for yaw ring only - if (direction === ROTATE_DIRECTION.YAW) { - if (spaceMode === SPACE_LOCAL) { - Overlays.editOverlay(handleRotateCurrentRing, { rotation: worldRotationZ }); - } else { - var rotationDegrees = 90; - Overlays.editOverlay(handleRotateCurrentRing, { - rotation: Quat.fromPitchYawRollDegrees(-rotationDegrees, 0, 0) - }); - } - } } if (wantDebug) { From feb230b3bd3001a707ac67d41a2c7ac519208bbc Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 28 Sep 2018 16:17:52 -0700 Subject: [PATCH 3/3] Remove old comment in entitySelectionTool.js --- scripts/system/libraries/entitySelectionTool.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/scripts/system/libraries/entitySelectionTool.js b/scripts/system/libraries/entitySelectionTool.js index 930f33f8d9..47228c3fae 100644 --- a/scripts/system/libraries/entitySelectionTool.js +++ b/scripts/system/libraries/entitySelectionTool.js @@ -2637,8 +2637,6 @@ SelectionDisplay = (function() { startAt: startAtCurrent, endAt: endAtCurrent }); - - // not sure why but this seems to be needed to fix an reverse rotation for yaw ring only } if (wantDebug) {