143 lines
4.3 KiB
C++
143 lines
4.3 KiB
C++
#include "Orange/Core/SmallVector.h"
|
|
#include "Orange/Core/Span.h"
|
|
#include <Orange/Core/Result.h>
|
|
#include <Orange/Core/FileSystem.h>
|
|
#include <Orange/Core/Parse.h>
|
|
|
|
#include <Orange/Render/Window.h>
|
|
#include <Orange/Render/RenderContext.h>
|
|
#include <Orange/Render/Swapchain.h>
|
|
|
|
using namespace orange;
|
|
|
|
Result<VoidResult> ParseOBJ(BufferView buffer)
|
|
{
|
|
const char* obj = (const char *)buffer.data;
|
|
do
|
|
{
|
|
SmallVector<char, 8> element;
|
|
stream::ReadString(obj, " #\n", element);
|
|
|
|
if (element == "v" || element == "vn" || element == "vt")
|
|
{
|
|
float vtx[3]{};
|
|
for (int i = 0; i < 3; i++)
|
|
{
|
|
stream::ConsumeSpace(obj);
|
|
auto r_float = stream::Parse<float>(obj);
|
|
if (!r_float) return Result<VoidResult>::Error();
|
|
vtx[i] = *r_float;
|
|
}
|
|
|
|
element.PushBack('\0');
|
|
log::info("Found: %s %f %f %f", element.Data(), vtx[0], vtx[1], vtx[2]);
|
|
}
|
|
else if (element == "g" || element == "o")
|
|
{
|
|
stream::ConsumeSpace(obj);
|
|
SmallVector<char, 32> name;
|
|
stream::ReadString(obj, " #\n", name);
|
|
|
|
name.PushBack('\0');
|
|
if (element == "g")
|
|
log::info("Group name: %s", name.Data());
|
|
else
|
|
log::info("Object name: %s", name.Data());
|
|
}
|
|
else if (element == "f")
|
|
{
|
|
int32_t indices[3][3]{};
|
|
for (int i = 0; i < 3; i++)
|
|
{
|
|
stream::ConsumeSpace(obj);
|
|
|
|
for (int j = 0; j < 3; j++)
|
|
{
|
|
indices[i][j] = -1;
|
|
|
|
if (j == 0 || stream::Consume(obj, "/"))
|
|
{
|
|
auto r_int = stream::Parse<uint32_t>(obj);
|
|
if (!r_int) continue;
|
|
|
|
indices[i][j] = *r_int;
|
|
}
|
|
}
|
|
}
|
|
log::info("Found: f %d/%d/%d %d/%d/%d %d/%d/%d",
|
|
indices[0][0], indices[0][1], indices[0][2],
|
|
indices[1][0], indices[1][1], indices[1][2],
|
|
indices[2][0], indices[2][1], indices[2][2]);
|
|
}
|
|
else if (element.Size())
|
|
{
|
|
element.PushBack('\0');
|
|
log::info("Unknown element: %s", element.Data());
|
|
}
|
|
|
|
stream::AdvancePast(obj, "\n");
|
|
} while (*obj != '\0');
|
|
|
|
return Result<VoidResult>::Success();
|
|
}
|
|
|
|
int main(int argc, char** argv)
|
|
{
|
|
(void)argc; (void)argv;
|
|
|
|
auto r_window = Window::Create();
|
|
if (!r_window)
|
|
return 1;
|
|
|
|
auto r_renderContext = RenderContext::Create("Cube Test");
|
|
if (!r_renderContext)
|
|
return 1;
|
|
|
|
auto r_surface = r_window->CreateSurface(r_renderContext->Instance());
|
|
if (!r_surface)
|
|
return 1;
|
|
|
|
auto r_swapchain = Swapchain::Create(*r_renderContext, *r_surface);
|
|
if (!r_swapchain)
|
|
return 1;
|
|
|
|
auto r_objData = fs::OpenFileIntoBuffer("/home/joshua/chair.obj", true);
|
|
if (!r_objData)
|
|
return 1;
|
|
|
|
ParseOBJ(*r_objData);
|
|
|
|
return 0;
|
|
|
|
while (r_window->Update())
|
|
{
|
|
r_renderContext->BeginCommandBuffer(r_swapchain->CommandBuffer());
|
|
{
|
|
const VkRenderingAttachmentInfoKHR attachmentInfo =
|
|
{
|
|
.sType = VK_STRUCTURE_TYPE_RENDERING_ATTACHMENT_INFO_KHR,
|
|
.imageView = r_swapchain->ImageView(),
|
|
.imageLayout = VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR,
|
|
.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR,
|
|
.storeOp = VK_ATTACHMENT_STORE_OP_STORE,
|
|
.clearValue = { .color = { .float32 = { 1.0f, 0.5f, 0.0f, 1.0f } } },
|
|
};
|
|
|
|
const VkRenderingInfo renderInfo =
|
|
{
|
|
.sType = VK_STRUCTURE_TYPE_RENDERING_INFO,
|
|
.renderArea = { {}, r_swapchain->Extent() },
|
|
.layerCount = 1,
|
|
.colorAttachmentCount = 1,
|
|
.pColorAttachments = &attachmentInfo,
|
|
};
|
|
vkCmdBeginRendering(r_swapchain->CommandBuffer(), &renderInfo);
|
|
vkCmdEndRendering(r_swapchain->CommandBuffer());
|
|
}
|
|
r_renderContext->EndCommandBuffer(r_swapchain->CommandBuffer());
|
|
r_swapchain->Present();
|
|
}
|
|
|
|
return 0;
|
|
}
|