From 8e83cd32f62d948f3081594520a0d99548d1277e Mon Sep 17 00:00:00 2001 From: Patedam Date: Sat, 21 Feb 2026 22:45:20 -0500 Subject: [PATCH] Fixed MeshRenderer, our cube is now totally drawn by mesh renderer ! --- Juliet/src/Graphics/MeshRenderer.cpp | 229 ++++++++++++++------------- JulietApp/main.cpp | 18 +-- 2 files changed, 128 insertions(+), 119 deletions(-) diff --git a/Juliet/src/Graphics/MeshRenderer.cpp b/Juliet/src/Graphics/MeshRenderer.cpp index 9e2bde4..9d168c2 100644 --- a/Juliet/src/Graphics/MeshRenderer.cpp +++ b/Juliet/src/Graphics/MeshRenderer.cpp @@ -16,87 +16,89 @@ namespace Juliet bool InitializeMeshRenderer(NonNullPtr arena, NonNullPtr device, NonNullPtr window) { - (void)arena; - (void)device; - (void)window; - return true; - // bool result = true; - // - // g_MeshRenderer.Meshes.Create(arena JULIET_DEBUG_PARAM("Meshes")); - // g_MeshRenderer.Vertices.Create(arena JULIET_DEBUG_PARAM("Vertices")); - // g_MeshRenderer.Indices.Create(arena JULIET_DEBUG_PARAM("Indices")); - // - // GraphicsDevice* graphicsDevice = g_MeshRenderer.Device = device.Get(); - // - // // Create graphics pipeline - // String entryPoint = WrapString("main"); - // ShaderCreateInfo shaderCI = {}; - // shaderCI.EntryPoint = entryPoint; - // - // // TODO: Assets management that handles path to assets or something. - // String shaderPath = WrapString("../../Assets/compiled/Triangle.vert.dxil"); - // shaderCI.Stage = ShaderStage::Vertex; - // Shader* vertexShader = CreateShader(graphicsDevice, shaderPath, shaderCI); - // - // shaderPath = WrapString("../../Assets/compiled/SolidColor.frag.dxil"); - // shaderCI.Stage = ShaderStage::Fragment; - // Shader* fragmentShader = CreateShader(graphicsDevice, shaderPath, shaderCI); - // - // ColorTargetDescription colorTargetDescription = {}; - // colorTargetDescription.Format = GetSwapChainTextureFormat(graphicsDevice, window); - // - // GraphicsPipelineCreateInfo pipelineCI = {}; - // pipelineCI.VertexShader = vertexShader; - // pipelineCI.FragmentShader = fragmentShader; - // pipelineCI.PrimitiveType = PrimitiveType::TriangleList; - // pipelineCI.TargetInfo = { .ColorTargetDescriptions = &colorTargetDescription, - // .NumColorTargets = 1, - // .DepthStencilFormat = TextureFormat::D32_FLOAT, - // .HasDepthStencilTarget = true }; - // pipelineCI.RasterizerState.FillMode = FillMode::Solid; - // pipelineCI.DepthStencilState.EnableDepthTest = true; - // pipelineCI.DepthStencilState.EnableDepthWrite = true; - // pipelineCI.DepthStencilState.CompareOperation = CompareOperation::Less; - // - // g_MeshRenderer.Pipeline = CreateGraphicsPipeline(graphicsDevice, pipelineCI); - // if (g_MeshRenderer.Pipeline == nullptr) - // { - // LogError(LogCategory::Graphics, "Failed to create graphics pipeline!"); - // result = false; - // } - // - // // Create the vertex and index buffers - // BufferCreateInfo vertexBufferCI = {}; - // vertexBufferCI.Size = kGeometryPage; - // vertexBufferCI.Usage = BufferUsage::VertexBuffer; - // g_MeshRenderer.VertexBuffer = CreateGraphicsBuffer(graphicsDevice, vertexBufferCI); - // - // BufferCreateInfo indexBufferCI = {}; - // indexBufferCI.Size = kIndexPage; - // indexBufferCI.Usage = BufferUsage::IndexBuffer; - // g_MeshRenderer.IndexBuffer = CreateGraphicsBuffer(graphicsDevice, indexBufferCI); - // - // if (vertexShader) - // { - // DestroyShader(graphicsDevice, vertexShader); - // } - // if (fragmentShader) - // { - // DestroyShader(graphicsDevice, fragmentShader); - // } - // - // return result; + bool result = true; + + g_MeshRenderer.Meshes.Create(arena JULIET_DEBUG_PARAM("Meshes")); + g_MeshRenderer.Vertices.Create(arena JULIET_DEBUG_PARAM("Vertices")); + g_MeshRenderer.Indices.Create(arena JULIET_DEBUG_PARAM("Indices")); + + GraphicsDevice* graphicsDevice = g_MeshRenderer.Device = device.Get(); + + // Create graphics pipeline + String entryPoint = WrapString("main"); + ShaderCreateInfo shaderCI = {}; + shaderCI.EntryPoint = entryPoint; + + // TODO: Assets management that handles path to assets or something. + String shaderPath = WrapString("../../Assets/compiled/Triangle.vert.dxil"); + shaderCI.Stage = ShaderStage::Vertex; + Shader* vertexShader = CreateShader(graphicsDevice, shaderPath, shaderCI); + + shaderPath = WrapString("../../Assets/compiled/SolidColor.frag.dxil"); + shaderCI.Stage = ShaderStage::Fragment; + Shader* fragmentShader = CreateShader(graphicsDevice, shaderPath, shaderCI); + + ColorTargetDescription colorTargetDescription = {}; + colorTargetDescription.Format = GetSwapChainTextureFormat(graphicsDevice, window); + + GraphicsPipelineCreateInfo pipelineCI = {}; + pipelineCI.VertexShader = vertexShader; + pipelineCI.FragmentShader = fragmentShader; + pipelineCI.PrimitiveType = PrimitiveType::TriangleList; + pipelineCI.TargetInfo = { .ColorTargetDescriptions = &colorTargetDescription, + .NumColorTargets = 1, + .DepthStencilFormat = TextureFormat::D32_FLOAT, + .HasDepthStencilTarget = true }; + pipelineCI.RasterizerState.FillMode = FillMode::Solid; + pipelineCI.DepthStencilState.EnableDepthTest = true; + pipelineCI.DepthStencilState.EnableDepthWrite = true; + pipelineCI.DepthStencilState.CompareOperation = CompareOperation::Less; + + g_MeshRenderer.Pipeline = CreateGraphicsPipeline(graphicsDevice, pipelineCI); + if (g_MeshRenderer.Pipeline == nullptr) + { + LogError(LogCategory::Graphics, "Failed to create graphics pipeline!"); + result = false; + } + + // Create the vertex and index buffers + BufferCreateInfo vertexBufferCI = {}; + vertexBufferCI.Size = kGeometryPage; + vertexBufferCI.Usage = BufferUsage::StructuredBuffer; + g_MeshRenderer.VertexBuffer = CreateGraphicsBuffer(graphicsDevice, vertexBufferCI); + + BufferCreateInfo indexBufferCI = {}; + indexBufferCI.Size = kIndexPage; + indexBufferCI.Usage = BufferUsage::IndexBuffer; + g_MeshRenderer.IndexBuffer = CreateGraphicsBuffer(graphicsDevice, indexBufferCI); + + if (vertexShader) + { + DestroyShader(graphicsDevice, vertexShader); + } + if (fragmentShader) + { + DestroyShader(graphicsDevice, fragmentShader); + } + + return result; } void ShutdownMeshRenderer() { - return; - // DestroyGraphicsBuffer(g_MeshRenderer.Device, g_MeshRenderer.IndexBuffer); - // DestroyGraphicsBuffer(g_MeshRenderer.Device, g_MeshRenderer.VertexBuffer); - // - // g_MeshRenderer.Indices.Destroy(); - // g_MeshRenderer.Vertices.Destroy(); - // g_MeshRenderer.Meshes.Destroy(); + if (g_MeshRenderer.LoadCopyBuffer) + { + UnmapGraphicsTransferBuffer(g_MeshRenderer.Device, g_MeshRenderer.LoadCopyBuffer); + DestroyGraphicsTransferBuffer(g_MeshRenderer.Device, g_MeshRenderer.LoadCopyBuffer); + g_MeshRenderer.LoadCopyBuffer = nullptr; + } + + DestroyGraphicsBuffer(g_MeshRenderer.Device, g_MeshRenderer.IndexBuffer); + DestroyGraphicsBuffer(g_MeshRenderer.Device, g_MeshRenderer.VertexBuffer); + + g_MeshRenderer.Indices.Destroy(); + g_MeshRenderer.Vertices.Destroy(); + g_MeshRenderer.Meshes.Destroy(); } void LoadMeshesOnGPU(NonNullPtr cmdList) @@ -119,12 +121,18 @@ namespace Juliet Vertex* vertices = g_MeshRenderer.Vertices.Data; if (!vertices) { + UnmapGraphicsTransferBuffer(g_MeshRenderer.Device, g_MeshRenderer.LoadCopyBuffer); + DestroyGraphicsTransferBuffer(g_MeshRenderer.Device, g_MeshRenderer.LoadCopyBuffer); + g_MeshRenderer.LoadCopyBuffer = nullptr; return; } Index* indices = g_MeshRenderer.Indices.Data; if (!indices) { + UnmapGraphicsTransferBuffer(g_MeshRenderer.Device, g_MeshRenderer.LoadCopyBuffer); + DestroyGraphicsTransferBuffer(g_MeshRenderer.Device, g_MeshRenderer.LoadCopyBuffer); + g_MeshRenderer.LoadCopyBuffer = nullptr; return; } @@ -181,11 +189,12 @@ namespace Juliet pushData.BufferIndex = vertexDescriptorIndex; SetPushConstants(cmdList, ShaderStage::Vertex, 0, sizeof(pushData) / 4, &pushData); + SetIndexBuffer(cmdList, g_MeshRenderer.IndexBuffer, IndexFormat::UInt16, g_MeshRenderer.Indices.Count, 0); + for (Mesh& mesh : g_MeshRenderer.Meshes) { - SetIndexBuffer(cmdList, g_MeshRenderer.IndexBuffer, IndexFormat::UInt16, mesh.IndexCount, 0); - // DrawIndexedPrimitives(pass, static_cast(mesh.IndexCount), 1, static_cast(mesh.IndexOffset), - // static_cast(mesh.VertexOffset), 0); + DrawIndexedPrimitives(pass, static_cast(mesh.IndexCount), 1, static_cast(mesh.IndexOffset), + static_cast(mesh.VertexOffset), 0); } } @@ -194,41 +203,41 @@ namespace Juliet Mesh result = {}; constexpr Vertex vertexData[] = { - // Front Face (Z = -0.5f) - { { -0.5f, 0.5f, -0.5f }, { 0.0f, 0.0f } }, // 0: Top Left - { { 0.5f, 0.5f, -0.5f }, { 1.0f, 0.0f } }, // 1: Top Right - { { 0.5f, -0.5f, -0.5f }, { 1.0f, 1.0f } }, // 2: Bottom Right - { { -0.5f, -0.5f, -0.5f }, { 0.0f, 1.0f } }, // 3: Bottom Left + // Front Face (Z = -0.5f) — Red + { { -0.5f, 0.5f, -0.5f }, { 0.8f, 0.2f, 0.2f, 1.0f } }, + { { 0.5f, 0.5f, -0.5f }, { 0.8f, 0.2f, 0.2f, 1.0f } }, + { { 0.5f, -0.5f, -0.5f }, { 0.8f, 0.2f, 0.2f, 1.0f } }, + { { -0.5f, -0.5f, -0.5f }, { 0.8f, 0.2f, 0.2f, 1.0f } }, - // Back Face (Z = 0.5f) - { { 0.5f, 0.5f, 0.5f }, { 0.0f, 0.0f } }, // 4: Top Left - { { -0.5f, 0.5f, 0.5f }, { 1.0f, 0.0f } }, // 5: Top Right - { { -0.5f, -0.5f, 0.5f }, { 1.0f, 1.0f } }, // 6: Bottom Right - { { 0.5f, -0.5f, 0.5f }, { 0.0f, 1.0f } }, // 7: Bottom Left + // Back Face (Z = 0.5f) — Green + { { 0.5f, 0.5f, 0.5f }, { 0.2f, 0.8f, 0.2f, 1.0f } }, + { { -0.5f, 0.5f, 0.5f }, { 0.2f, 0.8f, 0.2f, 1.0f } }, + { { -0.5f, -0.5f, 0.5f }, { 0.2f, 0.8f, 0.2f, 1.0f } }, + { { 0.5f, -0.5f, 0.5f }, { 0.2f, 0.8f, 0.2f, 1.0f } }, - // Top Face (Y = 0.5f) - { { -0.5f, 0.5f, 0.5f }, { 0.0f, 0.0f } }, // 8: Top Left - { { 0.5f, 0.5f, 0.5f }, { 1.0f, 0.0f } }, // 9: Top Right - { { 0.5f, 0.5f, -0.5f }, { 1.0f, 1.0f } }, // 10: Bottom Right - { { -0.5f, 0.5f, -0.5f }, { 0.0f, 1.0f } }, // 11: Bottom Left + // Top Face (Y = 0.5f) — Blue + { { -0.5f, 0.5f, 0.5f }, { 0.2f, 0.2f, 0.8f, 1.0f } }, + { { 0.5f, 0.5f, 0.5f }, { 0.2f, 0.2f, 0.8f, 1.0f } }, + { { 0.5f, 0.5f, -0.5f }, { 0.2f, 0.2f, 0.8f, 1.0f } }, + { { -0.5f, 0.5f, -0.5f }, { 0.2f, 0.2f, 0.8f, 1.0f } }, - // Bottom Face (Y = -0.5f) - { { -0.5f, -0.5f, -0.5f }, { 0.0f, 0.0f } }, // 12: Top Left - { { 0.5f, -0.5f, -0.5f }, { 1.0f, 0.0f } }, // 13: Top Right - { { 0.5f, -0.5f, 0.5f }, { 1.0f, 1.0f } }, // 14: Bottom Right - { { -0.5f, -0.5f, 0.5f }, { 0.0f, 1.0f } }, // 15: Bottom Left + // Bottom Face (Y = -0.5f) — Yellow + { { -0.5f, -0.5f, -0.5f }, { 0.8f, 0.8f, 0.2f, 1.0f } }, + { { 0.5f, -0.5f, -0.5f }, { 0.8f, 0.8f, 0.2f, 1.0f } }, + { { 0.5f, -0.5f, 0.5f }, { 0.8f, 0.8f, 0.2f, 1.0f } }, + { { -0.5f, -0.5f, 0.5f }, { 0.8f, 0.8f, 0.2f, 1.0f } }, - // Right Face (X = 0.5f) - { { 0.5f, 0.5f, -0.5f }, { 0.0f, 0.0f } }, // 16: Top Left - { { 0.5f, 0.5f, 0.5f }, { 1.0f, 0.0f } }, // 17: Top Right - { { 0.5f, -0.5f, 0.5f }, { 1.0f, 1.0f } }, // 18: Bottom Right - { { 0.5f, -0.5f, -0.5f }, { 0.0f, 1.0f } }, // 19: Bottom Left + // Right Face (X = 0.5f) — Cyan + { { 0.5f, 0.5f, -0.5f }, { 0.2f, 0.8f, 0.8f, 1.0f } }, + { { 0.5f, 0.5f, 0.5f }, { 0.2f, 0.8f, 0.8f, 1.0f } }, + { { 0.5f, -0.5f, 0.5f }, { 0.2f, 0.8f, 0.8f, 1.0f } }, + { { 0.5f, -0.5f, -0.5f }, { 0.2f, 0.8f, 0.8f, 1.0f } }, - // Left Face (X = -0.5f) - { { -0.5f, 0.5f, 0.5f }, { 0.0f, 0.0f } }, // 20: Top Left - { { -0.5f, 0.5f, -0.5f }, { 1.0f, 0.0f } }, // 21: Top Right - { { -0.5f, -0.5f, -0.5f }, { 1.0f, 1.0f } }, // 22: Bottom Right - { { -0.5f, -0.5f, 0.5f }, { 0.0f, 1.0f } } // 23: Bottom Left + // Left Face (X = -0.5f) — Magenta + { { -0.5f, 0.5f, 0.5f }, { 0.8f, 0.2f, 0.8f, 1.0f } }, + { { -0.5f, 0.5f, -0.5f }, { 0.8f, 0.2f, 0.8f, 1.0f } }, + { { -0.5f, -0.5f, -0.5f }, { 0.8f, 0.2f, 0.8f, 1.0f } }, + { { -0.5f, -0.5f, 0.5f }, { 0.8f, 0.2f, 0.8f, 1.0f } } }; constexpr size_t cubeVertexCount = ArraySize(vertexData); result.VertexCount = cubeVertexCount; diff --git a/JulietApp/main.cpp b/JulietApp/main.cpp index 8cdbaa9..0fcac63 100644 --- a/JulietApp/main.cpp +++ b/JulietApp/main.cpp @@ -109,11 +109,11 @@ void JulietApplication::Init() Running = false; } - // std::ignore = AddCube(); - // - // CommandList* loadCmd = AcquireCommandList(GraphicsDevice); - // LoadMeshesOnGPU(loadCmd); - // SubmitCommandLists(loadCmd); + std::ignore = AddCube(); + + CommandList* loadCmd = AcquireCommandList(GraphicsDevice); + LoadMeshesOnGPU(loadCmd); + SubmitCommandLists(loadCmd); if (Running == false) { @@ -269,12 +269,12 @@ void JulietApplication::Update() void JulietApplication::OnPreRender(CommandList* /*cmd*/) {} -void JulietApplication::OnRender(RenderPass*, CommandList*) +void JulietApplication::OnRender(RenderPass* pass, CommandList* cmd) { - // PushData pushData = {}; - // pushData.ViewProjection = Camera_GetViewProjectionMatrix(GetDebugCamera()); + PushData pushData = {}; + pushData.ViewProjection = Camera_GetViewProjectionMatrix(GetDebugCamera()); - // RenderMeshes(pass, cmd, pushData); + RenderMeshes(pass, cmd, pushData); // SetPushConstants(cmd, ShaderStage::Vertex, 0, sizeof(pushData) / 4, &pushData); }