public void ChangeCameraMode(OrbitCamera.ControlType type) { Camera.Control = type; if (type == OrbitCamera.ControlType.Walk) { Master.SetMaxViewingLevel(VoxelConstants.ChunkSizeY + 1); var below = VoxelHelpers.FindFirstVoxelBelowIncludeWater(new VoxelHandle(ChunkManager.ChunkData, GlobalVoxelCoordinate.FromVector3(new Vector3(Camera.Position.X, VoxelConstants.ChunkSizeY - 1, Camera.Position.Z)))); Camera.Position = below.WorldPosition + Vector3.One * 0.5f + Vector3.Up; } }
public void WalkUpdate(DwarfTime time, ChunkManager chunks) { { var mouseState = Mouse.GetState(); if (!GameState.Game.GraphicsDevice.Viewport.Bounds.Contains(mouseState.X, mouseState.Y)) { return; } } // Don't attempt any camera control if the user is trying to type intoa focus item. if (World.Gui.FocusItem != null && !World.Gui.FocusItem.IsAnyParentTransparent() && !World.Gui.FocusItem.IsAnyParentHidden()) { return; } if (GameSettings.Default.FogofWar) { var currentCoordinate = GlobalVoxelCoordinate.FromVector3(Position); if (currentCoordinate != _prevVoxelCoord) { VoxelHelpers.RadiusReveal(chunks.ChunkData, new VoxelHandle(chunks.ChunkData, currentCoordinate), 10); _prevVoxelCoord = currentCoordinate; } } float diffPhi = 0; float diffTheta = 0; Vector3 forward = (Target - Position); forward.Normalize(); Vector3 right = Vector3.Cross(forward, UpVector); Vector3 up = Vector3.Cross(right, forward); right.Normalize(); up.Normalize(); MouseState mouse = Mouse.GetState(); KeyboardState keys = Keyboard.GetState(); var bounds = new BoundingBox(World.ChunkManager.Bounds.Min, World.ChunkManager.Bounds.Max + Vector3.UnitY * 20); ZoomTargets.Clear(); Target = MathFunctions.Clamp(Target, bounds); float diffX, diffY = 0; float dt = (float)time.ElapsedRealTime.TotalSeconds; SnapToBounds(new BoundingBox(World.ChunkManager.Bounds.Min, World.ChunkManager.Bounds.Max + Vector3.UnitY * 20)); bool switchState = false; bool isAnyRotationKeyActive = keys.IsKeyDown(ControlSettings.Mappings.CameraMode) || keys.IsKeyDown(Keys.RightShift) || Mouse.GetState().MiddleButton == ButtonState.Pressed; if (isAnyRotationKeyActive && !shiftPressed) { shiftPressed = true; mouseOnRotate = GameState.Game.GraphicsDevice.Viewport.Bounds.Center; mousePrerotate = new Point(mouse.X, mouse.Y); switchState = true; mouseActiveInWalk = !mouseActiveInWalk; } else if (!isAnyRotationKeyActive && shiftPressed) { shiftPressed = false; } if (shiftPressed) { Mouse.SetPosition(mousePrerotate.X, mousePrerotate.Y); KeyManager.TrueMousePos = new Point(mousePrerotate.X, mousePrerotate.Y); } else { KeyManager.TrueMousePos = new Point(mouse.X, mouse.Y); } if (KeyManager.RotationEnabled(this)) { World.Gui.MouseVisible = false; Mouse.SetPosition(mouseOnRotate.X, mouseOnRotate.Y); if (!switchState) { diffX = mouse.X - mouseOnRotate.X; diffY = mouse.Y - mouseOnRotate.Y; } else { diffX = 0; diffY = 0; } if (!isLeftPressed && mouse.LeftButton == ButtonState.Pressed) { isLeftPressed = true; } else if (mouse.LeftButton == ButtonState.Released) { isLeftPressed = false; } if (!isRightPressed && mouse.RightButton == ButtonState.Pressed) { isRightPressed = true; } else if (mouse.RightButton == ButtonState.Released) { isRightPressed = false; } if (!isRightPressed) { float filterDiffX = (float)(diffX * dt); float filterDiffY = (float)(diffY * dt); diffTheta = (filterDiffX); diffPhi = -(filterDiffY); } KeyManager.TrueMousePos = mousePrerotate; } else { World.Gui.MouseVisible = true; } Vector3 velocityToSet = Vector3.Zero; if (EnableControl) { if (keys.IsKeyDown(ControlSettings.Mappings.Forward) || keys.IsKeyDown(Keys.Up)) { Vector3 mov = forward; mov.Normalize(); velocityToSet += mov * CameraMoveSpeed; } else if (keys.IsKeyDown(ControlSettings.Mappings.Back) || keys.IsKeyDown(Keys.Down)) { Vector3 mov = forward; mov.Normalize(); velocityToSet += -mov * CameraMoveSpeed; } if (keys.IsKeyDown(ControlSettings.Mappings.Left) || keys.IsKeyDown(Keys.Left)) { Vector3 mov = right; mov.Normalize(); velocityToSet += -mov * CameraMoveSpeed; } else if (keys.IsKeyDown(ControlSettings.Mappings.Right) || keys.IsKeyDown(Keys.Right)) { Vector3 mov = right; mov.Normalize(); velocityToSet += mov * CameraMoveSpeed; } } if (keys.IsKeyDown(ControlSettings.Mappings.Fly)) { flyKeyPressed = true; } else { if (flyKeyPressed) { flying = !flying; } flyKeyPressed = false; } if (velocityToSet.LengthSquared() > 0) { if (!flying) { float y = Velocity.Y; Velocity = Velocity * 0.5f + 0.5f * velocityToSet; Velocity = new Vector3(Velocity.X, y, Velocity.Z); } else { Velocity = Velocity * 0.5f + 0.5f * velocityToSet; } } LastWheel = mouse.ScrollWheelValue; float ymult = flying ? 0.9f : 1.0f; Velocity = new Vector3(Velocity.X * 0.9f, Velocity.Y * ymult, Velocity.Z * 0.9f); float subSteps = 10.0f; float subStepLength = 1.0f / subSteps; crouched = false; for (int i = 0; i < subSteps; i++) { VoxelHandle currentVoxel = new VoxelHandle(World.ChunkManager.ChunkData, GlobalVoxelCoordinate.FromVector3(Position)); var below = VoxelHelpers.GetNeighbor(currentVoxel, new GlobalVoxelOffset(0, -1, 0)); var above = VoxelHelpers.GetNeighbor(currentVoxel, new GlobalVoxelOffset(0, 1, 0)); if (above.IsValid && !above.IsEmpty) { crouched = true; } if (!flying) { if (!below.IsValid || below.IsEmpty) { Velocity += dt * Gravity * subStepLength; } else if (keys.IsKeyDown(ControlSettings.Mappings.Jump)) { Velocity += -dt * Gravity * subStepLength * 4; } if (currentVoxel.IsValid && currentVoxel.LiquidLevel > 0) { Velocity += -dt * Gravity * subStepLength * 0.999f; if (keys.IsKeyDown(ControlSettings.Mappings.Jump)) { Velocity += -dt * Gravity * subStepLength * 0.5f; } Velocity *= 0.99f; } } if (!CollidesWithChunks(World.ChunkManager, Position, true, true, 0.4f, 0.9f)) { MoveTarget(Velocity * dt * subStepLength); PushVelocity = Vector3.Zero; } else { MoveTarget(Velocity * dt * subStepLength); } } VoxelHandle voxelAfterMove = new VoxelHandle(World.ChunkManager.ChunkData, GlobalVoxelCoordinate.FromVector3(Position)); if (voxelAfterMove.IsValid && !voxelAfterMove.IsEmpty) { float distCenter = (voxelAfterMove.GetBoundingBox().Center() - Position).Length(); if (distCenter < 0.5f) { float closest = float.MaxValue; VoxelHandle closestVoxel = VoxelHandle.InvalidHandle; foreach (var voxel in VoxelHelpers.EnumerateAllNeighbors(voxelAfterMove.Coordinate).Select(c => new VoxelHandle(World.ChunkManager.ChunkData, c)).Where(v => v.IsEmpty)) { float d = (voxel.GetBoundingBox().Center() - Position).Length(); if (d < closest) { closest = d; closestVoxel = voxel; } } if (closestVoxel.IsValid) { var newPosition = closestVoxel.GetBoundingBox().Center(); var diff = (newPosition - Position); MoveTarget(diff); } } } Target += right * diffTheta * 0.1f; var newTarget = up * diffPhi * 0.1f + Target; var newForward = (Target - Position); if (Math.Abs(Vector3.Dot(newForward, UpVector)) < 0.99f) { Target = newTarget; } var diffTarget = Target - Position; diffTarget.Normalize(); Target = Position + diffTarget * 1.0f; UpdateBasisVectors(); UpdateViewMatrix(); }
public bool IsCameraUnderwater() { var handle = new VoxelHandle(ChunkManager.ChunkData, GlobalVoxelCoordinate.FromVector3(Camera.Position + Vector3.Up)); return(handle.IsValid && handle.LiquidLevel > 0 && handle.Coordinate.Y <= SlicePlane); }