public List <GameObjectRayHit> RaycastAllObjectsSorted(Ray ray, SceneRaycastPrecision rtRaycastPrecision, SceneRaycastFilter raycastFilter) { if (raycastFilter.AllowedObjectTypes.Count == 0) { return(new List <GameObjectRayHit>()); } List <GameObjectRayHit> sortedHits = RaycastAllObjectsSorted(ray, rtRaycastPrecision); raycastFilter.FilterHits(sortedHits); return(sortedHits); }
public SceneRaycastHit Raycast(Ray ray, SceneRaycastPrecision rtRaycastPrecision, SceneRaycastFilter raycastFilter) { List <GameObjectRayHit> allObjectHits = RaycastAllObjectsSorted(ray, rtRaycastPrecision, raycastFilter); GameObjectRayHit closestObjectHit = allObjectHits.Count != 0 ? allObjectHits[0] : null; XZGridRayHit gridRayHit = RaycastSceneGrid(ray); return(new SceneRaycastHit(closestObjectHit, gridRayHit)); }
private bool IdentifyGrabSurface() { _grabSurfaceInfo.SurfaceType = GrabSurfaceType.Invalid; SceneRaycastFilter raycastFilter = new SceneRaycastFilter(); raycastFilter.LayerMask = SharedSettings.SurfaceLayers; if ((SharedSettings.SurfaceFlags & ObjectGrabSurfaceFlags.Mesh) != 0) { raycastFilter.AllowedObjectTypes.Add(GameObjectType.Mesh); } if ((SharedSettings.SurfaceFlags & ObjectGrabSurfaceFlags.Terrain) != 0) { raycastFilter.AllowedObjectTypes.Add(GameObjectType.Terrain); } foreach (var grabTarget in _grabTargets) { raycastFilter.IgnoreObjects.AddRange(grabTarget.GameObject.GetAllChildrenAndSelf()); } SceneRaycastHit raycastHit = EditorScene.Get.Raycast(EditorCamera.Pickray, SceneRaycastPrecision.BestFit, raycastFilter); if (!raycastHit.WasAnythingHit) { return(false); } _grabSurfaceInfo.SceneRaycastHit = raycastHit; if (raycastHit.WasAnObjectHit) { _grabSurfaceInfo.AnchorNormal = raycastHit.ObjectHit.HitNormal; _grabSurfaceInfo.AnchorPoint = raycastHit.ObjectHit.HitPoint; _grabSurfaceInfo.AnchorPlane = raycastHit.ObjectHit.HitPlane; GameObjectType hitObjectType = raycastHit.ObjectHit.HitObject.GetGameObjectType(); if (hitObjectType == GameObjectType.Mesh) { _grabSurfaceInfo.SurfaceType = GrabSurfaceType.Mesh; int objectLayer = raycastHit.ObjectHit.HitObject.layer; if (LayerEx.IsLayerBitSet(SharedSettings.SphericalMeshLayers, objectLayer)) { _grabSurfaceInfo.SurfaceType = GrabSurfaceType.SphericalMesh; } else if (LayerEx.IsLayerBitSet(SharedSettings.TerrainMeshLayers, objectLayer)) { _grabSurfaceInfo.SurfaceType = GrabSurfaceType.TerrainMesh; } } else { _grabSurfaceInfo.SurfaceType = GrabSurfaceType.UnityTerrain; } } else if (raycastHit.WasGridHit && (SharedSettings.SurfaceFlags & ObjectGrabSurfaceFlags.Grid) != 0) { _grabSurfaceInfo.AnchorNormal = raycastHit.GridHit.HitNormal; _grabSurfaceInfo.AnchorPoint = raycastHit.GridHit.HitPoint; _grabSurfaceInfo.AnchorPlane = raycastHit.GridHit.HitPlane; _grabSurfaceInfo.SurfaceType = GrabSurfaceType.Grid; } return(true); }