Fixed MeshRenderer, our cube is now totally drawn by mesh renderer !

This commit is contained in:
2026-02-21 22:45:20 -05:00
parent 2362cefbc0
commit 8e83cd32f6
2 changed files with 128 additions and 119 deletions

View File

@@ -16,87 +16,89 @@ namespace Juliet
bool InitializeMeshRenderer(NonNullPtr<Arena> arena, NonNullPtr<GraphicsDevice> device, NonNullPtr<Window> window) bool InitializeMeshRenderer(NonNullPtr<Arena> arena, NonNullPtr<GraphicsDevice> device, NonNullPtr<Window> window)
{ {
(void)arena; bool result = true;
(void)device;
(void)window; g_MeshRenderer.Meshes.Create(arena JULIET_DEBUG_PARAM("Meshes"));
return true; g_MeshRenderer.Vertices.Create(arena JULIET_DEBUG_PARAM("Vertices"));
// bool result = true; g_MeshRenderer.Indices.Create(arena JULIET_DEBUG_PARAM("Indices"));
//
// g_MeshRenderer.Meshes.Create(arena JULIET_DEBUG_PARAM("Meshes")); GraphicsDevice* graphicsDevice = g_MeshRenderer.Device = device.Get();
// g_MeshRenderer.Vertices.Create(arena JULIET_DEBUG_PARAM("Vertices"));
// g_MeshRenderer.Indices.Create(arena JULIET_DEBUG_PARAM("Indices")); // Create graphics pipeline
// String entryPoint = WrapString("main");
// GraphicsDevice* graphicsDevice = g_MeshRenderer.Device = device.Get(); ShaderCreateInfo shaderCI = {};
// shaderCI.EntryPoint = entryPoint;
// // Create graphics pipeline
// String entryPoint = WrapString("main"); // TODO: Assets management that handles path to assets or something.
// ShaderCreateInfo shaderCI = {}; String shaderPath = WrapString("../../Assets/compiled/Triangle.vert.dxil");
// shaderCI.EntryPoint = entryPoint; shaderCI.Stage = ShaderStage::Vertex;
// Shader* vertexShader = CreateShader(graphicsDevice, shaderPath, shaderCI);
// // TODO: Assets management that handles path to assets or something.
// String shaderPath = WrapString("../../Assets/compiled/Triangle.vert.dxil"); shaderPath = WrapString("../../Assets/compiled/SolidColor.frag.dxil");
// shaderCI.Stage = ShaderStage::Vertex; shaderCI.Stage = ShaderStage::Fragment;
// Shader* vertexShader = CreateShader(graphicsDevice, shaderPath, shaderCI); Shader* fragmentShader = CreateShader(graphicsDevice, shaderPath, shaderCI);
//
// shaderPath = WrapString("../../Assets/compiled/SolidColor.frag.dxil"); ColorTargetDescription colorTargetDescription = {};
// shaderCI.Stage = ShaderStage::Fragment; colorTargetDescription.Format = GetSwapChainTextureFormat(graphicsDevice, window);
// Shader* fragmentShader = CreateShader(graphicsDevice, shaderPath, shaderCI);
// GraphicsPipelineCreateInfo pipelineCI = {};
// ColorTargetDescription colorTargetDescription = {}; pipelineCI.VertexShader = vertexShader;
// colorTargetDescription.Format = GetSwapChainTextureFormat(graphicsDevice, window); pipelineCI.FragmentShader = fragmentShader;
// pipelineCI.PrimitiveType = PrimitiveType::TriangleList;
// GraphicsPipelineCreateInfo pipelineCI = {}; pipelineCI.TargetInfo = { .ColorTargetDescriptions = &colorTargetDescription,
// pipelineCI.VertexShader = vertexShader; .NumColorTargets = 1,
// pipelineCI.FragmentShader = fragmentShader; .DepthStencilFormat = TextureFormat::D32_FLOAT,
// pipelineCI.PrimitiveType = PrimitiveType::TriangleList; .HasDepthStencilTarget = true };
// pipelineCI.TargetInfo = { .ColorTargetDescriptions = &colorTargetDescription, pipelineCI.RasterizerState.FillMode = FillMode::Solid;
// .NumColorTargets = 1, pipelineCI.DepthStencilState.EnableDepthTest = true;
// .DepthStencilFormat = TextureFormat::D32_FLOAT, pipelineCI.DepthStencilState.EnableDepthWrite = true;
// .HasDepthStencilTarget = true }; pipelineCI.DepthStencilState.CompareOperation = CompareOperation::Less;
// pipelineCI.RasterizerState.FillMode = FillMode::Solid;
// pipelineCI.DepthStencilState.EnableDepthTest = true; g_MeshRenderer.Pipeline = CreateGraphicsPipeline(graphicsDevice, pipelineCI);
// pipelineCI.DepthStencilState.EnableDepthWrite = true; if (g_MeshRenderer.Pipeline == nullptr)
// pipelineCI.DepthStencilState.CompareOperation = CompareOperation::Less; {
// LogError(LogCategory::Graphics, "Failed to create graphics pipeline!");
// g_MeshRenderer.Pipeline = CreateGraphicsPipeline(graphicsDevice, pipelineCI); result = false;
// if (g_MeshRenderer.Pipeline == nullptr) }
// {
// LogError(LogCategory::Graphics, "Failed to create graphics pipeline!"); // Create the vertex and index buffers
// result = false; BufferCreateInfo vertexBufferCI = {};
// } vertexBufferCI.Size = kGeometryPage;
// vertexBufferCI.Usage = BufferUsage::StructuredBuffer;
// // Create the vertex and index buffers g_MeshRenderer.VertexBuffer = CreateGraphicsBuffer(graphicsDevice, vertexBufferCI);
// BufferCreateInfo vertexBufferCI = {};
// vertexBufferCI.Size = kGeometryPage; BufferCreateInfo indexBufferCI = {};
// vertexBufferCI.Usage = BufferUsage::VertexBuffer; indexBufferCI.Size = kIndexPage;
// g_MeshRenderer.VertexBuffer = CreateGraphicsBuffer(graphicsDevice, vertexBufferCI); indexBufferCI.Usage = BufferUsage::IndexBuffer;
// g_MeshRenderer.IndexBuffer = CreateGraphicsBuffer(graphicsDevice, indexBufferCI);
// BufferCreateInfo indexBufferCI = {};
// indexBufferCI.Size = kIndexPage; if (vertexShader)
// indexBufferCI.Usage = BufferUsage::IndexBuffer; {
// g_MeshRenderer.IndexBuffer = CreateGraphicsBuffer(graphicsDevice, indexBufferCI); DestroyShader(graphicsDevice, vertexShader);
// }
// if (vertexShader) if (fragmentShader)
// { {
// DestroyShader(graphicsDevice, vertexShader); DestroyShader(graphicsDevice, fragmentShader);
// } }
// if (fragmentShader)
// { return result;
// DestroyShader(graphicsDevice, fragmentShader);
// }
//
// return result;
} }
void ShutdownMeshRenderer() void ShutdownMeshRenderer()
{ {
return; if (g_MeshRenderer.LoadCopyBuffer)
// DestroyGraphicsBuffer(g_MeshRenderer.Device, g_MeshRenderer.IndexBuffer); {
// DestroyGraphicsBuffer(g_MeshRenderer.Device, g_MeshRenderer.VertexBuffer); UnmapGraphicsTransferBuffer(g_MeshRenderer.Device, g_MeshRenderer.LoadCopyBuffer);
// DestroyGraphicsTransferBuffer(g_MeshRenderer.Device, g_MeshRenderer.LoadCopyBuffer);
// g_MeshRenderer.Indices.Destroy(); g_MeshRenderer.LoadCopyBuffer = nullptr;
// g_MeshRenderer.Vertices.Destroy(); }
// g_MeshRenderer.Meshes.Destroy();
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<CommandList> cmdList) void LoadMeshesOnGPU(NonNullPtr<CommandList> cmdList)
@@ -119,12 +121,18 @@ namespace Juliet
Vertex* vertices = g_MeshRenderer.Vertices.Data; Vertex* vertices = g_MeshRenderer.Vertices.Data;
if (!vertices) if (!vertices)
{ {
UnmapGraphicsTransferBuffer(g_MeshRenderer.Device, g_MeshRenderer.LoadCopyBuffer);
DestroyGraphicsTransferBuffer(g_MeshRenderer.Device, g_MeshRenderer.LoadCopyBuffer);
g_MeshRenderer.LoadCopyBuffer = nullptr;
return; return;
} }
Index* indices = g_MeshRenderer.Indices.Data; Index* indices = g_MeshRenderer.Indices.Data;
if (!indices) if (!indices)
{ {
UnmapGraphicsTransferBuffer(g_MeshRenderer.Device, g_MeshRenderer.LoadCopyBuffer);
DestroyGraphicsTransferBuffer(g_MeshRenderer.Device, g_MeshRenderer.LoadCopyBuffer);
g_MeshRenderer.LoadCopyBuffer = nullptr;
return; return;
} }
@@ -181,11 +189,12 @@ namespace Juliet
pushData.BufferIndex = vertexDescriptorIndex; pushData.BufferIndex = vertexDescriptorIndex;
SetPushConstants(cmdList, ShaderStage::Vertex, 0, sizeof(pushData) / 4, &pushData); 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) for (Mesh& mesh : g_MeshRenderer.Meshes)
{ {
SetIndexBuffer(cmdList, g_MeshRenderer.IndexBuffer, IndexFormat::UInt16, mesh.IndexCount, 0); DrawIndexedPrimitives(pass, static_cast<uint32>(mesh.IndexCount), 1, static_cast<uint32>(mesh.IndexOffset),
// DrawIndexedPrimitives(pass, static_cast<uint32>(mesh.IndexCount), 1, static_cast<uint32>(mesh.IndexOffset), static_cast<uint32>(mesh.VertexOffset), 0);
// static_cast<uint32>(mesh.VertexOffset), 0);
} }
} }
@@ -194,41 +203,41 @@ namespace Juliet
Mesh result = {}; Mesh result = {};
constexpr Vertex vertexData[] = { constexpr Vertex vertexData[] = {
// Front Face (Z = -0.5f) // Front Face (Z = -0.5f) — Red
{ { -0.5f, 0.5f, -0.5f }, { 0.0f, 0.0f } }, // 0: Top Left { { -0.5f, 0.5f, -0.5f }, { 0.8f, 0.2f, 0.2f, 1.0f } },
{ { 0.5f, 0.5f, -0.5f }, { 1.0f, 0.0f } }, // 1: Top Right { { 0.5f, 0.5f, -0.5f }, { 0.8f, 0.2f, 0.2f, 1.0f } },
{ { 0.5f, -0.5f, -0.5f }, { 1.0f, 1.0f } }, // 2: Bottom Right { { 0.5f, -0.5f, -0.5f }, { 0.8f, 0.2f, 0.2f, 1.0f } },
{ { -0.5f, -0.5f, -0.5f }, { 0.0f, 1.0f } }, // 3: Bottom Left { { -0.5f, -0.5f, -0.5f }, { 0.8f, 0.2f, 0.2f, 1.0f } },
// Back Face (Z = 0.5f) // Back Face (Z = 0.5f) — Green
{ { 0.5f, 0.5f, 0.5f }, { 0.0f, 0.0f } }, // 4: Top Left { { 0.5f, 0.5f, 0.5f }, { 0.2f, 0.8f, 0.2f, 1.0f } },
{ { -0.5f, 0.5f, 0.5f }, { 1.0f, 0.0f } }, // 5: Top Right { { -0.5f, 0.5f, 0.5f }, { 0.2f, 0.8f, 0.2f, 1.0f } },
{ { -0.5f, -0.5f, 0.5f }, { 1.0f, 1.0f } }, // 6: Bottom Right { { -0.5f, -0.5f, 0.5f }, { 0.2f, 0.8f, 0.2f, 1.0f } },
{ { 0.5f, -0.5f, 0.5f }, { 0.0f, 1.0f } }, // 7: Bottom Left { { 0.5f, -0.5f, 0.5f }, { 0.2f, 0.8f, 0.2f, 1.0f } },
// Top Face (Y = 0.5f) // Top Face (Y = 0.5f) — Blue
{ { -0.5f, 0.5f, 0.5f }, { 0.0f, 0.0f } }, // 8: Top Left { { -0.5f, 0.5f, 0.5f }, { 0.2f, 0.2f, 0.8f, 1.0f } },
{ { 0.5f, 0.5f, 0.5f }, { 1.0f, 0.0f } }, // 9: Top Right { { 0.5f, 0.5f, 0.5f }, { 0.2f, 0.2f, 0.8f, 1.0f } },
{ { 0.5f, 0.5f, -0.5f }, { 1.0f, 1.0f } }, // 10: Bottom Right { { 0.5f, 0.5f, -0.5f }, { 0.2f, 0.2f, 0.8f, 1.0f } },
{ { -0.5f, 0.5f, -0.5f }, { 0.0f, 1.0f } }, // 11: Bottom Left { { -0.5f, 0.5f, -0.5f }, { 0.2f, 0.2f, 0.8f, 1.0f } },
// Bottom Face (Y = -0.5f) // Bottom Face (Y = -0.5f) — Yellow
{ { -0.5f, -0.5f, -0.5f }, { 0.0f, 0.0f } }, // 12: Top Left { { -0.5f, -0.5f, -0.5f }, { 0.8f, 0.8f, 0.2f, 1.0f } },
{ { 0.5f, -0.5f, -0.5f }, { 1.0f, 0.0f } }, // 13: Top Right { { 0.5f, -0.5f, -0.5f }, { 0.8f, 0.8f, 0.2f, 1.0f } },
{ { 0.5f, -0.5f, 0.5f }, { 1.0f, 1.0f } }, // 14: Bottom Right { { 0.5f, -0.5f, 0.5f }, { 0.8f, 0.8f, 0.2f, 1.0f } },
{ { -0.5f, -0.5f, 0.5f }, { 0.0f, 1.0f } }, // 15: Bottom Left { { -0.5f, -0.5f, 0.5f }, { 0.8f, 0.8f, 0.2f, 1.0f } },
// Right Face (X = 0.5f) // Right Face (X = 0.5f) — Cyan
{ { 0.5f, 0.5f, -0.5f }, { 0.0f, 0.0f } }, // 16: Top Left { { 0.5f, 0.5f, -0.5f }, { 0.2f, 0.8f, 0.8f, 1.0f } },
{ { 0.5f, 0.5f, 0.5f }, { 1.0f, 0.0f } }, // 17: Top Right { { 0.5f, 0.5f, 0.5f }, { 0.2f, 0.8f, 0.8f, 1.0f } },
{ { 0.5f, -0.5f, 0.5f }, { 1.0f, 1.0f } }, // 18: Bottom Right { { 0.5f, -0.5f, 0.5f }, { 0.2f, 0.8f, 0.8f, 1.0f } },
{ { 0.5f, -0.5f, -0.5f }, { 0.0f, 1.0f } }, // 19: Bottom Left { { 0.5f, -0.5f, -0.5f }, { 0.2f, 0.8f, 0.8f, 1.0f } },
// Left Face (X = -0.5f) // Left Face (X = -0.5f) — Magenta
{ { -0.5f, 0.5f, 0.5f }, { 0.0f, 0.0f } }, // 20: Top Left { { -0.5f, 0.5f, 0.5f }, { 0.8f, 0.2f, 0.8f, 1.0f } },
{ { -0.5f, 0.5f, -0.5f }, { 1.0f, 0.0f } }, // 21: Top Right { { -0.5f, 0.5f, -0.5f }, { 0.8f, 0.2f, 0.8f, 1.0f } },
{ { -0.5f, -0.5f, -0.5f }, { 1.0f, 1.0f } }, // 22: Bottom Right { { -0.5f, -0.5f, -0.5f }, { 0.8f, 0.2f, 0.8f, 1.0f } },
{ { -0.5f, -0.5f, 0.5f }, { 0.0f, 1.0f } } // 23: Bottom Left { { -0.5f, -0.5f, 0.5f }, { 0.8f, 0.2f, 0.8f, 1.0f } }
}; };
constexpr size_t cubeVertexCount = ArraySize(vertexData); constexpr size_t cubeVertexCount = ArraySize(vertexData);
result.VertexCount = cubeVertexCount; result.VertexCount = cubeVertexCount;

View File

@@ -109,11 +109,11 @@ void JulietApplication::Init()
Running = false; Running = false;
} }
// std::ignore = AddCube(); std::ignore = AddCube();
//
// CommandList* loadCmd = AcquireCommandList(GraphicsDevice); CommandList* loadCmd = AcquireCommandList(GraphicsDevice);
// LoadMeshesOnGPU(loadCmd); LoadMeshesOnGPU(loadCmd);
// SubmitCommandLists(loadCmd); SubmitCommandLists(loadCmd);
if (Running == false) if (Running == false)
{ {
@@ -269,12 +269,12 @@ void JulietApplication::Update()
void JulietApplication::OnPreRender(CommandList* /*cmd*/) {} void JulietApplication::OnPreRender(CommandList* /*cmd*/) {}
void JulietApplication::OnRender(RenderPass*, CommandList*) void JulietApplication::OnRender(RenderPass* pass, CommandList* cmd)
{ {
// PushData pushData = {}; PushData pushData = {};
// pushData.ViewProjection = Camera_GetViewProjectionMatrix(GetDebugCamera()); pushData.ViewProjection = Camera_GetViewProjectionMatrix(GetDebugCamera());
// RenderMeshes(pass, cmd, pushData); RenderMeshes(pass, cmd, pushData);
// SetPushConstants(cmd, ShaderStage::Vertex, 0, sizeof(pushData) / 4, &pushData); // SetPushConstants(cmd, ShaderStage::Vertex, 0, sizeof(pushData) / 4, &pushData);
} }