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); } }