private void HandleInput(GameTime gameTime, GamePadState gamePadState, KeyboardState keyboardState) { float elapsedTime = (float)gameTime.ElapsedGameTime.TotalSeconds; //Handle input for selecting meshes if (((gamePadState.Buttons.X == ButtonState.Pressed) && (lastGamePadState.Buttons.X == ButtonState.Released)) || (keyboardState.IsKeyDown(Keys.Tab) && lastKeyboardState.IsKeyUp(Keys.Tab))) { //switch the active mesh activeMesh = (activeMesh + 1) % sampleMeshes.Length; } //Handle input for selecting the active technique if (((gamePadState.Buttons.Y == ButtonState.Pressed) && (lastGamePadState.Buttons.Y == ButtonState.Released)) || (keyboardState.IsKeyDown(Keys.Space) && lastKeyboardState.IsKeyUp(Keys.Space))) { activeTechnique = (activeTechnique + 1) % effect.Techniques.Count; } //handle mesh rotation inputs float dx = SampleArcBallCamera.ReadKeyboardAxis(keyboardState, Keys.Left, Keys.Right) + gamePadState.ThumbSticks.Left.X; float dy = SampleArcBallCamera.ReadKeyboardAxis(keyboardState, Keys.Down, Keys.Up) + gamePadState.ThumbSticks.Left.Y; //apply mesh rotation to world matrix if (dx != 0) { world = world * Matrix.CreateFromAxisAngle(camera.Up, elapsedTime * dx); } if (dy != 0) { world = world * Matrix.CreateFromAxisAngle(camera.Right, elapsedTime * -dy); } }
/// <summary> /// Load the graphics content. /// </summary> protected override void LoadContent() { //Set up the reference grid and sample camera grid = new SampleGrid(); grid.GridColor = Color.LimeGreen; grid.GridScale = 1.0f; grid.GridSize = 32; grid.LoadGraphicsContent(graphics.GraphicsDevice); camera = new SampleArcBallCamera( SampleArcBallCameraMode.RollConstrained); camera.Distance = 3; //orbit the camera so we're looking down the z=-1 axis //the acr-ball camera is traditionally oriented to look //at the "front" of an object camera.OrbitRight(MathHelper.Pi); //orbit up a bit for perspective camera.OrbitUp(.2f); //load meshes sampleMeshes = new Model[5]; sampleMeshes[0] = Content.Load <Model>("Cube"); sampleMeshes[1] = Content.Load <Model>("SphereHighPoly"); sampleMeshes[2] = Content.Load <Model>("SphereLowPoly"); sampleMeshes[3] = Content.Load <Model>("Cylinder"); sampleMeshes[4] = Content.Load <Model>("Cone"); //load texture modelTexture = Content.Load <Texture2D>("Clouds"); //load the effect effect = Content.Load <Effect>("TexturesAndColors"); // The parameters are no longer shared, as they were in the previous // Shader Series sample. There is only one effect, that uses multiple // techniques, so there is only one instance of the parameters. worldParameter = effect.Parameters["world"]; viewParameter = effect.Parameters["view"]; projectionParameter = effect.Parameters["projection"]; lightColorParameter = effect.Parameters["lightColor"]; lightDirectionParameter = effect.Parameters["lightDirection"]; ambientColorParameter = effect.Parameters["ambientColor"]; modelTextureParameter = effect.Parameters["modelTexture"]; //create the spritebatch for debug text spriteBatch = new SpriteBatch(graphics.GraphicsDevice); //load the sprite font for debug text debugTextFont = Content.Load <SpriteFont>("DebugText"); //Calculate the projection properties first on any //load callback. That way if the window gets resized, //the perspective matrix is updated accordingly float aspectRatio = (float)graphics.GraphicsDevice.Viewport.Width / (float)graphics.GraphicsDevice.Viewport.Height; float fov = MathHelper.PiOver4 * aspectRatio * 3 / 4; projection = Matrix.CreatePerspectiveFieldOfView(fov, aspectRatio, .1f, 1000f); //create a default world matrix world = Matrix.Identity; //grid requires a projection matrix to draw correctly grid.ProjectionMatrix = projection; //Set the grid to draw on the x/z plane around the origin grid.WorldMatrix = Matrix.Identity; // calculate the safe left and top edges of the screen safeBounds = new Vector2( (float)graphics.GraphicsDevice.Viewport.X + (float)graphics.GraphicsDevice.Viewport.Width * 0.1f, (float)graphics.GraphicsDevice.Viewport.Y + (float)graphics.GraphicsDevice.Viewport.Height * 0.1f ); }