Fixed MeshRenderer, our cube is now totally drawn by mesh renderer !
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user