diff --git a/CMakeLists.txt b/CMakeLists.txt index 9865d18..3fef00f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required(VERSION 3.13) project(inferno) -file(GLOB SRC "src/*.cpp" "src/graphics/*.cpp" "src/preview_renderer/*.cpp" "src/scene/*.cpp" "src/thirdparty/imgui/*.cpp") +file(GLOB SRC "src/*.cpp" "src/graphics/*.cpp" "src/preview_renderer/*.cpp" "src/scene/*.cpp" "src/thirdparty/imgui/*.cpp" "src/preview_renderer/*.cpp") add_executable(inferno ${SRC}) target_include_directories(inferno PRIVATE "libhart/thirdparty") diff --git a/src/graphics/vkrenderer.hpp b/src/graphics/vkrenderer.hpp index f408b99..9f5da00 100644 --- a/src/graphics/vkrenderer.hpp +++ b/src/graphics/vkrenderer.hpp @@ -21,6 +21,8 @@ typedef struct FrameInFlight { VkSemaphore RenderFinished; VkFence Fence; + // Global Uniform Buffer + // TODO: We also need push constants GenBuffer* UniformBuffer; } FrameInFlight; diff --git a/src/inferno.cpp b/src/inferno.cpp index d36ded1..cb2d637 100644 --- a/src/inferno.cpp +++ b/src/inferno.cpp @@ -96,13 +96,11 @@ InfernoApp* inferno_create() graphics::window_create("Inferno v" INFERNO_VERSION, 1920, 1080); app->Device = graphics::device_create(); app->Renderer = graphics::renderer_create(app->Device); + app->PreviewRenderer = graphics::preview_create(app->Renderer); graphics::renderer_configure_command_buffer(app->Renderer); graphics::renderer_configure_gui(app->Renderer); - app->PreviewTarget = graphics::rendertarget_create( - app->Device, { 1920, 1080 }, VK_FORMAT_R8G8B8A8_UNORM, true); - graphics::renderer_submit_repeat( app->Renderer, [](graphics::VulkanRenderer* renderer, VkCommandBuffer* commandBuffer) { @@ -120,9 +118,6 @@ InfernoApp* inferno_create() }, true); - app->Shader = graphics::shader_create(app->Device, app->Renderer->Swap); - graphics::shader_load(app->Shader, "res/shaders/basic"); - graphics::shader_build(app->Shader); scene::Mesh* mesh = scene::mesh_create(app->Device); scene::mesh_load_obj(mesh, "res/cornell-box.obj"); @@ -259,10 +254,6 @@ int inferno_run(InfernoApp* app) if (!inferno_pre(app)) continue; - VkCommandBuffer commandBuffer - = app->Renderer->CommandBuffersInFlight[app->Renderer->CurrentFrameIndex]; - uint32_t frameIndex = app->Renderer->CurrentFrameIndex; - if (glm::length(app->Input->MouseDelta) > 0.0f) graphics::camera_mouse_move(app->Scene->Camera, app->Input->MouseDelta, inferno_timer_get_time(app->MainTimer).count()); @@ -323,51 +314,12 @@ int inferno_run(InfernoApp* app) graphics::camera_raster_set_viewport(scene::scene_get_camera(app->Scene), { ImGui::GetWindowSize().x, ImGui::GetWindowSize().y }); - // graphics::preview_set_viewport(app->PreviewRenderer, app->Scene->Camera); - { - app->PreviewRenderArea = { 0, 0, (uint32_t)ImGui::GetWindowSize().x, - (uint32_t)ImGui::GetWindowSize().y }; + graphics::preview_set_viewport(app->PreviewRenderer, app->Scene->Camera); + graphics::preview_draw(app->PreviewRenderer, app->Scene); - // if changed - if (app->PreviewRenderArea.extent.width - != app->LastPreviewRenderArea.extent.width - || app->PreviewRenderArea.extent.height - != app->LastPreviewRenderArea.extent.height) { - - graphics::camera_raster_set_viewport(app->Scene->Camera, - { ImGui::GetWindowSize().x, ImGui::GetWindowSize().y }); - - graphics::rendertarget_recreate( - app->PreviewTarget, app->PreviewRenderArea.extent, VK_FORMAT_R8G8B8A8_UNORM); - } - - graphics::renderer_begin_pass( - app->Renderer, app->PreviewTarget, app->PreviewRenderArea); - - graphics::shader_use(app->Shader, commandBuffer, app->PreviewRenderArea); - scene::GlobalUniformObject globalUniformObject { - .Projection = graphics::camera_get_projection(app->Scene->Camera), - .View = graphics::camera_get_view(app->Scene->Camera), - }; - - graphics::shader_update_state( - app->Shader, commandBuffer, globalUniformObject, frameIndex); - - for (auto& object : scene::scene_get_renderables(app->Scene)) { - graphics::vertex_buffer_bind( - object->Meshs[0]->VertexBuffer, commandBuffer); - graphics::index_buffer_bind( - object->Meshs[0]->IndexBuffer, commandBuffer); - - vkCmdDrawIndexed(commandBuffer, - object->Meshs[0]->IndexBuffer->GenericBuffer->Count, 1, 0, 0, 0); - } - - graphics::renderer_end_pass(app->Renderer); - app->LastPreviewRenderArea = app->PreviewRenderArea; - } - - ImTextureID texture = (ImTextureID)app->PreviewTarget->DescriptorSet; + ImTextureID texture + = (ImTextureID)graphics::preview_get_target(app->PreviewRenderer) + ->DescriptorSet; ImGui::Image(texture, { ImGui::GetWindowSize().x, ImGui::GetWindowSize().y }, ImVec2(0, 1), ImVec2(1, 0)); ImGui::End(); diff --git a/src/inferno.hpp b/src/inferno.hpp index a2ce073..94632b2 100644 --- a/src/inferno.hpp +++ b/src/inferno.hpp @@ -56,16 +56,11 @@ typedef struct InfernoApp { InfernoInput* Input; scene::Scene* Scene; - graphics::RenderTarget* PreviewTarget; - VkRect2D PreviewRenderArea; - VkRect2D LastPreviewRenderArea; - graphics::Shader* Shader; - - // graphics::PreviewRenderer* PreviewRenderer; - graphics::RayRenderer* RayRenderer; - - graphics::VulkanRenderer* Renderer; graphics::GraphicsDevice* Device; + graphics::VulkanRenderer* Renderer; + + graphics::PreviewRenderer* PreviewRenderer; + graphics::RayRenderer* RayRenderer; InfernoTimer* MainTimer; uint64_t FrameCount; @@ -79,6 +74,7 @@ void inferno_stop_move_input(InfernoApp* app); bool inferno_pre(InfernoApp* app); void inferno_end(InfernoApp* app); + int inferno_run(InfernoApp* app); } // namespace inferno diff --git a/src/preview_renderer/debug.cpp b/src/preview_renderer/debug.cpp index 320daa2..a44c5d8 100644 --- a/src/preview_renderer/debug.cpp +++ b/src/preview_renderer/debug.cpp @@ -1,153 +1,115 @@ -// #include "debug.hpp" -// -// #include "preview_renderer/renderer.hpp" -// #include "preview_renderer/shader.hpp" -// #include "scene/camera.hpp" -// #include "scene/scene.hpp" -// -// #include -// #include -// -// namespace inferno::graphics { -// -// struct DebugLine { -// glm::vec3 Start; -// glm::vec3 End; -// glm::vec3 Color; -// }; -// -// struct DebugTextBillboard { -// glm::vec3 Position; -// glm::vec3 Color; -// std::string Text; -// }; -// -// struct _DebugInternal { -// std::mutex DebugMutex; -// -// GLuint VAO; -// GLuint VBO; -// Shader* LineShader; -// }; -// -// static DebugDrawer* DebugDrawerInstance = nullptr; -// -// void debug_init() -// { -// DebugDrawerInstance = new DebugDrawer; -// -// DebugDrawerInstance->LineElements = std::vector(); -// DebugDrawerInstance->BillboardElements = std::vector(); -// -// DebugDrawerInstance->_Internal = new _DebugInternal; -// DebugDrawerInstance->_Internal->LineShader = shader_create(); -// shader_load(DebugDrawerInstance->_Internal->LineShader, "res/shaders/lines_debug.glsl"); -// shader_link(DebugDrawerInstance->_Internal->LineShader); -// -// glGenVertexArrays(1, &DebugDrawerInstance->_Internal->VAO); -// glBindVertexArray(DebugDrawerInstance->_Internal->VAO); -// -// glGenBuffers(1, &DebugDrawerInstance->_Internal->VBO); -// glBindBuffer(GL_ARRAY_BUFFER, DebugDrawerInstance->_Internal->VBO); -// -// yolo::debug("DebugDrawer initialized"); -// } -// -// void debug_cleanup() -// { -// delete DebugDrawerInstance; -// } -// -// void debug_attach_renderer(PreviewRenderer* renderer) -// { -// DebugDrawerInstance->Renderer = renderer; -// } -// -// void debug_draw_line(glm::vec3 start, glm::vec3 end, glm::vec3 color) -// { -// std::lock_guard lock(DebugDrawerInstance->_Internal->DebugMutex); -// DebugDrawerInstance->LineElements.push_back({ start, end, color }); -// } -// -// void debug_draw_text_billboard(glm::vec3 position, glm::vec3 color, std::string text) -// { -// std::lock_guard lock(DebugDrawerInstance->_Internal->DebugMutex); -// DebugDrawerInstance->BillboardElements.push_back({ position, color, text }); -// } -// -// void debug_draw_ui() -// { -// ImGui::Checkbox("Show Overlay", &DebugDrawerInstance->DoShow); -// } -// -// void debug_draw_to_target(scene::Scene* scene) -// { -// if (!DebugDrawerInstance->DoShow) -// return; -// -// auto renderer = DebugDrawerInstance->Renderer; -// -// glBindFramebuffer(GL_FRAMEBUFFER, renderer->RenderTarget); -// -// glDisable(GL_DEPTH_TEST); -// -// glBindBuffer(GL_ARRAY_BUFFER, DebugDrawerInstance->_Internal->VBO); -// glBindVertexArray(DebugDrawerInstance->_Internal->VAO); -// -// GLuint vertex_position_arr_size = DebugDrawerInstance->LineElements.size() * 2 * 3; -// GLfloat vertex_position_arr[vertex_position_arr_size]; -// for (int i = 0; i < DebugDrawerInstance->LineElements.size(); i++) { -// auto line = DebugDrawerInstance->LineElements[i]; -// vertex_position_arr[i * 6 + 0] = line.Start.x; -// vertex_position_arr[i * 6 + 1] = line.Start.y; -// vertex_position_arr[i * 6 + 2] = line.Start.z; -// vertex_position_arr[i * 6 + 3] = line.End.x; -// vertex_position_arr[i * 6 + 4] = line.End.y; -// vertex_position_arr[i * 6 + 5] = line.End.z; -// } -// -// glBufferData(GL_ARRAY_BUFFER, vertex_position_arr_size * sizeof(GLfloat), vertex_position_arr, GL_STATIC_DRAW); -// -// Shader* shader = DebugDrawerInstance->_Internal->LineShader; -// shader_use(shader); -// -// GLint posAttrib = glGetAttribLocation(graphics::shader_get_program(shader), "position"); -// glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 0, 0); -// glEnableVertexAttribArray(posAttrib); -// -// auto viewMatrix = graphics::camera_get_view(scene::scene_get_camera(scene)); -// auto projMatrix = graphics::camera_get_projection(scene::scene_get_camera(scene)); -// -// GLint uniTrans = glGetUniformLocation(graphics::shader_get_program(shader), "model"); -// glUniformMatrix4fv(uniTrans, 1, GL_FALSE, glm::value_ptr(glm::mat4(1.0f))); -// -// GLint uniView = glGetUniformLocation(graphics::shader_get_program(shader), "view"); -// glUniformMatrix4fv(uniView, 1, GL_FALSE, glm::value_ptr(viewMatrix)); -// -// GLint uniProj = glGetUniformLocation(graphics::shader_get_program(shader), "proj"); -// glUniformMatrix4fv(uniProj, 1, GL_FALSE, glm::value_ptr(projMatrix)); -// -// glDrawArrays(GL_LINES, 0, vertex_position_arr_size); -// -// DebugDrawerInstance->LineElements.clear(); -// -// // glEnable(GL_TEXTURE_2D); -// // glEnable(GL_BLEND); -// // glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); -// // -// // for (auto& billboard : DebugDrawerInstance->BillboardElements) { -// // glColor3f(billboard.Color.x, billboard.Color.y, billboard.Color.z); -// // glRasterPos3f(billboard.Position.x, billboard.Position.y, billboard.Position.z); -// // -// // for (auto& c : billboard.Text) { -// // glutBitmapCharacter(GL_BITMAP, c); -// // } -// // } -// -// DebugDrawerInstance->BillboardElements.clear(); -// -// glEnable(GL_DEPTH_TEST); -// glBindFramebuffer(GL_FRAMEBUFFER, 0); -// } -// -// } +#include "debug.hpp" + +#include "preview_renderer/renderer.hpp" +#include "graphics/shader.hpp" +#include "graphics/buffer.hpp" +#include "scene/camera.hpp" +#include "scene/scene.hpp" + +#include +#include + +namespace inferno::graphics { + +struct DebugLine { + glm::vec3 Start; + glm::vec3 End; + glm::vec3 Color; +}; + +struct DebugTextBillboard { + glm::vec3 Position; + glm::vec3 Color; + std::string Text; +}; + +struct _DebugInternal { + std::mutex DebugMutex; + + Buffer* LineBuffer; + Shader* LineShader; +}; + +static DebugDrawer* DebugDrawerInstance = nullptr; + +void debug_init() +{ + DebugDrawerInstance = new DebugDrawer; + + DebugDrawerInstance->LineElements = std::vector(); + DebugDrawerInstance->BillboardElements = std::vector(); + + DebugDrawerInstance->_Internal = new _DebugInternal; + // DebugDrawerInstance->_Internal->LineShader = shader_create(); + + yolo::debug("DebugDrawer initialized"); +} + +void debug_cleanup() +{ + delete DebugDrawerInstance; +} + +void debug_attach_renderer(PreviewRenderer* renderer) +{ + DebugDrawerInstance->Renderer = renderer; +} + +void debug_draw_line(glm::vec3 start, glm::vec3 end, glm::vec3 color) +{ + std::lock_guard lock(DebugDrawerInstance->_Internal->DebugMutex); + DebugDrawerInstance->LineElements.push_back({ start, end, color }); +} + +void debug_draw_text_billboard(glm::vec3 position, glm::vec3 color, std::string text) +{ + std::lock_guard lock(DebugDrawerInstance->_Internal->DebugMutex); + DebugDrawerInstance->BillboardElements.push_back({ position, color, text }); +} + +void debug_draw_ui() +{ + ImGui::Checkbox("Show Overlay", &DebugDrawerInstance->DoShow); +} + +void debug_draw_to_target(scene::Scene* scene) +{ + if (!DebugDrawerInstance->DoShow) + return; + + auto renderer = DebugDrawerInstance->Renderer; + + GLuint vertex_position_arr_size = DebugDrawerInstance->LineElements.size() * 2 * 3; + GLfloat vertex_position_arr[vertex_position_arr_size]; + for (int i = 0; i < DebugDrawerInstance->LineElements.size(); i++) { + auto line = DebugDrawerInstance->LineElements[i]; + vertex_position_arr[i * 6 + 0] = line.Start.x; + vertex_position_arr[i * 6 + 1] = line.Start.y; + vertex_position_arr[i * 6 + 2] = line.Start.z; + vertex_position_arr[i * 6 + 3] = line.End.x; + vertex_position_arr[i * 6 + 4] = line.End.y; + vertex_position_arr[i * 6 + 5] = line.End.z; + } + + + // glDrawArrays(GL_LINES, 0, vertex_position_arr_size); + + DebugDrawerInstance->LineElements.clear(); + + // glEnable(GL_TEXTURE_2D); + // glEnable(GL_BLEND); + // glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + // + // for (auto& billboard : DebugDrawerInstance->BillboardElements) { + // glColor3f(billboard.Color.x, billboard.Color.y, billboard.Color.z); + // glRasterPos3f(billboard.Position.x, billboard.Position.y, billboard.Position.z); + // + // for (auto& c : billboard.Text) { + // glutBitmapCharacter(GL_BITMAP, c); + // } + // } + + DebugDrawerInstance->BillboardElements.clear(); +} + +} diff --git a/src/preview_renderer/debug.hpp b/src/preview_renderer/debug.hpp index 8cb66b3..c53636b 100644 --- a/src/preview_renderer/debug.hpp +++ b/src/preview_renderer/debug.hpp @@ -1,44 +1,44 @@ -// #pragma once -// -// #include -// -// #include -// #include -// #include -// #include -// -// namespace inferno::scene { -// struct Scene; -// } -// -// namespace inferno::graphics { -// -// struct PreviewRenderer; -// -// struct DebugLine; -// struct DebugTextBillboard; -// -// struct _DebugInternal; -// -// struct DebugDrawer { -// _DebugInternal* _Internal = nullptr; -// -// bool DoShow = true; -// PreviewRenderer* Renderer = nullptr; -// std::vector LineElements; -// std::vector BillboardElements; -// }; -// -// void debug_init(); -// void debug_cleanup(); -// -// void debug_attach_renderer(PreviewRenderer* renderer); -// -// void debug_draw_line(glm::vec3 start, glm::vec3 end, glm::vec3 color); -// void debug_draw_text_billboard(glm::vec3 position, glm::vec3 color, std::string text); -// -// void debug_draw_ui(); -// -// void debug_draw_to_target(scene::Scene* scene); -// -// } +#pragma once + +#include + +#include +#include +#include +#include + +namespace inferno::scene { +struct Scene; +} + +namespace inferno::graphics { + +struct PreviewRenderer; + +struct DebugLine; +struct DebugTextBillboard; + +struct _DebugInternal; + +struct DebugDrawer { + _DebugInternal* _Internal = nullptr; + + bool DoShow = true; + PreviewRenderer* Renderer = nullptr; + std::vector LineElements; + std::vector BillboardElements; +}; + +void debug_init(); +void debug_cleanup(); + +void debug_attach_renderer(PreviewRenderer* renderer); + +void debug_draw_line(glm::vec3 start, glm::vec3 end, glm::vec3 color); +void debug_draw_text_billboard(glm::vec3 position, glm::vec3 color, std::string text); + +void debug_draw_ui(); + +void debug_draw_to_target(scene::Scene* scene); + +} diff --git a/src/preview_renderer/renderer.cpp b/src/preview_renderer/renderer.cpp index 931182c..f8743f6 100644 --- a/src/preview_renderer/renderer.cpp +++ b/src/preview_renderer/renderer.cpp @@ -1,150 +1,102 @@ -// #include "renderer.hpp" -// -// #include -// -// #include "preview_renderer/debug.hpp" -// #include "scene/object.hpp" -// #include "shader.hpp" -// -// #include -// -// #include -// #include -// #include -// #include -// #include -// #include -// -// #include -// -// namespace inferno::graphics { -// -// PreviewRenderer* preview_create() -// { -// PreviewRenderer* renderer = new PreviewRenderer; -// -// glGenFramebuffers(1, &renderer->RenderTarget); -// glBindFramebuffer(GL_FRAMEBUFFER, renderer->RenderTarget); -// -// glGenTextures(1, &renderer->RenderTargetTexture); -// glBindTexture(GL_TEXTURE_2D, renderer->RenderTargetTexture); -// glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 800, 600, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); -// -// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); -// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); -// -// glGenTextures(1, &renderer->RenderTargetDepthTexture); -// glBindTexture(GL_TEXTURE_2D, renderer->RenderTargetDepthTexture); -// glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, 800, 600, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); -// -// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); -// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); -// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); -// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); -// -// // Attach the texture to the framebuffer. -// glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, renderer->RenderTargetDepthTexture, 0); -// glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, renderer->RenderTargetTexture, 0); -// -// assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE); -// glBindFramebuffer(GL_FRAMEBUFFER, 0); -// -// // bind preview renderer to debugdraw -// debug_init(); -// debug_attach_renderer(renderer); -// -// return renderer; -// } -// -// void preview_cleanup(PreviewRenderer* renderer) -// { -// } -// -// void preview_draw_ui(PreviewRenderer* renderer) -// { -// } -// -// void preview_set_viewport(PreviewRenderer* renderer, Camera* camera) -// { -// auto viewport = camera_raster_get_viewport(camera); -// renderer->Viewport = viewport; -// -// glBindFramebuffer(GL_FRAMEBUFFER, renderer->RenderTarget); -// -// glBindTexture(GL_TEXTURE_2D, renderer->RenderTargetTexture); -// glTexImage2D( -// GL_TEXTURE_2D, -// 0, -// GL_RGB, -// renderer->Viewport.x, -// renderer->Viewport.y, -// 0, -// GL_RGB, -// GL_UNSIGNED_BYTE, -// NULL); -// -// glBindTexture(GL_TEXTURE_2D, renderer->RenderTargetDepthTexture); -// glTexImage2D(GL_TEXTURE_2D, -// 0, -// GL_DEPTH24_STENCIL8, -// renderer->Viewport.x, -// renderer->Viewport.y, -// 0, -// GL_DEPTH_COMPONENT, -// GL_FLOAT, -// NULL); -// -// glBindFramebuffer(GL_FRAMEBUFFER, 0); -// } -// -// GLuint preview_get_rendered_texture(PreviewRenderer* renderer) -// { -// glBindFramebuffer(GL_FRAMEBUFFER, renderer->RenderTarget); -// return renderer->RenderTargetTexture; -// } -// -// void preview_draw(PreviewRenderer* renderer, scene::Scene* scene) -// { -// // clear -// glBindFramebuffer(GL_FRAMEBUFFER, renderer->RenderTarget); -// glClearColor(0.1, 0.1, 0.1, 1.0); -// glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); -// glBindFramebuffer(GL_FRAMEBUFFER, 0); -// -// // draw -// glBindFramebuffer(GL_FRAMEBUFFER, renderer->RenderTarget); -// glViewport(0, -// 0, -// renderer->Viewport.x, -// renderer->Viewport.y); -// -// glEnable(GL_DEPTH_TEST); -// -// for (scene::SceneObject* o : scene::scene_get_renderables(scene)) { -// for (scene::Mesh* m : scene::scene_object_get_meshs(o)) { -// graphics::Shader* shader = m->getMaterial()->getGlShader(); -// graphics::shader_use(shader); -// -// auto viewMatrix = graphics::camera_get_view(scene::scene_get_camera(scene)); -// auto projMatrix = graphics::camera_get_projection(scene::scene_get_camera(scene)); -// -// GLint uniTrans = glGetUniformLocation(graphics::shader_get_program(shader), "model"); -// glUniformMatrix4fv(uniTrans, 1, GL_FALSE, glm::value_ptr(glm::mat4(1.0f))); -// -// GLint uniView = glGetUniformLocation(graphics::shader_get_program(shader), "view"); -// glUniformMatrix4fv(uniView, 1, GL_FALSE, glm::value_ptr(viewMatrix)); -// -// GLint uniProj = glGetUniformLocation(graphics::shader_get_program(shader), "proj"); -// glUniformMatrix4fv(uniProj, 1, GL_FALSE, glm::value_ptr(projMatrix)); -// -// glBindVertexArray(m->getVAO()); -// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m->getEBO()); -// -// glDrawElements(GL_TRIANGLES, m->getIndexCount() * sizeof(uint32_t), GL_UNSIGNED_INT, 0); -// } -// } -// -// glBindFramebuffer(GL_FRAMEBUFFER, 0); -// } -// -// } +#include "renderer.hpp" + +#include + +#include "preview_renderer/debug.hpp" + +#include "graphics/buffer.hpp" +#include "graphics/rendertarget.hpp" +#include "graphics/shader.hpp" +#include "graphics/vkrenderer.hpp" + +#include "scene/mesh.hpp" +#include "scene/object.hpp" +#include "scene/scene.hpp" + +#include + +#include +#include +#include +#include +#include + +#include + +namespace inferno::graphics { + +PreviewRenderer* preview_create(VulkanRenderer* vkrenderer) +{ + PreviewRenderer* renderer = new PreviewRenderer; + renderer->Renderer = vkrenderer; + + renderer->DrawShader = graphics::shader_create(vkrenderer->Device, vkrenderer->Swap); + + graphics::shader_load(renderer->DrawShader, "res/shaders/basic"); + graphics::shader_build(renderer->DrawShader); + + renderer->PreviewRenderTarget = graphics::rendertarget_create( + renderer->Renderer->Device, { 1920, 1080 }, VK_FORMAT_R8G8B8A8_UNORM, true); + + // bind preview renderer to debugdraw + debug_init(); + debug_attach_renderer(renderer); + + return renderer; +} + +void preview_cleanup(PreviewRenderer* renderer) { } + +void preview_draw_ui(PreviewRenderer* renderer) { } + +void preview_set_viewport(PreviewRenderer* renderer, Camera* camera) +{ + auto viewport = camera_raster_get_viewport(camera); + renderer->Viewport.offset.x = 0; + renderer->Viewport.offset.y = 0; + renderer->Viewport.extent.width = viewport.x; + renderer->Viewport.extent.height = viewport.y; +} + +RenderTarget* preview_get_target(PreviewRenderer* renderer) +{ + return renderer->PreviewRenderTarget; +} + +void preview_draw(PreviewRenderer* renderer, scene::Scene* scene) +{ + VkCommandBuffer commandBuffer = *renderer->Renderer->CommandBufferInFlight; + // if changed + if (renderer->HasViewportChanged) { + graphics::rendertarget_recreate(renderer->PreviewRenderTarget, + renderer->Viewport.extent, VK_FORMAT_R8G8B8A8_UNORM); + } + + graphics::renderer_begin_pass( + renderer->Renderer, renderer->PreviewRenderTarget, renderer->Viewport); + + graphics::shader_use(renderer->DrawShader, commandBuffer, renderer->Viewport); + + scene::GlobalUniformObject globalUniformObject { + .Projection = graphics::camera_get_projection(scene->Camera), + .View = graphics::camera_get_view(scene->Camera), + }; + + graphics::shader_update_state(renderer->DrawShader, commandBuffer, globalUniformObject, + renderer->Renderer->CurrentFrameIndex); + + for (scene::SceneObject* o : scene::scene_get_renderables(scene)) { + for (scene::Mesh* m : scene::scene_object_get_meshs(o)) { + + graphics::vertex_buffer_bind(m->VertexBuffer, commandBuffer); + graphics::index_buffer_bind(m->IndexBuffer, commandBuffer); + + vkCmdDrawIndexed( + commandBuffer, m->IndexBuffer->GenericBuffer->Count, 1, 0, 0, 0); + } + } + graphics::renderer_end_pass(renderer->Renderer); + // app->LastPreviewRenderArea = app->PreviewRenderArea; +} + +} diff --git a/src/preview_renderer/renderer.hpp b/src/preview_renderer/renderer.hpp index 84e171b..f48a97a 100644 --- a/src/preview_renderer/renderer.hpp +++ b/src/preview_renderer/renderer.hpp @@ -1,37 +1,43 @@ -// #pragma once -// -// #include -// -// #include -// -// namespace inferno::scene { -// struct Scene; -// } -// -// namespace inferno::graphics { -// -// struct Viewport; -// struct Camera; -// struct DebugDraw; -// -// typedef struct PreviewRenderer { -// glm::ivec2 Viewport; -// -// GLuint RenderTarget = 0; -// GLuint RenderTargetTexture = 0; -// GLuint RenderTargetDepthTexture = 0; -// } PreviewRenderer; -// -// PreviewRenderer* preview_create(); -// void preview_cleanup(PreviewRenderer* renderer); -// -// void preview_draw_debug_ui(PreviewRenderer* renderer); -// -// void preview_draw_ui(PreviewRenderer* renderer); -// void preview_set_viewport(PreviewRenderer* renderer, Camera* camera); -// -// GLuint preview_get_rendered_texture(PreviewRenderer* renderer); -// -// void preview_draw(PreviewRenderer* renderer, scene::Scene* scene); -// -// } // namespace inferno::graphics +#pragma once + +#include + +#include + +namespace inferno::scene { +struct Scene; +} + +namespace inferno::graphics { + +struct VulkanRenderer; +struct Viewport; +struct Camera; +struct DebugDraw; +struct RenderTarget; +struct Shader; + +typedef struct PreviewRenderer { + VulkanRenderer* Renderer; + + RenderTarget* PreviewRenderTarget; + + Shader* DrawShader; + + VkRect2D Viewport; + bool HasViewportChanged = false; +} PreviewRenderer; + +PreviewRenderer* preview_create(VulkanRenderer* renderer); +void preview_cleanup(PreviewRenderer* renderer); + +void preview_draw_debug_ui(PreviewRenderer* renderer); + +void preview_draw_ui(PreviewRenderer* renderer); +void preview_set_viewport(PreviewRenderer* renderer, Camera* camera); + +RenderTarget* preview_get_target(PreviewRenderer* renderer); + +void preview_draw(PreviewRenderer* renderer, scene::Scene* scene); + +} // namespace inferno::graphics