working shader

This commit is contained in:
Michele 2021-01-09 20:50:57 +00:00
parent 07685fcd9c
commit be8e56cf27
3 changed files with 32 additions and 202 deletions

View file

@ -6,7 +6,6 @@ using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using MonoGame.Extended;
using Myra;
using Myra.Graphics2D;
using Myra.Graphics2D.Brushes;
using Myra.Graphics2D.TextureAtlases;
using Myra.Graphics2D.UI;
@ -79,7 +78,6 @@ namespace Sledgemapper
_mainWidget.lblConnectionStatus.Text = "Reconnecting";
await Task.Yield();
}
private async Task OnHubReconnected(string arg)
{
ExceptionlessClient.Default.SubmitEvent(new Event { Message = "Hub reconnected", Type = "SignalR Client Events", Source = _settings.MachineName });
@ -103,8 +101,8 @@ namespace Sledgemapper
try
{
// rendertarget = new RenderTarget2D(GraphicsDevice, _graphics.PreferredBackBufferWidth, _graphics.PreferredBackBufferHeight, false, SurfaceFormat.Color, DepthFormat.Depth24Stencil8, 0, RenderTargetUsage.PreserveContents);
rendertarget = new RenderTarget2D(GraphicsDevice, GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height);
rendertarget = new RenderTarget2D(GraphicsDevice, GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height, true, SurfaceFormat.Alpha8, DepthFormat.Depth16, 0, RenderTargetUsage.DiscardContents);
//rendertarget = new RenderTarget2D(GraphicsDevice, GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height);
}
catch
@ -137,12 +135,8 @@ namespace Sledgemapper
{
_spriteBatch = new SpriteBatch(GraphicsDevice);
outlineShader = Content.Load<Effect>("shaders/OutlineShader");
// outlineShader.Parameters["Thickness"].SetValue((float)_settings.Thickness);
// outlineShader.Parameters["shadow"].SetValue(1);
// outlineShader.Parameters["ScreenSize"].SetValue(
// new Vector2(GraphicsDevice.Viewport.Bounds.Width, GraphicsDevice.Viewport.Bounds.Height));
MyraEnvironment.Game = this;
rendertarget = new RenderTarget2D(GraphicsDevice, GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height);
rendertarget = new RenderTarget2D(GraphicsDevice, GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height, true, SurfaceFormat.Alpha8, DepthFormat.Depth16, 0, RenderTargetUsage.DiscardContents);
_mainWidget = new MainWidget();
@ -167,7 +161,6 @@ namespace Sledgemapper
_mainWidget.BtnToolbarWall.Click += OnBtnToolbarWallClicked;
_mainWidget.BtnToolbarDelete.Click += OnBtnToolbarDeleteClicked;
AddItemToToolGrid(_mainWidget.GridTiles, OnTileButtonClicked, "tiles");
AddItemToToolGrid(_mainWidget.GridWalls, OnWallButtonClicked, "walls");
AddItemToToolGrid(_mainWidget.GridOverlays, OnOverlayButtonClicked, "overlays");
@ -191,7 +184,6 @@ namespace Sledgemapper
private void OnBtnToolbarTileClicked(object sender, EventArgs e)
{
_state.InsertMode = InsertMode.NewTile;
}
private void OnBtnToolbarRoomClicked(object sender, EventArgs e)
@ -279,7 +271,6 @@ namespace Sledgemapper
if (IsActive && GraphicsDevice.Viewport.Bounds.Contains(Mouse.GetState().Position) && !_desktop.IsMouseOverGUI && !_desktop.HasModalWidget)
{
var mouseState = Mouse.GetState();
var screenPosition = new Point(mouseState.Position.X - (int)_viewportCenter.X, mouseState.Position.Y - (int)_viewportCenter.Y);
@ -311,21 +302,6 @@ namespace Sledgemapper
_state.SelectClosestSnapPoint(screenPosition);
}
// if (newState.IsKeyDown(Keys.LeftControl) && newState.IsKeyDown(Keys.C) && !oldState.IsKeyDown(Keys.C))
// {
// CenterOnSelectedTile();
// }
if (newState.IsKeyUp(Keys.Up) && (newState.IsKeyUp(Keys.Up) != oldState.IsKeyUp(Keys.Up)))
{
_settings.Thickness++;
}
if (newState.IsKeyUp(Keys.Down) && (newState.IsKeyUp(Keys.Down) != oldState.IsKeyUp(Keys.Down)))
{
_settings.Threshold++;
}
if (!newState.IsKeyDown(Keys.LeftControl) && mouseState.LeftButton == ButtonState.Pressed && mouseState.LeftButton == oldMouseState.LeftButton)
{
_viewportCenter = new Vector3(_viewportCenter.X + mouseState.Position.X - oldMouseState.Position.X, _viewportCenter.Y + mouseState.Position.Y - oldMouseState.Position.Y, 0);
@ -372,7 +348,6 @@ namespace Sledgemapper
viewNoteButton.Click += OnContextMenuViewNoteClick;
deleteNoteButton.Click += OnContextMenuDeleteNoteClick;
popup.AddChild(viewNoteButton);
popup.AddChild(deleteNoteButton);
}
@ -393,7 +368,6 @@ namespace Sledgemapper
_sessionData.NewTile(_state.SelectedTile, _state.CurrentTileId);
break;
case InsertMode.Wall:
_sessionData.NewWall(_state.SelectedWall, _state.CurrentWallId);
@ -425,10 +399,7 @@ namespace Sledgemapper
_state.LineStart = null;
_state.LineWidth = 1;
_sessionData.NewLine(line);
}
}
if (_state.InsertMode == InsertMode.NewRoom && newState.IsKeyDown(Keys.LeftControl)
@ -599,22 +570,17 @@ namespace Sledgemapper
var visibleTilesX = GraphicsDevice.Viewport.Width / _state.TileSize + 1;
var visibleTilesY = GraphicsDevice.Viewport.Height / _state.TileSize + 1;
GraphicsDevice.SetRenderTarget(rendertarget);
GraphicsDevice.Clear(Color.Transparent);
_spriteBatch.Begin(
_spriteBatch.Begin(depthStencilState: DepthStencilState.None,
transformMatrix: Matrix.CreateTranslation(_viewportCenter),
blendState: BlendState.Opaque,
sortMode: SpriteSortMode.Immediate);
// DrawTiles();
sortMode: SpriteSortMode.Deferred);
var items = new List<BaseMapEntity>();
items.AddRange(_sessionData.Lines.Values);
items.AddRange(_sessionData.Rooms.Values);
GraphicsDevice.Clear(Color.Transparent);
foreach (var item in items.OrderBy(t => t.Timestamp))
foreach (var item in _sessionData.Lines.Values.Union<BaseMapEntity>(_sessionData.Rooms.Values).OrderBy(t => t.Timestamp))
{
switch (item)
{
@ -640,7 +606,6 @@ namespace Sledgemapper
_spriteBatch.End();
GraphicsDevice.SetRenderTarget(null);
GraphicsDevice.Clear(_settings.BackgroundColor);
Vector2 texelSize = new Vector2((float)(1 / (double)rendertarget.Width), (float)(1 / (double)rendertarget.Height));
outlineShader.Parameters["TexelSize"].SetValue(texelSize);
@ -651,9 +616,10 @@ namespace Sledgemapper
outlineShader.Parameters["B"].SetValue(_settings.OverlayTintColor.B / 255.0f);
_spriteBatch.Begin(
effect: outlineShader,
effect: outlineShader,
blendState: BlendState.AlphaBlend,
sortMode: SpriteSortMode.Immediate);
sortMode: SpriteSortMode.Deferred);
GraphicsDevice.Clear(_settings.BackgroundColor);
_spriteBatch.Draw(rendertarget, Vector2.Zero, null, Color.White);
_spriteBatch.End();
@ -661,8 +627,8 @@ namespace Sledgemapper
transformMatrix: Matrix.CreateTranslation(_viewportCenter),
sortMode: SpriteSortMode.Deferred);
//DrawOverlays();
//DrawNotes();
DrawOverlays();
DrawNotes();
DrawGrid(visibleTilesX, visibleTilesY);
if (string.IsNullOrWhiteSpace(_sessionData.SessionName))
@ -820,11 +786,9 @@ namespace Sledgemapper
if (l > 0)
{
var whiteRectangle = new Texture2D(GraphicsDevice, (int)l, (int)(_state.TileSize * _state.LineWidth));
// whiteRectangle.SetData(new[] { new Color(Color.Red, 80) });
whiteRectangle.SetData(Enumerable.Range(0, (int)l * ((int)(_state.TileSize * _state.LineWidth))).Select(i => new Color(Color.Red, 80)).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);
}
}
@ -850,17 +814,12 @@ namespace Sledgemapper
break;
}
_spriteBatch.DrawCircle(snapPoint, _state.TileSize / 5f, 100, Color.Red, 2);
_spriteBatch.DrawCircle(snapPoint, _state.TileSize / 6f, 50, Color.Red, 2);
//line preview
if (_state.LineStart != null)
{
// border pass
// var content = Content.Load<Texture2D>($"tiles/{tile.ID}");
var posX = _state.LineStart.X * _state.TileSize;
var posY = _state.LineStart.Y * _state.TileSize;
@ -1210,12 +1169,8 @@ namespace Sledgemapper
_spriteBatch.Draw(whiteRectangle, new Rectangle((int)posX, (int)posY, _state.TileSize, _state.TileSize), null, Color.White, 0, Vector2.Zero, SpriteEffects.None, 1);
}
}
private void DrawLine(Line tile)
{
//inner pass
// var content = Content.Load<Texture2D>($"tiles/{tile.ID}");
var posX = tile.Start.X * _state.TileSize;
var posY = tile.Start.Y * _state.TileSize;
@ -1268,7 +1223,7 @@ namespace Sledgemapper
}
}
private void DrawRoom(Room tile)
{
var posX = tile.Start.X * _state.TileSize;
@ -1338,105 +1293,12 @@ namespace Sledgemapper
_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);
}
}
Effect outlineShader; // Outline shader effect
private void DrawDelete()
{
//inner pass
foreach (var tile in _sessionData.Rooms.Values.Where(r => r.Delete))
{
// var content = Content.Load<Texture2D>($"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.Transparent });
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);
}
}
}
private void DrawDelete(Room tile)
{
//inner pass
// var content = Content.Load<Texture2D>($"tiles/{tile.ID}");
var posX = tile.Start.X * _state.TileSize;
var posY = tile.Start.Y * _state.TileSize;
@ -1504,10 +1366,6 @@ namespace Sledgemapper
_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);
}
}
@ -1899,15 +1757,6 @@ namespace Sledgemapper
_state.InsertMode = InsertMode.Overlay;
}
private void OnTileButtonClicked(object sender, EventArgs e)
{
_state.CurrentTileId = ((ImageButton)sender).Id;
_mainWidget.ClearSelection();
((ImageButton)sender).Border = new SolidBrush(Color.Red);
((ImageButton)sender).BorderThickness = new Myra.Graphics2D.Thickness(2);
_state.InsertMode = InsertMode.Tile;
}
private void OnWallButtonClicked(object sender, EventArgs e)
{
_state.CurrentWallId = ((ImageButton)sender).Id;