public override void InjectMousePressed(MouseEvent arg, MouseButtonID id) { base.InjectMousePressed(arg, id); if (id == MouseButtonID.MB_Right) { if (state == EditState.Free) { editor.HidePivot(); return; } MaterialPtr material = currentSelectedEnt.GetSubEntity(0).GetMaterial(); material.GetTechnique(0).SetAmbient(0, 0, 0); currentSelectedEnt.GetSubEntity(0).SetMaterial(material); state = EditState.Free; currentSelectedEnt.ParentSceneNode.ShowBoundingBox = false; currentSelectedEnt = null; editor.HidePivot(); operation = EditOperation.None; } else if (id == MouseButtonID.MB_Left) { Ray ray = GameManager.Instance.trayMgr.getCursorRay(editor.Map.Camera); var query = editor.Map.SceneManager.CreateRayQuery(ray); RaySceneQueryResult result = query.Execute(); foreach (var sResult in result) { if (sResult.movable != null && (sResult.movable.Name.StartsWith("SCENE_OBJECT") || sResult.movable.Name.StartsWith("AIMESH"))) { //High light the object var ent = editor.Map.SceneManager.GetEntity(sResult.movable.Name); MaterialPtr material = ent.GetSubEntity(0).GetMaterial(); ColourValue cv = new ColourValue(1, 0, 0); material.GetTechnique(0).SetAmbient(cv); ColourValue cv2 = new ColourValue(1, 0, 0); material.GetTechnique(0).SetDiffuse(cv2); ent.GetSubEntity(0).SetMaterial(material); ent.ParentSceneNode.ShowBoundingBox = true; currentSelectedEnt = ent; state = EditState.Edit; Mogre.Vector3 entCenterPos = ent.GetWorldBoundingBox().Center; editor.ShowPivotAtPosition(entCenterPos); } } } }
public void updateFilpTerrain() { Ray ray = new Ray(Position, Mogre.Vector3.NEGATIVE_UNIT_Y); RaySceneQuery rayQuery = mCamera.SceneManager.CreateRayQuery(ray); RaySceneQueryResult rayQueryResult = rayQuery.Execute(); foreach (var result in rayQueryResult) { if (result.worldFragment != null) { mBodyNode.SetPosition( Position.x, result.worldFragment.singleIntersection.y + 10, Position.z); } } }
public bool Tick(int diffX, int diffY, string startX, string startY, int searchCounter) { if (mRoot != null && IsInitialized == true) { renderScene(); foobar(); if (mAnimationState != null) { mAnimationState.AddTime(((float).01)); //todo - might not render last frame if (mAnimationState.HasEnded) { return(false); } } // Setup the scene query Vector3 camPos = mCamera.RealPosition; Ray cameraRay = new Ray(new Vector3(camPos.x, 5000.0f, camPos.z), Vector3.NEGATIVE_UNIT_Y); mRaySceneQuery.Ray = cameraRay; // Perform the scene query; RaySceneQueryResult result = mRaySceneQuery.Execute(); RaySceneQueryResult.Enumerator itr = (RaySceneQueryResult.Enumerator)result.GetEnumerator(); // Get the results, set the camera height if ((itr != null) && itr.MoveNext()) { if (itr.Current != null && itr.Current.worldFragment != null) { float terrainHeight = itr.Current.worldFragment.singleIntersection.y; if ((terrainHeight + 120.0f) > camPos.y) {// mCamera.SetPosition(camPos.x, terrainHeight + 150.0f, camPos.z); cameraNode.Translate(cameraYawNode.Orientation * cameraPitchNode.Orientation * new Vector3(0, 10, 0), SceneNode.TransformSpace.TS_LOCAL); } } } mRoot.RenderOneFrame(); } return(true); }
protected override bool FrameEnded(FrameEvent e) { if (!base.FrameEnded(e)) { return(false); } SetDebugCaption(0, string.Format("Camera Location: ({0}, {1}, {2}) ", mCamera.GetPosition().x, mCamera.GetPosition().y, mCamera.GetPosition().z)); SetDebugCaption(1, string.Format("Camera Orientation: ({0}, {1}, {2}, {3}) ", mCamera.GetOrientation().x, mCamera.GetOrientation().y, mCamera.GetOrientation().z, mCamera.GetOrientation().w)); Vector3 p = mCamera.GetPosition(); p.y = 3000.0f; mRay.setOrigin(p); SetDebugCaption(2, string.Format(" ray at : ({0}, {1}, {2}) ", mRay.getOrigin().x, mRay.getOrigin().y, mRay.getOrigin().z)); SetDebugCaption(3, ""); mRaySceneQuery.setRay(mRay); RaySceneQueryResult qryResult = mRaySceneQuery.execute(); if (qryResult.Count > 0) { float newY = -999.0f; foreach (RaySceneQueryResultEntry qryEntry in qryResult) { if (newY < qryEntry.distance) { newY = qryEntry.distance; } } if (newY != -999.0f) { newY = 3000.0f - newY; p = mCamera.GetPosition(); p.y = newY + 5.0f; mCamera.SetPosition(p.x, p.y, p.z); SetDebugCaption(3, string.Format(" intersect at : ({0}, {1}, {2}) ", p.x, p.y, p.z)); } } return(true); }
public string selectObject(Point mousePoint, float width, float height) { RestoreBoxnodes(); Ray ray = camera.GetCameraToViewportRay(mousePoint.X / width, mousePoint.Y / height); raySceneQuery.Ray = ray; // Execute query raySceneQuery.SetSortByDistance(true, 1); RaySceneQueryResult result = raySceneQuery.Execute(); if (result.Count > 0) { isTubeRool = true; RaySceneQueryResultEntry entry = result[0]; string entryName = entry.movable.Name; if (entryName.Substring(0, 3).Equals("box")) { Node node = entry.movable.ParentNode; Vector3 nodePosition = node.Position; if (nodePosition.x == 0) { nodePosition.x += 20; node.Position = nodePosition; } } else if (entryName.Substring(0, 4).Equals("tube")) { isTubeRool = false; Node nodeParent = entry.movable.ParentNode.Parent; for (int i = 1; i < 4; i++) { Node nodeChild = nodeParent.GetChild("tube" + i.ToString() + "Node"); nodeChild.ResetOrientation(); } } return(entryName); } return(""); }
private void picRender_MouseClick(object sender, MouseEventArgs e) { if (e.Button != MouseButtons.Right) { return; } SelectedItem = ""; RaySceneQuery mRaySceneQuery = null; // Save mouse position float mouseX = (float)e.X / picRender.Width; float mouseY = (float)e.Y / picRender.Height; // Setup the ray scene query Ray mouseRay = mgr.GetCamera("Camera").GetCameraToViewportRay(mouseX, mouseY); mRaySceneQuery = mgr.CreateRayQuery(mouseRay); // Execute query RaySceneQueryResult result = mRaySceneQuery.Execute(); RaySceneQueryResultEntry oneobj; ctxPickObject.Items.Clear(); // Get results, create a node/entity on the position for (Int16 i = 0; i < result.Count; i++) { oneobj = result[i]; if (oneobj.movable != null && oneobj.movable.Name != "canvas") { ctxPickObject.Items.Add(oneobj.movable.Name).Click += new EventHandler(ItemPicked); } } // ctxPickObject.Show(picRender, e.X, e.Y); drawFrame(); }
protected Vector3 GetFirstRealHit(Vector3 origin, Vector3 direction) { Vector3 hit = origin; float minDistance = float.MaxValue; RaySceneQuery raySceneQuery = CameraCS.SceneManager.CreateRayQuery(new Ray(origin, direction)); RaySceneQueryResult result = raySceneQuery.Execute(); var iterator = result.GetEnumerator(); bool intersect = false; while (iterator.MoveNext() /*&& !intersect*/) //! @todo are the results ordered ?? if so, uncomment (optimization) { var itr = iterator.Current; if (itr.distance < minDistance && // take the shorter itr.movable.ParentSceneNode != CameraCS.CameraSceneNode && itr.movable.ParentSceneNode != CameraCS.TargetNode && !_ignoreList.Contains(itr.movable)) { minDistance = itr.distance; intersect = true; if (itr.worldFragment != null) { hit = itr.worldFragment.singleIntersection; } else //if(itr.movable) { hit = origin + (direction * itr.distance); } } } CameraCS.SceneManager.DestroyQuery(raySceneQuery); return(hit); }
public void LeftClicked(float x, float y, string currentEntity) { // Save mouse position mouseX = x; mouseY = y; // Setup the ray scene query Ray mouseRay = mCamera.GetCameraToViewportRay(mouseX, mouseY); Ray newRay = new Ray(new Vector3(mouseRay.Origin.x, System.Math.Abs(mouseRay.Origin.y), mouseRay.Origin.z), mouseRay.Direction); mRaySceneQuery.Ray = newRay; // Execute query RaySceneQueryResult result = mRaySceneQuery.Execute(); RaySceneQueryResult.Enumerator itr = (RaySceneQueryResult.Enumerator)result.GetEnumerator(); // Get results, create a node/entity on the position if (itr != null && itr.MoveNext()) { if (string.IsNullOrWhiteSpace(currentEntity)) { return; } if (itr.Current != null && itr.Current.worldFragment != null) { Entity ent = mMgr.CreateEntity(currentEntity + mCount.ToString(), currentEntity); mCurrentObject = mMgr.RootSceneNode.CreateChildSceneNode(currentEntity + "Node" + mCount.ToString(), itr.Current.worldFragment.singleIntersection); mCount++; mCurrentObject.AttachObject(ent); mCurrentObject.SetScale(scale); } } // mLMouseDown = true; return; }
public static Vector3 GetBestLocationFromYDown(Vector3 vector, float fallbackY, float sizeY) { Ray ray = new Ray(vector + new Vector3(0, (float.MaxValue), 0), Vector3.NEGATIVE_UNIT_Y); RaySceneQuery mRaySceneQuery = Engine.Renderer.Scene.CreateRayQuery(ray); mRaySceneQuery.SetSortByDistance(true, 64); mRaySceneQuery.QueryMask = (uint)QueryFlags.INSTANCE_ENTITY; mRaySceneQuery.QueryTypeMask = SceneManager.ENTITY_TYPE_MASK | SceneManager.STATICGEOMETRY_TYPE_MASK | SceneManager.USER_TYPE_MASK_LIMIT | SceneManager.FRUSTUM_TYPE_MASK | SceneManager.FX_TYPE_MASK | SceneManager.LIGHT_TYPE_MASK | SceneManager.WORLD_GEOMETRY_TYPE_MASK; RaySceneQueryResult result = mRaySceneQuery.Execute(); RaySceneQueryResult.Enumerator itr = (RaySceneQueryResult.Enumerator)(result.GetEnumerator()); Vector3 max = new Vector3(vector.x, fallbackY, vector.z); if (itr != null) { while (itr.MoveNext()) { RaySceneQueryResultEntry entry = itr.Current; SceneNode parentNode = entry.movable.ParentSceneNode; Vector3 current = new Vector3(vector.x, parentNode.Position.y + sizeY, vector.z); if (current.y > max.y) { max = current; } } } return(max); }
/// <summary> /// Calculates collistion from Rays and check distance between bullet and object gets from the Ray result. /// </summary> /// <returns>Returns if bullet hits any target.</returns> private bool Collision() { Ray ray = new Ray(sceneNode.Position, GetDirection(sceneNode.Orientation)); var mRaySceneQuery = Game.SceneManager.CreateRayQuery(ray); RaySceneQueryResult result = mRaySceneQuery.Execute(); // Check all objects from the Ray result. foreach (var item in result) { if ((item.distance < farfarAway) && (item.distance > 0)) { // Meet something var hitTest = Game.HitTest; if (hitTest.IsObjectControllable(item.movable.Name)) { // Can hit just controlable game objects (no bullets, no pointers...) hittedObject = hitTest.GetGameObject(item.movable.Name); return(true); } } } return(false); }
private bool FrameStarted(FrameEvent evt) { // Check camera height RaySceneQuery raySceneQuery = sceneMgr.CreateRayQuery(new Ray(camera.Position + new Vector3(0, 1000000, 0), Vector3.NEGATIVE_UNIT_Y)); RaySceneQueryResult qryResult = raySceneQuery.Execute(); RaySceneQueryResult.Iterator it = qryResult.Begin(); if (it != qryResult.End() && it.Value.worldFragment != null) { if (camera.DerivedPosition.y < it.Value.worldFragment.singleIntersection.y + 30) { camera.SetPosition(camera.Position.x, it.Value.worldFragment.singleIntersection.y + 30, camera.Position.z); } it.MoveNext(); } //SkyX::AtmosphereManager::Options SkyXOptions = mSkyX->getAtmosphereManager()->getOptions(); // Time if (!showInformation) { manager.TimeMultiplier = 0.1f; } else { manager.TimeMultiplier = 0.0f; } textArea.Caption = GetConfigString(); manager.Update(evt.timeSinceLastFrame); return(true); }
public float GetTSMHeightAt(float x, float z) { float y = 0.0f; Ray updateRay = new Ray(); updateRay.Origin = new Vector3(x, 9999, z); updateRay.Direction = Vector3.NEGATIVE_UNIT_Y; RaySceneQuery tsmRaySceneQuery = this.sceneMgr.CreateRayQuery(updateRay); RaySceneQueryResult qryResult = tsmRaySceneQuery.Execute(); RaySceneQueryResult.Iterator i = qryResult.Begin(); if (i != qryResult.End() && i.Value.worldFragment != null) { y = i.Value.worldFragment.singleIntersection.y; } this.sceneMgr.DestroyQuery(tsmRaySceneQuery); tsmRaySceneQuery.Dispose(); return(y); }
protected override bool ExampleApp_FrameStarted(FrameEvent evt) { if (base.ExampleApp_FrameStarted(evt) == false) { return(false); } // clamp to terrain Ray updateRay = new Ray(this.camera.Position, Vector3.NEGATIVE_UNIT_Y); raySceneQuery.Ray = updateRay; RaySceneQueryResult qryResult = raySceneQuery.Execute(); RaySceneQueryResultEntry rs = qryResult[0]; if (rs != null && rs.worldFragment != null) { camera.SetPosition(camera.Position.x, rs.worldFragment.singleIntersection.y + 10, camera.Position.z); } return(true); }
public RaycastResult Raycast(Ray ray, uint queryMask) { RaycastResult rr = new RaycastResult(); RaySceneQuery raySceneQuery = this.sceneMgr.CreateRayQuery(new Ray()); raySceneQuery.SetSortByDistance(true); // check we are initialised if (raySceneQuery != null) { // create a query object raySceneQuery.Ray = ray; raySceneQuery.SetSortByDistance(true); raySceneQuery.QueryMask = queryMask; using (RaySceneQueryResult queryResult = raySceneQuery.Execute()) { // execute the query, returns a vector of hits if (queryResult.Count <= 0) { // raycast did not hit an objects bounding box this.sceneMgr.DestroyQuery(raySceneQuery); raySceneQuery.Dispose(); return(null); } // at this point we have raycast to a series of different objects bounding boxes. // we need to test these different objects to see which is the first polygon hit. // there are some minor optimizations (distance based) that mean we wont have to // check all of the objects most of the time, but the worst case scenario is that // we need to test every triangle of every object. // Ogre::Real closest_distance = -1.0f; rr.Distance = -1.0f; Vector3 closestResult = Vector3.ZERO; for (int qridx = 0; qridx < queryResult.Count; qridx++) { // stop checking if we have found a raycast hit that is closer // than all remaining entities if (rr.Distance >= 0.0f && rr.Distance < queryResult[qridx].distance) { break; } // only check this result if its a hit against an entity if (queryResult[qridx].movable != null && queryResult[qridx].movable.MovableType == "Entity") { // get the entity to check Entity entity = (Entity)queryResult[qridx].movable; // mesh data to retrieve Vector3[] vertices; int[] indices; RenderOperation.OperationTypes opType; // get the mesh information using (MeshPtr mesh = entity.GetMesh()) { opType = mesh.GetSubMesh(0).operationType; Debug.Assert(CheckSubMeshOpType(mesh, opType)); GetMeshInformation( mesh, out vertices, out indices, entity.ParentNode._getDerivedPosition(), entity.ParentNode._getDerivedOrientation(), entity.ParentNode._getDerivedScale()); } int vertexCount = vertices.Length; int indexCount = indices.Length; // test for hitting individual triangles on the mesh bool newClosestFound = false; Pair <bool, float> hit; switch (opType) { case RenderOperation.OperationTypes.OT_TRIANGLE_LIST: for (int i = 0; i < indexCount; i += 3) { hit = Mogre.Math.Intersects(ray, vertices[indices[i]], vertices[indices[i + 1]], vertices[indices[i + 2]], true, false); if (CheckDistance(rr, hit)) { newClosestFound = true; } } break; case RenderOperation.OperationTypes.OT_TRIANGLE_STRIP: for (int i = 0; i < indexCount - 2; i++) { hit = Mogre.Math.Intersects(ray, vertices[indices[i]], vertices[indices[i + 1]], vertices[indices[i + 2]], true, true); if (CheckDistance(rr, hit)) { newClosestFound = true; } } break; case RenderOperation.OperationTypes.OT_TRIANGLE_FAN: for (int i = 0; i < indexCount - 2; i++) { hit = Mogre.Math.Intersects(ray, vertices[indices[0]], vertices[indices[i + 1]], vertices[indices[i + 2]], true, true); if (CheckDistance(rr, hit)) { newClosestFound = true; } } break; default: throw new Exception("invalid operation type"); } // if we found a new closest raycast for this object, update the // closest_result before moving on to the next object. if (newClosestFound) { rr.Target = entity; closestResult = ray.GetPoint(rr.Distance); } } } this.sceneMgr.DestroyQuery(raySceneQuery); raySceneQuery.Dispose(); // return the result if (rr.Distance >= 0.0f) { // raycast success rr.Position = closestResult; return(rr); } else { return(null); } } } else { return(null); } }
public override void InjectMouseMove(MouseEvent arg) { base.InjectMouseMove(arg); Vector2 cursorPos = new Vector2(arg.state.X.abs, arg.state.Y.abs); Ray ray = UIManager.Instance.GetCursorRay(editor.Map.Camera); switch (state) { case EditState.Add: switch (type) { case EditType.EditAIMeshMode: Mogre.Vector3 pos = Helper.ConvertScreenCoordToWorldCoord( lastMousePos, editor.Map.Camera, EngineManager.Instance.renderWindow); HandleObjectCreate(pos); state = EditState.Edit; operation = EditOperation.ChangingObjCoordFllowMouse; break; case EditType.EditObjectMode: break; case EditType.EditTerrainMode: break; } break; case EditState.Edit: switch (type) { case EditType.EditAIMeshMode: Mogre.Vector3 pos = ray.Origin + ray.Direction * distance; HandleObjOperationNoResize(pos, cursorPos); break; case EditType.EditObjectMode: break; case EditType.EditTerrainMode: break; } break; case EditState.Free: Degree deCameraYaw = new Degree(arg.state.X.rel * -0.1f); editor.Map.Camera.Yaw(deCameraYaw); Degree deCameraPitch = new Degree(arg.state.Y.rel * -0.1f); editor.Map.Camera.Pitch(deCameraPitch); if (currentSelectedEnt != null) { currentSelectedEnt.ParentSceneNode.ShowBoundingBox = false; } var query = editor.Map.SceneManager.CreateRayQuery(ray); query.QueryMask = 1 << 0; RaySceneQueryResult result = query.Execute(); foreach (var sResult in result) { if (sResult.movable != null && (sResult.movable.Name.StartsWith("SCENE_OBJECT") || sResult.movable.Name.StartsWith("AIMESH"))) { //High light the object var ent = editor.Map.SceneManager.GetEntity(sResult.movable.Name); MaterialPtr material = ent.GetSubEntity(0).GetMaterial(); ColourValue cv = new ColourValue(1, 0, 0); material.GetTechnique(0).SetAmbient(cv); ColourValue cv2 = new ColourValue(1, 0, 0); material.GetTechnique(0).SetDiffuse(cv2); ent.GetSubEntity(0).SetMaterial(material); ent.ParentSceneNode.ShowBoundingBox = true; currentSelectedEnt = ent; } } break; } lastMousePos = cursorPos; }
public RaycastResult Raycast(Ray ray, uint queryMask) { RaycastResult rr = new RaycastResult(); RaySceneQuery raySceneQuery = this.sceneMgr.CreateRayQuery(new Ray()); raySceneQuery.SetSortByDistance(true); // check we are initialised if (raySceneQuery != null) { // create a query object raySceneQuery.Ray = ray; raySceneQuery.SetSortByDistance(true); raySceneQuery.QueryMask = queryMask; // execute the query, returns a vector of hits if (raySceneQuery.Execute().Count <= 0) { // raycast did not hit an objects bounding box return(null); } } else { // LogManager.Singleton.LogMessage("Cannot raycast without RaySceneQuery instance"); return(null); } // at this point we have raycast to a series of different objects bounding boxes. // we need to test these different objects to see which is the first polygon hit. // there are some minor optimizations (distance based) that mean we wont have to // check all of the objects most of the time, but the worst case scenario is that // we need to test every triangle of every object. // Ogre::Real closest_distance = -1.0f; rr.Distance = -1.0f; Vector3 closest_result = Vector3.ZERO; RaySceneQueryResult query_result = raySceneQuery.GetLastResults(); for (int qridx = 0; qridx < query_result.Count; qridx++) { // stop checking if we have found a raycast hit that is closer // than all remaining entities if ((rr.Distance >= 0.0f) && (rr.Distance < query_result[qridx].distance)) { break; } // only check this result if its a hit against an entity if ((query_result[qridx].movable != null) && (query_result[qridx].movable.MovableType.CompareTo("Entity") == 0)) { // get the entity to check Entity pentity = (Entity)query_result[qridx].movable; // mesh data to retrieve uint vertex_count; uint index_count; Vector3[] vertices; ulong[] indices; // get the mesh information GetMeshInformation( pentity.GetMesh(), out vertex_count, out vertices, out index_count, out indices, pentity.ParentNode._getDerivedPosition(), pentity.ParentNode._getDerivedOrientation(), pentity.ParentNode.GetScale()); // test for hitting individual triangles on the mesh bool new_closest_found = false; for (int i = 0; i < (int)index_count; i += 3) { // check for a hit against this triangle Pair <bool, float> 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 ((rr.Distance < 0.0f) || (hit.second < rr.Distance)) { // this is the closest so far, save it off rr.Distance = hit.second; new_closest_found = true; } } } // if we found a new closest raycast for this object, update the // closest_result before moving on to the next object. if (new_closest_found) { rr.Target = pentity; closest_result = ray.GetPoint(rr.Distance); } } } this.sceneMgr.DestroyQuery(raySceneQuery); raySceneQuery.Dispose(); // return the result if (rr.Distance >= 0.0f) { // raycast success rr.Position = closest_result; return(rr); } else { return(null); } }
internal static global::System.Runtime.InteropServices.HandleRef getCPtr(RaySceneQueryResult obj) { return((obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr); }
private void renderBox_MouseClick(object sender, MouseEventArgs e) { if (e.Button != MouseButtons.Left) { return; } foreach (MovableObject selectedNode in selectedNodes) { try { selectedNode.ParentSceneNode.ShowBoundingBox = false; } catch (Exception ex) { //log(ex.ToString()); } } selectedNodes = new ArrayList(); float scrx = (float)e.X / OgreWindow.Instance.mViewport.ActualWidth; float scry = (float)e.Y / OgreWindow.Instance.mViewport.ActualHeight; Ray ray = OgreWindow.Instance.mCamera.GetCameraToViewportRay(scrx, scry); RaySceneQuery query = OgreWindow.Instance.mSceneMgr.CreateRayQuery(ray); RaySceneQueryResult results = query.Execute(); float nearest = 100000000f; //100 mill int nearestIndex = -1; for (int i = 0; i < results.Count; i++) { RaySceneQueryResultEntry entry = results[i]; if (entry.movable.Name == "MainCamera") { continue; } if (entry.movable.Name.IndexOf("SphereEntity") > -1) { continue; } if (entry.movable.Name.IndexOf("SkyXMeshEnt") > -1) { continue; } if (entry.movable.Name.IndexOf("_Hydrax_GodRays_ManualObject") > -1) { continue; } if (entry.movable.Name.IndexOf("_Hydrax_GodRays_Projector_Camera") > -1) { continue; } if (entry.movable.Name.IndexOf("_Hydrax_Projector_Camera") > -1) { continue; } if (entry.movable.Name.IndexOf("HydraxMeshEnt") > -1) { continue; } bool cancel = false; foreach (string s in preventSelect) { if (entry.movable.Name.IndexOf(s) > -1) { cancel = true; break; } } if (cancel) { continue; } if (entry.distance < nearest) { nearest = entry.distance; nearestIndex = i; } } if (nearestIndex > -1) { RaySceneQueryResultEntry entry = results[nearestIndex]; selectSceneNode(entry.movable); } }
private static bool GetRaySceneLocationWithPlane(double x, double y, Plane plane, out Vector3 vector, SceneNode ignore) { float width = Engine.Renderer.Camera.Viewport.ActualWidth; float height = Engine.Renderer.Camera.Viewport.ActualHeight; Ray mouseRay = Engine.Renderer.Camera.GetCameraToViewportRay((float)((x - 1) / width), (float)((y - 1) / height)); Plane inverse = new Plane(-plane.normal, -plane.d); Pair <bool, float> d0 = mouseRay.Intersects(plane); Pair <bool, float> d1 = mouseRay.Intersects(inverse); RaySceneQuery mRaySceneQuery = Engine.Renderer.Scene.CreateRayQuery(mouseRay); mRaySceneQuery.SetSortByDistance(true, 16); mRaySceneQuery.QueryMask = (uint)QueryFlags.INSTANCE_ENTITY; mRaySceneQuery.QueryTypeMask = SceneManager.ENTITY_TYPE_MASK | SceneManager.STATICGEOMETRY_TYPE_MASK | SceneManager.USER_TYPE_MASK_LIMIT | SceneManager.FRUSTUM_TYPE_MASK | SceneManager.FX_TYPE_MASK | SceneManager.LIGHT_TYPE_MASK | SceneManager.WORLD_GEOMETRY_TYPE_MASK; RaySceneQueryResult result = mRaySceneQuery.Execute(); RaySceneQueryResult.Enumerator itr = (RaySceneQueryResult.Enumerator)(result.GetEnumerator()); if (itr != null) { RaySceneQueryResultEntry entry = null; while (itr.MoveNext()) { entry = itr.Current; if (entry != null && !entry.movable.ParentSceneNode.Equals(ignore)) { vector = mouseRay.GetPoint(entry.distance); return(true); } } if (d0.first) { Vector3 planePoint = mouseRay.GetPoint(d0.second); if ((Engine.Renderer.Camera.Position - planePoint).Length < MAX_TRANSLATE_DRAG_DISTANCE) { vector = planePoint; return(true); } } if (d1.first) { Vector3 planePoint = mouseRay.GetPoint(d1.second); if ((Engine.Renderer.Camera.Position - planePoint).Length < MAX_TRANSLATE_DRAG_DISTANCE) { vector = planePoint; return(true); } else { vector = Vector3.ZERO; return(false); } } else { vector = Vector3.ZERO; return(false); } } else { vector = Vector3.ZERO; return(false); } }
public RaySceneQueryResult(RaySceneQueryResult other) : this(OgrePINVOKE.new_RaySceneQueryResult__SWIG_1(RaySceneQueryResult.getCPtr(other)), true) { if (OgrePINVOKE.SWIGPendingException.Pending) { throw OgrePINVOKE.SWIGPendingException.Retrieve(); } }