} // Load #endregion #region Update Tasks /// <summary> /// Tasks executed during the update. /// This is the place to put the application logic. /// </summary> protected override void UpdateTasks() { if (Keyboard.KeyJustPressed(Keys.Space)) { if (directionalLight.DirectionalLight.Intensity == 1) { directionalLight.DirectionalLight.Intensity = 4f; } else { directionalLight.DirectionalLight.Intensity = 1f; } } } // UpdateTasks
} // Start /// <summary> /// Tasks executed during the update. /// This is the place to put the application logic. /// </summary> public override void Update() { if (beginInEditorMode) { EditorManager.EnableEditorMode(); beginInEditorMode = false; } // Enable editor mode if (Keyboard.KeyJustPressed(Keys.E) && Keyboard.KeyPressed(Keys.LeftControl)) { if (EditorManager.EditorModeEnabled) { EditorManager.DisableEditorMode(); } else { EditorManager.EnableEditorMode(); } } } // UpdateTasks
} // Load #endregion #region Update Tasks /// <summary> /// Tasks executed during the update. /// This is the place to put the application logic. /// </summary> protected override void UpdateTasks() { // This is intended to be used in Xbox tests. if (XNAFinalEngine.Input.GamePad.PlayerOne.BackJustPressed) throw new Exception("Quick exit in Xbox 360 tests."); //demoLegend.Transform.Position = new Vector3(20, Screen.Height - 50f, 0f); #region Doors if (Keyboard.KeyJustPressed(Keys.Space) || XNAFinalEngine.Input.GamePad.PlayerOne.AJustPressed) { openingDoors = !openingDoors; } if (openingDoors) { lamborghiniMurcielagoLoader.LeftDoorAngle += Time.SmoothFrameTime * 30; lamborghiniMurcielagoLoader.RightDoorAngle += Time.SmoothFrameTime * 30; } else { lamborghiniMurcielagoLoader.LeftDoorAngle -= Time.SmoothFrameTime * 30; lamborghiniMurcielagoLoader.RightDoorAngle -= Time.SmoothFrameTime * 30; } #endregion #region Tires if (Keyboard.KeyPressed(Keys.Left) || XNAFinalEngine.Input.GamePad.PlayerOne.LeftStickX < 0) { lamborghiniMurcielagoLoader.TiresAngle += Time.SmoothFrameTime * 80; } if (Keyboard.KeyPressed(Keys.Right) || XNAFinalEngine.Input.GamePad.PlayerOne.LeftStickX > 0) { lamborghiniMurcielagoLoader.TiresAngle -= Time.SmoothFrameTime * 80; } #endregion } // UpdateTasks
} // SetPosition #endregion #region Update /// <summary> /// Update camera. /// </summary> public override void Update() { if (!((GameObject3D)Owner).Camera.Enabled) { return; } if (CouldBeManipulated() || ThisCameraIsBeingManipulated) { if (mode == ModeType.Softimage || mode == ModeType.NoManipulationKey) { #region Softimage mode #region Is it in manipulation mode? if (ThisCameraIsBeingManipulated) { // To exit the manipulation mode. if (Keyboard.KeyJustPressed(Keys.Escape) || Keyboard.KeyJustPressed(Keys.Space)) { cameraBeingManipulated = null; } } // To enter or exit the manipulation mode using the s key. if (Keyboard.KeyJustPressed(Keys.S)) { sJustPressed = true; sJustPressedTime = Time.ApplicationTime; } else { if (sJustPressed && !Keyboard.KeyPressed(Keys.S)) { sJustPressed = false; if (Time.ApplicationTime - sJustPressedTime < 0.3f) { cameraBeingManipulated = ThisCameraIsBeingManipulated ? null : this; } } } #endregion #region Manipulate if (ThisCameraIsBeingManipulated || Keyboard.KeyPressed(Keys.S) || mode == ModeType.NoManipulationKey) { // Translation if (Mouse.LeftButtonPressed) { LookAtPosition -= ((GameObject3D)Owner).Transform.Right * Mouse.DeltaX * Distance / 1000; LookAtPosition += ((GameObject3D)Owner).Transform.Up * Mouse.DeltaY * Distance / 1000; } // Orientation if (Mouse.RightButtonPressed && !OrthographicMode) { Yaw += Mouse.DeltaX * 0.005f; Pitch += Mouse.DeltaY * 0.005f; } // Zoom if (Mouse.MiddleButtonPressed) { Distance -= (-Mouse.DeltaX + Mouse.DeltaY) * Distance / 1300; // The minus is because I'm a little perfectionist. } } // Zoom Distance -= Mouse.WheelDelta * Distance / 1300; #endregion #endregion } else { #region Maya mode if ((Keyboard.KeyPressed(Keys.LeftAlt) || Keyboard.KeyPressed(Keys.RightAlt)) && (Mouse.LeftButtonPressed || Mouse.RightButtonPressed || Mouse.MiddleButtonPressed)) { cameraBeingManipulated = this; // Translation if (Mouse.MiddleButtonPressed) { LookAtPosition -= ((GameObject3D)Owner).Transform.Right * Mouse.DeltaX * Distance / 1000; LookAtPosition += ((GameObject3D)Owner).Transform.Up * Mouse.DeltaY * Distance / 1000; } // Orientation if (Mouse.LeftButtonPressed && !OrthographicMode) { Yaw += Mouse.DeltaX * 0.005f; Pitch += Mouse.DeltaY * 0.005f; } if (Mouse.RightButtonPressed) { // Distance or zoom Distance -= (Mouse.DeltaX + Mouse.DeltaY) * Distance / 1300; } } else { cameraBeingManipulated = null; } // Distance or zoom Distance -= Mouse.WheelDelta * Distance / 1300; // 1300 is an arbitrary number. #endregion } } #region Gamepad LookAtPosition -= ((GameObject3D)Owner).Transform.Right * -GamePad.PlayerOne.LeftStickX * Distance / 1000; LookAtPosition += ((GameObject3D)Owner).Transform.Up * GamePad.PlayerOne.LeftStickY * Distance / 1000; // Orientation Yaw -= GamePad.PlayerOne.RightStickX * 0.008f; Pitch += GamePad.PlayerOne.RightStickY * 0.008f; // Distance or zoom Distance -= (GamePad.PlayerOne.RightTrigger - GamePad.PlayerOne.LeftTrigger) * Distance / 300; #endregion #region Bounds // Orientation bounds if (Yaw >= twoPi) { Yaw -= twoPi; } if (Yaw < 0) { Yaw += twoPi; } if (Pitch >= twoPi) { Pitch -= twoPi; } if (Pitch < 0) { Pitch += twoPi; } // Distance bounds. if (Distance > ((GameObject3D)Owner).Camera.FarPlane) { Distance = ((GameObject3D)Owner).Camera.FarPlane; } if (Distance < ((GameObject3D)Owner).Camera.NearPlane) { Distance = ((GameObject3D)Owner).Camera.NearPlane; } #endregion // Calculate Rotation // Quaternion rotation = Quaternion.Identity; rotation *= Quaternion.CreateFromYawPitchRoll(0, Pitch, 0); rotation *= Quaternion.CreateFromYawPitchRoll(Yaw, 0, 0); rotation *= Quaternion.CreateFromYawPitchRoll(0, 0, Roll); // Its actually the invert... ((GameObject3D)Owner).Transform.Rotation = Quaternion.Inverse(rotation); // Now the position. Matrix rotationMatrix = Matrix.CreateFromQuaternion(rotation); ((GameObject3D)Owner).Transform.Position = LookAtPosition + new Vector3(rotationMatrix.M13, rotationMatrix.M23, rotationMatrix.M33) * Distance; if (OrthographicMode) { ((GameObject3D)Owner).Camera.OrthographicVerticalSize = Distance; } } // Update
} // DisableGizmo #endregion #region Update /// <summary> /// Update. /// </summary> internal void Update(GameObject3D gizmoCamera, Control clientArea) { #region Active if (Active) { // If the manipulation is over... if (!Mouse.LeftButtonPressed) { Active = false; // Store new previous matrix. if (selectedObjects[0].Transform.LocalMatrix != selectedObjectsLocalMatrix[0]) { using (Transaction.Create()) { for (int i = 0; i < selectedObjects.Count; i++) { // I store the action on the undo system. It seems complex. But it is pretty simple actually. Matrix oldMatrix = selectedObjectsLocalMatrix[i]; Matrix newMatrix = selectedObjects[i].Transform.LocalMatrix; GameObject3D gameObject3D = selectedObjects[i]; ActionManager.CallMethod( // Redo delegate { gameObject3D.Transform.LocalMatrix = newMatrix; }, // Undo delegate { gameObject3D.Transform.LocalMatrix = oldMatrix; }); } } } } // Transformate object... else { Vector2 transformationAmount; Vector3 translation = Vector3.Zero; // First we have to know how much to move the object in each axis. if (redAxisSelected) { Calculate2DMouseDirection(selectedObject, gizmoCamera, new Vector3(1, 0, 0), out transformationAmount); translation.X = (Mouse.DeltaX * transformationAmount.X / 100.0f); translation.X += (Mouse.DeltaY * transformationAmount.Y / 100.0f); } if (greenAxisSelected) { Calculate2DMouseDirection(selectedObject, gizmoCamera, new Vector3(0, 1, 0), out transformationAmount); translation.Y = (Mouse.DeltaX * transformationAmount.X / 100.0f); translation.Y += (Mouse.DeltaY * transformationAmount.Y / 100.0f); } if (blueAxisSelected) { Calculate2DMouseDirection(selectedObject, gizmoCamera, new Vector3(0, 0, 1), out transformationAmount); translation.Z = (Mouse.DeltaX * transformationAmount.X / 100.0f); translation.Z += (Mouse.DeltaY * transformationAmount.Y / 100.0f); } // Calculate the scale to do transformation proportional to the camera distance to the object. // The calculations are doing once from only one object to move everything at the same rate. Vector3 center; Quaternion orientation; float scale; GizmoScaleCenterOrientation(selectedObject, gizmoCamera, out scale, out center, out orientation); // Transform each object. foreach (GameObject3D gameObject3D in selectedObjects) { gameObject3D.Transform.Translate(translation * scale, Space == SpaceMode.Local ? Components.Space.Local : Components.Space.World); } } if (Keyboard.KeyJustPressed(Keys.Escape)) { Active = false; // Revert transformation to all selected objects. for (int i = 0; i < selectedObjects.Count; i++) { selectedObjects[i].Transform.LocalMatrix = selectedObjectsLocalMatrix[i]; } } } #endregion #region Inactive else { if (!Keyboard.KeyPressed(Keys.LeftAlt) && !Keyboard.KeyPressed(Keys.RightAlt)) { // If we press the left mouse button the manipulator activates. if (Mouse.LeftButtonJustPressed) { Active = true; // Stores initial matrix because maybe the user press escape; i.e. maybe he cancel the transformation. for (int i = 0; i < selectedObjects.Count; i++) { selectedObjectsLocalMatrix[i] = selectedObjects[i].Transform.LocalMatrix; } } // Perform a pick around the mouse pointer. Viewport viewport = new Viewport(gizmoCamera.Camera.Viewport.X + clientArea.ControlLeftAbsoluteCoordinate, gizmoCamera.Camera.Viewport.Y + clientArea.ControlTopAbsoluteCoordinate, gizmoCamera.Camera.Viewport.Width, gizmoCamera.Camera.Viewport.Height); Picker.BeginManualPicking(gizmoCamera.Camera.ViewMatrix, gizmoCamera.Camera.ProjectionMatrix, viewport); RenderGizmoForPicker(gizmoCamera); Color[] colorArray = Picker.EndManualPicking(new Rectangle(Mouse.Position.X - 5, Mouse.Position.Y - 5, RegionSize, RegionSize)); #region Find Selected Axis redAxisSelected = true; greenAxisSelected = true; blueAxisSelected = true; bool allAxis = false; for (int i = 0; i < RegionSize * RegionSize; i++) { // This is the order of preference: // 1) All axis. // 2) 1 axis. // 3) 2 axis. if (redAxisSelected && greenAxisSelected && blueAxisSelected) { // X and Y axis. if (colorArray[i].R == 255 && colorArray[i].G == 255 && colorArray[i].B == 0) { redAxisSelected = true; greenAxisSelected = true; blueAxisSelected = false; } // X and Z axis. if (colorArray[i].R == 255 && colorArray[i].G == 0 && colorArray[i].B == 255) { redAxisSelected = true; greenAxisSelected = false; blueAxisSelected = true; } // Y and Z axis. if (colorArray[i].R == 0 && colorArray[i].G == 255 && colorArray[i].B == 255) { redAxisSelected = false; greenAxisSelected = true; blueAxisSelected = true; } } // X axis. if (colorArray[i].R == 255 && colorArray[i].G == 0 && colorArray[i].B == 0) { redAxisSelected = true; greenAxisSelected = false; blueAxisSelected = false; } // Y axis. if (colorArray[i].R == 0 && colorArray[i].G == 255 && colorArray[i].B == 0) { redAxisSelected = false; greenAxisSelected = true; blueAxisSelected = false; } // Z axis. if (colorArray[i].R == 0 && colorArray[i].G == 0 && colorArray[i].B == 255) { redAxisSelected = false; greenAxisSelected = false; blueAxisSelected = true; } // All axis. if (colorArray[i].R == 255 && colorArray[i].G == 255 && colorArray[i].B == 255) { redAxisSelected = true; greenAxisSelected = true; blueAxisSelected = true; allAxis = true; i = RegionSize * RegionSize; // Or break. } } if (redAxisSelected && greenAxisSelected && blueAxisSelected && !allAxis) { redAxisSelected = false; greenAxisSelected = false; blueAxisSelected = false; } #endregion } else { redAxisSelected = false; greenAxisSelected = false; blueAxisSelected = false; } } #endregion } // Update
} // LoadContent #endregion #region Update Tasks /// <summary> /// Tasks executed during the update. /// This is the place to put the application logic. /// </summary> protected override void UpdateTasks() { // This is intended to be used in Xbox tests. //if (XNAFinalEngine.Input.GamePad.PlayerOne.BackJustPressed) // throw new Exception("Quick exit in Xbox 360 tests."); // Move the dynamic box // if (Keyboard.KeyJustPressed(Keys.Space) || XNAFinalEngine.Input.GamePad.PlayerOne.AJustPressed) { cube.RigidBody.Entity.ApplyImpulse(cube.Transform.Position, Vector3.Up * 5); } // Move the obstacle // if (Keyboard.KeyPressed(Keys.W) || XNAFinalEngine.Input.GamePad.PlayerOne.DPadUpPressed) { obstacle.Transform.Translate(Vector3.Forward * Time.GameDeltaTime * 2, Space.World); } if (Keyboard.KeyPressed(Keys.S) || XNAFinalEngine.Input.GamePad.PlayerOne.DPadDownPressed) { obstacle.Transform.Translate(Vector3.Backward * Time.GameDeltaTime * 2, Space.World); } if (Keyboard.KeyPressed(Keys.A) || XNAFinalEngine.Input.GamePad.PlayerOne.DPadLeftPressed) { obstacle.Transform.Translate(Vector3.Left * Time.GameDeltaTime * 2, Space.World); } if (Keyboard.KeyPressed(Keys.D) || XNAFinalEngine.Input.GamePad.PlayerOne.DPadRightPressed) { obstacle.Transform.Translate(Vector3.Right * Time.GameDeltaTime * 2, Space.World); } if (Keyboard.KeyPressed(Keys.Q) || XNAFinalEngine.Input.GamePad.PlayerOne.LeftButtonPressed) { obstacle.Transform.Rotate(new Vector3(0, Time.GameDeltaTime * 35, 0)); } if (Keyboard.KeyPressed(Keys.E) || XNAFinalEngine.Input.GamePad.PlayerOne.RightButtonPressed) { obstacle.Transform.Rotate(new Vector3(0, -Time.GameDeltaTime * 35, 0)); } // Fire a box // if (Keyboard.KeyJustPressed(Keys.LeftControl) || XNAFinalEngine.Input.GamePad.PlayerOne.XJustPressed) { var bullet = MakeBox(camera.Transform.Position, 1, 1, 1, 1, hitMaterial); var rb = bullet.RigidBody; rb.Entity.Orientation = camera.Transform.Rotation; rb.Entity.LinearVelocity = camera.Transform.Forward * 45f; } // Cast a ray and apply an impulse to the first object touched by the ray // if (Keyboard.KeyJustPressed(Keys.LeftShift) || XNAFinalEngine.Input.GamePad.PlayerOne.BJustPressed) { RayCastResult raycastResult; GameObject3D go = PhysicsManager.Raycast(new Ray(camera.Transform.Position, camera.Transform.Forward), 100f, out raycastResult); if (go != null && go != floor && go != cube && go != obstacle) { // Change the color of the hitted GO go.ModelRenderer.Material = new BlinnPhong { DiffuseColor = new Color(1.0f, 1.0f, 0.0f), SpecularPower = 500, SpecularIntensity = 0.5f }; // Apply Up impulse to the GO go.RigidBody.Entity.LinearMomentum = Vector3.Up * 25f; } } base.UpdateTasks(); } // UpdateTasks