diff --git a/DoomDeathmatch.sln b/DoomDeathmatch.sln
index d20fae8..15066e3 100644
--- a/DoomDeathmatch.sln
+++ b/DoomDeathmatch.sln
@@ -10,6 +10,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PresenterWpf", "PresenterWp
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PresenterConsole", "PresenterConsole\PresenterConsole.csproj", "{85AA55C5-F8AF-4C38-8874-702684BCAFBB}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PresenterNative", "PresenterNative\PresenterNative.csproj", "{3B8B7867-5B38-4013-A366-159083F5C095}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -36,5 +38,9 @@ Global
{85AA55C5-F8AF-4C38-8874-702684BCAFBB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{85AA55C5-F8AF-4C38-8874-702684BCAFBB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{85AA55C5-F8AF-4C38-8874-702684BCAFBB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3B8B7867-5B38-4013-A366-159083F5C095}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3B8B7867-5B38-4013-A366-159083F5C095}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3B8B7867-5B38-4013-A366-159083F5C095}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3B8B7867-5B38-4013-A366-159083F5C095}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
EndGlobal
diff --git a/DoomDeathmatch/Assets/test.shader b/DoomDeathmatch/Assets/test.shader
deleted file mode 100644
index 464f8b5..0000000
--- a/DoomDeathmatch/Assets/test.shader
+++ /dev/null
@@ -1,19 +0,0 @@
-#shader vertex
-#version 330 core
-
-layout(location = 0) in vec2 aPos;
-
-void main()
-{
- gl_Position = vec4(aPos, 0.0, 1.0);
-}
-
-#shader fragment
-#version 330 core
-
-out vec4 FragColor;
-
-void main()
-{
- FragColor = vec4(1.0, 1.0, 0.0, 1.0);
-}
\ No newline at end of file
diff --git a/DoomDeathmatch/DoomDeathmatch.csproj b/DoomDeathmatch/DoomDeathmatch.csproj
index 90e66bb..025d582 100644
--- a/DoomDeathmatch/DoomDeathmatch.csproj
+++ b/DoomDeathmatch/DoomDeathmatch.csproj
@@ -8,14 +8,14 @@
-
+
-
-
-
-
+
+
+
+
diff --git a/DoomDeathmatch/src/Program.cs b/DoomDeathmatch/src/Program.cs
index 9e8ab43..5f53be4 100644
--- a/DoomDeathmatch/src/Program.cs
+++ b/DoomDeathmatch/src/Program.cs
@@ -6,15 +6,7 @@ namespace DoomDeathmatch;
internal abstract class Program
{
- [DllImport("kernel32.dll")]
- static extern IntPtr GetConsoleWindow();
-
- [DllImport("User32.dll", SetLastError = true)]
- public static extern IntPtr GetDC(IntPtr hwnd);
-
- public static void Main(string[] args)
- {
- var engine = new Engine.Engine(480, 270, false, "Doom Deathmatch");
- engine.Run();
- }
+ public static void Main(string[] args)
+ {
+ }
}
\ No newline at end of file
diff --git a/DoomDeathmatch/src/QuadVertex.cs b/DoomDeathmatch/src/QuadVertex.cs
index b29ae81..f26909f 100644
--- a/DoomDeathmatch/src/QuadVertex.cs
+++ b/DoomDeathmatch/src/QuadVertex.cs
@@ -7,15 +7,11 @@ namespace DoomDeathmatch;
public struct QuadVertex : IVertex
{
- [Vertex(VertexAttribType.Float, 2)]
- public Vector2 Position2;
+ [Vertex(VertexAttribType.Float, 2)] public Vector2 Position2;
- [Vertex(VertexAttribType.Float, 2)]
- public Vector2 Position;
+ [Vertex(VertexAttribType.Float, 2)] public Vector2 Position;
- [Vertex(VertexAttribType.Float, 2)]
- public Vector2 Position4;
+ [Vertex(VertexAttribType.Float, 2)] public Vector2 Position4;
- [Vertex(VertexAttribType.Float, 2)]
- public Vector2 Position3;
+ [Vertex(VertexAttribType.Float, 2)] public Vector2 Position3;
}
\ No newline at end of file
diff --git a/Engine/Engine.csproj b/Engine/Engine.csproj
index efd2e0e..d1889fc 100644
--- a/Engine/Engine.csproj
+++ b/Engine/Engine.csproj
@@ -10,31 +10,37 @@
true
+
+ true
+
+
+
+
-
- ResXFileCodeGenerator
- Test.Designer.cs
- PreserveNewest
-
+
+ ResXFileCodeGenerator
+ Test.Designer.cs
+ PreserveNewest
+
-
- True
- True
- ShaderResource.resx
-
+
+ True
+ True
+ ShaderResource.resx
+
diff --git a/Engine/src/Asset/Image.cs b/Engine/src/Asset/Image.cs
index 8b1ee4b..9fc6581 100644
--- a/Engine/src/Asset/Image.cs
+++ b/Engine/src/Asset/Image.cs
@@ -6,14 +6,16 @@ namespace Engine.Asset;
public class Image(T[,] parPixels)
where T : struct, IPixel
{
- public int Width { get; } = parPixels.GetLength(1);
- public int Height { get; } = parPixels.GetLength(0);
+ public int Width { get; }
+ public int Height { get; }
public T[,] Pixels { get; } = parPixels;
public T this[int parY, int parX] => Pixels[parY, parX];
public Image(int parWidth, int parHeight) : this(new T[parHeight, parWidth])
{
+ Width = parWidth;
+ Height = parHeight;
}
public DynamicTexture ToDynamicTexture()
diff --git a/Engine/src/Engine.cs b/Engine/src/Engine.cs
index 853b80d..1ec77b1 100644
--- a/Engine/src/Engine.cs
+++ b/Engine/src/Engine.cs
@@ -7,25 +7,49 @@ using OpenTK.Mathematics;
using OpenTK.Windowing.Common;
using OpenTK.Windowing.Desktop;
using Serilog;
-using Serilog.Sinks.SystemConsole.Themes;
namespace Engine;
public sealed class Engine
{
- public Renderer Renderer => _renderer;
- public SceneManager SceneManager => _sceneManager;
+ public Renderer Renderer { get; }
+ public SceneManager SceneManager { get; } = new();
+
+ internal Window Window { get; }
+
+ internal IPresenter? Presenter
+ {
+ get => _presenter;
+ set
+ {
+ if (_presenter != null)
+ {
+ _presenter.Resize -= PresenterResize;
+ }
+
+ _presenter = value;
+
+ if (_presenter != null)
+ {
+ _presenter.Resize += PresenterResize;
+ }
+ }
+ }
+
+ internal IInputHandler? InputHandler
+ {
+ get => _inputHandler;
+ set => _inputHandler = value;
+ }
- private readonly Window _window;
- private readonly Renderer _renderer;
- private readonly SceneManager _sceneManager = new();
private readonly ILogger _logger;
- private readonly IInputHandler _inputHandler;
- private readonly IPresenter _presenter;
+
+ private IInputHandler? _inputHandler;
+ private IPresenter? _presenter;
private Thread? _updateThread;
- public Engine(int parWidth, int parHeight, bool parHeadless = false, string parTitle = "")
+ public Engine(int parWidth, int parHeight, bool parHeadless, string parTitle, ILogger parLogger)
{
var settings = new NativeWindowSettings
{
@@ -33,41 +57,16 @@ public sealed class Engine
Title = parTitle,
StartVisible = !parHeadless,
APIVersion = new Version(4, 6),
- Profile = ContextProfile.Compatability
+ Profile = ContextProfile.Core
};
- _window = new Window(this, new NativeWindow(settings), parHeadless);
- _renderer = new Renderer(parWidth, parHeight);
- if (!parHeadless)
- {
- _window.Resize += parArgs =>
- {
- _renderer.Resize(parArgs.Width, parArgs.Height);
- };
- _presenter = _window;
- }
-
- Thread.CurrentThread.Name = "RendererThread";
-
- Log.Logger = new LoggerConfiguration()
- .MinimumLevel.Verbose()
- .Enrich.WithThreadName()
- .Enrich.WithThreadId()
- .Enrich.FromLogContext()
- .WriteTo.Console(
- outputTemplate:
- "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff}] [{Level:u3}] [{ThreadName,-15:l}:{ThreadId,-4:d4}] [{SourceContext:l}] {Message:lj}{NewLine}{Exception}",
- theme: AnsiConsoleTheme.Literate)
- .CreateLogger();
+ Window = new Window(this, new NativeWindow(settings), parHeadless);
+ Renderer = new Renderer(parWidth, parHeight);
+ Log.Logger = parLogger;
_logger = Log.ForContext();
}
- public Engine(int parWidth, int parHeight, Func parPresenter) : this(parWidth, parHeight, true)
- {
- _presenter = parPresenter(this);
- }
-
public void Run()
{
_updateThread = new Thread(RunUpdate);
@@ -75,23 +74,24 @@ public sealed class Engine
var timer = Stopwatch.StartNew();
var deltaTime = 0.0;
- while (!_presenter.IsExiting)
+ while (!Presenter?.IsExiting ?? false)
{
- var time = deltaTime;
- _renderer.Commit(_ => GL.ClearColor(0.6f, 0.0f, 0.6f, 1.0f));
- _renderer.Commit(_ => GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit));
- _renderer.Commit(parRenderer =>
- {
- parRenderer.QuadRenderer.Commit(
- Matrix4.CreateScale(MathF.Sin((float)time) * 2) * Matrix4.CreateRotationZ(MathF.Sin((float)time)),
- new Vector4((MathF.Sin((float)time * 3) + 1.0f) / 2, (MathF.Sin((float)time) + 1.0f) / 2, (MathF.Sin((float)time * 5) + 1.0f) / 2, 1.0f));
- parRenderer.QuadRenderer.Render(Matrix4.Identity, Matrix4.Identity);
- parRenderer.QuadRenderer.Reset();
- });
- _renderer.Render();
- _presenter.Present(_renderer.TextureInternal);
+ Renderer.StartFrame();
- _presenter.Update(deltaTime);
+ GL.ClearColor(0.6f, 0.0f, 0.6f, 1.0f);
+ GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
+
+ Renderer.QuadRenderer.Commit(
+ Matrix4.CreateRotationZ((float)deltaTime),
+ new Vector4((MathF.Sin((float)deltaTime) + 1.0f) / 2, (MathF.Sin((float)deltaTime) + 1.0f) / 2,
+ (MathF.Sin((float)deltaTime) + 1.0f) / 2, 1.0f));
+ Renderer.QuadRenderer.Render(Matrix4.Identity, Matrix4.Identity);
+ Renderer.QuadRenderer.Reset();
+
+ Renderer.EndFrame();
+
+ Presenter!.Present(Renderer.TextureInternal);
+ Presenter!.Update(deltaTime);
deltaTime = timer.Elapsed.TotalSeconds;
}
@@ -102,11 +102,19 @@ public sealed class Engine
{
var timer = Stopwatch.StartNew();
var deltaTime = 0.0;
- while (!_presenter.IsExiting)
+ while (!Presenter?.IsExiting ?? false)
{
- _sceneManager.Update(deltaTime);
+ SceneManager.Update(deltaTime);
timer.Restart();
deltaTime = timer.Elapsed.TotalSeconds;
}
}
+
+ private void PresenterResize(ResizeEventArgs parEventArgs)
+ {
+ if (parEventArgs.Width == 0 || parEventArgs.Height == 0)
+ return;
+
+ Renderer.Resize(parEventArgs.Width, parEventArgs.Height);
+ }
}
\ No newline at end of file
diff --git a/Engine/src/EngineBuilder.cs b/Engine/src/EngineBuilder.cs
new file mode 100644
index 0000000..264a3b2
--- /dev/null
+++ b/Engine/src/EngineBuilder.cs
@@ -0,0 +1,151 @@
+using Engine.Graphics;
+using Engine.Input;
+using Serilog;
+using Serilog.Core;
+using Serilog.Events;
+using Serilog.Sinks.SystemConsole.Themes;
+
+namespace Engine;
+
+public sealed class EngineBuilder
+{
+ private string _title = "";
+ private bool _headless;
+ private int _width = 1;
+ private int _height = 1;
+
+ private Func? _presenterFunc;
+ private Func? _inputHandlerFunc;
+
+ // Logging
+ private bool _logToConsole;
+ private bool _logToFile;
+ private string? _logFilePath;
+ private LogEventLevel _logLevel = LogEventLevel.Information;
+
+ public EngineBuilder() { }
+
+ public EngineBuilder Title(string parTitle)
+ {
+ _title = parTitle;
+ return this;
+ }
+
+ public EngineBuilder Headless(bool parHeadless = true)
+ {
+ _headless = parHeadless;
+ return this;
+ }
+
+ public EngineBuilder Width(int parWidth)
+ {
+ ArgumentOutOfRangeException.ThrowIfNegativeOrZero(parWidth);
+
+ _width = parWidth;
+ return this;
+ }
+
+ public EngineBuilder Height(int parHeight)
+ {
+ ArgumentOutOfRangeException.ThrowIfNegativeOrZero(parHeight);
+
+ _height = parHeight;
+ return this;
+ }
+
+ public EngineBuilder Presenter(IPresenter parPresenter)
+ {
+ _presenterFunc = _ => parPresenter;
+ return this;
+ }
+
+ public EngineBuilder Presenter(Func parPresenterFunc)
+ {
+ _presenterFunc = parPresenterFunc;
+ return this;
+ }
+
+ public EngineBuilder InputHandler(IInputHandler parInputHandler)
+ {
+ _inputHandlerFunc = _ => parInputHandler;
+ return this;
+ }
+
+ public EngineBuilder InputHandler(Func parInputHandlerFunc)
+ {
+ _inputHandlerFunc = parInputHandlerFunc;
+ return this;
+ }
+
+ public EngineBuilder LogToConsole(bool parLogToConsole = true)
+ {
+ _logToConsole = parLogToConsole;
+ return this;
+ }
+
+ public EngineBuilder LogToFile(bool parLogToFile = true, string? parLogFilePath = null)
+ {
+ if (parLogToFile && parLogFilePath == null)
+ throw new ArgumentNullException(nameof(parLogFilePath));
+
+ _logToFile = parLogToFile;
+ _logFilePath = parLogFilePath;
+ return this;
+ }
+
+ public EngineBuilder LogLevel(LogEventLevel parLogLevel)
+ {
+ _logLevel = parLogLevel;
+ return this;
+ }
+
+ public Engine Build()
+ {
+ var logger = BuildLogger();
+ var engine = new Engine(_width, _height, _headless, _title, logger);
+
+ var presenter = _presenterFunc?.Invoke(engine);
+ if (presenter != null)
+ {
+ engine.Presenter = presenter;
+ }
+
+ var inputHandler = _inputHandlerFunc?.Invoke(engine);
+ if (inputHandler != null)
+ {
+ engine.InputHandler = inputHandler;
+ }
+
+ return engine;
+ }
+
+ private Logger BuildLogger()
+ {
+ const string template =
+ "[{Timestamp:yyyy-MM-dd HH:mm:ss.fff}] [{Level:u3}] [{ThreadName,-15:l}:{ThreadId,-4:d4}] [{SourceContext:l}] {Message:lj}{NewLine}{Exception}";
+
+ var loggerConfiguration = new LoggerConfiguration()
+ .MinimumLevel.Is(_logLevel)
+ .Enrich.WithThreadName()
+ .Enrich.WithThreadId()
+ .Enrich.FromLogContext();
+
+ if (_logToConsole)
+ {
+ loggerConfiguration.WriteTo.Console(
+ outputTemplate: template,
+ theme: AnsiConsoleTheme.Literate
+ );
+ }
+
+ if (_logToFile)
+ {
+ loggerConfiguration.WriteTo.File(
+ _logFilePath!,
+ outputTemplate: template
+ );
+ }
+
+ return loggerConfiguration.CreateLogger();
+ }
+}
\ No newline at end of file
diff --git a/Engine/src/Graphics/Render/Quad/QuadRenderer.cs b/Engine/src/Graphics/Render/Quad/QuadRenderer.cs
index 1657552..832a8bf 100644
--- a/Engine/src/Graphics/Render/Quad/QuadRenderer.cs
+++ b/Engine/src/Graphics/Render/Quad/QuadRenderer.cs
@@ -8,6 +8,7 @@ namespace Engine.Graphics.Render.Quad;
public class QuadRenderer : InstancedRenderer
{
private readonly TextureUnitMap _textureUnitMap = new(16);
+ private readonly int[] _textureUnitIndices = new int[16];
public QuadRenderer(Renderer parRenderer, int parInstanceCount)
: base(parRenderer, PrimitiveType.Triangles, parInstanceCount, [0, 1, 2, 2, 3, 0], [
@@ -41,14 +42,13 @@ public class QuadRenderer : InstancedRenderer _framebuffer.TextureInternal!;
- public readonly QuadRenderer QuadRenderer;
+ public QuadRenderer QuadRenderer { get; }
private readonly Framebuffer.Framebuffer _framebuffer;
- private readonly Queue> _renderActions = new();
private readonly Thread _renderThread;
public Renderer(int parWidth, int parHeight)
{
+ Thread.CurrentThread.Name = "RendererThread";
+
InitializeOpenGl(parWidth, parHeight);
_renderThread = Thread.CurrentThread;
@@ -37,7 +38,7 @@ public class Renderer
GL.Enable(EnableCap.DepthTest);
- GL.Enable(EnableCap.FramebufferSrgb);
+ // GL.Enable(EnableCap.FramebufferSrgb);
GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha);
GL.Enable(EnableCap.Blend);
@@ -47,28 +48,26 @@ public class Renderer
public void EnsureRenderThread()
{
+#if DEBUG
if (Thread.CurrentThread == _renderThread)
{
return;
}
throw new InvalidOperationException("Renderer is not on render thread");
+#endif
}
- internal void Commit(Action parRenderAction)
- {
- _renderActions.Enqueue(parRenderAction);
- }
-
- internal void Render()
+ internal void StartFrame()
{
EnsureRenderThread();
_framebuffer.Bind();
- while (_renderActions.TryDequeue(out var renderAction))
- {
- renderAction(this);
- }
+ }
+
+ internal void EndFrame()
+ {
+ EnsureRenderThread();
_framebuffer.Unbind();
}
diff --git a/Engine/src/Graphics/Texture/TextureUnitMap.cs b/Engine/src/Graphics/Texture/TextureUnitMap.cs
index eda650a..df1eea0 100644
--- a/Engine/src/Graphics/Texture/TextureUnitMap.cs
+++ b/Engine/src/Graphics/Texture/TextureUnitMap.cs
@@ -2,18 +2,13 @@
namespace Engine.Graphics.Texture;
-public class TextureUnitMap : IEnumerable>
+public class TextureUnitMap(int parCapacity)
{
public int Size => _textures.Count;
- public int Capacity => _capacity;
+ public int Capacity => parCapacity;
+ public IReadOnlyDictionary Textures => _textures;
private readonly Dictionary _textures = new();
- private readonly int _capacity;
-
- public TextureUnitMap(int parCapacity)
- {
- _capacity = parCapacity;
- }
public int GetUnit(Texture parTexture)
{
@@ -22,7 +17,7 @@ public class TextureUnitMap : IEnumerable>
return unit;
}
- if (_textures.Count >= _capacity)
+ if (_textures.Count >= parCapacity)
{
throw new InvalidOperationException("Texture unit map is full");
}
@@ -37,14 +32,4 @@ public class TextureUnitMap : IEnumerable>
{
_textures.Clear();
}
-
- public IEnumerator> GetEnumerator()
- {
- return _textures.GetEnumerator();
- }
-
- IEnumerator IEnumerable.GetEnumerator()
- {
- return GetEnumerator();
- }
}
\ No newline at end of file
diff --git a/Engine/src/Resource/ShaderResource.resx b/Engine/src/Resource/ShaderResource.resx
index a854c31..a78eb25 100644
--- a/Engine/src/Resource/ShaderResource.resx
+++ b/Engine/src/Resource/ShaderResource.resx
@@ -1,9 +1,10 @@
-
+
-
+
@@ -13,10 +14,14 @@
1.3
- System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
+ PublicKeyToken=b77a5c561934e089
+
- System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral,
+ PublicKeyToken=b77a5c561934e089
+
diff --git a/Engine/src/Window.cs b/Engine/src/Window.cs
index 93e586e..d315603 100644
--- a/Engine/src/Window.cs
+++ b/Engine/src/Window.cs
@@ -51,8 +51,6 @@ public class Window : IPresenter
public void Present(IConstTexture parTexture)
{
- GL.Viewport(0, 0, Width, Height);
-
GL.ClearColor(0.0f, 0.0f, 0.0f, 1.0f);
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
diff --git a/EngineTests/EngineTests.csproj b/EngineTests/EngineTests.csproj
index fccc8f0..a5e5c2e 100644
--- a/EngineTests/EngineTests.csproj
+++ b/EngineTests/EngineTests.csproj
@@ -22,11 +22,11 @@
-
+
-
+
diff --git a/EngineTests/src/Scene/GameObjectTests.cs b/EngineTests/src/Scene/GameObjectTests.cs
index c559edf..b186134 100644
--- a/EngineTests/src/Scene/GameObjectTests.cs
+++ b/EngineTests/src/Scene/GameObjectTests.cs
@@ -5,67 +5,67 @@ namespace EngineTests.Scene;
public class GameObjectTests
{
- private GameObject _gameObject;
+ private GameObject _gameObject;
- [SetUp]
- public void Setup()
+ [SetUp]
+ public void Setup()
+ {
+ _gameObject = new GameObject();
+ }
+
+ [Test]
+ public void Constructor_ShouldInitializeWithTransformComponent()
+ {
+ Assert.Multiple(() =>
{
- _gameObject = new GameObject();
- }
+ Assert.That(_gameObject.Transform, Is.Not.Null);
+ Assert.That(_gameObject.HasComponent(), Is.True);
+ });
+ }
- [Test]
- public void Constructor_ShouldInitializeWithTransformComponent()
+ [Test]
+ public void AddComponent_ShouldThrowIfComponentAlreadyExists()
+ {
+ _gameObject.AddComponent();
+
+ Assert.Throws(() => _gameObject.ProcessChanges());
+ }
+
+ [Test]
+ public void AddComponent_ShouldAddComponentToGameObject()
+ {
+ _gameObject.AddComponent();
+ _gameObject.ProcessChanges();
+
+ Assert.Multiple(() =>
{
- Assert.Multiple(() =>
- {
- Assert.That(_gameObject.Transform, Is.Not.Null);
- Assert.That(_gameObject.HasComponent(), Is.True);
- });
- }
+ Assert.That(_gameObject.GetComponent(), Is.Not.Null);
+ Assert.That(_gameObject.HasComponent(), Is.True);
+ });
+ }
- [Test]
- public void AddComponent_ShouldThrowIfComponentAlreadyExists()
+ [Test]
+ public void AddComponent_ShouldAddComponentToGameObjectWithArgs()
+ {
+ _gameObject.AddComponent(99, 0.2f, 1001f);
+ _gameObject.ProcessChanges();
+
+ var camera = _gameObject.GetComponent()!;
+
+ Assert.Multiple(() =>
{
- _gameObject.AddComponent();
+ Assert.That(camera.FieldOfView, Is.EqualTo(99));
+ Assert.That(camera.NearPlane, Is.EqualTo(0.2f));
+ Assert.That(camera.FarPlane, Is.EqualTo(1001f));
+ });
+ }
- Assert.Throws(() => _gameObject.ProcessChanges());
- }
+ [Test]
+ public void AddComponent_ShouldThrowIfComponentBaseTypeAlreadyExists()
+ {
+ _gameObject.AddComponent();
+ _gameObject.AddComponent();
- [Test]
- public void AddComponent_ShouldAddComponentToGameObject()
- {
- _gameObject.AddComponent();
- _gameObject.ProcessChanges();
-
- Assert.Multiple(() =>
- {
- Assert.That(_gameObject.GetComponent(), Is.Not.Null);
- Assert.That(_gameObject.HasComponent(), Is.True);
- });
- }
-
- [Test]
- public void AddComponent_ShouldAddComponentToGameObjectWithArgs()
- {
- _gameObject.AddComponent(99, 0.2f, 1001f);
- _gameObject.ProcessChanges();
-
- var camera = _gameObject.GetComponent()!;
-
- Assert.Multiple(() =>
- {
- Assert.That(camera.FieldOfView, Is.EqualTo(99));
- Assert.That(camera.NearPlane, Is.EqualTo(0.2f));
- Assert.That(camera.FarPlane, Is.EqualTo(1001f));
- });
- }
-
- [Test]
- public void AddComponent_ShouldThrowIfComponentBaseTypeAlreadyExists()
- {
- _gameObject.AddComponent();
- _gameObject.AddComponent();
-
- Assert.Throws(() => _gameObject.ProcessChanges());
- }
+ Assert.Throws(() => _gameObject.ProcessChanges());
+ }
}
\ No newline at end of file
diff --git a/EngineTests/src/Scene/HierarchyTests.cs b/EngineTests/src/Scene/HierarchyTests.cs
index 2b9e426..508bf98 100644
--- a/EngineTests/src/Scene/HierarchyTests.cs
+++ b/EngineTests/src/Scene/HierarchyTests.cs
@@ -4,563 +4,563 @@ namespace EngineTests.Scene;
public class HierarchyTests
{
- private Hierarchy