From 014a62b2a1b157e1632886a3bae5a7fece8a300a Mon Sep 17 00:00:00 2001 From: Gulum Date: Sun, 28 Mar 2021 17:55:16 +0200 Subject: [PATCH] init commit --- .gitignore | 3 ++ Barbs.csproj | 14 +++++++ Content.mgcb | 33 +++++++++++++++ Line.cs | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++ Program.cs | 89 +++++++++++++++++++++++++++++++++++++++++ app.manifest | 9 +++++ ball.png | Bin 0 -> 8368 bytes line.fx | 57 ++++++++++++++++++++++++++ 8 files changed, 316 insertions(+) create mode 100644 .gitignore create mode 100644 Barbs.csproj create mode 100644 Content.mgcb create mode 100644 Line.cs create mode 100644 Program.cs create mode 100644 app.manifest create mode 100644 ball.png create mode 100644 line.fx 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 0000000000000000000000000000000000000000..f23ff6104f864b4a24c2476c709db1cf0cfab114 GIT binary patch literal 8368 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