diff --git a/src/EngineSharp.Core/EngineSharp.Core/OpenGLEngine.cs b/src/EngineSharp.Core/EngineSharp.Core/OpenGLEngine.cs index 67113fc..c46bead 100644 --- a/src/EngineSharp.Core/EngineSharp.Core/OpenGLEngine.cs +++ b/src/EngineSharp.Core/EngineSharp.Core/OpenGLEngine.cs @@ -13,7 +13,7 @@ internal class OpenGLEngine : Engine { private readonly IWindow _window; private readonly Dictionary _scenes; - private GL _gl = null!; // because between constructing the engine and OnLoad being called nothing should call these fields. Therefore, we do "!" to get rid of warnings + private GL _gl = null!; // "= null!" because between constructing the engine and OnLoad being called nothing should access these fields anyway private InputService _inputService = null!; private PerspectiveCamera _camera = null!; private Scene? _currentScene; @@ -58,7 +58,8 @@ internal class OpenGLEngine : Engine var shader = new Shader(vertexShaderFile, fragmentShaderFile); shader.Initialize(_gl); - _shaders.Add(vertexShaderFile, shader); + var osInvariantVertexShaderFile = vertexShaderFile.Replace("\\", "/"); + _shaders.Add(osInvariantVertexShaderFile, shader); } var computeShaderFiles = Directory.GetFiles("./assets/shaders", "*.comp"); @@ -67,7 +68,8 @@ internal class OpenGLEngine : Engine var shader = new ComputeShader(computeShaderFile); shader.Initialize(_gl); - _computeShaders.Add(computeShaderFile, shader); + var osInvariantComputeShaderFile = computeShaderFile.Replace("\\", "/"); + _computeShaders.Add(osInvariantComputeShaderFile, shader); } } diff --git a/src/EngineSharp.Core/EngineSharp.Core/Rendering/Engine.cs b/src/EngineSharp.Core/EngineSharp.Core/Rendering/Engine.cs index 45149e4..5c78c83 100644 --- a/src/EngineSharp.Core/EngineSharp.Core/Rendering/Engine.cs +++ b/src/EngineSharp.Core/EngineSharp.Core/Rendering/Engine.cs @@ -27,7 +27,6 @@ internal abstract class Engine : IEngine internal Scene CreateScene(string sceneName, bool isDefaultScene) { - if (isDefaultScene && !string.IsNullOrEmpty(_defaultSceneName)) { throw new InvalidOperationException( diff --git a/src/EngineSharp.Core/EngineSharp.Core/Rendering/MeshRenderer.cs b/src/EngineSharp.Core/EngineSharp.Core/Rendering/MeshRenderer.cs index 9178c01..4fb4ec9 100644 --- a/src/EngineSharp.Core/EngineSharp.Core/Rendering/MeshRenderer.cs +++ b/src/EngineSharp.Core/EngineSharp.Core/Rendering/MeshRenderer.cs @@ -1,16 +1,15 @@ -using System; -using EngineSharp.Core.ECS; +using EngineSharp.Core.ECS; using Silk.NET.Maths; using Silk.NET.OpenGL; namespace EngineSharp.Core.Rendering; -// TODO: Make IDisposable and delete the buffers and vertex arrays on dispose (and make vao, vbo, ebo nullable for cleaner code) +// TODO: Make IDisposable and delete the buffers and vertex arrays on dispose public class MeshRenderer : RenderComponent { public required Mesh Mesh { get; set; } // in the future this might be an array, or alternatively, a mesh can have submeshes. we will see - private uint vao, vbo, ebo; + private uint? _vao, _vbo, _ebo; internal override void Render(GL gl, Matrix4X4 projectionMatrix, Matrix4X4 viewMatrix, Matrix4X4 modelMatrix) { @@ -24,11 +23,11 @@ public class MeshRenderer : RenderComponent private void GenerateRenderableMesh(GL gl, Matrix4X4 projectionMatrix, Matrix4X4 viewMatrix, Matrix4X4 modelMatrix) { - if(vao == 0) { vao = gl.CreateVertexArray(); } - gl.BindVertexArray(vao); + _vao ??= gl.CreateVertexArray(); + gl.BindVertexArray(_vao.Value); - if(vbo == 0) { vbo = gl.GenBuffer(); } - if(ebo == 0) { ebo = gl.GenBuffer(); } + _vbo ??= gl.GenBuffer(); + _ebo ??= gl.GenBuffer(); var meshData = new float[Mesh.Vertices.Length * 3 + Mesh.Normals.Length * 3]; for (int i = 0, insert = 0; i < Mesh.Vertices.Length; i++, insert += 6) @@ -42,31 +41,19 @@ public class MeshRenderer : RenderComponent meshData[insert + 5] = Mesh.Normals[i].Z; } - unsafe - { - gl.BindBuffer(BufferTargetARB.ArrayBuffer, vbo); - // var meshDataSpan = new ReadOnlySpan(meshData); - // gl.BufferData(BufferTargetARB.ArrayBuffer, meshDataSpan, BufferUsageARB.StaticDraw); // TODO: maybe try the unsafe approach and see if that works? - fixed (void* data = &meshData[0]) - { - gl.BufferData(BufferTargetARB.ArrayBuffer, (nuint)(meshData.Length * sizeof(float)), data, BufferUsageARB.StaticDraw); - } - - gl.BindBuffer(BufferTargetARB.ElementArrayBuffer, ebo); - // var indicesSpan = new ReadOnlySpan(Mesh.Indices); - // gl.BufferData(BufferTargetARB.ArrayBuffer, indicesSpan, BufferUsageARB.StaticDraw); - fixed (void* indices = &Mesh.Indices[0]) - { - gl.BufferData(BufferTargetARB.ElementArrayBuffer, (nuint)(Mesh.Indices.Length * sizeof(float)), indices, BufferUsageARB.StaticDraw); - } - - // vertices - gl.EnableVertexAttribArray(0); - gl.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 6 * sizeof(float), null); - // normals - gl.EnableVertexAttribArray(1); - gl.VertexAttribPointer(1, 3, VertexAttribPointerType.Float, false, 6 * sizeof(float), (void*)(3 * sizeof(float))); - } + gl.BindBuffer(BufferTargetARB.ArrayBuffer, _vbo.Value); + var meshDataSpan = new ReadOnlySpan(meshData); + gl.BufferData(BufferTargetARB.ArrayBuffer, meshDataSpan, BufferUsageARB.StaticDraw); + gl.BindBuffer(BufferTargetARB.ElementArrayBuffer, _ebo.Value); + var indicesSpan = new ReadOnlySpan(Mesh.Indices); + gl.BufferData(BufferTargetARB.ElementArrayBuffer, indicesSpan, BufferUsageARB.StaticDraw); + + // vertices + gl.EnableVertexAttribArray(0); + gl.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 6 * sizeof(float), 0); + // normals + gl.EnableVertexAttribArray(1); + gl.VertexAttribPointer(1, 3, VertexAttribPointerType.Float, false, 6 * sizeof(float), 3 * sizeof(float)); } } \ No newline at end of file