static bool FindCustomSnappingPoints(Vector3 startWorldPoint, Vector3 currentWorldPoint, Grid worldSlideGrid, int contextIndex, List <Vector3> foundWorldspacePoints) { if (!s_SnappingContext.TryGetValue(contextIndex, out var snappingContext)) { s_SnappingContext[contextIndex] = snappingContext = new SnappingContext(); } snappingContext.Clear(); s_DrawSurfaceSnapEvents.Clear(); s_DrawEdgeSnapEvents.Clear(); s_DrawVertexSnapEvents.Clear(); var edgeSnappingActive = Snapping.EdgeSnappingActive; var vertexSnappingActive = Snapping.VertexSnappingActive; var surfaceSnappingActive = Snapping.SurfaceSnappingActive; if (!edgeSnappingActive && !vertexSnappingActive && !surfaceSnappingActive) { return(false); } var surfaceSnapEvents = surfaceSnappingActive ? snappingContext.s_AllSurfaceSnapEvents : null; var edgeSnapEvents = edgeSnappingActive ? snappingContext.s_AllEdgeSnapEvents : null; var vertexSnapEvents = vertexSnappingActive ? snappingContext.s_AllVertexSnapEvents : null; var selection = Selection.gameObjects; FindClosestSnapPointsToPlane(selection, startWorldPoint, currentWorldPoint, worldSlideGrid, kArbitrarySnapDistance, surfaceSnapEvents, edgeSnapEvents, vertexSnapEvents); snappingContext.CollectAllSnapPoints(foundWorldspacePoints); return(true); }
const float kArbitrarySnapDistance = 5; // TODO: use fixed step when no grid snapping, otherwise grid step size static bool FindCustomSnappingRayPoints(Vector3 worldRayStart, Vector3 worldRayDirection, int contextIndex, List <Vector3> foundWorldspacePoints) { if (!s_SnappingContext.TryGetValue(contextIndex, out var snappingContext)) { s_SnappingContext[contextIndex] = snappingContext = new SnappingContext(); } snappingContext.Clear(); s_DrawSurfaceSnapEvents.Clear(); s_DrawEdgeSnapEvents.Clear(); s_DrawVertexSnapEvents.Clear(); var edgeSnappingActive = Snapping.EdgeSnappingActive; var vertexSnappingActive = Snapping.VertexSnappingActive; var surfaceSnappingActive = Snapping.SurfaceSnappingActive; if (!edgeSnappingActive && !vertexSnappingActive && !surfaceSnappingActive) { return(false); } var selection = Selection.gameObjects; var step = worldRayDirection * kArbitrarySnapDistance; FindSnapPointsAlongRay(selection, worldRayStart, step, surfaceSnappingActive ? snappingContext.s_AllSurfaceSnapEvents : null, edgeSnappingActive ? snappingContext.s_AllEdgeSnapEvents : null, vertexSnappingActive ? snappingContext.s_AllVertexSnapEvents : null); snappingContext.CollectAllSnapPoints(foundWorldspacePoints); return(true); }