Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }