diff --git a/Engine/source/gui/worldEditor/worldEditor.cpp b/Engine/source/gui/worldEditor/worldEditor.cpp index 7708feb79..5a2515fff 100644 --- a/Engine/source/gui/worldEditor/worldEditor.cpp +++ b/Engine/source/gui/worldEditor/worldEditor.cpp @@ -2254,7 +2254,7 @@ void WorldEditor::on3DMouseDragged(const Gui3DMouseEvent & event) mGizmo->getProfile()->snapToGrid = snapToGrid; } - mSelected->offset( mGizmo->getOffset() ); + mSelected->offset(mGizmo->getOffset(), mGridSnap ? mGridPlaneSize : 0.f); // Handle various sticking terrainSnapSelection( mSelected, event.modifier, mGizmo->getPosition() ); diff --git a/Engine/source/gui/worldEditor/worldEditorSelection.cpp b/Engine/source/gui/worldEditor/worldEditorSelection.cpp index 72f406b98..57c2747d1 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 -= mFmod( wPos.x, gridSnap ); - wPos.y -= mFmod( wPos.y, gridSnap ); - wPos.z -= mFmod( wPos.z, gridSnap ); + wPos.x = _snapFloat(wPos.x, gridSnap); + wPos.y = _snapFloat(wPos.y, gridSnap); + wPos.z = _snapFloat(wPos.z, gridSnap); } mat.setColumn(3, wPos); @@ -318,6 +318,22 @@ void WorldEditorSelection::offset( const Point3F& offset, F32 gridSnap ) mCentroidValid = false; } +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); +} + + //----------------------------------------------------------------------------- void WorldEditorSelection::setPosition(const Point3F & pos) diff --git a/Engine/source/gui/worldEditor/worldEditorSelection.h b/Engine/source/gui/worldEditor/worldEditorSelection.h index a2ff89c42..9ff9eef9c 100644 --- a/Engine/source/gui/worldEditor/worldEditorSelection.h +++ b/Engine/source/gui/worldEditor/worldEditorSelection.h @@ -108,6 +108,7 @@ 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 &);