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

@ -7,60 +7,46 @@
#define PS_SHADERMODEL ps_4_0_level_9_1 #define PS_SHADERMODEL ps_4_0_level_9_1
#endif #endif
float2 TexelSize; // should be (1f/textureSize.X, 1f/textureSize.Y) float2 TexelSize; // should be (1f/textureSize.X, 1f/textureSize.Y)
int shadow;
int BorderSize; int BorderSize;
float R; float R;
float G; float G;
float B; float B;
Texture2D SpriteTexture;
sampler2D SpriteTextureSampler = sampler_state sampler2D SpriteTextureSampler = sampler_state
{ {
Texture = <SpriteTexture>; Texture = <SpriteTexture>;
}; };
struct VertexShaderOutput struct VertexShaderOutput
{ {
float4 Color : COLOR0; float4 Color : COLOR0;
float2 TextureCoordinates : TEXCOORD0; float2 TextureCoordinates : TEXCOORD0;
}; };
sampler ColorMapSampler = sampler_state
{
Texture = <ColorMap>;
MinFilter = Linear;
MagFilter = Linear;
MipFilter = Linear;
AddressU = Clamp;
AddressV = Clamp;
};
float4 MainPS(VertexShaderOutput input) : COLOR float4 MainPS(VertexShaderOutput input) : COLOR
{ {
float4 color = tex2D(ColorMapSampler, input.TextureCoordinates); float4 color = tex2D(SpriteTextureSampler, input.TextureCoordinates);
float2 offsetX = float2(TexelSize.x, 0);
float2 offsetY = { 0, TexelSize.y };
float2 offsetd1 = { TexelSize.x, TexelSize.y }; if (color.a > 0)
float2 offsetd2 = { -TexelSize.x, -TexelSize.y }; {
float2 offsetd3 = { TexelSize.x, -TexelSize.y }; return color;
float2 offsetd4 = { -TexelSize.x, TexelSize.y }; }
if (color.a == 0) float2 offsetX = float2(TexelSize.x, 0);
{ float2 offsetY = float2( 0, TexelSize.y );
for (int i = 1; i < 16; i++)
for (int i = 1; i < 10; i++)
{ {
if (i<=BorderSize) if (i<=BorderSize)
{ {
float4 c1 = tex2D(ColorMapSampler, input.TextureCoordinates + offsetX*i); float4 c1 = tex2D(SpriteTextureSampler, input.TextureCoordinates + offsetX*i);
float4 c2 = tex2D(ColorMapSampler, input.TextureCoordinates - offsetX*i); float4 c2 = tex2D(SpriteTextureSampler, input.TextureCoordinates - offsetX*i);
float4 c3 = tex2D(ColorMapSampler, input.TextureCoordinates + offsetY*i); float4 c3 = tex2D(SpriteTextureSampler, input.TextureCoordinates + offsetY*i);
float4 c4 = tex2D(ColorMapSampler, input.TextureCoordinates - offsetY*i); float4 c4 = tex2D(SpriteTextureSampler, input.TextureCoordinates - offsetY*i);
float4 d1 = tex2D(SpriteTextureSampler, input.TextureCoordinates - (offsetX+offsetY)*i);
float4 d1 = tex2D(ColorMapSampler, input.TextureCoordinates - offsetd1*i); float4 d2 = tex2D(SpriteTextureSampler, input.TextureCoordinates + (offsetX+offsetY)*i);
float4 d2 = tex2D(ColorMapSampler, input.TextureCoordinates - offsetd2*i); float4 d3 = tex2D(SpriteTextureSampler, input.TextureCoordinates - (offsetX-offsetY)*i);
float4 d3 = tex2D(ColorMapSampler, input.TextureCoordinates - offsetd3*i); float4 d4 = tex2D(SpriteTextureSampler, input.TextureCoordinates - (-offsetX+offsetY)*i);
float4 d4 = tex2D(ColorMapSampler, input.TextureCoordinates - offsetd4*i);
if (color.a != c1.a || color.a != c2.a|| color.a != c3.a|| color.a != c4.a if (color.a != c1.a || color.a != c2.a|| color.a != c3.a|| color.a != c4.a
|| color.a != d1.a || color.a != d1.a
@ -76,9 +62,6 @@ if (color.a == 0)
} }
} }
} }
return color;
}
return color; return color;
} }

View file

@ -11,8 +11,6 @@ namespace Sledgemapper
public Color GridColor { get; set; } public Color GridColor { get; set; }
public Color NoteColor { get; set; } public Color NoteColor { get; set; }
public string MachineName { get; set; } public string MachineName { get; set; }
public int Thickness { get; internal set; }
public int Threshold { get; internal set; }
public Settings() public Settings()
{ {

View file

@ -6,7 +6,6 @@ using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Input;
using MonoGame.Extended; using MonoGame.Extended;
using Myra; using Myra;
using Myra.Graphics2D;
using Myra.Graphics2D.Brushes; using Myra.Graphics2D.Brushes;
using Myra.Graphics2D.TextureAtlases; using Myra.Graphics2D.TextureAtlases;
using Myra.Graphics2D.UI; using Myra.Graphics2D.UI;
@ -79,7 +78,6 @@ namespace Sledgemapper
_mainWidget.lblConnectionStatus.Text = "Reconnecting"; _mainWidget.lblConnectionStatus.Text = "Reconnecting";
await Task.Yield(); await Task.Yield();
} }
private async Task OnHubReconnected(string arg) private async Task OnHubReconnected(string arg)
{ {
ExceptionlessClient.Default.SubmitEvent(new Event { Message = "Hub reconnected", Type = "SignalR Client Events", Source = _settings.MachineName }); ExceptionlessClient.Default.SubmitEvent(new Event { Message = "Hub reconnected", Type = "SignalR Client Events", Source = _settings.MachineName });
@ -103,8 +101,8 @@ namespace Sledgemapper
try 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, true, SurfaceFormat.Alpha8, DepthFormat.Depth16, 0, RenderTargetUsage.DiscardContents);
rendertarget = new RenderTarget2D(GraphicsDevice, GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height); //rendertarget = new RenderTarget2D(GraphicsDevice, GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height);
} }
catch catch
@ -137,12 +135,8 @@ namespace Sledgemapper
{ {
_spriteBatch = new SpriteBatch(GraphicsDevice); _spriteBatch = new SpriteBatch(GraphicsDevice);
outlineShader = Content.Load<Effect>("shaders/OutlineShader"); 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; 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(); _mainWidget = new MainWidget();
@ -167,7 +161,6 @@ namespace Sledgemapper
_mainWidget.BtnToolbarWall.Click += OnBtnToolbarWallClicked; _mainWidget.BtnToolbarWall.Click += OnBtnToolbarWallClicked;
_mainWidget.BtnToolbarDelete.Click += OnBtnToolbarDeleteClicked; _mainWidget.BtnToolbarDelete.Click += OnBtnToolbarDeleteClicked;
AddItemToToolGrid(_mainWidget.GridTiles, OnTileButtonClicked, "tiles");
AddItemToToolGrid(_mainWidget.GridWalls, OnWallButtonClicked, "walls"); AddItemToToolGrid(_mainWidget.GridWalls, OnWallButtonClicked, "walls");
AddItemToToolGrid(_mainWidget.GridOverlays, OnOverlayButtonClicked, "overlays"); AddItemToToolGrid(_mainWidget.GridOverlays, OnOverlayButtonClicked, "overlays");
@ -191,7 +184,6 @@ namespace Sledgemapper
private void OnBtnToolbarTileClicked(object sender, EventArgs e) private void OnBtnToolbarTileClicked(object sender, EventArgs e)
{ {
_state.InsertMode = InsertMode.NewTile; _state.InsertMode = InsertMode.NewTile;
} }
private void OnBtnToolbarRoomClicked(object sender, EventArgs e) 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) if (IsActive && GraphicsDevice.Viewport.Bounds.Contains(Mouse.GetState().Position) && !_desktop.IsMouseOverGUI && !_desktop.HasModalWidget)
{ {
var mouseState = Mouse.GetState(); var mouseState = Mouse.GetState();
var screenPosition = new Point(mouseState.Position.X - (int)_viewportCenter.X, mouseState.Position.Y - (int)_viewportCenter.Y); 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); _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) 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); _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; viewNoteButton.Click += OnContextMenuViewNoteClick;
deleteNoteButton.Click += OnContextMenuDeleteNoteClick; deleteNoteButton.Click += OnContextMenuDeleteNoteClick;
popup.AddChild(viewNoteButton); popup.AddChild(viewNoteButton);
popup.AddChild(deleteNoteButton); popup.AddChild(deleteNoteButton);
} }
@ -393,7 +368,6 @@ namespace Sledgemapper
_sessionData.NewTile(_state.SelectedTile, _state.CurrentTileId); _sessionData.NewTile(_state.SelectedTile, _state.CurrentTileId);
break; break;
case InsertMode.Wall: case InsertMode.Wall:
_sessionData.NewWall(_state.SelectedWall, _state.CurrentWallId); _sessionData.NewWall(_state.SelectedWall, _state.CurrentWallId);
@ -425,10 +399,7 @@ namespace Sledgemapper
_state.LineStart = null; _state.LineStart = null;
_state.LineWidth = 1; _state.LineWidth = 1;
_sessionData.NewLine(line); _sessionData.NewLine(line);
} }
} }
if (_state.InsertMode == InsertMode.NewRoom && newState.IsKeyDown(Keys.LeftControl) if (_state.InsertMode == InsertMode.NewRoom && newState.IsKeyDown(Keys.LeftControl)
@ -599,22 +570,17 @@ namespace Sledgemapper
var visibleTilesX = GraphicsDevice.Viewport.Width / _state.TileSize + 1; var visibleTilesX = GraphicsDevice.Viewport.Width / _state.TileSize + 1;
var visibleTilesY = GraphicsDevice.Viewport.Height / _state.TileSize + 1; var visibleTilesY = GraphicsDevice.Viewport.Height / _state.TileSize + 1;
GraphicsDevice.SetRenderTarget(rendertarget); GraphicsDevice.SetRenderTarget(rendertarget);
GraphicsDevice.Clear(Color.Transparent);
_spriteBatch.Begin( _spriteBatch.Begin(depthStencilState: DepthStencilState.None,
transformMatrix: Matrix.CreateTranslation(_viewportCenter), transformMatrix: Matrix.CreateTranslation(_viewportCenter),
blendState: BlendState.Opaque, blendState: BlendState.Opaque,
sortMode: SpriteSortMode.Immediate);
// DrawTiles(); sortMode: SpriteSortMode.Deferred);
var items = new List<BaseMapEntity>(); GraphicsDevice.Clear(Color.Transparent);
items.AddRange(_sessionData.Lines.Values);
items.AddRange(_sessionData.Rooms.Values);
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) switch (item)
{ {
@ -640,7 +606,6 @@ namespace Sledgemapper
_spriteBatch.End(); _spriteBatch.End();
GraphicsDevice.SetRenderTarget(null); GraphicsDevice.SetRenderTarget(null);
GraphicsDevice.Clear(_settings.BackgroundColor);
Vector2 texelSize = new Vector2((float)(1 / (double)rendertarget.Width), (float)(1 / (double)rendertarget.Height)); Vector2 texelSize = new Vector2((float)(1 / (double)rendertarget.Width), (float)(1 / (double)rendertarget.Height));
outlineShader.Parameters["TexelSize"].SetValue(texelSize); outlineShader.Parameters["TexelSize"].SetValue(texelSize);
@ -653,7 +618,8 @@ namespace Sledgemapper
_spriteBatch.Begin( _spriteBatch.Begin(
effect: outlineShader, effect: outlineShader,
blendState: BlendState.AlphaBlend, blendState: BlendState.AlphaBlend,
sortMode: SpriteSortMode.Immediate); sortMode: SpriteSortMode.Deferred);
GraphicsDevice.Clear(_settings.BackgroundColor);
_spriteBatch.Draw(rendertarget, Vector2.Zero, null, Color.White); _spriteBatch.Draw(rendertarget, Vector2.Zero, null, Color.White);
_spriteBatch.End(); _spriteBatch.End();
@ -661,8 +627,8 @@ namespace Sledgemapper
transformMatrix: Matrix.CreateTranslation(_viewportCenter), transformMatrix: Matrix.CreateTranslation(_viewportCenter),
sortMode: SpriteSortMode.Deferred); sortMode: SpriteSortMode.Deferred);
//DrawOverlays(); DrawOverlays();
//DrawNotes(); DrawNotes();
DrawGrid(visibleTilesX, visibleTilesY); DrawGrid(visibleTilesX, visibleTilesY);
if (string.IsNullOrWhiteSpace(_sessionData.SessionName)) if (string.IsNullOrWhiteSpace(_sessionData.SessionName))
@ -820,11 +786,9 @@ namespace Sledgemapper
if (l > 0) if (l > 0)
{ {
var whiteRectangle = new Texture2D(GraphicsDevice, (int)l, (int)(_state.TileSize * _state.LineWidth)); 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()); 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); _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; break;
} }
_spriteBatch.DrawCircle(snapPoint, _state.TileSize / 5f, 100, Color.Red, 2); _spriteBatch.DrawCircle(snapPoint, _state.TileSize / 6f, 50, Color.Red, 2);
//line preview //line preview
if (_state.LineStart != null) if (_state.LineStart != null)
{ {
// border pass
// var content = Content.Load<Texture2D>($"tiles/{tile.ID}");
var posX = _state.LineStart.X * _state.TileSize; var posX = _state.LineStart.X * _state.TileSize;
var posY = _state.LineStart.Y * _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); _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) private void DrawLine(Line tile)
{ {
//inner pass
// var content = Content.Load<Texture2D>($"tiles/{tile.ID}");
var posX = tile.Start.X * _state.TileSize; var posX = tile.Start.X * _state.TileSize;
var posY = tile.Start.Y * _state.TileSize; var posY = tile.Start.Y * _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(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 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) private void DrawDelete(Room tile)
{ {
//inner pass
// var content = Content.Load<Texture2D>($"tiles/{tile.ID}");
var posX = tile.Start.X * _state.TileSize; var posX = tile.Start.X * _state.TileSize;
var posY = tile.Start.Y * _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(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; _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) private void OnWallButtonClicked(object sender, EventArgs e)
{ {
_state.CurrentWallId = ((ImageButton)sender).Id; _state.CurrentWallId = ((ImageButton)sender).Id;