commit 014a62b2a1b157e1632886a3bae5a7fece8a300a Author: Gulum Date: Sun Mar 28 17:55:16 2021 +0200 init commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4c98949 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +bin/ +.vscode/ +obj/ \ No newline at end of file diff --git a/Barbs.csproj b/Barbs.csproj new file mode 100644 index 0000000..f0dba18 --- /dev/null +++ b/Barbs.csproj @@ -0,0 +1,14 @@ + + + + Exe + net5.0 + app.manifest + + + + + + + + diff --git a/Content.mgcb b/Content.mgcb new file mode 100644 index 0000000..fa664c3 --- /dev/null +++ b/Content.mgcb @@ -0,0 +1,33 @@ + +#----------------------------- Global Properties ----------------------------# + +/outputDir:bin\Debug\net5.0 +/intermediateDir:obj +/platform:Windows +/config: +/profile:Reach +/compress:False + +#-------------------------------- References --------------------------------# + + +#---------------------------------- Content ---------------------------------# + +#begin ball.png +/importer:TextureImporter +/processor:TextureProcessor +/processorParam:ColorKeyColor=255,0,255,255 +/processorParam:ColorKeyEnabled=True +/processorParam:GenerateMipmaps=False +/processorParam:PremultiplyAlpha=True +/processorParam:ResizeToPowerOfTwo=False +/processorParam:MakeSquare=False +/processorParam:TextureFormat=Color +/build:ball.png + +#begin line.fx +/importer:EffectImporter +/processor:EffectProcessor +/processorParam:DebugMode=Auto +/build:line.fx + diff --git a/Line.cs b/Line.cs new file mode 100644 index 0000000..de79d9e --- /dev/null +++ b/Line.cs @@ -0,0 +1,111 @@ +using System.Collections.Generic; +using System.Diagnostics; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; + +public class Line +{ + private List points; + private float thickness = 1.0f; + + public enum JoinType + { + None, + Miter, + Bevel, + Round + } + + public enum LineCaps + { + None, + Round + } + + private Color LineColor { get; set; } + + //Graphical representation + private VertexBuffer vbo; + private IndexBuffer ibo; + private GraphicsDevice gDevice; + + public Line(List points) + { + this.points = points; + this.LineColor = Color.Black; + } + + public Line(List points, float thickness) + { + this.points = points; + this.thickness = thickness; + this.LineColor = Color.Black; + } + + public Line(List points, float thickness, Color color) + { + this.points = points; + this.thickness = thickness; + this.LineColor = color; + } + + public void InitOnGraphicalDevice(GraphicsDevice device) + { + this.gDevice = device; + Debug.Assert(this.points.Count >= 2); + List vertices = new List(); + List indices = new List(); + + for(int i = 0; i < this.points.Count - 1 ; i++) + { + var p = this.points[i]; + var pNext = this.points[i+1]; + + Vector2 dir = pNext - p; + Vector2 perpendincularVector = new Vector2(dir.Y, -dir.X); + perpendincularVector.Normalize(); + + var offsetPoint1 = new Vector3(p.X, p.Y ,0.0f); + var offsetPoint2 = new Vector3(p.X, p.Y ,0.0f); + vertices.Add(new VertexPositionColorTexture(offsetPoint1,this.LineColor, perpendincularVector)); + vertices.Add(new VertexPositionColorTexture(offsetPoint2,this.LineColor, perpendincularVector * -1)); + var offsetPoint1Next = new Vector3(pNext.X, pNext.Y ,0.0f); + var offsetPoint2Next = new Vector3(pNext.X, pNext.Y ,0.0f); + vertices.Add(new VertexPositionColorTexture(offsetPoint1Next,this.LineColor, perpendincularVector)); + vertices.Add(new VertexPositionColorTexture(offsetPoint2Next,this.LineColor, perpendincularVector * -1)); + } + + for (int i = 0; i < vertices.Count; i+=4) + { + indices.Add((ushort)(i)); + indices.Add((ushort)(i + 1)); + indices.Add((ushort)(i + 2)); + + indices.Add((ushort)(i + 2)); + indices.Add((ushort)(i + 1)); + indices.Add((ushort)(i + 3)); + } + + + this.vbo = new VertexBuffer(device, typeof(VertexPositionColorTexture), (this.points.Count - 1) * 4, BufferUsage.WriteOnly); + this.vbo.SetData(vertices.ToArray()); + this.ibo = new IndexBuffer(device, typeof(ushort), indices.Count,BufferUsage.WriteOnly); + this.ibo.SetData(indices.ToArray()); + } + + public void Draw(Effect lineEffect) + { + this.gDevice.SetVertexBuffer(this.vbo); + this.gDevice.Indices = this.ibo; + RasterizerState rasterizerState = new RasterizerState(); + rasterizerState.CullMode = CullMode.None; + this.gDevice.RasterizerState = rasterizerState; + lineEffect.Parameters["thickness"].SetValue(this.thickness); + foreach (EffectPass pass in lineEffect.CurrentTechnique.Passes) + { + pass.Apply(); + this.gDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList,0,0,this.ibo.IndexCount / 3); + //this.gDevice.DrawPrimitives(PrimitiveType.LineList, 0, this.vbo.VertexCount); + } + } +} \ No newline at end of file diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..822cb5d --- /dev/null +++ b/Program.cs @@ -0,0 +1,89 @@ +using System.Collections.Generic; +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework.Input; + +namespace Barbs +{ + class Program : Game + { + Texture2D ballTexture; + private GraphicsDeviceManager graphics; + private SpriteBatch spriteBatch; + BasicEffect basicEffect; + Matrix world; + Matrix view; + Matrix projection; + Line testLine; + Effect lineEffect; + public Program() + { + graphics = new GraphicsDeviceManager(this); + Content.RootDirectory = "."; + } + + protected override void Initialize() + { + // TODO: Add your initialization logic here + graphics.PreferredBackBufferHeight = 1824; + graphics.PreferredBackBufferWidth = 2736; + graphics.ApplyChanges(); + + base.Initialize(); + } + + protected override void LoadContent() + { + // Create a new SpriteBatch, which can be used to draw textures. + spriteBatch = new SpriteBatch(GraphicsDevice); + ballTexture = Content.Load("ball"); + + world = Matrix.CreateTranslation(0, 0, 0); + view = Matrix.CreateLookAt(new Vector3(0, 0, 3), new Vector3(0, 0, 0), new Vector3(0, 1, 0)); + projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45), 800f / 480f, 0.01f, 100f); + + basicEffect = new BasicEffect(GraphicsDevice); + lineEffect = Content.Load("line"); + + Vector2[] arr = { new Vector2(0.0f,0.0f), new Vector2(0.2f,0.5f), new Vector2(0.2f,0.0f), new Vector2(0.5f,0.0f), + new Vector2(0.7f,-0.5f)}; + this.testLine = new Line(new List(arr), 0.01f, Color.DarkSlateGray); + this.testLine.InitOnGraphicalDevice(GraphicsDevice); + } + + protected override void Update(GameTime gameTime) + { + if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape)) + Exit(); + + // TODO: Add your update logic here + base.Update(gameTime); + } + + protected override void Draw(GameTime gameTime) + { + //graphics.GraphicsDevice.Clear(Color.CornflowerBlue); + GraphicsDevice.Clear(Color.White); + + // TODO: Add your drawing code here + // spriteBatch.Begin(); + // spriteBatch.Draw(ballTexture, new Vector2(0, 0), Color.White); + // spriteBatch.End(); + + basicEffect.World = world; + basicEffect.View = view; + basicEffect.Projection = projection; + basicEffect.VertexColorEnabled = true; + lineEffect.Parameters["WorldViewProjection"].SetValue(world*view*projection); + + this.testLine.Draw(this.lineEffect); + base.Draw(gameTime); + } + + static void Main(string[] args) + { + var pro = new Program(); + pro.Run(); + } + } +} diff --git a/app.manifest b/app.manifest new file mode 100644 index 0000000..cc249fd --- /dev/null +++ b/app.manifest @@ -0,0 +1,9 @@ + + + + + true/pm + PerMonitorV2,PerMonitor + + + \ No newline at end of file diff --git a/ball.png b/ball.png new file mode 100644 index 0000000..f23ff61 Binary files /dev/null and b/ball.png differ diff --git a/line.fx b/line.fx new file mode 100644 index 0000000..55c59e9 --- /dev/null +++ b/line.fx @@ -0,0 +1,57 @@ +#if OPENGL + #define SV_POSITION POSITION + #define VS_SHADERMODEL vs_3_0 + #define PS_SHADERMODEL ps_3_0 +#else + #define VS_SHADERMODEL vs_4_0_level_9_1 + #define PS_SHADERMODEL ps_4_0_level_9_1 +#endif + +matrix WorldViewProjection; +float thickness; + +struct VertexShaderInput +{ + float4 Position : POSITION0; + float4 Color : COLOR0; + float2 Normal : TEXCOORD0; +}; + +struct VertexShaderOutput +{ + float4 Position : SV_POSITION; + float4 Color : COLOR0; + float2 Normal : TEXCOORD0; +}; + +VertexShaderOutput MainVS(in VertexShaderInput input) +{ + VertexShaderOutput output = (VertexShaderOutput)0; + float4 temp = input.Position + (float4(input.Normal,0.0,0.0) * thickness); + output.Position = mul(temp, WorldViewProjection); + output.Color = input.Color; + output.Normal = input.Normal; + return output; +} + +float4 MainPS(VertexShaderOutput input) : COLOR +{ + float feather = 0.2; //Fade off part + float4 res = input.Color; + float distFromLine = length(input.Normal); + float alpha = 1.0 - ((clamp(distFromLine, (1.0 - feather),1.0) - (1.0 - feather)) / feather); + res.a = alpha; + return res; +} + +technique BasicColorDrawing +{ + pass P0 + { + AlphaBlendEnable = TRUE; + DestBlend = INVSRCALPHA; + SrcBlend = SRCALPHA; + VertexShader = compile VS_SHADERMODEL MainVS(); + PixelShader = compile PS_SHADERMODEL MainPS(); + } +}; \ No newline at end of file