working shader
This commit is contained in:
parent
07685fcd9c
commit
be8e56cf27
3 changed files with 32 additions and 202 deletions
|
@ -7,60 +7,46 @@
|
|||
#define PS_SHADERMODEL ps_4_0_level_9_1
|
||||
#endif
|
||||
float2 TexelSize; // should be (1f/textureSize.X, 1f/textureSize.Y)
|
||||
int shadow;
|
||||
int BorderSize;
|
||||
float R;
|
||||
float G;
|
||||
float B;
|
||||
|
||||
Texture2D SpriteTexture;
|
||||
sampler2D SpriteTextureSampler = sampler_state
|
||||
{
|
||||
Texture = <SpriteTexture>;
|
||||
};
|
||||
|
||||
struct VertexShaderOutput
|
||||
{
|
||||
float4 Color : COLOR0;
|
||||
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 color = tex2D(ColorMapSampler, input.TextureCoordinates);
|
||||
float2 offsetX = float2(TexelSize.x, 0);
|
||||
float2 offsetY = { 0, TexelSize.y };
|
||||
float4 color = tex2D(SpriteTextureSampler, input.TextureCoordinates);
|
||||
|
||||
if (color.a > 0)
|
||||
{
|
||||
return color;
|
||||
}
|
||||
|
||||
float2 offsetd1 = { TexelSize.x, TexelSize.y };
|
||||
float2 offsetd2 = { -TexelSize.x, -TexelSize.y };
|
||||
float2 offsetd3 = { TexelSize.x, -TexelSize.y };
|
||||
float2 offsetd4 = { -TexelSize.x, TexelSize.y };
|
||||
float2 offsetX = float2(TexelSize.x, 0);
|
||||
float2 offsetY = float2( 0, TexelSize.y );
|
||||
|
||||
if (color.a == 0)
|
||||
{
|
||||
for (int i = 1; i < 16; i++)
|
||||
for (int i = 1; i < 10; i++)
|
||||
{
|
||||
if (i<=BorderSize)
|
||||
{
|
||||
float4 c1 = tex2D(ColorMapSampler, input.TextureCoordinates + offsetX*i);
|
||||
float4 c2 = tex2D(ColorMapSampler, input.TextureCoordinates - offsetX*i);
|
||||
float4 c3 = tex2D(ColorMapSampler, input.TextureCoordinates + offsetY*i);
|
||||
float4 c4 = tex2D(ColorMapSampler, input.TextureCoordinates - offsetY*i);
|
||||
|
||||
float4 d1 = tex2D(ColorMapSampler, input.TextureCoordinates - offsetd1*i);
|
||||
float4 d2 = tex2D(ColorMapSampler, input.TextureCoordinates - offsetd2*i);
|
||||
float4 d3 = tex2D(ColorMapSampler, input.TextureCoordinates - offsetd3*i);
|
||||
float4 d4 = tex2D(ColorMapSampler, input.TextureCoordinates - offsetd4*i);
|
||||
float4 c1 = tex2D(SpriteTextureSampler, input.TextureCoordinates + offsetX*i);
|
||||
float4 c2 = tex2D(SpriteTextureSampler, input.TextureCoordinates - offsetX*i);
|
||||
float4 c3 = tex2D(SpriteTextureSampler, input.TextureCoordinates + offsetY*i);
|
||||
float4 c4 = tex2D(SpriteTextureSampler, input.TextureCoordinates - offsetY*i);
|
||||
float4 d1 = tex2D(SpriteTextureSampler, input.TextureCoordinates - (offsetX+offsetY)*i);
|
||||
float4 d2 = tex2D(SpriteTextureSampler, input.TextureCoordinates + (offsetX+offsetY)*i);
|
||||
float4 d3 = tex2D(SpriteTextureSampler, input.TextureCoordinates - (offsetX-offsetY)*i);
|
||||
float4 d4 = tex2D(SpriteTextureSampler, input.TextureCoordinates - (-offsetX+offsetY)*i);
|
||||
|
||||
if (color.a != c1.a || color.a != c2.a|| color.a != c3.a|| color.a != c4.a
|
||||
|| color.a != d1.a
|
||||
|
@ -76,9 +62,6 @@ if (color.a == 0)
|
|||
}
|
||||
}
|
||||
}
|
||||
return color;
|
||||
}
|
||||
|
||||
|
||||
return color;
|
||||
}
|
||||
|
|
|
@ -11,8 +11,6 @@ namespace Sledgemapper
|
|||
public Color GridColor { get; set; }
|
||||
public Color NoteColor { get; set; }
|
||||
public string MachineName { get; set; }
|
||||
public int Thickness { get; internal set; }
|
||||
public int Threshold { get; internal set; }
|
||||
|
||||
public Settings()
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue