From b9a360cffa2a0b577d55a8b30f50f3c5e3208d58 Mon Sep 17 00:00:00 2001 From: Ben Kyd Date: Tue, 19 Dec 2023 13:30:48 +0000 Subject: [PATCH] need diff --- res/shaders/{unused => }/lines_debug.frag | 4 +- res/shaders/lines_debug.frag.spv | Bin 0 -> 512 bytes res/shaders/lines_debug.vert | 19 ++++ res/shaders/lines_debug.vert.spv | Bin 0 -> 1784 bytes res/shaders/unused/lines_debug.vert | 15 --- res/shaders/vulkan_test.frag | 9 -- res/shaders/vulkan_test.frag.spv | Bin 572 -> 0 bytes res/shaders/vulkan_test.vert | 13 --- res/shaders/vulkan_test.vert.spv | Bin 1052 -> 0 bytes src/graphics/buffer.cpp | 43 +++++++-- src/graphics/buffer.hpp | 13 ++- src/graphics/pipeline.cpp | 4 +- src/graphics/shader.cpp | 19 +++- src/graphics/shader.hpp | 12 ++- src/graphics/vkrenderer.cpp | 8 +- src/graphics/vkrenderer.hpp | 4 +- src/inferno.cpp | 5 +- src/preview_renderer/debug.cpp | 109 ++++++++++++---------- src/preview_renderer/debug.hpp | 11 +-- src/preview_renderer/renderer.cpp | 6 +- src/scene/mesh.hpp | 7 ++ 21 files changed, 185 insertions(+), 116 deletions(-) rename res/shaders/{unused => }/lines_debug.frag (50%) create mode 100644 res/shaders/lines_debug.frag.spv create mode 100644 res/shaders/lines_debug.vert create mode 100644 res/shaders/lines_debug.vert.spv delete mode 100644 res/shaders/unused/lines_debug.vert delete mode 100644 res/shaders/vulkan_test.frag delete mode 100644 res/shaders/vulkan_test.frag.spv delete mode 100644 res/shaders/vulkan_test.vert delete mode 100644 res/shaders/vulkan_test.vert.spv diff --git a/res/shaders/unused/lines_debug.frag b/res/shaders/lines_debug.frag similarity index 50% rename from res/shaders/unused/lines_debug.frag rename to res/shaders/lines_debug.frag index ab65bdb..87aae54 100644 --- a/res/shaders/unused/lines_debug.frag +++ b/res/shaders/lines_debug.frag @@ -1,11 +1,11 @@ #version 450 core -in vec4 vFragPos; +layout (location = 0) in vec3 vFragPos; layout(location = 0) out vec4 outColour; void main() { - outColour = vec4(vFragPos.xyz, 1.0); + outColour = vec4(1., 0., 0., 1.0); } diff --git a/res/shaders/lines_debug.frag.spv b/res/shaders/lines_debug.frag.spv new file mode 100644 index 0000000000000000000000000000000000000000..c0cc3de1587105ef73549951cdf4379813bb3c88 GIT binary patch literal 512 zcmYjNO-sW-6daqTt*!kKL2pv=s1y%c1VIm?dkIwV2P`ECvJjJ!kAgRUo4?A7;LK_v z3oq}@WZupsLFc>=>|um4X81dY=#T-qp6@1ljTTj%EUs^^q?jP^LTRSxqsy*(U%Ol{ z_E}Tbj5_f&;1uvy;EPLL3}GT`Rx1-d*?6Yl zK}bd0H$>>Yi>7`ovZ5*JCr(+m&*l23YLH73UAhw`FHF+|@s&@N=jac!>G`tXXcpr6S2 zseEJN|997IPL@n(=0E?L*_~akG`co!%!rvX)8?Vc*PIy@VuY15U9IibHo9qRU`$n_VX>`+Xk!?gS zwvCocY%_Iz3vZ&pb8$23wTgs5jAFmQ1X<7ihh*PP^+;*Ut78=scGd zJB%7THu-Fm)P99q9^lx-d`j7jXME0?;Vw>h-FNMfoIJ+a6nh)F&O6sl_u{4<#+VYZ zUK9;uf#$(nSnN8K-fi00eu~{eJ2`&SJ2R zF%O@-UlN}O=JPmfD4$x)wIYqMyuX^eW?n3KtIDAU_C;A`=}@w$eCpy859RY;=leYy z_}rzBPs$#VkVhQf-`Bc)YE4UwIeAI_8ChW5(}I2%r9%k|KK_z~n#=MpNy7(Qk;T3G z8pIIxc}1E%5oaIx`FA1jb5(vQp)P&!{rg*ze@#Ah*%y66X|STuXH^(;3nlcyXWltB zmfaOLdA`q0*&`D2`LMB1dOgui!=)z+{Eras|G7|RdRD?bKMG|Ivja?Oi1A+G(ZloR z1{n2sREd7)CFH{=&b@g4ylmnuk6n-rR;;@)!1B6$op?h=Z_60?#9!znybX36sLLRuE(Ouca8Li6)WBIe(lMPlp%l!dX noY96b^5GL_MnBY>`8|-(9}auwF1IASGtR}i@!|bdr>ByCZD)P~ literal 0 HcmV?d00001 diff --git a/res/shaders/unused/lines_debug.vert b/res/shaders/unused/lines_debug.vert deleted file mode 100644 index 2b0c1e5..0000000 --- a/res/shaders/unused/lines_debug.vert +++ /dev/null @@ -1,15 +0,0 @@ -#version 450 core - -layout(location = 0) in vec4 position; - -uniform mat4 model; -uniform mat4 view; -uniform mat4 proj; - -out vec4 vFragPos; - -void main() -{ - vFragPos = model * position; - gl_Position = proj * view * model * position; -} diff --git a/res/shaders/vulkan_test.frag b/res/shaders/vulkan_test.frag deleted file mode 100644 index 32335af..0000000 --- a/res/shaders/vulkan_test.frag +++ /dev/null @@ -1,9 +0,0 @@ -#version 450 core - -layout(location = 0) in vec3 fFragColour; - -layout(location = 0) out vec4 outColour; - -void main() { - outColour = vec4(fFragColour, 1.0); -} diff --git a/res/shaders/vulkan_test.frag.spv b/res/shaders/vulkan_test.frag.spv deleted file mode 100644 index c20ecbc8ece47d8ad1c789ef411889aeee949fa5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 572 zcmYk2%}T>i6oijW)7IAhS>)Ocv*3fEVOkAU=p8xDmHrZlwesPAPXHFqR)3>J8Rl(al zUUIN2>+ z%P`3oRe>u-)z>w*@J{pWE=|&WEk8K2ygaPuuO;hgii}4BiyqCkA1NtWkBih+><_eW zh#L!s((@*I{KxvXRQW6LS7na}9Qw8@dV2I7RsD*BM^8@%xKs6LdxF{L?No0d4_++p z_!i@;UW?`KuE6}0SZ4brr}EDYN)C^$Zdh{M|EToj-xrui&pA16Hk!=LnKPH2b+z(k$(RMRYSzprQ=EpW2rknaMmQ7l9uE^Qq`{_{i1}LsT)5C{kuCqxDNZHQ8>>2#!(pCBnk&M zjry6LM(~#BcsA+BlfgW}6Jx%or&(9k<1r5Jqx2z4v*?dpp#_djY&f==9VSATaz1y+ zahqga`=rj~6ftI2>@v2aD?845Nk5v!*Z{Ff9M58&?#bObo__3LI_p?q?Bv%?+Izel z#=}V}RxRJr6hAfQRtWdtIPI|FO?a(09y7vY9>>E5V?Vwk*zkNI%ycN>;4{y>&wJt1 zV@p}&eO3)>V(-XWlx|CQm9LK{_vzJ?zbxIBaK4s4UkLSD^6S#%gB{9ZHdlif(iZQX zw7bWT(r33|^jXh&MP2&fZ%8=I^D??bsTsCYV$^iJ-4dhzy{2Qn nJqh{niF1z&)#VN!BNullableClientData = data; - void* mData; - vkMapMemory(device->VulkanDevice, buffer->StagingBuffer->DeviceData, 0, bufferSize, 0, - &mData); - memcpy(mData, data, bufferSize); - vkUnmapMemory(device->VulkanDevice, buffer->StagingBuffer->DeviceData); + if (size == 0) { + void* mData; + vkMapMemory(device->VulkanDevice, buffer->StagingBuffer->DeviceData, 0, bufferSize, 0, + &mData); + memcpy(mData, data, bufferSize); + vkUnmapMemory(device->VulkanDevice, buffer->StagingBuffer->DeviceData); + } buffer->GenericBuffer = generic_buffer_create(device, size, bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); - buffer_copy(buffer, device); + if (size == 0) + buffer_copy(buffer, device); return buffer; } @@ -127,6 +130,34 @@ void vertex_buffer_cleanup(Buffer* buffer) delete buffer; } +void vertex_buffer_update(Buffer* buffer, void* data, uint32_t size) +{ + VkDeviceSize bufferSize = size * sizeof(scene::Vert); + + if (buffer->StagingBuffer->Size < bufferSize) { + generic_buffer_cleanup(buffer->StagingBuffer); + generic_buffer_cleanup(buffer->GenericBuffer); + + buffer->StagingBuffer = generic_buffer_create(buffer->GenericBuffer->Device, + size, bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT); + + buffer->GenericBuffer = generic_buffer_create(buffer->GenericBuffer->Device, + size, bufferSize, + VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, + VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT); + } + + void* mData; + vkMapMemory(buffer->GenericBuffer->Device->VulkanDevice, + buffer->StagingBuffer->DeviceData, 0, bufferSize, 0, &mData); + memcpy(mData, data, bufferSize); + vkUnmapMemory(buffer->GenericBuffer->Device->VulkanDevice, + buffer->StagingBuffer->DeviceData); + + buffer_copy(buffer, buffer->GenericBuffer->Device); +} + void vertex_buffer_bind(Buffer* buffer, VkCommandBuffer commandBuffer) { VkBuffer vertexBuffers[] = { buffer->GenericBuffer->Handle }; diff --git a/src/graphics/buffer.hpp b/src/graphics/buffer.hpp index 2792be6..b1e09d0 100644 --- a/src/graphics/buffer.hpp +++ b/src/graphics/buffer.hpp @@ -38,16 +38,21 @@ void generic_buffer_cleanup(GenBuffer* buffer); void buffer_copy(Buffer* buffer, GraphicsDevice* device); -Buffer* vertex_buffer_create(GraphicsDevice* device, void* data, uint32_t size, bool bind = false); +Buffer* vertex_buffer_create( + GraphicsDevice* device, void* data, uint32_t size, bool bind = false); void vertex_buffer_cleanup(Buffer* buffer); +void vertex_buffer_update(Buffer* buffer, void* data, uint32_t size); void vertex_buffer_bind(Buffer* buffer, VkCommandBuffer commandBuffer); -Buffer* index_buffer_create(GraphicsDevice* device, void* data, uint32_t size, bool bind = false); +Buffer* index_buffer_create( + GraphicsDevice* device, void* data, uint32_t size, bool bind = false); void index_buffer_cleanup(Buffer* buffer); +void index_buffer_update(Buffer* buffer, void* data, uint32_t size); void index_buffer_bind(Buffer* buffer, VkCommandBuffer commandBuffer); // We *do* want universally mapped memory to act as a "uniform buffer" -template GenBuffer* uniform_buffer_create(GraphicsDevice* device, bool bind = false) +template +GenBuffer* uniform_buffer_create(GraphicsDevice* device, bool bind = false) { GenBuffer* buffer = generic_buffer_create(device, 0, sizeof(T), VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, @@ -61,7 +66,7 @@ template GenBuffer* uniform_buffer_create(GraphicsDevice* device, bo inline void uniform_buffer_cleanup(GenBuffer* buffer) { generic_buffer_cleanup(buffer); } -template void uniform_buffer_update(GenBuffer* buffer, T* data) +template void uniform_buffer_update(GenBuffer* buffer, T* data) { memcpy(buffer->MappedData, (void*)data, sizeof(T)); } diff --git a/src/graphics/pipeline.cpp b/src/graphics/pipeline.cpp index 3171b27..c93c470 100644 --- a/src/graphics/pipeline.cpp +++ b/src/graphics/pipeline.cpp @@ -44,6 +44,9 @@ Pipeline* pipeline_create(GraphicsDevice* device, SwapChain* swap, Shader* shade inputAssembly.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO; inputAssembly.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST; inputAssembly.primitiveRestartEnable = VK_FALSE; + if (type == PIPELINE_TYPE_GRAPHICS_LINE) { + inputAssembly.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST; + } VkPipelineViewportStateCreateInfo viewportState {}; viewportState.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO; @@ -53,7 +56,6 @@ Pipeline* pipeline_create(GraphicsDevice* device, SwapChain* swap, Shader* shade VkPipelineRasterizationStateCreateInfo rasterizer {}; rasterizer.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO; rasterizer.depthClampEnable = VK_FALSE; // NOTE: This is for shadow mapping - rasterizer.polygonMode = VK_POLYGON_MODE_LINE; rasterizer.rasterizerDiscardEnable = VK_FALSE; rasterizer.polygonMode = VK_POLYGON_MODE_FILL; rasterizer.lineWidth = 1.3f; diff --git a/src/graphics/shader.cpp b/src/graphics/shader.cpp index dbce32d..bb9b8b7 100644 --- a/src/graphics/shader.cpp +++ b/src/graphics/shader.cpp @@ -21,11 +21,13 @@ std::string textFromFile(const std::filesystem::path& path) (std::istreambuf_iterator(input)), std::istreambuf_iterator()); } -Shader* shader_create(GraphicsDevice* device, SwapChain* swapchain) +Shader* shader_create( + GraphicsDevice* device, SwapChain* swapchain, ShaderProgramType type) { Shader* shader = new Shader; shader->Device = device; shader->GraphicsSwapchain = swapchain; + shader->Type = type; return shader; } @@ -173,8 +175,21 @@ void shader_build(Shader* shader) yolo::error("failed to allocate descriptor sets!"); } + PipelineType pipelineType = PIPELINE_TYPE_GRAPHICS; + switch (shader->Type) { + case SHADER_PROGRAM_TYPE_GRAPHICS: + pipelineType = PIPELINE_TYPE_GRAPHICS; + break; + case SHADER_PROGRAM_TYPE_GRAPHICS_LINE: + pipelineType = PIPELINE_TYPE_GRAPHICS_LINE; + break; + default: + yolo::error("Shader type not supported"); + break; + } + shader->GraphicsPipeline = pipeline_create(shader->Device, shader->GraphicsSwapchain, - shader, layouts.size(), layouts.data(), PIPELINE_TYPE_GRAPHICS); + shader, layouts.size(), layouts.data(), pipelineType); shader->GlobalUniformBuffer = uniform_buffer_create(shader->Device, true); } diff --git a/src/graphics/shader.hpp b/src/graphics/shader.hpp index 6e25a02..b3661ec 100644 --- a/src/graphics/shader.hpp +++ b/src/graphics/shader.hpp @@ -19,6 +19,13 @@ struct SwapChain; struct Pipeline; struct GenBuffer; +typedef enum ShaderProgramType { + SHADER_PROGRAM_TYPE_GRAPHICS, + SHADER_PROGRAM_TYPE_GRAPHICS_LINE, + SHADER_PROGRAM_TYPE_COMPUTE, + SHADER_PROGRAM_TYPE_RAYTRACING +} ShaderProgramType; + typedef struct ShaderPushConst { union { glm::mat4 mat[2]; // 64 bytes each @@ -30,6 +37,8 @@ typedef struct ShaderPushConst { typedef struct Shader { GraphicsDevice* Device; + ShaderProgramType Type; + SwapChain* GraphicsSwapchain; Pipeline* GraphicsPipeline; @@ -45,7 +54,8 @@ typedef struct Shader { VkPipelineVertexInputStateCreateInfo VertexInputInfo; } Shader; -Shader* shader_create(GraphicsDevice* device, SwapChain* swapchain); +Shader* shader_create( + GraphicsDevice* device, SwapChain* swapchain, ShaderProgramType type); void shader_cleanup(Shader* shader); void shader_load(Shader* shader, std::filesystem::path path); diff --git a/src/graphics/vkrenderer.cpp b/src/graphics/vkrenderer.cpp index 511fbf2..8ade0b6 100644 --- a/src/graphics/vkrenderer.cpp +++ b/src/graphics/vkrenderer.cpp @@ -198,7 +198,7 @@ bool renderer_begin_frame(VulkanRenderer* renderer) } void renderer_begin_pass( - VulkanRenderer* renderer, RenderTarget* target, VkRect2D renderArea) + VulkanRenderer* renderer, RenderTarget* target, VkRect2D renderArea, bool clear) { VkImageMemoryBarrier imageMemoryBarrier {}; imageMemoryBarrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; @@ -224,6 +224,9 @@ void renderer_begin_pass( attachmentInfo.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR; attachmentInfo.storeOp = VK_ATTACHMENT_STORE_OP_STORE; attachmentInfo.clearValue = clearColor; + if (!clear) { + attachmentInfo.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; + } VkRenderingAttachmentInfo depthAttachmentInfo; if (target->TargetDepth != nullptr) { @@ -237,6 +240,9 @@ void renderer_begin_pass( depthAttachmentInfo.resolveImageView = VK_NULL_HANDLE; depthAttachmentInfo.resolveImageLayout = VK_IMAGE_LAYOUT_GENERAL; depthAttachmentInfo.pNext = VK_NULL_HANDLE; + if (!clear) { + depthAttachmentInfo.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD; + } } VkRenderingInfo renderingInfo {}; diff --git a/src/graphics/vkrenderer.hpp b/src/graphics/vkrenderer.hpp index a21c549..4189a64 100644 --- a/src/graphics/vkrenderer.hpp +++ b/src/graphics/vkrenderer.hpp @@ -67,8 +67,8 @@ void renderer_submit_now(VulkanRenderer* renderer, bool renderer_begin_frame(VulkanRenderer* renderer); -void renderer_begin_pass( - VulkanRenderer* renderer, RenderTarget* target, VkRect2D renderArea); +void renderer_begin_pass(VulkanRenderer* renderer, RenderTarget* target, + VkRect2D renderArea, bool clear = true); // this is for rendering to the swapchain / present image void renderer_begin_pass(VulkanRenderer* renderer, VkRect2D renderArea); diff --git a/src/inferno.cpp b/src/inferno.cpp index 9bf9ee1..919466f 100644 --- a/src/inferno.cpp +++ b/src/inferno.cpp @@ -14,6 +14,7 @@ #include "graphics/shader.hpp" #include "graphics/swapchain.hpp" #include "graphics/vkrenderer.hpp" +#include "preview_renderer/debug.hpp" #include "window.hpp" // #include "preview_renderer/debug.hpp" @@ -292,7 +293,7 @@ int inferno_run(InfernoApp* app) ImGui::Checkbox("Show Preview", &showPreview); graphics::preview_draw_ui(app->PreviewRenderer); if (ImGui::TreeNode("Debug Overlay")) { - // graphics::debug_draw_ui(); + graphics::debug_draw_ui(); ImGui::TreePop(); } ImGui::TreePop(); @@ -323,6 +324,8 @@ int inferno_run(InfernoApp* app) lastViewport = currentViewport; graphics::preview_draw(app->PreviewRenderer, app->Scene); + // graphics::debug_draw_line({0, 0, 0}, {1, 1, 0}, {1, 1, 0}); + // graphics::debug_draw_to_target(app->Scene); ImTextureID texture = (ImTextureID)graphics::preview_get_target(app->PreviewRenderer) diff --git a/src/preview_renderer/debug.cpp b/src/preview_renderer/debug.cpp index a44c5d8..f894f2b 100644 --- a/src/preview_renderer/debug.cpp +++ b/src/preview_renderer/debug.cpp @@ -1,9 +1,14 @@ #include "debug.hpp" -#include "preview_renderer/renderer.hpp" -#include "graphics/shader.hpp" #include "graphics/buffer.hpp" +#include "graphics/rendertarget.hpp" +#include "graphics/shader.hpp" +#include "graphics/vkrenderer.hpp" + +#include "preview_renderer/renderer.hpp" + #include "scene/camera.hpp" +#include "scene/mesh.hpp" #include "scene/scene.hpp" #include @@ -26,34 +31,31 @@ struct DebugTextBillboard { struct _DebugInternal { std::mutex DebugMutex; - Buffer* LineBuffer; + Buffer* LineBuffer = nullptr; Shader* LineShader; }; static DebugDrawer* DebugDrawerInstance = nullptr; -void debug_init() +void debug_init(PreviewRenderer* renderer) { DebugDrawerInstance = new DebugDrawer; + DebugDrawerInstance->Renderer = renderer; DebugDrawerInstance->LineElements = std::vector(); - DebugDrawerInstance->BillboardElements = std::vector(); + // DebugDrawerInstance->BillboardElements = std::vector(); DebugDrawerInstance->_Internal = new _DebugInternal; - // DebugDrawerInstance->_Internal->LineShader = shader_create(); + // DebugDrawerInstance->_Internal->LineShader = shader_create(renderer->Renderer->Device, + // renderer->Renderer->Swap, SHADER_PROGRAM_TYPE_GRAPHICS_LINE); + // graphics::shader_load( + // DebugDrawerInstance->_Internal->LineShader, "res/shaders/lines_debug"); + // graphics::shader_build(DebugDrawerInstance->_Internal->LineShader); yolo::debug("DebugDrawer initialized"); } -void debug_cleanup() -{ - delete DebugDrawerInstance; -} - -void debug_attach_renderer(PreviewRenderer* renderer) -{ - DebugDrawerInstance->Renderer = renderer; -} +void debug_cleanup() { delete DebugDrawerInstance; } void debug_draw_line(glm::vec3 start, glm::vec3 end, glm::vec3 color) { @@ -61,55 +63,62 @@ void debug_draw_line(glm::vec3 start, glm::vec3 end, glm::vec3 color) 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_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_ui() { ImGui::Checkbox("Show Overlay", &DebugDrawerInstance->DoShow); } void debug_draw_to_target(scene::Scene* scene) { if (!DebugDrawerInstance->DoShow) return; - auto renderer = DebugDrawerInstance->Renderer; + uint32_t bufferSize + = DebugDrawerInstance->LineElements.size() * sizeof(DebugLine) * 2; + scene::DebugLineVert* bufferData = new scene::DebugLineVert[bufferSize]; - 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; + bufferData[i * 2] = { DebugDrawerInstance->LineElements[i].Start, + DebugDrawerInstance->LineElements[i].Color }; + bufferData[i * 2 + 1] = { DebugDrawerInstance->LineElements[i].End, + DebugDrawerInstance->LineElements[i].Color }; } + if (bufferSize > 0 && DebugDrawerInstance->_Internal->LineBuffer == nullptr) { + DebugDrawerInstance->_Internal->LineBuffer = vertex_buffer_create( + DebugDrawerInstance->Renderer->Renderer->Device, bufferData, bufferSize); + } - // glDrawArrays(GL_LINES, 0, vertex_position_arr_size); + auto backend = DebugDrawerInstance->Renderer->Renderer; + VkCommandBuffer commandBuffer = *backend->CommandBufferInFlight; + + graphics::renderer_begin_pass(backend, + DebugDrawerInstance->Renderer->PreviewRenderTarget, + DebugDrawerInstance->Renderer->Viewport, false); + + graphics::shader_use(DebugDrawerInstance->_Internal->LineShader, commandBuffer, + DebugDrawerInstance->Renderer->Viewport); + + scene::GlobalUniformObject GlobalUniformObject { + .Projection = graphics::camera_get_projection(scene->Camera), + .View = graphics::camera_get_view(scene->Camera), + }; + + graphics::shader_update_state(DebugDrawerInstance->_Internal->LineShader, + commandBuffer, GlobalUniformObject, backend->CurrentFrameIndex); + + graphics::vertex_buffer_bind( + DebugDrawerInstance->_Internal->LineBuffer, commandBuffer); + + vkCmdDraw(commandBuffer, DebugDrawerInstance->LineElements.size() * 2, 1, 0, 0); + + graphics::renderer_end_pass(backend); 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(); + delete[] bufferData; } } diff --git a/src/preview_renderer/debug.hpp b/src/preview_renderer/debug.hpp index c53636b..e950da2 100644 --- a/src/preview_renderer/debug.hpp +++ b/src/preview_renderer/debug.hpp @@ -21,21 +21,20 @@ struct DebugTextBillboard; struct _DebugInternal; struct DebugDrawer { + PreviewRenderer* Renderer = nullptr; _DebugInternal* _Internal = nullptr; bool DoShow = true; - PreviewRenderer* Renderer = nullptr; + std::vector LineElements; - std::vector BillboardElements; + // std::vector BillboardElements; }; -void debug_init(); +void debug_init(PreviewRenderer* renderer); 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_text_billboard(glm::vec3 position, glm::vec3 color, std::string text); void debug_draw_ui(); diff --git a/src/preview_renderer/renderer.cpp b/src/preview_renderer/renderer.cpp index 05cf283..5380a82 100644 --- a/src/preview_renderer/renderer.cpp +++ b/src/preview_renderer/renderer.cpp @@ -30,7 +30,8 @@ PreviewRenderer* preview_create(VulkanRenderer* vkrenderer) PreviewRenderer* renderer = new PreviewRenderer; renderer->Renderer = vkrenderer; - renderer->DrawShader = graphics::shader_create(vkrenderer->Device, vkrenderer->Swap); + renderer->DrawShader = graphics::shader_create( + vkrenderer->Device, vkrenderer->Swap, SHADER_PROGRAM_TYPE_GRAPHICS); graphics::shader_load(renderer->DrawShader, "res/shaders/basic"); graphics::shader_build(renderer->DrawShader); @@ -39,8 +40,7 @@ PreviewRenderer* preview_create(VulkanRenderer* vkrenderer) renderer->Renderer->Device, { 1920, 1080 }, VK_FORMAT_R8G8B8A8_UNORM, true); // bind preview renderer to debugdraw - debug_init(); - debug_attach_renderer(renderer); + // debug_init(renderer); return renderer; } diff --git a/src/scene/mesh.hpp b/src/scene/mesh.hpp index 0e2dc18..f759f81 100644 --- a/src/scene/mesh.hpp +++ b/src/scene/mesh.hpp @@ -21,8 +21,15 @@ struct Vert { glm::vec3 Normal; }; +struct DebugLineVert { + glm::vec3 Position; + glm::vec3 Color; +}; + using Index = uint32_t; +// NOTE: Out of coincidence, this is the same for both vert and debug line vert +// TODO: Make this a template // somehow VkVertexInputBindingDescription get_vert_binding_description(); std::array get_vert_attribute_descriptions();