Axiom.Core.RaySceneQuery.Execute C# (CSharp) Method

Execute() public method

Executes the query, returning the results back in one list.
This method executes the scene query as configured, gathers the results into one structure and returns a reference to that structure. These results will also persist in this query object until the next query is executed, or ClearResults. A more lightweight version of this method that returns results through a listener is also available.
public Execute ( ) : IList
return IList
		public virtual IList<RaySceneQueryResultEntry> Execute()
		{
			ClearResults();

			// execute the callback version using ourselves as the listener
			Execute( this );

			if ( sortByDistance )
			{
				lastResults.Sort();

				if ( maxResults != 0 && lastResults.Count > maxResults )
				{
					// remove the results greater than the desired amount
					lastResults.RemoveRange( maxResults, lastResults.Count - maxResults );
				}
			}

			return lastResults;
		}

Same methods

RaySceneQuery::Execute ( IRaySceneQueryListener listener ) : void

Usage Example

Esempio n. 1
0
        protected override void OnFrameStarted(object source, FrameEventArgs e)
        {
            frameCount++;

            int tick = Environment.TickCount;

            time += e.TimeSinceLastFrame;

            float moveTime = e.TimeSinceLastFrame;

            if (moveTime > 1)
            {
                moveTime = 1;
            }

            Axiom.SceneManagers.Multiverse.WorldManager.Instance.Time = time;

            if ((tick - lastTick) > 100)
            {
                Console.WriteLine("long frame: {0}", tick - lastTick);
                LogManager.Instance.Write("long frame: {0}", tick - lastTick);
            }

            lastTick = tick;

//			int hpg = gen.HeightPointsGenerated;
//			if ( lastHeightPointsGenerated != hpg )
//			{
//				Console.WriteLine("HeightPointsGenerated: {0}", hpg - lastHeightPointsGenerated);
//				lastHeightPointsGenerated = hpg;
//			}

            float scaleMove = 20 * oneMeter * moveTime;

            // reset acceleration zero
            camAccel = Vector3.Zero;

            // set the scaling of camera motion
            cameraScale = 100 * moveTime;

            bool retry = true;

            //System.Threading.Thread.Sleep(3000);

            //while (retry)
            //{
            //    // TODO: Move this into an event queueing mechanism that is processed every frame
            //    try
            //    {
            //        input.Capture();
            //        retry = false;
            //    }
            //    catch (Exception ex)
            //    {
            //        System.Threading.Thread.Sleep(1000);
            //    }
            //}

            // TODO: Move this into an event queueing mechanism that is processed every frame

            bool realIsActive = window.IsActive;

            try
            {
                // force a reset of axiom's internal input state so that it will call Acquire() on the
                // input device again.
                if (captureFailed)
                {
                    window.IsActive = false;
                    input.Capture();
                    window.IsActive = realIsActive;
                }
                input.Capture();
                captureFailed = false;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                captureFailed = true;
                System.Threading.Thread.Sleep(1000);
            }
            finally
            {
                window.IsActive = realIsActive;
            }

            if (input.IsKeyPressed(KeyCodes.Escape))
            {
                Root.Instance.QueueEndRendering();

                return;
            }

            if (input.IsKeyPressed(KeyCodes.A))
            {
                camAccel.x = -0.5f;
            }

            if (input.IsKeyPressed(KeyCodes.D))
            {
                camAccel.x = 0.5f;
            }

            if (input.IsKeyPressed(KeyCodes.W))
            {
                camAccel.z = -1.0f;
            }

            if (input.IsKeyPressed(KeyCodes.S))
            {
                camAccel.z = 1.0f;
            }

            if (!captureFailed)
            {
                camAccel.y += (float)(input.RelativeMouseZ * 0.1f);
            }

            if (input.IsKeyPressed(KeyCodes.Left))
            {
                camera.Yaw(cameraScale);
            }

            if (input.IsKeyPressed(KeyCodes.Right))
            {
                camera.Yaw(-cameraScale);
            }

            if (input.IsKeyPressed(KeyCodes.Up))
            {
                camera.Pitch(cameraScale);
            }

            if (input.IsKeyPressed(KeyCodes.Down))
            {
                camera.Pitch(-cameraScale);
            }

            // subtract the time since last frame to delay specific key presses
            toggleDelay -= e.TimeSinceLastFrame;

            // toggle rendering mode
            if (input.IsKeyPressed(KeyCodes.R) && toggleDelay < 0)
            {
                if (camera.SceneDetail == SceneDetailLevel.Points)
                {
                    camera.SceneDetail = SceneDetailLevel.Solid;
                }
                else if (camera.SceneDetail == SceneDetailLevel.Solid)
                {
                    camera.SceneDetail = SceneDetailLevel.Wireframe;
                }
                else
                {
                    camera.SceneDetail = SceneDetailLevel.Points;
                }

                Console.WriteLine("Rendering mode changed to '{0}'.", camera.SceneDetail);

                toggleDelay = 1;
            }

            if (input.IsKeyPressed(KeyCodes.F) && toggleDelay < 0)
            {
                followTerrain = !followTerrain;
                toggleDelay   = 1;
            }

            if (input.IsKeyPressed(KeyCodes.H) && toggleDelay < 0)
            {
                humanSpeed  = !humanSpeed;
                toggleDelay = 1;
            }

            if (input.IsKeyPressed(KeyCodes.T) && toggleDelay < 0)
            {
                // toggle the texture settings
                switch (filtering)
                {
                case TextureFiltering.Bilinear:
                    filtering = TextureFiltering.Trilinear;
                    aniso     = 1;
                    break;

                case TextureFiltering.Trilinear:
                    filtering = TextureFiltering.Anisotropic;
                    aniso     = 8;
                    break;

                case TextureFiltering.Anisotropic:
                    filtering = TextureFiltering.Bilinear;
                    aniso     = 1;
                    break;
                }

                Console.WriteLine("Texture Filtering changed to '{0}'.", filtering);

                // set the new default
                MaterialManager.Instance.SetDefaultTextureFiltering(filtering);
                MaterialManager.Instance.DefaultAnisotropy = aniso;

                toggleDelay = 1;
            }

            if (input.IsKeyPressed(KeyCodes.P))
            {
                string[] temp     = Directory.GetFiles(Environment.CurrentDirectory, "screenshot*.jpg");
                string   fileName = string.Format("screenshot{0}.jpg", temp.Length + 1);

                // show briefly on the screen
                window.DebugText = string.Format("Wrote screenshot '{0}'.", fileName);

                TakeScreenshot(fileName);

                // show for 2 seconds
                debugTextDelay = 2.0f;
            }

            if (input.IsKeyPressed(KeyCodes.B))
            {
                scene.ShowBoundingBoxes = !scene.ShowBoundingBoxes;
            }

            if (input.IsKeyPressed(KeyCodes.O))
            {
                // hide all overlays, includes ones besides the debug overlay
                viewport.OverlaysEnabled = !viewport.OverlaysEnabled;
            }

            if (input.IsKeyPressed(KeyCodes.F1) && toggleDelay < 0)
            {
                Axiom.SceneManagers.Multiverse.WorldManager.Instance.DrawStitches =
                    !Axiom.SceneManagers.Multiverse.WorldManager.Instance.DrawStitches;
                toggleDelay = 1;
            }

            if (input.IsKeyPressed(KeyCodes.F2) && toggleDelay < 0)
            {
                Axiom.SceneManagers.Multiverse.WorldManager.Instance.DrawTiles =
                    !Axiom.SceneManagers.Multiverse.WorldManager.Instance.DrawTiles;
                toggleDelay = 1;
            }

            if (input.IsKeyPressed(KeyCodes.F3) && toggleDelay < 0)
            {
                Console.WriteLine("Camera Location: {0}, {1}, {2}", camera.Position.x.ToString("F3"),
                                  camera.Position.y.ToString("F3"), camera.Position.z.ToString("F3"));
                toggleDelay = 1;
            }

            if (input.IsKeyPressed(KeyCodes.F4) && toggleDelay < 0)
            {
                preview = !preview;

                if (preview)
                {
                    // when in preview mode, move the camera up high and look at the ground
                    camera.MoveRelative(new Vector3(0, 1000 * oneMeter, 0));
                    camera.LookAt(new Vector3(0, 0, 0));

                    followTerrain = false;
                }
                else
                {
                    // when not in preview mode, hug the ground
                    followTerrain = true;
                }
                SetupScene();

                toggleDelay = 1;
            }

            if (input.IsKeyPressed(KeyCodes.F5) && toggleDelay < 0)
            {
                if (WorldManager.Instance.OceanWaveHeight >= 500)
                {
                    WorldManager.Instance.OceanWaveHeight -= 500;
                }
                toggleDelay = 1;
            }

            if (input.IsKeyPressed(KeyCodes.F6) && toggleDelay < 0)
            {
                WorldManager.Instance.OceanWaveHeight += 500;
                toggleDelay = 1;
            }

            if (input.IsKeyPressed(KeyCodes.F7) && toggleDelay < 0)
            {
                NewRoad();
                toggleDelay = 1;
            }


            if (input.IsKeyPressed(KeyCodes.F8) && toggleDelay < 0)
            {
                WorldManager.Instance.SeaLevel += 500;
                toggleDelay = 1;
            }

            if (input.IsKeyPressed(KeyCodes.F9) && toggleDelay < 0)
            {
                StreamWriter  s = new StreamWriter("boundaries.xml");
                XmlTextWriter w = new XmlTextWriter(s);
                //w.Formatting = Formatting.Indented;
                //w.Indentation = 2;
                //w.IndentChar = ' ';
                mvScene.ExportBoundaries(w);
                w.Close();
                s.Close();
                toggleDelay = 1;
            }

            if (input.IsKeyPressed(KeyCodes.F10) && toggleDelay < 0)
            {
                StreamReader  s = new StreamReader("boundaries.xml");
                XmlTextReader r = new XmlTextReader(s);
                mvScene.ImportBoundaries(r);
                r.Close();
                s.Close();
                toggleDelay = 1;
            }

            if (input.IsKeyPressed(KeyCodes.F11) && toggleDelay < 0)
            {
                StreamWriter s = new StreamWriter("terrain.xml");
                gen.ToXML(s);
                s.Close();
                toggleDelay = 1;
            }

            if (input.IsKeyPressed(KeyCodes.F12) && toggleDelay < 0)
            {
                StreamReader s = new StreamReader("terrain.xml");
                gen.FromXML(s);
                s.Close();

                SetupScene();

                toggleDelay = 1;
            }

            if (input.IsKeyPressed(KeyCodes.I))
            {
                //point camera north
                camera.Direction = Vector3.NegativeUnitZ;
            }
            if (input.IsKeyPressed(KeyCodes.K))
            {
                //point camera south
                camera.Direction = Vector3.UnitZ;
            }
            if (input.IsKeyPressed(KeyCodes.J))
            {
                //point camera west
                camera.Direction = Vector3.NegativeUnitX;
            }
            if (input.IsKeyPressed(KeyCodes.L))
            {
                //point camera east
                camera.Direction = Vector3.UnitX;
            }

            if (!captureFailed)
            {
                if (!input.IsMousePressed(MouseButtons.Left))
                {
                    float cameraYaw   = -input.RelativeMouseX * .13f;
                    float cameraPitch = -input.RelativeMouseY * .13f;

                    camera.Yaw(cameraYaw);
                    camera.Pitch(cameraPitch);
                }
                else
                {
                    cameraVector.x += input.RelativeMouseX * 0.13f;
                }
            }

            if (humanSpeed)
            {             // in game running speed is 7m/sec
                //camVelocity = camAccel * 7 * oneMeter;
                camVelocity = camAccel * 32 * oneMeter;
            }
            else
            {
                camVelocity += (camAccel * scaleMove * camSpeed);
            }

            //         Console.WriteLine("ScameMove: {0}", scaleMove.ToString("F3"));
            //         Console.WriteLine("Camera Accel: {0}, {1}, {2}", camAccel.x.ToString("F3"),
            //camAccel.y.ToString("F3"), camAccel.z.ToString("F3"));
            //         Console.WriteLine("Camera Velocity: {0}, {1}, {2}", camVelocity.x.ToString("F3"),
            //camVelocity.y.ToString("F3"), camVelocity.z.ToString("F3"));

            // move the camera based on the accumulated movement vector
            camera.MoveRelative(camVelocity * moveTime);

            // Now dampen the Velocity - only if user is not accelerating
            if (camAccel == Vector3.Zero)
            {
                float slowDown = 6 * moveTime;
                if (slowDown > 1)
                {
                    slowDown = 1;
                }
                camVelocity *= (1 - slowDown);
            }

            if (followTerrain)
            {
                // adjust new camera position to be a fixed distance above the ground
                Axiom.Core.RaySceneQuery raySceneQuery = scene.CreateRayQuery(new Ray(camera.Position, Vector3.NegativeUnitY));

                raySceneQuery.QueryMask = (ulong)Axiom.SceneManagers.Multiverse.RaySceneQueryType.Height;
                ArrayList results = raySceneQuery.Execute();

                RaySceneQueryResultEntry result = (RaySceneQueryResultEntry)results[0];

                camera.Position = new Vector3(camera.Position.x, result.worldFragment.SingleIntersection.y + (2f * oneMeter), camera.Position.z);
            }

            // update performance stats once per second
            if (statDelay < 0.0f && showDebugOverlay)
            {
                UpdateStats();
                statDelay = 1.0f;
            }
            else
            {
                statDelay -= e.TimeSinceLastFrame;
            }

            // turn off debug text when delay ends
            if (debugTextDelay < 0.0f)
            {
                debugTextDelay   = 0.0f;
                window.DebugText = "";
            }
            else if (debugTextDelay > 0.0f)
            {
                debugTextDelay -= e.TimeSinceLastFrame;
            }
        }