Browse Source

sets snap to grid to itterate through selected objects and settle them into the nearest (seected value), ie 1, 2.5, 3.33 ect.

Azaezel 8 năm trước cách đây
mục cha
commit
7d2315c781

+ 1 - 1
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() );

+ 19 - 3
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)

+ 1 - 0
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 &);