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)
{
(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<CommandList> 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<uint32>(mesh.IndexCount), 1, static_cast<uint32>(mesh.IndexOffset),
// static_cast<uint32>(mesh.VertexOffset), 0);
DrawIndexedPrimitives(pass, static_cast<uint32>(mesh.IndexCount), 1, static_cast<uint32>(mesh.IndexOffset),
static_cast<uint32>(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;

View File

@@ -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);
}