From c8efc0f586bedd3412e82a1a8211cef7aae6855e Mon Sep 17 00:00:00 2001 From: Maddie Date: Tue, 28 Jul 2026 15:11:50 -0500 Subject: [PATCH] Add project files. --- Raster3D.App/Game.cs | 25 ++++++ Raster3D.App/Interfaces/IDrawable.cs | 14 +++ Raster3D.App/Interfaces/IEntity.cs | 20 +++++ Raster3D.App/Player.cs | 32 +++++++ Raster3D.App/Program.cs | 29 +++++++ Raster3D.App/Raster3D.App.csproj | 14 +++ Raster3D.slnx | 4 + Raster3D/.config/dotnet-tools.json | 36 ++++++++ Raster3D/.vscode/launch.json | 14 +++ Raster3D/Content/Content.mgcb | 15 ++++ Raster3D/Engine.cs | 71 ++++++++++++++++ Raster3D/Graphics/Pixel.cs | 22 +++++ Raster3D/Graphics/Vec2D.cs | 20 +++++ Raster3D/Graphics/rgb.cs | 22 +++++ Raster3D/Icon.ico | Bin 0 -> 147541 bytes Raster3D/Impl/CGameLoop.cs | 14 +++ Raster3D/Impl/IObject.cs | 15 ++++ Raster3D/Impl/IRunnable.cs | 14 +++ Raster3D/OObjects.cs | 78 +++++++++++++++++ Raster3D/Objects/Line.cs | 123 +++++++++++++++++++++++++++ Raster3D/Objects/Triangle.cs | 39 +++++++++ Raster3D/Raster3D.Engine.csproj | 18 ++++ Raster3D/Renderer.cs | 39 +++++++++ Raster3D/app.manifest | 43 ++++++++++ docs/Line.md | 17 ++++ docs/Objects.md | 12 +++ docs/Pixel.md | 3 + docs/README.md | 0 docs/RenderObject.md | 0 docs/Triangle.md | 13 +++ docs/template.md | 13 +++ 31 files changed, 779 insertions(+) create mode 100644 Raster3D.App/Game.cs create mode 100644 Raster3D.App/Interfaces/IDrawable.cs create mode 100644 Raster3D.App/Interfaces/IEntity.cs create mode 100644 Raster3D.App/Player.cs create mode 100644 Raster3D.App/Program.cs create mode 100644 Raster3D.App/Raster3D.App.csproj create mode 100644 Raster3D.slnx create mode 100644 Raster3D/.config/dotnet-tools.json create mode 100644 Raster3D/.vscode/launch.json create mode 100644 Raster3D/Content/Content.mgcb create mode 100644 Raster3D/Engine.cs create mode 100644 Raster3D/Graphics/Pixel.cs create mode 100644 Raster3D/Graphics/Vec2D.cs create mode 100644 Raster3D/Graphics/rgb.cs create mode 100644 Raster3D/Icon.ico create mode 100644 Raster3D/Impl/CGameLoop.cs create mode 100644 Raster3D/Impl/IObject.cs create mode 100644 Raster3D/Impl/IRunnable.cs create mode 100644 Raster3D/OObjects.cs create mode 100644 Raster3D/Objects/Line.cs create mode 100644 Raster3D/Objects/Triangle.cs create mode 100644 Raster3D/Raster3D.Engine.csproj create mode 100644 Raster3D/Renderer.cs create mode 100644 Raster3D/app.manifest create mode 100644 docs/Line.md create mode 100644 docs/Objects.md create mode 100644 docs/Pixel.md create mode 100644 docs/README.md create mode 100644 docs/RenderObject.md create mode 100644 docs/Triangle.md create mode 100644 docs/template.md diff --git a/Raster3D.App/Game.cs b/Raster3D.App/Game.cs new file mode 100644 index 0000000..9a8bc79 --- /dev/null +++ b/Raster3D.App/Game.cs @@ -0,0 +1,25 @@ +using Raster3D.Engine; +using Raster3D.Engine.Impl; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Raster3D.Engine.Graphics; +using Raster3D.Engine.Objects; + +namespace Raster3D.App +{ + internal class Game : CGameLoop + { + + + + + public override void exec(Engine.Engine engine) + { + Line line = new Line(new Vec2D(0, 30), new Vec2D(30,60), engine); + line._Draw(); + } + } +} diff --git a/Raster3D.App/Interfaces/IDrawable.cs b/Raster3D.App/Interfaces/IDrawable.cs new file mode 100644 index 0000000..ef37163 --- /dev/null +++ b/Raster3D.App/Interfaces/IDrawable.cs @@ -0,0 +1,14 @@ +using Microsoft.Xna.Framework; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Raster3D.App.Interfaces +{ + internal interface IDrawable + { + void draw(GameTime time); + } +} diff --git a/Raster3D.App/Interfaces/IEntity.cs b/Raster3D.App/Interfaces/IEntity.cs new file mode 100644 index 0000000..f4ccdd7 --- /dev/null +++ b/Raster3D.App/Interfaces/IEntity.cs @@ -0,0 +1,20 @@ +using Raster3D.Engine; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Raster3D.Engine.Graphics; + +namespace Raster3D.App.Interfaces +{ + internal interface IEntity + { + int id { get; set; } + Vec2D position { get; set; } + + void tick(); + void spawn(); + void free(); + } +} diff --git a/Raster3D.App/Player.cs b/Raster3D.App/Player.cs new file mode 100644 index 0000000..0e47593 --- /dev/null +++ b/Raster3D.App/Player.cs @@ -0,0 +1,32 @@ +using Raster3D.App.Interfaces; +using Raster3D.Engine; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Raster3D.Engine.Graphics; + +namespace Raster3D.App +{ + public class Player : IEntity + { + public int id { get; set; } + public Vec2D position { get; set; } + + public void tick() + { + + } + + public void spawn() + { + + } + + public void free() + { + + } + } +} diff --git a/Raster3D.App/Program.cs b/Raster3D.App/Program.cs new file mode 100644 index 0000000..0f588b5 --- /dev/null +++ b/Raster3D.App/Program.cs @@ -0,0 +1,29 @@ +using Raster3D.Engine; +using Raster3D.Engine.Impl; + + +namespace Raster3D.App +{ + public class App : IRunnable + { + public static Engine.Engine engine; + + public string WindowTitle { get; set; } = "Raster3D Testing Application"; + + public App() + { + engine = new Engine.Engine(this, new Game()); + } + + public void Run(string[] args) + { + engine.Run(); + } + + static void Main(string[] args) + { + IRunnable app = new App(); + app.Run(args); + } + } +} \ No newline at end of file diff --git a/Raster3D.App/Raster3D.App.csproj b/Raster3D.App/Raster3D.App.csproj new file mode 100644 index 0000000..0e35c1b --- /dev/null +++ b/Raster3D.App/Raster3D.App.csproj @@ -0,0 +1,14 @@ + + + + Exe + net9.0-windows + enable + enable + + + + + + + diff --git a/Raster3D.slnx b/Raster3D.slnx new file mode 100644 index 0000000..c729c7f --- /dev/null +++ b/Raster3D.slnx @@ -0,0 +1,4 @@ + + + + diff --git a/Raster3D/.config/dotnet-tools.json b/Raster3D/.config/dotnet-tools.json new file mode 100644 index 0000000..ffcc32a --- /dev/null +++ b/Raster3D/.config/dotnet-tools.json @@ -0,0 +1,36 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "dotnet-mgcb": { + "version": "3.8.5", + "commands": [ + "mgcb" + ] + }, + "dotnet-mgcb-editor": { + "version": "3.8.5", + "commands": [ + "mgcb-editor" + ] + }, + "dotnet-mgcb-editor-linux": { + "version": "3.8.5", + "commands": [ + "mgcb-editor-linux" + ] + }, + "dotnet-mgcb-editor-windows": { + "version": "3.8.5", + "commands": [ + "mgcb-editor-windows" + ] + }, + "dotnet-mgcb-editor-mac": { + "version": "3.8.5", + "commands": [ + "mgcb-editor-mac" + ] + } + } +} \ No newline at end of file diff --git a/Raster3D/.vscode/launch.json b/Raster3D/.vscode/launch.json new file mode 100644 index 0000000..1a1266f --- /dev/null +++ b/Raster3D/.vscode/launch.json @@ -0,0 +1,14 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "C#: Raster3D Debug", + "type": "dotnet", + "request": "launch", + "projectPath": "${workspaceFolder}/Raster3D.csproj" + } + ], + } \ No newline at end of file diff --git a/Raster3D/Content/Content.mgcb b/Raster3D/Content/Content.mgcb new file mode 100644 index 0000000..3c42606 --- /dev/null +++ b/Raster3D/Content/Content.mgcb @@ -0,0 +1,15 @@ + +#----------------------------- Global Properties ----------------------------# + +/outputDir:bin/$(Platform) +/intermediateDir:obj/$(Platform) +/platform:Windows +/config: +/profile:Reach +/compress:False + +#-------------------------------- References --------------------------------# + + +#---------------------------------- Content ---------------------------------# + diff --git a/Raster3D/Engine.cs b/Raster3D/Engine.cs new file mode 100644 index 0000000..fa2b66d --- /dev/null +++ b/Raster3D/Engine.cs @@ -0,0 +1,71 @@ +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using Microsoft.Xna.Framework.Input; +using Raster3D.Engine.Impl; +using Raster3D.Engine.Graphics; + +namespace Raster3D.Engine +{ + public class Engine : Game + { + private GraphicsDeviceManager _graphics; + private SpriteBatch _spriteBatch; + + public Pixel[] pixels; + public Renderer renderer = new Renderer(); + public IRunnable TargetApplication; + + public CGameLoop loop; + + + public Engine(IRunnable Application, CGameLoop EngineLoop) + { + _graphics = new GraphicsDeviceManager(this); + Content.RootDirectory = "Content"; + IsMouseVisible = true; + TargetApplication = Application; + loop = EngineLoop; + } + + + + protected override void Initialize() + { + // Allocate pixel array based on current viewport size + pixels = new Pixel[GraphicsDevice.Viewport.Width * GraphicsDevice.Viewport.Height]; + Window.Title = TargetApplication.WindowTitle; + base.Initialize(); + + } + + protected override void LoadContent() + { + _spriteBatch = new SpriteBatch(GraphicsDevice); + } + + protected override void Update(GameTime gameTime) + { + if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed || Keyboard.GetState().IsKeyDown(Keys.Escape)) + Exit(); + + base.Update(gameTime); + } + + protected override void Draw(GameTime gameTime) + { + + if (loop != null) + { + loop.exec(this); + } + + + GraphicsDevice.Clear(Color.Black); + _spriteBatch.Begin(); + renderer.RenderFrame(pixels, _spriteBatch, GraphicsDevice, GraphicsDevice.Viewport.Width, GraphicsDevice.Viewport.Height); + _spriteBatch.End(); + + base.Draw(gameTime); + } + } +} \ No newline at end of file diff --git a/Raster3D/Graphics/Pixel.cs b/Raster3D/Graphics/Pixel.cs new file mode 100644 index 0000000..967048d --- /dev/null +++ b/Raster3D/Graphics/Pixel.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Raster3D.Engine.Graphics +{ + public struct Pixel + { + public int X; + public int Y; + public rgb color; + + public Pixel(int _x, int _y, rgb _color) + { + X = _x; + Y = _y; + color = _color; + } + } +} diff --git a/Raster3D/Graphics/Vec2D.cs b/Raster3D/Graphics/Vec2D.cs new file mode 100644 index 0000000..761e627 --- /dev/null +++ b/Raster3D/Graphics/Vec2D.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Raster3D.Engine.Graphics +{ + public struct Vec2D + { + public int X; + public int Y; + + public Vec2D(int x, int y) + { + X = x; + Y = y; + } + } +} diff --git a/Raster3D/Graphics/rgb.cs b/Raster3D/Graphics/rgb.cs new file mode 100644 index 0000000..154c3f1 --- /dev/null +++ b/Raster3D/Graphics/rgb.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Raster3D.Engine.Graphics +{ + public struct rgb + { + public float r; + public float g; + public float b; + + public rgb(float _r, float _g, float _b) + { + r = _r; + g = _g; + b = _b; + } + } +} diff --git a/Raster3D/Icon.ico b/Raster3D/Icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..7d9dec18704053ee43cd7c956022ddbdb34d8de1 GIT binary patch literal 147541 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 0 && x0 < screenWidth && y0 >= 0 && y0 < screenHeight) + { + int index = (y0 * screenWidth) + x0; + engine.pixels[index] = new Pixel(x0, y0, clr); + } + + if (x0 == x1 && y0 == y1) break; + + int e2 = 2 * err; + + if (e2 > -dy) + { + err -= dy; + x0 += sx; + } + + if (e2 < dx) + { + err += dx; + y0 += sy; + } + } + } + + public void Triangle(Vec2D[] positions, rgb[] colors, Engine engine) + { + // positions should have a length of 3 and exactly 3 + // colors has 3 points + + // this just draws an array of lines + + // line 1 + Line(positions[0], positions[1], colors[0], engine); // pos1 - pos2 + + // line 2 + Line(positions[1], positions[2], colors[1], engine); // pos2 - pos3 + + // line 3 + Line(positions[2], positions[0], colors[2], engine); // pos3 - back to pos1 + } + + public void Square(Vec2D[] points, rgb[] colors, Engine engine) + { + // TODO: implemen t this + } + } +} diff --git a/Raster3D/Objects/Line.cs b/Raster3D/Objects/Line.cs new file mode 100644 index 0000000..ce956a6 --- /dev/null +++ b/Raster3D/Objects/Line.cs @@ -0,0 +1,123 @@ +using Raster3D.Engine.Graphics; +using Raster3D.Engine.Impl; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.ConstrainedExecution; +using System.Text; +using System.Threading.Tasks; + +namespace Raster3D.Engine.Objects +{ + public class Line : IObject + { + // This is the base class for all IObject things that use primative lines + + + // implement children + public IObject[] children { get; set; } + + + // cast variaibles + private Vec2D _pos1; + private Vec2D _pos2; + private rgb _clr; + private int _width; + private Engine _engine; + private bool canDraw = true; + + private enum ECastType + { + Standard, + PlainColour, + CustomWidth + } + + private ECastType castType; + + + // legacy cast for some ammount of backwards compat + public Line(Vec2D pos1, Vec2D pos2, rgb clr, Engine engine) + { + _pos1 = pos1; + _pos2 = pos2; + _clr = clr; + _engine = engine; + castType = ECastType.Standard; + } + + // csat with plain white colour + public Line(Vec2D pos1, Vec2D pos2, Engine engine) + { + _pos1 = pos1; + _pos2 = pos2; + _engine = engine; + _clr = new rgb(1.0f, 1.0f, 1.0f); + castType = ECastType.PlainColour; + } + + // cast with custom width + public Line(Vec2D pos1, Vec2D pos2, rgb clr, int width, Engine engine) + { + _pos1 = pos1; + _pos2 = pos2; + _clr = clr; + _engine = engine; + _width = width; + castType = ECastType.CustomWidth; + } + + // draw call + public void _Draw() + { + int x0 = (int)_pos1.X; + int y0 = (int)_pos1.Y; + int x1 = (int)_pos2.X; + int y1 = (int)_pos2.Y; + + int dx = Math.Abs(x1 - x0); + int dy = Math.Abs(y1 - y0); + + int sx = x0 < x1 ? 1 : -1; + int sy = y0 < y1 ? 1 : -1; + + int err = dx - dy; + + int screenWidth = _engine.GraphicsDevice.Viewport.Width; + int screenHeight = _engine.GraphicsDevice.Viewport.Height; + + while (canDraw) + { + if (x0 >= 0 && x0 < screenWidth && y0 >= 0 && y0 < screenHeight) + { + int index = (y0 * screenWidth) + x0; + _engine.pixels[index] = new Pixel(x0, y0, _clr); + } + + if (x0 == x1 && y0 == y1) break; + + int e2 = 2 * err; + + if (e2 > -dy) + { + err -= dy; + x0 += sx; + } + + if (e2 < dx) + { + err += dx; + y0 += sy; + } + } + + + } + + // destroy call + public void _Free() + { + + } + } +} diff --git a/Raster3D/Objects/Triangle.cs b/Raster3D/Objects/Triangle.cs new file mode 100644 index 0000000..88b1e88 --- /dev/null +++ b/Raster3D/Objects/Triangle.cs @@ -0,0 +1,39 @@ +using Raster3D.Engine.Graphics; +using Raster3D.Engine.Impl; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Raster3D.Engine.Objects +{ + public class Triangle : IObject + { + public IObject[] children { get; set; } = new IObject[3]; + + // positions array + private Vec2D[] _positions; + private rgb[] _clrs; + private Engine _engine; + + public Triangle(Vec2D[] positions, rgb[] colors, Engine engine) + { + _positions = positions; + _clrs = colors; + _engine = engine; + } + + public void _Draw() + { + children.Append(new Line(_positions[0], _positions[1], _clrs[0], _engine)); + children.Append(new Line(_positions[1], _positions[2], _clrs[1], _engine)); + children.Append(new Line(_positions[2], _positions[1], _clrs[2], _engine)); + } + + public void _Free() + { + throw new NotImplementedException(); + } + } +} diff --git a/Raster3D/Raster3D.Engine.csproj b/Raster3D/Raster3D.Engine.csproj new file mode 100644 index 0000000..834c7f3 --- /dev/null +++ b/Raster3D/Raster3D.Engine.csproj @@ -0,0 +1,18 @@ + + + Library + net9.0-windows + Major + false + false + true + + + app.manifest + Icon.ico + + + + + + \ No newline at end of file diff --git a/Raster3D/Renderer.cs b/Raster3D/Renderer.cs new file mode 100644 index 0000000..3350a0d --- /dev/null +++ b/Raster3D/Renderer.cs @@ -0,0 +1,39 @@ +using Microsoft.Xna.Framework; +using Microsoft.Xna.Framework.Graphics; +using Raster3D.Engine.Graphics; + +namespace Raster3D.Engine +{ + public class Renderer + { + private Texture2D _frameBufferTexture; + private Color[] _colorData; + + public void RenderFrame(Pixel[] pixels, SpriteBatch batch, GraphicsDevice device, int width, int height) + { + if (_frameBufferTexture == null || _frameBufferTexture.Width != width || _frameBufferTexture.Height != height) + { + _frameBufferTexture?.Dispose(); + _frameBufferTexture = new Texture2D(device, width, height); + _colorData = new Color[width * height]; + } + + for (int i = 0; i < _colorData.Length; i++) + { + _colorData[i] = Color.Black; + } + + foreach (var p in pixels) + { + if (p.X >= 0 && p.X < width && p.Y >= 0 && p.Y < height) + { + int index = (p.Y * width) + p.X; + _colorData[index] = new Color(p.color.r, p.color.g, p.color.b, 1.0f); + } + } + + _frameBufferTexture.SetData(_colorData); + batch.Draw(_frameBufferTexture, Vector2.Zero, Color.White); + } + } +} \ No newline at end of file diff --git a/Raster3D/app.manifest b/Raster3D/app.manifest new file mode 100644 index 0000000..a2f6071 --- /dev/null +++ b/Raster3D/app.manifest @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + permonitorv2,permonitor + + + + diff --git a/docs/Line.md b/docs/Line.md new file mode 100644 index 0000000..fcefe11 --- /dev/null +++ b/docs/Line.md @@ -0,0 +1,17 @@ +# Line + +### [RenderObject](RenderObject.md) < [Pixel](Pixel.md) < [Line](Line.md) + +## + +The line primitave is a simple one, comprised of 2 Vec2D points + +## +## Arguments + +| Name | Type | Need | +| ---- | ---- | ---- | +| pos1 | [Vec2D]() | The first position of a line | +| pos2 | [Vec2D]() | The second position of a line | +| color | [rgb]() | The fill color of the line | +| engine | [Engine]() | The call for the engine, used to access the pixbuf \ No newline at end of file diff --git a/docs/Objects.md b/docs/Objects.md new file mode 100644 index 0000000..68f4a84 --- /dev/null +++ b/docs/Objects.md @@ -0,0 +1,12 @@ +# Raster3D Objects docs + +Raster3D contains a few builtin objects that can be used to draw shapes and primitaves onscreen. + +Below is an exhaustive tree list of objects and links to their documentation. + + +- [RenderObject](RenderObject.md) + - [Pixel](Pixel.md) + - [Line](Line.md) + - [Triangle](Triangle.md) + - [Square](Square.md) \ No newline at end of file diff --git a/docs/Pixel.md b/docs/Pixel.md new file mode 100644 index 0000000..621163c --- /dev/null +++ b/docs/Pixel.md @@ -0,0 +1,3 @@ +# Pixel + +### [RenderObject]() < [Pixel](objects/Pixel.md) \ No newline at end of file diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/RenderObject.md b/docs/RenderObject.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/Triangle.md b/docs/Triangle.md new file mode 100644 index 0000000..504e2ae --- /dev/null +++ b/docs/Triangle.md @@ -0,0 +1,13 @@ +# Triangle + +### [RenderObject](RenderObject.md) < [Pixel](Pixel.md) < [Line](Line.md) < [Triangle](Triangle.md) + +## + +Description + +## +## Arguments + +| Name | Type | Need | +| ---- | ---- | ---- | diff --git a/docs/template.md b/docs/template.md new file mode 100644 index 0000000..15827b5 --- /dev/null +++ b/docs/template.md @@ -0,0 +1,13 @@ +# Template + +### [ThingThatExtended]() < [Thing]() + +## + +Description + +## +## Arguments + +| Name | Type | Need | +| ---- | ---- | ---- |