diff --git a/Sledgemapper.Shared/Entities/Session.cs b/Sledgemapper.Shared/Entities/Session.cs index 46c271e..74a794f 100644 --- a/Sledgemapper.Shared/Entities/Session.cs +++ b/Sledgemapper.Shared/Entities/Session.cs @@ -28,6 +28,7 @@ namespace Sledgemapper.Shared.Entities Walls = new ConcurrentDictionary(); Notes = new ConcurrentDictionary(); Lines=new ConcurrentDictionary(); + Rooms=new ConcurrentDictionary(); Players = new List(); Colors = new List(); } @@ -42,6 +43,7 @@ namespace Sledgemapper.Shared.Entities public string SessionName { get; set; } public int SessionId { get; set; } public ConcurrentDictionary Lines { get; private set; } + public ConcurrentDictionary Rooms { get; private set; } public void NewTile(Tile selectedTile, string tileId) { @@ -201,5 +203,25 @@ namespace Sledgemapper.Shared.Entities //TODO fix this //OnRaiseMapEntityAddedEvent(new MapEntityAddedEventArgs(newTile)); } + + public void NewRoom(Room line) + { + if (line is null) + { + return; + } + + var lineExist = Rooms.TryGetValue(line.ToString(), out var tile); + var newLine = new Room { Start=line.Start, End=line.End}; + if (lineExist) + { + Rooms.TryRemove(line.ToString(), out var _); + } + + Rooms.TryAdd(newLine.ToString(), newLine); + + //TODO fix this + //OnRaiseMapEntityAddedEvent(new MapEntityAddedEventArgs(newTile)); + } } } diff --git a/Sledgemapper.Shared/Entities/Tile.cs b/Sledgemapper.Shared/Entities/Tile.cs index e0dc91e..44b64ed 100644 --- a/Sledgemapper.Shared/Entities/Tile.cs +++ b/Sledgemapper.Shared/Entities/Tile.cs @@ -29,6 +29,17 @@ } } + public class Room : BaseMapEntity + { + public SnapPoint Start { get; set; } + public SnapPoint End { get; set; } + + public override string ToString() + { + return $"{Start.X}_{Start.Y}_{Start.Index}_{End.X}_{End.Y}_{End.Index}"; + } + } + public class SnapPoint : BaseMapEntity { public int Index { get; set; } diff --git a/Sledgemapper/Sledgemapper.cs b/Sledgemapper/Sledgemapper.cs index 26ff2f9..a558eb1 100644 --- a/Sledgemapper/Sledgemapper.cs +++ b/Sledgemapper/Sledgemapper.cs @@ -272,7 +272,7 @@ namespace Sledgemapper _state.SelectOverlay(screenPosition); } - if (_state.InsertMode == InsertMode.NewLine) + if (_state.InsertMode == InsertMode.NewLine || _state.InsertMode == InsertMode.NewRoom) { _state.SelectClosestSnapPoint(screenPosition); } @@ -387,6 +387,29 @@ namespace Sledgemapper } + if (_state.InsertMode == InsertMode.NewRoom && newState.IsKeyDown(Keys.LeftControl) + && mouseState.LeftButton == ButtonState.Released + && mouseState.LeftButton != oldMouseState.LeftButton) + { + if (_state.LineStart is null) + { + _state.LineStart = new SnapPoint { X = _state.SelectedSnapPoint.X, Y = _state.SelectedSnapPoint.Y, Index = _state.SelectedSnapPoint.Index }; + } + else + { + + var line = new Room + { + Start = new SnapPoint { X = _state.LineStart.X, Y = _state.LineStart.Y, Index = _state.LineStart.Index }, + End = new SnapPoint { X = _state.SelectedSnapPoint.X, Y = _state.SelectedSnapPoint.Y, Index = _state.SelectedSnapPoint.Index } + }; + _state.LineStart = null; + _state.LineWidth = 1; + _sessionData.NewRoom(line); + } + + } + if (_state.InsertMode == InsertMode.NewLine && _state.LineStart != null) { if (mouseState.ScrollWheelValue > oldMouseState.ScrollWheelValue) @@ -402,7 +425,7 @@ namespace Sledgemapper if (newState.IsKeyDown(Keys.LeftControl) && mouseState.ScrollWheelValue != oldMouseState.ScrollWheelValue) { // var center = new Point(GraphicsDevice.Viewport.Width / 2, GraphicsDevice.Viewport.Height / 2); - var maxTileSize=500; + var maxTileSize = 500; var center = new Point((Window.ClientBounds.Width + 200) / 2 - _state.TileSize / 2, Window.ClientBounds.Height / 2 - _state.TileSize / 2); var tx = (center.X - (int)_viewportCenter.X) / _state.TileSize; @@ -513,6 +536,7 @@ namespace Sledgemapper DrawTiles(); DrawLines(); + DrawRooms(); DrawWalls(); DrawOverlays(); DrawNotes(); @@ -683,7 +707,102 @@ namespace Sledgemapper } } + if (_state.InsertMode == InsertMode.NewRoom && _state.SelectedSnapPoint != null) + { + var snapPoint = new Vector2(_state.SelectedSnapPoint.X * _state.TileSize, _state.SelectedSnapPoint.Y * _state.TileSize); + switch (_state.SelectedSnapPoint.Index) + { + case 1: + break; + case 2: + snapPoint.X += _state.TileSize / 2; + break; + case 3: + snapPoint.Y += _state.TileSize / 2; + break; + case 4: + snapPoint.Y += _state.TileSize / 2; + snapPoint.X += _state.TileSize / 2; + break; + } + + _spriteBatch.DrawCircle(snapPoint, _state.TileSize / 5f, 100, Color.Red, 2); + + + //line preview + if (_state.LineStart != null) + { + + // border pass + + // var content = Content.Load($"tiles/{tile.ID}"); + + var posX = _state.LineStart.X * _state.TileSize; + var posY = _state.LineStart.Y * _state.TileSize; + + var endposX = _state.SelectedSnapPoint.X * _state.TileSize; + var endposY = _state.SelectedSnapPoint.Y * _state.TileSize; + + switch (_state.LineStart.Index) + { + case 1: + break; + case 2: + posX += _state.TileSize / 2; + break; + case 3: + posY += _state.TileSize / 2; + + break; + case 4: + posX += _state.TileSize / 2; + posY += _state.TileSize / 2; + break; + } + + switch (_state.SelectedSnapPoint.Index) + { + case 1: + break; + case 2: + endposX += _state.TileSize / 2; + break; + case 3: + endposY += _state.TileSize / 2; + + break; + case 4: + endposX += _state.TileSize / 2; + endposY += _state.TileSize / 2; + break; + } + + + if (posX != endposX && posY != endposY) + { + var whiteRectangle = new Texture2D(GraphicsDevice, 1, 1); + // whiteRectangle.SetData(new[] { new Color(Color.Red, 80) }); + whiteRectangle.SetData(new[] { new Color(Color.Red, 80) }); + if ((posX > endposX && posY > endposY) || (posX < endposX && posY < endposY)) + { + _spriteBatch.Draw(whiteRectangle, new Rectangle(posX, posY, endposX - posX, endposY - posY), null, Color.White, 0, new Vector2(0, 0), SpriteEffects.None, 1); + } + else + { + if (endposY < posY) + { + _spriteBatch.Draw(whiteRectangle, new Rectangle(posX, endposY, endposX - posX, posY - endposY), null, Color.White, 0, new Vector2(0, 0), SpriteEffects.None, 1); + } + + if (endposX < posX) + { + _spriteBatch.Draw(whiteRectangle, new Rectangle(endposX, posY, posX - endposX, endposY - posY), null, Color.White, 0, new Vector2(0, 0), SpriteEffects.None, 1); + } + } + } + } + } _spriteBatch.End(); @@ -925,6 +1044,8 @@ namespace Sledgemapper } + private int _borderWidth => (_state.TileSize / 6) % 2 == 0 ? (_state.TileSize / 6) : (_state.TileSize / 6) + 1; + private void DrawTiles() { // foreach (var tile in _sessionData.Map.Values) @@ -949,8 +1070,8 @@ namespace Sledgemapper var whiteRectangle = new Texture2D(GraphicsDevice, 1, 1); whiteRectangle.SetData(new[] { _settings.OverlayTintColor }); - _spriteBatch.Draw(whiteRectangle, new Rectangle((int)posX - 4, (int)posY - 4, _state.TileSize + 8, _state.TileSize + 8), null, Color.White, 0, Vector2.Zero, SpriteEffects.None, 1); - // _spriteBatch.DrawRectangle(new Rectangle((int)posX-4, (int)posY-4, _state.TileSize+8, _state.TileSize+8), _settings.OverlayTintColor,1); + _spriteBatch.Draw(whiteRectangle, new Rectangle((int)posX - _borderWidth / 2, (int)posY - _borderWidth / 2, _state.TileSize + _borderWidth, _state.TileSize + _borderWidth), null, Color.White, 0, Vector2.Zero, SpriteEffects.None, 1); + // _spriteBatch.DrawRectangle(new Rectangle((int)posX-4, (int)posY-4, _state.TileSize+_borderWidth, _state.TileSize+_borderWidth), _settings.OverlayTintColor,1); // _spriteBatch.Draw(content, new Vector2(posX, posY), // null, Color.White, MathHelper.ToRadians(90 * tile.Rotation), new Vector2(content.Width / 2, content.Height / 2), ((float)_state.TileSize) / content.Width, SpriteEffects.None, 0); @@ -1030,28 +1151,17 @@ namespace Sledgemapper break; } - var l = Math.Sqrt(Math.Pow(posX - endposX, 2) + Math.Pow(posY - endposY, 2)); - if (l > 0) + var length = (int)Math.Sqrt(Math.Pow(posX - endposX, 2) + Math.Pow(posY - endposY, 2)); + var height = (int)(_state.TileSize * tile.Width) + _borderWidth; + if (length > 0) { - var borderRectangle = new Texture2D(GraphicsDevice, (int)l, (int)(_state.TileSize * _state.LineWidth) + 8); - // whiteRectangle.SetData(new[] { new Color(Color.Red, 80) }); - - borderRectangle.SetData(Enumerable.Range(0, (int)l * ((int)(_state.TileSize * _state.LineWidth) + 8)).Select(i => _settings.OverlayTintColor).ToArray()); - - - // _spriteBatch.Draw(whiteRectangle, new Rectangle(posX, posY, (int)l, (int)(_state.TileSize+_state.LineWidth)), null, Color.White, angleRad, new Vector2(0,0), SpriteEffects.None, 1); - - + var borderRectangle = new Texture2D(GraphicsDevice, length, height); + borderRectangle.SetData(Enumerable.Range(0, length * height).Select(i => _settings.OverlayTintColor).ToArray()); var angle = Math.Atan2(posY - endposY, endposX - posX); - var angleRad = -(float)angle;//MathHelper.ToRadians((float)angle); - _spriteBatch.Draw(borderRectangle, new Rectangle(posX, posY, (int)l, (int)(_state.TileSize * tile.Width) + 8), null, Color.White, angleRad, new Vector2(0, 4), SpriteEffects.None, 1); + var angleRad = -(float)angle; + _spriteBatch.Draw(borderRectangle, new Rectangle(posX, posY, length, height), null, Color.White, angleRad, new Vector2(0, _borderWidth / 2), SpriteEffects.None, 1); } - // _spriteBatch.Draw(whiteRectangle, new Rectangle((int)posX-4, (int)posY-4, _state.TileSize+8, _state.TileSize+8),null,Color.White,0,Vector2.Zero,SpriteEffects.None, 1); - // _spriteBatch.DrawRectangle(new Rectangle((int)posX-4, (int)posY-4, _state.TileSize+8, _state.TileSize+8), _settings.OverlayTintColor,1); - - // _spriteBatch.Draw(content, new Vector2(posX, posY), - // null, Color.White, MathHelper.ToRadians(90 * tile.Rotation), new Vector2(content.Width / 2, content.Height / 2), ((float)_state.TileSize) / content.Width, SpriteEffects.None, 0); } //inner pass @@ -1099,43 +1209,185 @@ namespace Sledgemapper break; } - - - // var whiteRectangle = new Texture2D(GraphicsDevice, 1, 1); - // whiteRectangle.SetData(new[] { _settings.OverlayTintColor }); - - // _spriteBatch.DrawLine(posX, posY, endposX, endposY, Color.White, _state.TileSize); - - // _spriteBatch.Draw(whiteRectangle, new Rectangle((int)posX-4, (int)posY-4, _state.TileSize+8, _state.TileSize+8),null,Color.White,0,Vector2.Zero,SpriteEffects.None, 1); - // _spriteBatch.DrawRectangle(new Rectangle((int)posX-4, (int)posY-4, _state.TileSize+8, _state.TileSize+8), _settings.OverlayTintColor,1); - - // _spriteBatch.Draw(content, new Vector2(posX, posY), - // null, Color.White, MathHelper.ToRadians(90 * tile.Rotation), new Vector2(content.Width / 2, content.Height / 2), ((float)_state.TileSize) / content.Width, SpriteEffects.None, 0); - var l = Math.Sqrt(Math.Pow(posX - endposX, 2) + Math.Pow(posY - endposY, 2)); - if (l > 0) + var length = (int)Math.Sqrt(Math.Pow(posX - endposX, 2) + Math.Pow(posY - endposY, 2)); + var height = (int)(_state.TileSize * tile.Width); + if (length > 0) { - var innerRectangle = new Texture2D(GraphicsDevice, 1,1); - innerRectangle.SetData(new[] { Color.White }); - - //innerRectangle.SetData(Enumerable.Range(0, (int)l * ((int)(_state.TileSize + _state.LineWidth))).Select(i => Color.White).ToArray()); - - - // _spriteBatch.Draw(whiteRectangle, new Rectangle(posX, posY, (int)l, (int)(_state.TileSize+_state.LineWidth)), null, Color.White, angleRad, new Vector2(0,0), SpriteEffects.None, 1); - - - + var innerRectangle = new Texture2D(GraphicsDevice, 1, 1); + innerRectangle.SetData(new[] { Color.White }); var angle = Math.Atan2(posY - endposY, endposX - posX); - var angleRad = -(float)angle;//MathHelper.ToRadians((float)angle); - _spriteBatch.Draw(innerRectangle, new Rectangle(posX, posY, (int)l, (int)(_state.TileSize * tile.Width)), null, Color.White, angleRad, new Vector2(0, 0), SpriteEffects.None, 1); + var angleRad = -(float)angle; + _spriteBatch.Draw(innerRectangle, new Rectangle(posX, posY, length, height), null, Color.White, angleRad, new Vector2(0, 0), SpriteEffects.None, 1); + } + } + } + + private void DrawRooms() + { + // var borderRectangle = new Texture2D(GraphicsDevice, 1, 1); + // borderRectangle.SetData(new[] { _settings.OverlayTintColor }); + + // var innerRectangle = new Texture2D(GraphicsDevice, 1, 1); + // innerRectangle.SetData(new[] { Color.White }); + + // border pass + foreach (var tile in _sessionData.Rooms.Values) + { + // var content = Content.Load($"tiles/{tile.ID}"); + + var posX = tile.Start.X * _state.TileSize; + var posY = tile.Start.Y * _state.TileSize; + + var endposX = tile.End.X * _state.TileSize; + var endposY = tile.End.Y * _state.TileSize; + + switch (tile.Start.Index) + { + case 1: + break; + case 2: + posX += _state.TileSize / 2; + break; + case 3: + posY += _state.TileSize / 2; + + break; + case 4: + posX += _state.TileSize / 2; + posY += _state.TileSize / 2; + break; } - // var l = Math.Sqrt(Math.Pow(posX - endposX, 2) + Math.Pow(posY - endposY, 2)); + switch (tile.End.Index) + { + case 1: + break; + case 2: + endposX += _state.TileSize / 2; + break; + case 3: + endposY += _state.TileSize / 2; - // var angle = Math.Atan2(posY - endposY, endposX - posX); - // var angleRad = -(float)angle;//MathHelper.ToRadians((float)angle); - // _spriteBatch.Draw(innerRectangle, new Rectangle(posX, posY, (int)l, (int)(_state.TileSize * tile.Width)), null, Color.White, angleRad, Vector2.Zero, SpriteEffects.None, 1); + break; + case 4: + endposX += _state.TileSize / 2; + endposY += _state.TileSize / 2; + break; + } + +// posX-=_borderWidth/2; +// posY-=_borderWidth/2; + if (posX != endposX && posY != endposY) + { + + var borderRectangle = new Texture2D(GraphicsDevice, 1, 1); + borderRectangle.SetData(new [] { _settings.OverlayTintColor }); + if ( (posX < endposX && posY < endposY)) + + { + _spriteBatch.Draw(borderRectangle, new Rectangle(posX-_borderWidth/2, posY-_borderWidth/2, endposX - posX+_borderWidth, endposY - posY+_borderWidth), null, Color.White, 0, Vector2.Zero, SpriteEffects.None, 1); + } + else if ((posX > endposX && posY > endposY) ) + { + _spriteBatch.Draw(borderRectangle, new Rectangle(posX+_borderWidth/2, posY+_borderWidth/2, endposX - posX-_borderWidth, endposY - posY-_borderWidth), null, Color.White, 0, Vector2.Zero, SpriteEffects.None, 1); + } + + else + { + if (endposY < posY) + { + _spriteBatch.Draw(borderRectangle, new Rectangle(posX-_borderWidth/2, endposY-_borderWidth/2, endposX - posX+_borderWidth, posY - endposY+_borderWidth), null, Color.White, 0, Vector2.Zero, SpriteEffects.None, 1); + } + + if (endposX < posX) + { + _spriteBatch.Draw(borderRectangle, new Rectangle(endposX-_borderWidth/2, posY-_borderWidth/2, posX - endposX+_borderWidth, endposY - posY+_borderWidth), null, Color.White, 0, Vector2.Zero, SpriteEffects.None, 1); + } + } + + // _spriteBatch.Draw(borderRectangle, new Rectangle(posX, posY, length, height), null, Color.White, 0, new Vector2(0, _borderWidth / 2), SpriteEffects.None, 1); + } + } + + //inner pass + foreach (var tile in _sessionData.Rooms.Values) + { + // var content = Content.Load($"tiles/{tile.ID}"); + + var posX = tile.Start.X * _state.TileSize; + var posY = tile.Start.Y * _state.TileSize; + + var endposX = tile.End.X * _state.TileSize; + var endposY = tile.End.Y * _state.TileSize; + + switch (tile.Start.Index) + { + case 1: + break; + case 2: + posX += _state.TileSize / 2; + break; + case 3: + posY += _state.TileSize / 2; + + break; + case 4: + posX += _state.TileSize / 2; + posY += _state.TileSize / 2; + break; + } + + switch (tile.End.Index) + { + case 1: + break; + case 2: + endposX += _state.TileSize / 2; + break; + case 3: + endposY += _state.TileSize / 2; + + break; + case 4: + endposX += _state.TileSize / 2; + endposY += _state.TileSize / 2; + break; + } + + if (posX != endposX && posY != endposY) + { + + var borderRectangle = new Texture2D(GraphicsDevice, 1, 1); + borderRectangle.SetData(new [] {Color.White }); + if ( (posX < endposX && posY < endposY)) + + { + _spriteBatch.Draw(borderRectangle, new Rectangle(posX , posY , endposX - posX , endposY - posY ), null, Color.White, 0, Vector2.Zero, SpriteEffects.None, 1); + } + else if ((posX > endposX && posY > endposY) ) + { + _spriteBatch.Draw(borderRectangle, new Rectangle(posX , posY , endposX - posX , endposY - posY ), null, Color.White, 0, Vector2.Zero, SpriteEffects.None, 1); + } + + else + { + if (endposY < posY) + { + _spriteBatch.Draw(borderRectangle, new Rectangle(posX, endposY, endposX - posX , posY - endposY ), null, Color.White, 0, Vector2.Zero, SpriteEffects.None, 1); + } + + if (endposX < posX) + { + _spriteBatch.Draw(borderRectangle, new Rectangle(endposX , posY , posX - endposX , endposY - posY ), null, Color.White, 0, Vector2.Zero, SpriteEffects.None, 1); + } + } + + + + // _spriteBatch.Draw(borderRectangle, new Rectangle(posX, posY, length, height), null, Color.White, 0, new Vector2(0, _borderWidth / 2), SpriteEffects.None, 1); + } } }