static void SnapGridIntersection(UVSnapSettings snapSettings, SurfaceReference surfaceReference, Vector3 intersectionPoint, float preferenceFactor, ref Vector3 snappedPoint, ref float bestDist) { if ((snapSettings & UVSnapSettings.GeometryGrid) == UVSnapSettings.None) { return; } var grid = UnitySceneExtensions.Grid.defaultGrid; var gridSnappedPoint = Snapping.SnapPoint(intersectionPoint, grid); var worldPlane = surfaceReference.WorldPlane.Value; var xAxis = grid.Right; var yAxis = grid.Up; var zAxis = grid.Forward; var snapAxis = Axis.X | Axis.Y | Axis.Z; if (Mathf.Abs(Vector3.Dot(xAxis, worldPlane.normal)) >= kAlignmentEpsilon) { snapAxis &= ~Axis.X; } if (Mathf.Abs(Vector3.Dot(yAxis, worldPlane.normal)) >= kAlignmentEpsilon) { snapAxis &= ~Axis.Y; } if (Mathf.Abs(Vector3.Dot(zAxis, worldPlane.normal)) >= kAlignmentEpsilon) { snapAxis &= ~Axis.Z; } if (Mathf.Abs(worldPlane.GetDistanceToPoint(gridSnappedPoint)) < kDistanceEpsilon) { bestDist = (gridSnappedPoint - intersectionPoint).magnitude * preferenceFactor; snappedPoint = gridSnappedPoint; } else { float dist; var ray = new Ray(gridSnappedPoint, xAxis); if ((snapAxis & Axis.X) != Axis.None && worldPlane.UnsignedRaycast(ray, out dist)) { var planePoint = ray.GetPoint(dist); var abs_dist = (planePoint - intersectionPoint).magnitude * preferenceFactor; if (abs_dist < bestDist) { bestDist = abs_dist; snappedPoint = planePoint; } } ray.direction = yAxis; if ((snapAxis & Axis.Y) != Axis.None && worldPlane.UnsignedRaycast(ray, out dist)) { var planePoint = ray.GetPoint(dist); var abs_dist = (planePoint - intersectionPoint).magnitude * preferenceFactor; if (abs_dist < bestDist) { bestDist = abs_dist; snappedPoint = planePoint; } } ray.direction = zAxis; if ((snapAxis & Axis.Z) != Axis.None && worldPlane.UnsignedRaycast(ray, out dist)) { var planePoint = ray.GetPoint(dist); var abs_dist = (planePoint - intersectionPoint).magnitude * preferenceFactor; if (abs_dist < bestDist) { bestDist = abs_dist; snappedPoint = planePoint; } } } }