bool MogitorsRoot.IDragDropHandler.OnDragOver(DragData dragData, Mogre.Viewport vp, Mogre.Vector2 position) { if (dragData.Object == null) { return(false); } Mogre.Ray mouseRay = vp.Camera.GetCameraToViewportRay(position.x, position.y); EntityEditor entity = dragData.Object as EntityEditor; bool hitFound = false; if (!hitFound) { if (entity.Position.x == 999999 && entity.Position.y == 999999 && entity.Position.z == 999999) { entity.Position = mouseRay.Origin + mouseRay.Direction * 40.0f; } else { entity.Position = MogitorsRoot.Instance.GetGizmoIntersectCameraPlane(entity, mouseRay); } } return(true); }
private bool FindNewClosest(Mogre.Ray ray, ref float closestDistance, Mogre.Entity entity) { // mesh data to retrieve uint vertexCount, indexCount; Mogre.Vector3[] vertices; uint[] indices; // get the mesh information GetMeshInformationEx(entity.GetMesh(), out vertexCount, out vertices, out indexCount, out indices, entity.ParentNode._getDerivedPosition(), entity.ParentNode._getDerivedOrientation(), entity.ParentNode._getDerivedScale()); // test for hitting individual triangles on the mesh bool newClosestFound = false; for (uint i = 0; i < indexCount; i += 3) { // check for a hit against this triangle var hit = Mogre.Math.Intersects(ray, vertices[indices[i]], vertices[indices[i + 1]], vertices[indices[i + 2]], true, false); // if it was a hit check if its the closest if (hit.first) { if ((closestDistance < 0.0f) || (hit.second < closestDistance)) { // this is the closes so far, save it off closestDistance = hit.second; newClosestFound = true; } } } return(newClosestFound); }
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); } }