public BuildOrder GetGuardDesignation(Voxel vox) { return((from d in GuardDesignations let vref = d.Vox let v = vref where vox.Equals(v) select d).FirstOrDefault()); }
public bool IsVoxelOccluded(Voxel voxel, Vector3 cameraPos) { Vector3 voxelPoint = voxel.Position + Vector3.One * 0.5f; Voxel atPos = new Voxel(); foreach (Point3 coord in MathFunctions.RasterizeLine(cameraPos, voxelPoint)) { Vector3 pos = new Vector3(coord.X, coord.Y, coord.Z); bool success = GetNonNullVoxelAtWorldLocationCheckFirst(null, pos, ref atPos); if (success && atPos.IsVisible && !atPos.Equals(voxel)) { return(true); } } return(false); }
public void Update() { MouseState mouse = Mouse.GetState(); KeyboardState keyboard = Keyboard.GetState(); Voxel underMouse = GetVoxelUnderMouse(); bool newVoxel = underMouse != null && !underMouse.Equals(VoxelUnderMouse); if (underMouse != null) { VoxelUnderMouse = underMouse; PlayState.CursorLightPos = underMouse.Position + new Vector3(0.5f, 0.5f, 0.5f); if (Enabled && underMouse.TypeName != "empty" && underMouse.IsExplored) { string info = underMouse.TypeName; if (PlayState.PlayerFaction.RoomBuilder.IsInRoom(underMouse)) { Room room = PlayState.PlayerFaction.RoomBuilder.GetMostLikelyRoom(underMouse); if (room != null) { info += " (" + room.ID + ")"; } } PlayState.GUI.ToolTipManager.PopupInfo(info); } } if (!Enabled) { return; } if (keyboard.IsKeyDown(Keys.LeftAlt) || keyboard.IsKeyDown(Keys.RightAlt)) { BoxYOffset += (float)(mouse.ScrollWheelValue - LastMouseWheel) * 0.01f; LastMouseWheel = mouse.ScrollWheelValue; newVoxel = true; } else { LastMouseWheel = mouse.ScrollWheelValue; } if (underMouse != null) { BoundingBox box = underMouse.GetBoundingBox().Expand(0.05f); Drawer3D.DrawBox(box, CurrentColor, CurrentWidth, true); } if (isLeftPressed) { if (mouse.LeftButton == ButtonState.Released) { isLeftPressed = false; LeftReleasedCallback(); BoxYOffset = 0; } else { if (SelectionBuffer.Count == 0) { FirstVoxel = underMouse; SelectionBuffer.Add(underMouse); } else { SelectionBuffer.Clear(); SelectionBuffer.Add(FirstVoxel); SelectionBuffer.Add(underMouse); BoundingBox buffer = GetSelectionBox(); if (BoxYOffset > 0) { buffer.Max.Y += BoxYOffset; } else if (BoxYOffset < 0) { buffer.Min.Y += BoxYOffset; } SelectionBuffer = Chunks.GetVoxelsIntersecting(buffer); if (newVoxel) { Dragged.Invoke(SelectionBuffer, InputManager.MouseButton.Left); } } } } else if (mouse.LeftButton == ButtonState.Pressed) { LeftPressedCallback(); isLeftPressed = true; BoxYOffset = 0; } if (isRightPressed) { if (mouse.RightButton == ButtonState.Released) { isRightPressed = false; RightReleasedCallback(); BoxYOffset = 0; } else { if (SelectionBuffer.Count == 0) { SelectionBuffer.Add(underMouse); FirstVoxel = underMouse; } else { SelectionBuffer.Clear(); SelectionBuffer.Add(FirstVoxel); SelectionBuffer.Add(underMouse); BoundingBox buffer = GetSelectionBox(); if (BoxYOffset > 0) { buffer.Max.Y += BoxYOffset; } else if (BoxYOffset < 0) { buffer.Min.Y += BoxYOffset; } SelectionBuffer = Chunks.GetVoxelsIntersecting(buffer); if (newVoxel) { Dragged.Invoke(SelectionBuffer, InputManager.MouseButton.Right); } } } } else if (mouse.RightButton == ButtonState.Pressed) { RightPressedCallback(); BoxYOffset = 0; isRightPressed = true; } }
public BuildOrder GetGuardDesignation(Voxel vox) { return (from d in GuardDesignations let vref = d.Vox let v = vref where vox.Equals(v) select d).FirstOrDefault(); }
public void Update() { MouseState mouse = Mouse.GetState(); KeyboardState keyboard = Keyboard.GetState(); Voxel underMouse = GetVoxelUnderMouse(); // Keep track of whether a new voxel has been selected. bool newVoxel = underMouse != null && !underMouse.Equals(VoxelUnderMouse); // If there is a voxel under the mouse... if (underMouse != null) { VoxelUnderMouse = underMouse; // Update the cursor light. PlayState.CursorLightPos = underMouse.Position + new Vector3(0.5f, 0.5f, 0.5f); // Get the type of the voxel and display it to the player. if (Enabled && !underMouse.IsEmpty && underMouse.IsExplored) { string info = underMouse.TypeName; // If it belongs to a room, display that information. if (PlayState.PlayerFaction.RoomBuilder.IsInRoom(underMouse)) { Room room = PlayState.PlayerFaction.RoomBuilder.GetMostLikelyRoom(underMouse); if (room != null) { info += " (" + room.ID + ")"; } } PlayState.GUI.ToolTipManager.PopupInfo(info); } } // Do nothing if not enabled. if (!Enabled) { return; } bool altPressed = false; // If the left or right ALT keys are pressed, we can adjust the height of the selection // for building pits and tall walls using the mouse wheel. if (keyboard.IsKeyDown(Keys.LeftAlt) || keyboard.IsKeyDown(Keys.RightAlt)) { BoxYOffset += (mouse.ScrollWheelValue - LastMouseWheel) * 0.01f; LastMouseWheel = mouse.ScrollWheelValue; newVoxel = true; altPressed = true; } else { LastMouseWheel = mouse.ScrollWheelValue; } // Draw a box around the current voxel under the mouse. if (underMouse != null) { BoundingBox box = underMouse.GetBoundingBox().Expand(0.05f); Drawer3D.DrawBox(box, CurrentColor, CurrentWidth, true); } // If the left mouse button is pressed, update the slection buffer. if (isLeftPressed) { // On release, select voxels. if (mouse.LeftButton == ButtonState.Released) { isLeftPressed = false; LeftReleasedCallback(); BoxYOffset = 0; } // Otherwise, update the selection buffer else { if (SelectionBuffer.Count == 0) { FirstVoxel = underMouse; SelectionBuffer.Add(underMouse); } else { SelectionBuffer.Clear(); SelectionBuffer.Add(FirstVoxel); SelectionBuffer.Add(underMouse); BoundingBox buffer = GetSelectionBox(); // Update the selection box to account for offsets from mouse wheel. if (BoxYOffset > 0) { buffer.Max.Y += BoxYOffset; } else if (BoxYOffset < 0) { buffer.Min.Y += BoxYOffset; } SelectionBuffer = Chunks.GetVoxelsIntersecting(buffer); if (!altPressed) { SelectionBuffer.RemoveAll( voxel => (!voxel.Equals(underMouse) && Chunks.ChunkData.IsVoxelOccluded(voxel))); } if (newVoxel) { Dragged.Invoke(SelectionBuffer, InputManager.MouseButton.Left); } } } } // If the mouse was not previously pressed, but is now pressed, then notify us of that. else if (mouse.LeftButton == ButtonState.Pressed) { LeftPressedCallback(); isLeftPressed = true; BoxYOffset = 0; } // Case where the right mouse button is pressed (mirrors left mouse button) // TODO(Break this into a function) if (isRightPressed) { if (mouse.RightButton == ButtonState.Released) { isRightPressed = false; RightReleasedCallback(); BoxYOffset = 0; } else { if (SelectionBuffer.Count == 0) { SelectionBuffer.Add(underMouse); FirstVoxel = underMouse; } else { SelectionBuffer.Clear(); SelectionBuffer.Add(FirstVoxel); SelectionBuffer.Add(underMouse); BoundingBox buffer = GetSelectionBox(); if (BoxYOffset > 0) { buffer.Max.Y += BoxYOffset; } else if (BoxYOffset < 0) { buffer.Min.Y += BoxYOffset; } SelectionBuffer = Chunks.GetVoxelsIntersecting(buffer); if (!altPressed) { SelectionBuffer.RemoveAll( voxel => (!voxel.Equals(underMouse) && Chunks.ChunkData.IsVoxelOccluded(voxel))); } if (newVoxel) { Dragged.Invoke(SelectionBuffer, InputManager.MouseButton.Right); } } } } else if (mouse.RightButton == ButtonState.Pressed) { RightPressedCallback(); BoxYOffset = 0; isRightPressed = true; } }