public Mogre.Vector3 GetGizmoIntersectCameraPlane(BaseEditor obj, Mogre.Ray pickRay)
        {
            Mogre.Vector3            vPos   = obj.DerivedPosition;
            Mogre.Pair <bool, float> result = pickRay.Intersects(new Mogre.Plane(-ActiveViewport.CameraEditor.Camera.DerivedDirection, vPos));

            if (result.first)
            {
                Mogre.Vector3 AxisX = obj.DerivedOrientation.XAxis;
                Mogre.Vector3 AxisY = obj.DerivedOrientation.YAxis;
                Mogre.Vector3 AxisZ = obj.DerivedOrientation.ZAxis;

                Mogre.Vector3 Proj  = pickRay.GetPoint(result.second) - vPos;
                Mogre.Vector3 vPos1 = (AxisX.DotProduct(Proj) * AxisX);
                Mogre.Vector3 vPos2 = (AxisY.DotProduct(Proj) * AxisY);
                Mogre.Vector3 vPos3 = (AxisZ.DotProduct(Proj) * AxisZ);
                vPos += vPos1 + vPos2 + vPos3;
            }

            return(vPos);
        }
        public bool PickEntity(Mogre.RaySceneQuery raySceneQuery, Mogre.Ray ray, out Mogre.Entity result, Mogre.Vector3 hitPoint, string excludedObject, float maxDistance)
        {
            result = null;

            raySceneQuery.Ray       = ray;
            raySceneQuery.QueryMask = QueryFlags.Movable;
            raySceneQuery.SetSortByDistance(true);

            if (raySceneQuery.Execute().Count <= 0)
            {
                result = null;
                return(false);
            }

            // at this point we have raycast to a series of different objects bounding boxes.
            float closestDistance = maxDistance;

            Mogre.Vector3 closestResult = Mogre.Vector3.ZERO;
            foreach (var thisResult in raySceneQuery.GetLastResults())
            {
                // stop checking if we have found a raycast hit that is closer
                // than all remaining entities
                if ((closestDistance >= 0.0f) && (closestDistance < thisResult.distance))
                {
                    break;
                }

                // only check this result if its a hit against an entity
                if ((thisResult.movable != null) && (thisResult.movable.MovableType == "Entity"))
                {
                    Mogre.Entity entity = thisResult.movable as Mogre.Entity;

                    if (!entity.Visible || entity.Name == excludedObject)
                    {
                        continue;
                    }

                    bool newClosestFound = FindNewClosest(ray, ref closestDistance, entity);

                    // if we found a new closes raycast for this object, update the
                    // closes_result before moving on to the next object.
                    if (newClosestFound)
                    {
                        closestResult = ray.GetPoint(closestDistance);
                        result        = entity;
                    }
                }
            }

            // Return the result
            if (closestDistance != maxDistance)
            {
                hitPoint = closestResult;
                return(true);
            }
            else
            {
                // Raycast failed
                return(false);
            }
        }