diff --git a/Nuake/src/Rendering/Renderer.cpp b/Nuake/src/Rendering/Renderer.cpp index 25f86f4f..92c61628 100644 --- a/Nuake/src/Rendering/Renderer.cpp +++ b/Nuake/src/Rendering/Renderer.cpp @@ -22,6 +22,7 @@ namespace Nuake unsigned int depthFBO; Ref Renderer::CubeMesh; + Ref Renderer::QuadMesh; Shader* Renderer::m_Shader; Shader* Renderer::m_SkyboxShader; @@ -62,13 +63,14 @@ namespace Nuake 4, 5, 0, 0, 5, 1 }; - float QuadVertices[] = { - -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, - 1.0f, 1.0f, 0.0f, 1.0f, 1.0f, - -1.0f, 1.0f, 0.0f, 0.0f, 1.0f, - 1.0f, -1.0f, 0.0f, 1.0f, 0.0f, - -1.0f, -1.0f, 0.0f, 0.0f, 0.0f, - 1.0f, 1.0f, 0.0f, 1.0f, 1.0f + std::vector QuadVertices + { + { Vector3(-1.0f, -1.0f, 0.0f), Vector2(0, 0), Vector3(0, 0, -1) }, + { Vector3(1.0f, 1.0f, 0.0f), Vector2(1.0f, 1.0f), Vector3(0, 0, -1) }, + { Vector3(-1.0f, 1.0f, 0.0f), Vector2(0.0f, 1.0f), Vector3(0, 0, -1) }, + { Vector3(1.0f, -1.0f, 0.0f), Vector2(1.0f, 0.0f), Vector3(0, 0, -1) }, + { Vector3(-1.0f, -1.0f, 0.0f), Vector2(0.0f, 0.0f), Vector3(0, 0, -1) }, + { Vector3(1.0f, 1.0f, 0.0f), Vector2(1.0f, 1.0f), Vector3(0, 0, -1) } }; @@ -84,24 +86,10 @@ namespace Nuake CubeMesh = CreateRef(); CubeMesh->AddSurface(CubeVertices, CubeIndices); CubeMesh->SetMaterial(material); - // Cube buffer - //CubeVertexArray = new VertexArray(); - //CubeVertexArray->Bind(); - //CubeVertexBuffer = new VertexBuffer(CubeVertices, sizeof(CubeVertices)); - // - VertexBufferLayout vblayout = VertexBufferLayout(); - vblayout.Push(3); - //CubeVertexArray->AddBuffer(*CubeVertexBuffer, vblayout); - // Quad buffer - QuadVertexArray = new VertexArray(); - QuadVertexArray->Bind(); - QuadVertexBuffer = new VertexBuffer(QuadVertices, sizeof(QuadVertices)); - - vblayout = VertexBufferLayout(); - vblayout.Push(3); - vblayout.Push(2); - QuadVertexArray->AddBuffer(*QuadVertexBuffer, vblayout); + QuadMesh = CreateRef(); + QuadMesh->AddSurface(QuadVertices, { 0, 1, 2, 3, 4, 5 }); + QuadMesh->SetMaterial(material); } void Renderer::LoadShaders() @@ -221,7 +209,7 @@ namespace Nuake m_DebugShader->SetUniformMat4f("u_Model", transform.GetGlobalTransform()); m_DebugShader->SetUniform4f("u_Color", color.r, color.g, color.b, color.a); - CubeVertexArray->Bind(); + CubeMesh->Bind(); RenderCommand::DrawArrays(0, 36); } @@ -233,7 +221,7 @@ namespace Nuake void Renderer::DrawQuad(Matrix4 transform) { - QuadVertexArray->Bind(); + QuadMesh->Bind(); RenderCommand::DrawArrays(0, 6); } } diff --git a/Nuake/src/Rendering/Renderer.h b/Nuake/src/Rendering/Renderer.h index 847e3b86..2cde2df3 100644 --- a/Nuake/src/Rendering/Renderer.h +++ b/Nuake/src/Rendering/Renderer.h @@ -51,6 +51,7 @@ namespace Nuake static Ref m_LightsUniformBuffer; static Ref CubeMesh; + static Ref QuadMesh; static void Init(); static void LoadShaders(); diff --git a/Nuake/src/Rendering/SceneRenderer.cpp b/Nuake/src/Rendering/SceneRenderer.cpp index 486beb1f..05f0b606 100644 --- a/Nuake/src/Rendering/SceneRenderer.cpp +++ b/Nuake/src/Rendering/SceneRenderer.cpp @@ -1,7 +1,9 @@ #include "SceneRenderer.h" #include "src/Rendering/Shaders/ShaderManager.h" -#include +#include "src/Scene/Components/BSPBrushComponent.h" +#include "src/Scene/Components/SpriteComponent.h" + #include namespace Nuake @@ -208,16 +210,18 @@ namespace Nuake mGBuffer->Bind(); mGBuffer->Clear(); { + // Init RenderCommand::Enable(RendererEnum::FACE_CULL); Shader* gBufferShader = ShaderManager::GetShader("resources/Shaders/gbuffer.shader"); gBufferShader->Bind(); gBufferShader->SetUniformMat4f("u_Projection", mProjection); gBufferShader->SetUniformMat4f("u_View", mView); - auto view = scene.m_Registry.view(); + // Models + auto view = scene.m_Registry.view(); for (auto e : view) { - auto [transform, mesh, parent, visibility] = view.get(e); + auto [transform, mesh, visibility] = view.get(e); if (mesh.ModelResource && visibility.Visible) { @@ -232,10 +236,11 @@ namespace Nuake RenderCommand::Disable(RendererEnum::FACE_CULL); Renderer::Flush(gBufferShader, false); - auto quakeView = scene.m_Registry.view(); + // Quake BSPs + auto quakeView = scene.m_Registry.view(); for (auto e : quakeView) { - auto [transform, model, parent, visibility] = quakeView.get(e); + auto [transform, model, visibility] = quakeView.get(e); if (model.IsTransparent || !visibility.Visible) continue; @@ -246,6 +251,36 @@ namespace Nuake } } Renderer::Flush(gBufferShader, false); + + // Sprites + auto spriteView = scene.m_Registry.view(); + for (auto e : spriteView) + { + auto [transform, sprite, visibility] = spriteView.get(e); + + if (!visibility.Visible) + continue; + + auto finalQuadTransform = transform.GetGlobalTransform(); + if (sprite.Billboard) + { + Matrix4 finalMatrix; + finalQuadTransform = glm::inverse(mView); + + if (sprite.LockYRotation) + { + finalQuadTransform[1] = Vector4(0, 1, 0, 0); + finalQuadTransform[2] = Vector4(finalQuadTransform[2][0], 0, finalQuadTransform[2][2], 0); + finalQuadTransform = finalQuadTransform; + //finalQuadTransform[1] = Vector4(0, 1, 0, 1); + } + + finalQuadTransform[3] = Vector4(transform.GetGlobalPosition(), 1.0f); + } + + Renderer::SubmitMesh(Renderer::QuadMesh, finalQuadTransform, (uint32_t)e); + } + Renderer::Flush(gBufferShader, false); } }