From f7ed077d820e4b23b6eced3d37dc93c39cb4c8c0 Mon Sep 17 00:00:00 2001 From: AzaezelX Date: Wed, 10 Apr 2024 14:17:19 -0500 Subject: [PATCH 1/4] round utility functions add mRoundF to return nearest floating value to stepsize --- Engine/source/gui/worldEditor/gizmo.cpp | 14 ++------------ .../gui/worldEditor/worldEditorSelection.cpp | 12 +----------- Engine/source/math/mConsoleFunctions.cpp | 8 ++++++++ Engine/source/math/mMathFn.h | 17 ++++++++++++++++- 4 files changed, 27 insertions(+), 24 deletions(-) diff --git a/Engine/source/gui/worldEditor/gizmo.cpp b/Engine/source/gui/worldEditor/gizmo.cpp index 200b036cb..ac3d12807 100644 --- a/Engine/source/gui/worldEditor/gizmo.cpp +++ b/Engine/source/gui/worldEditor/gizmo.cpp @@ -1895,18 +1895,8 @@ Point3F Gizmo::_snapPoint( const Point3F &pnt ) const } F32 Gizmo::_snapFloat( const F32 &val, const F32 &snap ) const -{ - if ( snap == 0.0f ) - return val; - - F32 a = mFmod( val, snap ); - - F32 temp = val; - - if ( mFabs(a) > (snap / 2) ) - val < 0.0f ? temp -= snap : temp += snap; - - return(temp - a); +{ + return mRoundF(val, snap); } GizmoAlignment Gizmo::_filteredAlignment() diff --git a/Engine/source/gui/worldEditor/worldEditorSelection.cpp b/Engine/source/gui/worldEditor/worldEditorSelection.cpp index 3d83ccb36..bcf292efa 100644 --- a/Engine/source/gui/worldEditor/worldEditorSelection.cpp +++ b/Engine/source/gui/worldEditor/worldEditorSelection.cpp @@ -320,17 +320,7 @@ void WorldEditorSelection::offset( const Point3F& offset, F32 gridSnap ) F32 WorldEditorSelection::_snapFloat(const F32 &val, const F32 &snap) const { - if (snap == 0.0f) - return val; - - F32 a = mFmod(val, snap); - - F32 temp = val; - - if (mFabs(a) > (snap / 2)) - val < 0.0f ? temp -= snap : temp += snap; - - return(temp - a); + return mRoundF(val, snap); } diff --git a/Engine/source/math/mConsoleFunctions.cpp b/Engine/source/math/mConsoleFunctions.cpp index ef0e14445..ddb90ca93 100644 --- a/Engine/source/math/mConsoleFunctions.cpp +++ b/Engine/source/math/mConsoleFunctions.cpp @@ -103,6 +103,14 @@ DefineEngineFunction( mRound, S32, ( F32 v ),, "@ingroup Math" ) { return mRound(v); + +DefineEngineFunction(mRoundF, F32, (F32 v, F32 step), , + "Round v to the nth decimal place or the nearest whole number by default." + "@param v Value to roundn" + "@return The rounded value as a F32." + "@ingroup Math") +{ + return mRoundF(v, step); } DefineEngineFunction(mRoundDelta, S32, (F32 v, S32 d), (0.0, 1), diff --git a/Engine/source/math/mMathFn.h b/Engine/source/math/mMathFn.h index 6dffd5d3d..1c65604a1 100644 --- a/Engine/source/math/mMathFn.h +++ b/Engine/source/math/mMathFn.h @@ -217,7 +217,22 @@ inline F32 mRound(const F32 val, const S32 n) S32 place = (S32) pow(10.0f, n); return mFloor((val*place)+0.5)/place; -} +} + +inline F32 mRoundF(const F32 val, const F32 step) +{ + if (step == 0.0f) + return val; + + F32 a = mFmod(val, step); + + F32 temp = val; + + if (mFabs(a) > (step / 2)) + val < 0.0f ? temp -= step : temp += step; + + return(temp - a); +} inline S32 mAbs(const S32 val) { From 65fe0be0370c0b86489aae8c3ddac6afde8b5d80 Mon Sep 17 00:00:00 2001 From: AzaezelX Date: Wed, 10 Apr 2024 15:17:24 -0500 Subject: [PATCH 2/4] use consistent clipping --- Engine/source/math/mathUtils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Engine/source/math/mathUtils.cpp b/Engine/source/math/mathUtils.cpp index 6006678d9..bf6358d0f 100644 --- a/Engine/source/math/mathUtils.cpp +++ b/Engine/source/math/mathUtils.cpp @@ -827,7 +827,7 @@ void mShortestSegmentBetweenLines( const Line &line0, const Line &line1, LineSeg F32 denom = a*c - b*b; - if ( denom > -0.001f && denom < 0.001f ) + if ( denom > -POINT_EPSILON && denom < POINT_EPSILON) { outSegment->p0 = line0.origin; outSegment->p1 = line1.origin + (e/c)*line1.direction; From f52c1165b64bfcbde3a92209fcc2a996f228c79b Mon Sep 17 00:00:00 2001 From: AzaezelX Date: Wed, 10 Apr 2024 15:17:47 -0500 Subject: [PATCH 3/4] fix editor grid snap --- Engine/source/gui/worldEditor/gizmo.cpp | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/Engine/source/gui/worldEditor/gizmo.cpp b/Engine/source/gui/worldEditor/gizmo.cpp index ac3d12807..0b88c6035 100644 --- a/Engine/source/gui/worldEditor/gizmo.cpp +++ b/Engine/source/gui/worldEditor/gizmo.cpp @@ -958,19 +958,14 @@ void Gizmo::on3DMouseDragged( const Gui3DMouseEvent & event ) mDeltaScale.zero(); Point3F newPosition; - if( mProfile->snapToGrid ) - { - Point3F snappedMouseDownProjPnt = _snapPoint( mMouseDownProjPnt ); - mDeltaTotalPos = projPnt - snappedMouseDownProjPnt; - newPosition = projPnt; - } - else - { - mDeltaTotalPos = projPnt - mMouseDownProjPnt; - newPosition = mSavedTransform.getPosition() + mDeltaTotalPos; - } - + mDeltaTotalPos = projPnt - mMouseDownProjPnt; + newPosition = mSavedTransform.getPosition() + mDeltaTotalPos; + mDeltaPos = newPosition - mTransform.getPosition(); + + if (mProfile->snapToGrid) + newPosition = _snapPoint(newPosition); + mTransform.setPosition( newPosition ); mCurrentTransform.setPosition( newPosition ); From 39e72cf2b6408ebb9228bc8e13754919929769cc Mon Sep 17 00:00:00 2001 From: AzaezelX Date: Wed, 10 Apr 2024 15:56:44 -0500 Subject: [PATCH 4/4] ditch _snapfloat entirely in favor of just using the shared mRoundF --- Engine/source/gui/worldEditor/gizmo.cpp | 13 ++++--------- Engine/source/gui/worldEditor/gizmo.h | 1 - .../source/gui/worldEditor/worldEditorSelection.cpp | 12 +++--------- .../source/gui/worldEditor/worldEditorSelection.h | 1 - 4 files changed, 7 insertions(+), 20 deletions(-) diff --git a/Engine/source/gui/worldEditor/gizmo.cpp b/Engine/source/gui/worldEditor/gizmo.cpp index 0b88c6035..9b7c55aeb 100644 --- a/Engine/source/gui/worldEditor/gizmo.cpp +++ b/Engine/source/gui/worldEditor/gizmo.cpp @@ -1089,7 +1089,7 @@ void Gizmo::on3DMouseDragged( const Gui3DMouseEvent & event ) // if((mProfile->forceSnapRotations && event.modifier | SI_SHIFT) || (mProfile->allowSnapRotations && event.modifier & SI_SHIFT )) - angle = mDegToRad( _snapFloat( mRadToDeg( angle ), mProfile->rotationSnap ) ); + angle = mDegToRad( mRoundF( mRadToDeg( angle ), mProfile->rotationSnap ) ); mDeltaAngle = angle - mLastAngle; mLastAngle = angle; @@ -1882,18 +1882,13 @@ Point3F Gizmo::_snapPoint( const Point3F &pnt ) const return pnt; Point3F snap; - snap.x = _snapFloat( pnt.x, mProfile->gridSize.x ); - snap.y = _snapFloat( pnt.y, mProfile->gridSize.y ); - snap.z = _snapFloat( pnt.z, mProfile->gridSize.z ); + snap.x = mRoundF( pnt.x, mProfile->gridSize.x ); + snap.y = mRoundF( pnt.y, mProfile->gridSize.y ); + snap.z = mRoundF( pnt.z, mProfile->gridSize.z ); return snap; } -F32 Gizmo::_snapFloat( const F32 &val, const F32 &snap ) const -{ - return mRoundF(val, snap); -} - GizmoAlignment Gizmo::_filteredAlignment() { GizmoAlignment align = mProfile->alignment; diff --git a/Engine/source/gui/worldEditor/gizmo.h b/Engine/source/gui/worldEditor/gizmo.h index f0075f662..80c985d70 100644 --- a/Engine/source/gui/worldEditor/gizmo.h +++ b/Engine/source/gui/worldEditor/gizmo.h @@ -313,7 +313,6 @@ protected: void _renderAxisText(); void _renderPlane(); Point3F _snapPoint( const Point3F &pnt ) const; - F32 _snapFloat( const F32 &val, const F32 &snap ) const; GizmoAlignment _filteredAlignment(); void _updateState( bool collideGizmo = true ); void _updateEnabledAxices(); diff --git a/Engine/source/gui/worldEditor/worldEditorSelection.cpp b/Engine/source/gui/worldEditor/worldEditorSelection.cpp index bcf292efa..b6c3a8e2a 100644 --- a/Engine/source/gui/worldEditor/worldEditorSelection.cpp +++ b/Engine/source/gui/worldEditor/worldEditorSelection.cpp @@ -306,9 +306,9 @@ void WorldEditorSelection::offset( const Point3F& offset, F32 gridSnap ) if( gridSnap != 0.f ) { - wPos.x = _snapFloat(wPos.x, gridSnap); - wPos.y = _snapFloat(wPos.y, gridSnap); - wPos.z = _snapFloat(wPos.z, gridSnap); + wPos.x = mRoundF(wPos.x, gridSnap); + wPos.y = mRoundF(wPos.y, gridSnap); + wPos.z = mRoundF(wPos.z, gridSnap); } mat.setColumn(3, wPos); @@ -318,12 +318,6 @@ void WorldEditorSelection::offset( const Point3F& offset, F32 gridSnap ) mCentroidValid = false; } -F32 WorldEditorSelection::_snapFloat(const F32 &val, const F32 &snap) const -{ - return mRoundF(val, snap); -} - - //----------------------------------------------------------------------------- void WorldEditorSelection::setPosition(const Point3F & pos) diff --git a/Engine/source/gui/worldEditor/worldEditorSelection.h b/Engine/source/gui/worldEditor/worldEditorSelection.h index f42b2ebfd..99d014c4d 100644 --- a/Engine/source/gui/worldEditor/worldEditorSelection.h +++ b/Engine/source/gui/worldEditor/worldEditorSelection.h @@ -108,7 +108,6 @@ class WorldEditorSelection : public SimPersistSet // void offset(const Point3F& delta, F32 gridSnap = 0.f ); void setPosition(const Point3F & pos); - F32 _snapFloat(const F32 &val, const F32 &snap) const; void setCentroidPosition(bool useBoxCenter, const Point3F & pos); void orient(const MatrixF &, const Point3F &);