aboutsummaryrefslogtreecommitdiff
path: root/src/platform/vulkan
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform/vulkan')
-rw-r--r--src/platform/vulkan/vulkan_index_buffer.cpp25
-rw-r--r--src/platform/vulkan/vulkan_index_buffer.h22
-rw-r--r--src/platform/vulkan/vulkan_renderer.cpp191
-rw-r--r--src/platform/vulkan/vulkan_renderer.h5
-rw-r--r--src/platform/vulkan/vulkan_renderer_api.cpp86
-rw-r--r--src/platform/vulkan/vulkan_renderer_api.h38
-rw-r--r--src/platform/vulkan/vulkan_shader.cpp146
-rw-r--r--src/platform/vulkan/vulkan_shader.h52
-rw-r--r--src/platform/vulkan/vulkan_texture.cpp73
-rw-r--r--src/platform/vulkan/vulkan_texture.h60
-rw-r--r--src/platform/vulkan/vulkan_uniform_buffer.cpp25
-rw-r--r--src/platform/vulkan/vulkan_uniform_buffer.h19
-rw-r--r--src/platform/vulkan/vulkan_vertex_array.cpp36
-rw-r--r--src/platform/vulkan/vulkan_vertex_array.h28
-rw-r--r--src/platform/vulkan/vulkan_vertex_buffer.cpp34
-rw-r--r--src/platform/vulkan/vulkan_vertex_buffer.h26
16 files changed, 189 insertions, 677 deletions
diff --git a/src/platform/vulkan/vulkan_index_buffer.cpp b/src/platform/vulkan/vulkan_index_buffer.cpp
deleted file mode 100644
index a6e5912..0000000
--- a/src/platform/vulkan/vulkan_index_buffer.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-#include "vulkan_index_buffer.h"
-
-namespace Donut
-{
- VulkanIndexBuffer::VulkanIndexBuffer(uint32_t* indices, uint32_t count)
- : m_count(count)
- {
- // TODO(Hachem): Implement Vulkan index buffer creation
- }
-
- VulkanIndexBuffer::~VulkanIndexBuffer()
- {
- // TODO(Hachem): Implement Vulkan index buffer cleanup
- }
-
- auto VulkanIndexBuffer::bind() const -> void
- {
- // TODO(Hachem): Implement Vulkan index buffer binding
- }
-
- auto VulkanIndexBuffer::unbind() const -> void
- {
- // TODO(Hachem): Implement Vulkan index buffer unbinding
- }
-};
diff --git a/src/platform/vulkan/vulkan_index_buffer.h b/src/platform/vulkan/vulkan_index_buffer.h
deleted file mode 100644
index a0734a8..0000000
--- a/src/platform/vulkan/vulkan_index_buffer.h
+++ /dev/null
@@ -1,22 +0,0 @@
-#pragma once
-
-#include "rendering/index_buffer.h"
-
-namespace Donut
-{
- class VulkanIndexBuffer
- : public IndexBuffer
- {
- public:
- VulkanIndexBuffer(uint32_t* indices, uint32_t count);
- virtual ~VulkanIndexBuffer();
-
- virtual auto bind() const -> void override;
- virtual auto unbind() const -> void override;
-
- virtual auto get_count() const -> uint32_t override{ return m_count; }
- private:
- uint32_t m_renderer_id;
- uint32_t m_count;
- };
-};
diff --git a/src/platform/vulkan/vulkan_renderer.cpp b/src/platform/vulkan/vulkan_renderer.cpp
index 69d6501..cad0a44 100644
--- a/src/platform/vulkan/vulkan_renderer.cpp
+++ b/src/platform/vulkan/vulkan_renderer.cpp
@@ -121,6 +121,20 @@ namespace Donut
VkPipelineLayout present_pipeline_layout = VK_NULL_HANDLE;
VkPipeline present_pipeline = VK_NULL_HANDLE;
+ // World-builder scene view (grid now; sphere/skybox next). Normal-scale
+ // orbital camera; geometry drawn straight into the swapchain render pass.
+ bool scene_mode = false;
+ Camera scene_camera{ 45.0f, (float)GEO_W / (float)GEO_H, 0.1f, 1000.0f };
+ VkBuffer grid_vb = VK_NULL_HANDLE; VkDeviceMemory grid_vb_mem = VK_NULL_HANDLE;
+ uint32_t grid_vertex_count = 0;
+ VkBuffer grid_ubo = VK_NULL_HANDLE; VkDeviceMemory grid_ubo_mem = VK_NULL_HANDLE;
+ void* grid_ubo_mapped = nullptr;
+ VkDescriptorSetLayout grid_set_layout = VK_NULL_HANDLE;
+ VkDescriptorPool grid_pool = VK_NULL_HANDLE;
+ VkDescriptorSet grid_set = VK_NULL_HANDLE;
+ VkPipelineLayout grid_pipeline_layout = VK_NULL_HANDLE;
+ VkPipeline grid_pipeline = VK_NULL_HANDLE;
+
auto find_memory_type(uint32_t type_filter, VkMemoryPropertyFlags flags) const -> uint32_t;
auto create_buffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags props, VkBuffer& buf, VkDeviceMemory& mem) const -> bool;
static auto load_spirv(const std::string& path) -> std::vector<uint32_t>;
@@ -138,8 +152,10 @@ namespace Donut
auto create_hdri_cubemap(const char* path) -> bool;
auto rebuild_hdri_cubemap(const char* path) -> void;
auto create_present_resources() -> bool;
+ auto create_scene_resources() -> bool;
auto process_input() -> void;
auto update_geodesic_uniforms() -> void;
+ auto update_scene_uniforms() -> void;
auto destroy_geodesic_resources() -> void;
auto recreate_swapchain() -> bool;
auto cleanup_swapchain() -> void;
@@ -931,6 +947,120 @@ namespace Donut
return true;
}
+ auto VulkanRenderer::Impl::create_scene_resources() -> bool
+ {
+ const VkMemoryPropertyFlags host_vis = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT;
+
+ // Scene camera: normal-scale orbital viewer (matches the OpenGL world-builder).
+ scene_camera.set_camera_mode(CameraMode::Orbital);
+ scene_camera.set_orbital_target(glm::vec3(0.0f));
+ scene_camera.set_orbital_radius(15.0);
+ scene_camera.set_orbital_limits(2.0, 200.0);
+ scene_camera.set_orbital_speed(0.01f);
+ scene_camera.set_zoom_speed(2.0);
+ scene_camera.set_azimuth(0.0f);
+ scene_camera.set_elevation((float)std::numbers::pi / 3.0f);
+ scene_camera.update_orbital();
+
+ // Line grid on the XZ plane (+/-50 units, 1-unit cells). Grid.slang scales
+ // the position by u_GridSize/50, so u_GridSize = 50 keeps it 1:1.
+ std::vector<glm::vec3> lines;
+ const int N = 50;
+ for (int i = -N; i <= N; ++i)
+ {
+ lines.push_back({ (float)i, 0.0f, (float)-N });
+ lines.push_back({ (float)i, 0.0f, (float) N });
+ lines.push_back({ (float)-N, 0.0f, (float)i });
+ lines.push_back({ (float) N, 0.0f, (float)i });
+ }
+ grid_vertex_count = (uint32_t)lines.size();
+ VkDeviceSize vbsize = lines.size() * sizeof(glm::vec3);
+ if (!create_buffer(vbsize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, host_vis, grid_vb, grid_vb_mem)) return false;
+ void* mp = nullptr; vkMapMemory(device, grid_vb_mem, 0, vbsize, 0, &mp); memcpy(mp, lines.data(), vbsize); vkUnmapMemory(device, grid_vb_mem);
+
+ // $Globals UBO (set 0, binding 0), std140, 176 bytes; refilled each frame.
+ if (!create_buffer(176, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, host_vis, grid_ubo, grid_ubo_mem)) return false;
+ vkMapMemory(device, grid_ubo_mem, 0, 176, 0, &grid_ubo_mapped);
+
+ VkDescriptorSetLayoutBinding b{}; b.binding = 0; b.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; b.descriptorCount = 1; b.stageFlags = VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT;
+ VkDescriptorSetLayoutCreateInfo dslci{ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO }; dslci.bindingCount = 1; dslci.pBindings = &b;
+ VK_CHECK(vkCreateDescriptorSetLayout(device, &dslci, nullptr, &grid_set_layout));
+ VkDescriptorPoolSize psize{ VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1 };
+ VkDescriptorPoolCreateInfo dpci{ VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO }; dpci.maxSets = 1; dpci.poolSizeCount = 1; dpci.pPoolSizes = &psize;
+ VK_CHECK(vkCreateDescriptorPool(device, &dpci, nullptr, &grid_pool));
+ VkDescriptorSetAllocateInfo dsai{ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO }; dsai.descriptorPool = grid_pool; dsai.descriptorSetCount = 1; dsai.pSetLayouts = &grid_set_layout;
+ VK_CHECK(vkAllocateDescriptorSets(device, &dsai, &grid_set));
+ VkDescriptorBufferInfo bi{ grid_ubo, 0, VK_WHOLE_SIZE };
+ VkWriteDescriptorSet w{ VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET }; w.dstSet = grid_set; w.dstBinding = 0; w.descriptorCount = 1; w.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; w.pBufferInfo = &bi;
+ vkUpdateDescriptorSets(device, 1, &w, 0, nullptr);
+
+ VkShaderModule vmod, fmod;
+ if (!create_shader_module("assets/shaders/generated/Grid.vertexMain.spv", vmod)) return false;
+ if (!create_shader_module("assets/shaders/generated/Grid.fragmentMain.spv", fmod)) return false;
+ VkPipelineLayoutCreateInfo plci{ VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO }; plci.setLayoutCount = 1; plci.pSetLayouts = &grid_set_layout;
+ VK_CHECK(vkCreatePipelineLayout(device, &plci, nullptr, &grid_pipeline_layout));
+ VkPipelineShaderStageCreateInfo stages[2]{};
+ stages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; stages[0].stage = VK_SHADER_STAGE_VERTEX_BIT; stages[0].module = vmod; stages[0].pName = "main";
+ stages[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; stages[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT; stages[1].module = fmod; stages[1].pName = "main";
+ VkVertexInputBindingDescription vib{ 0, sizeof(glm::vec3), VK_VERTEX_INPUT_RATE_VERTEX };
+ VkVertexInputAttributeDescription via{ 0, 0, VK_FORMAT_R32G32B32_SFLOAT, 0 };
+ VkPipelineVertexInputStateCreateInfo vin{ VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO };
+ vin.vertexBindingDescriptionCount = 1; vin.pVertexBindingDescriptions = &vib;
+ vin.vertexAttributeDescriptionCount = 1; vin.pVertexAttributeDescriptions = &via;
+ VkPipelineInputAssemblyStateCreateInfo ia{ VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO }; ia.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
+ VkPipelineViewportStateCreateInfo vps{ VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO }; vps.viewportCount = 1; vps.scissorCount = 1;
+ VkDynamicState dyn[2] = { VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR };
+ VkPipelineDynamicStateCreateInfo dsci{ VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO }; dsci.dynamicStateCount = 2; dsci.pDynamicStates = dyn;
+ VkPipelineRasterizationStateCreateInfo rs{ VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO }; rs.polygonMode = VK_POLYGON_MODE_FILL; rs.cullMode = VK_CULL_MODE_NONE; rs.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE; rs.lineWidth = 1.0f;
+ VkPipelineMultisampleStateCreateInfo ms{ VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO }; ms.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
+ VkPipelineColorBlendAttachmentState cba{};
+ cba.blendEnable = VK_TRUE;
+ cba.srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA; cba.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA; cba.colorBlendOp = VK_BLEND_OP_ADD;
+ cba.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE; cba.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO; cba.alphaBlendOp = VK_BLEND_OP_ADD;
+ cba.colorWriteMask = VK_COLOR_COMPONENT_R_BIT | VK_COLOR_COMPONENT_G_BIT | VK_COLOR_COMPONENT_B_BIT | VK_COLOR_COMPONENT_A_BIT;
+ VkPipelineColorBlendStateCreateInfo cb{ VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO }; cb.attachmentCount = 1; cb.pAttachments = &cba;
+ VkGraphicsPipelineCreateInfo gpci{ VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO };
+ gpci.stageCount = 2; gpci.pStages = stages;
+ gpci.pVertexInputState = &vin; gpci.pInputAssemblyState = &ia; gpci.pViewportState = &vps;
+ gpci.pDynamicState = &dsci;
+ gpci.pRasterizationState = &rs; gpci.pMultisampleState = &ms; gpci.pColorBlendState = &cb;
+ gpci.layout = grid_pipeline_layout; gpci.renderPass = render_pass; gpci.subpass = 0;
+ VkResult pr = vkCreateGraphicsPipelines(device, VK_NULL_HANDLE, 1, &gpci, nullptr, &grid_pipeline);
+ vkDestroyShaderModule(device, vmod, nullptr); vkDestroyShaderModule(device, fmod, nullptr);
+ if (pr != VK_SUCCESS) { DONUT_ERROR("Vulkan: grid pipeline creation failed ({})", (int)pr); return false; }
+ DONUT_INFO("Vulkan: scene resources ready ({} grid verts)", grid_vertex_count);
+ return true;
+ }
+
+ auto VulkanRenderer::Impl::update_scene_uniforms() -> void
+ {
+ struct GridUBO {
+ glm::mat4 view_projection; // 0 (SPIR-V RowMajor -> upload transposed)
+ glm::mat4 transform; // 64
+ float grid_size; float p0[3]; // 128
+ glm::vec3 grid_color; // 144
+ float grid_alpha; // 156
+ glm::vec3 camera_pos; // 160
+ float p1; // 172
+ } g{};
+ static_assert(sizeof(GridUBO) == 176, "GridUBO std140 layout mismatch");
+
+ uint32_t h = swapchain_extent.height ? swapchain_extent.height : 1;
+ float aspect = (float)swapchain_extent.width / (float)h;
+ scene_camera.set_projection(45.0f, aspect, 0.1f, 1000.0f);
+ glm::mat4 vp = scene_camera.get_projection_matrix() * scene_camera.get_view_matrix();
+
+ // Slang's mul(M,v) + the SPIR-V RowMajor decoration means glm's column-major
+ // matrices upload directly here (no transpose) to read as the intended M.
+ g.view_projection = vp;
+ g.transform = glm::mat4(1.0f);
+ g.grid_size = 50.0f;
+ g.grid_color = glm::vec3(0.55f, 0.55f, 0.6f);
+ g.grid_alpha = 0.75f;
+ g.camera_pos = scene_camera.get_orbital_position();
+ if (grid_ubo_mapped) memcpy(grid_ubo_mapped, &g, sizeof(g));
+ }
+
auto VulkanRenderer::Impl::update_geodesic_uniforms() -> void
{
struct CamUBO {
@@ -984,7 +1114,7 @@ namespace Donut
glfwGetCursorPos(window, &mx, &my);
bool left_down = glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT) == GLFW_PRESS;
- if (camera.get_camera_mode() == CameraMode::FPS)
+ if (!scene_mode && camera.get_camera_mode() == CameraMode::FPS)
{
// Left-drag looks around (screen-up looks up); WASD/QE move.
if (left_down && !left_was_down) { fps_last_x = mx; fps_last_y = my; }
@@ -1010,24 +1140,35 @@ namespace Donut
}
else
{
+ Camera& cam = scene_mode ? scene_camera : camera;
if (left_down && !left_was_down && !over_ui)
- camera.process_orbital_mouse_button(GLFW_MOUSE_BUTTON_LEFT, GLFW_PRESS, 0);
+ cam.process_orbital_mouse_button(GLFW_MOUSE_BUTTON_LEFT, GLFW_PRESS, 0);
else if (!left_down && left_was_down)
- camera.process_orbital_mouse_button(GLFW_MOUSE_BUTTON_LEFT, GLFW_RELEASE, 0);
+ cam.process_orbital_mouse_button(GLFW_MOUSE_BUTTON_LEFT, GLFW_RELEASE, 0);
left_was_down = left_down;
- camera.process_orbital_mouse_move(mx, my); // orbits only while dragging
+ cam.process_orbital_mouse_move(mx, my); // orbits only while dragging
double scroll = g_ScrollAccum; g_ScrollAccum = 0.0;
if (scroll != 0.0 && !over_ui)
- camera.process_orbital_scroll(0.0, scroll);
+ cam.process_orbital_scroll(0.0, scroll);
- user_moving = camera.is_dragging() || camera.is_panning();
+ user_moving = cam.is_dragging() || cam.is_panning();
}
}
auto VulkanRenderer::Impl::destroy_geodesic_resources() -> void
{
+ if (grid_pipeline) vkDestroyPipeline(device, grid_pipeline, nullptr);
+ if (grid_pipeline_layout) vkDestroyPipelineLayout(device, grid_pipeline_layout, nullptr);
+ if (grid_pool) vkDestroyDescriptorPool(device, grid_pool, nullptr);
+ if (grid_set_layout) vkDestroyDescriptorSetLayout(device, grid_set_layout, nullptr);
+ if (grid_ubo_mapped) { vkUnmapMemory(device, grid_ubo_mem); grid_ubo_mapped = nullptr; }
+ if (grid_ubo) vkDestroyBuffer(device, grid_ubo, nullptr);
+ if (grid_ubo_mem) vkFreeMemory(device, grid_ubo_mem, nullptr);
+ if (grid_vb) vkDestroyBuffer(device, grid_vb, nullptr);
+ if (grid_vb_mem) vkFreeMemory(device, grid_vb_mem, nullptr);
+
if (present_pipeline) vkDestroyPipeline(device, present_pipeline, nullptr);
if (present_pipeline_layout) vkDestroyPipelineLayout(device, present_pipeline_layout, nullptr);
if (present_pool) vkDestroyDescriptorPool(device, present_pool, nullptr);
@@ -1061,6 +1202,31 @@ namespace Donut
VkCommandBufferBeginInfo begin{ VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO };
VK_CHECK(vkBeginCommandBuffer(cmd, &begin));
+ if (scene_mode)
+ {
+ // Scene view: grid lines drawn straight into the swapchain, then ImGui.
+ VkClearValue cv{}; cv.color = { { clear.r, clear.g, clear.b, clear.a } };
+ VkRenderPassBeginInfo rpbi{ VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO };
+ rpbi.renderPass = render_pass; rpbi.framebuffer = framebuffers[image_index];
+ rpbi.renderArea = { { 0, 0 }, swapchain_extent };
+ rpbi.clearValueCount = 1; rpbi.pClearValues = &cv;
+ vkCmdBeginRenderPass(cmd, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
+ vkCmdBindPipeline(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, grid_pipeline);
+ // Negative-height viewport flips Y so the scene reads like the GL path.
+ VkViewport gvp{ 0, (float)swapchain_extent.height, (float)swapchain_extent.width, -(float)swapchain_extent.height, 0, 1 };
+ VkRect2D gsc{ { 0, 0 }, swapchain_extent };
+ vkCmdSetViewport(cmd, 0, 1, &gvp);
+ vkCmdSetScissor(cmd, 0, 1, &gsc);
+ vkCmdBindDescriptorSets(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, grid_pipeline_layout, 0, 1, &grid_set, 0, nullptr);
+ VkDeviceSize goff = 0; vkCmdBindVertexBuffers(cmd, 0, 1, &grid_vb, &goff);
+ vkCmdDraw(cmd, grid_vertex_count, 1, 0, 0);
+ if (draw_data)
+ ImGui_ImplVulkan_RenderDrawData(draw_data, cmd);
+ vkCmdEndRenderPass(cmd);
+ VK_CHECK(vkEndCommandBuffer(cmd));
+ return true;
+ }
+
// Geodesic offscreen pass
VkClearValue geo_clear{}; geo_clear.color = { { 0, 0, 0, 1 } };
VkRenderPassBeginInfo grp{ VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO };
@@ -1153,6 +1319,7 @@ namespace Donut
if (!v.create_sync_objects()) return false;
if (!v.create_geodesic_resources()) return false;
if (!v.create_present_resources()) return false;
+ if (!v.create_scene_resources()) return false;
DONUT_INFO("Vulkan renderer ready: {} swapchain images, {}x{}",
(int)v.images.size(), v.swapchain_extent.width, v.swapchain_extent.height);
@@ -1253,6 +1420,16 @@ namespace Donut
return m_impl->camera.get_camera_mode() == CameraMode::FPS;
}
+ auto VulkanRenderer::set_scene_mode(bool enabled) -> void
+ {
+ if (m_impl) m_impl->scene_mode = enabled;
+ }
+
+ auto VulkanRenderer::is_scene_mode() const -> bool
+ {
+ return m_impl && m_impl->scene_mode;
+ }
+
auto VulkanRenderer::draw_frame(const glm::vec4& clear_color, const std::function<void()>& build_ui) -> void
{
Impl& v = *m_impl;
@@ -1286,7 +1463,7 @@ namespace Donut
if (v.geo_in_use != VK_NULL_HANDLE)
vkWaitForFences(v.device, 1, &v.geo_in_use, VK_TRUE, UINT64_MAX);
v.process_input();
- v.update_geodesic_uniforms();
+ if (v.scene_mode) v.update_scene_uniforms(); else v.update_geodesic_uniforms();
vkResetCommandBuffer(v.command_buffers[v.current_frame], 0);
if (!v.record_command_buffer(v.command_buffers[v.current_frame], image_index, clear_color, draw_data)) return;
diff --git a/src/platform/vulkan/vulkan_renderer.h b/src/platform/vulkan/vulkan_renderer.h
index 0e643c1..e6920c5 100644
--- a/src/platform/vulkan/vulkan_renderer.h
+++ b/src/platform/vulkan/vulkan_renderer.h
@@ -47,6 +47,11 @@ namespace Donut
auto set_free_fly(bool enabled) -> void;
auto is_free_fly() const -> bool;
+ // Switch between the black-hole geodesic view and the world-builder scene
+ // view (grid/sphere/skybox drawn with real Vulkan geometry pipelines).
+ auto set_scene_mode(bool enabled) -> void;
+ auto is_scene_mode() const -> bool;
+
private:
struct Impl;
Impl* m_impl = nullptr;
diff --git a/src/platform/vulkan/vulkan_renderer_api.cpp b/src/platform/vulkan/vulkan_renderer_api.cpp
deleted file mode 100644
index 56499f4..0000000
--- a/src/platform/vulkan/vulkan_renderer_api.cpp
+++ /dev/null
@@ -1,86 +0,0 @@
-#include "vulkan_renderer_api.h"
-
-namespace Donut
-{
- auto VulkanRendererAPI::init() -> void
- {
- // TODO(Hachem): Implement Vulkan renderer API initialization
- }
-
- auto VulkanRendererAPI::set_viewport(uint32_t x, uint32_t y, uint32_t width, uint32_t height) -> void
- {
- // TODO(Hachem): Implement Vulkan viewport setting
- }
-
- auto VulkanRendererAPI::set_clear_color(const glm::vec4& color) -> void
- {
- // TODO(Hachem): Implement Vulkan clear color setting
- }
-
- auto VulkanRendererAPI::clear() -> void
- {
- // TODO(Hachem): Implement Vulkan clear
- }
-
- auto VulkanRendererAPI::enable_depth_test() -> void
- {
- // TODO(Hachem): Implement Vulkan depth test enabling
- }
-
- auto VulkanRendererAPI::disable_depth_test() -> void
- {
- // TODO(Hachem): Implement Vulkan depth test disabling
- }
-
- auto VulkanRendererAPI::set_face_culling(bool enabled) -> void
- {
- // TODO(Hachem): Implement Vulkan face culling setting
- }
-
- auto VulkanRendererAPI::enable_blending() -> void
- {
- // TODO(Hachem): Implement Vulkan blending enabling
- }
-
- auto VulkanRendererAPI::disable_blending() -> void
- {
- // TODO(Hachem): Implement Vulkan blending disabling
- }
-
- auto VulkanRendererAPI::draw_indexed(const Ref<VertexArray>& vertex_array, uint32_t index_count) -> void
- {
- // TODO(Hachem): Implement Vulkan indexed drawing
- }
-
- auto VulkanRendererAPI::draw_arrays(uint32_t vertex_count, uint32_t first) -> void
- {
- // TODO(Hachem): Implement Vulkan array drawing
- }
-
- auto VulkanRendererAPI::draw_lines(const Ref<VertexArray>& vertex_array, uint32_t index_count) -> void
- {
- // TODO(Hachem): Implement Vulkan line drawing
- }
-
- auto VulkanRendererAPI::bind_texture(uint32_t texture_id, uint32_t slot) -> void
- {
- // TODO(Hachem): Implement Vulkan texture binding
- }
-
- auto VulkanRendererAPI::bind_image_texture(uint32_t texture_id, uint32_t slot, bool read_only) -> void
- {
- // TODO(Hachem): Implement Vulkan image texture binding
- }
-
- auto VulkanRendererAPI::read_pixels(uint32_t x, uint32_t y, uint32_t width, uint32_t height,
- uint32_t format, uint32_t type, void* pixels) -> void
- {
- // TODO(Hachem): Implement Vulkan pixel reading
- // For now, this is a placeholder implementation
- // In a real Vulkan implementation, this would involve:
- // 1. Creating a staging buffer
- // 2. Copying the framebuffer to the staging buffer
- // 3. Mapping the staging buffer and copying to the pixels array
- // 4. Unmapping and destroying the staging buffer
- }
-};
diff --git a/src/platform/vulkan/vulkan_renderer_api.h b/src/platform/vulkan/vulkan_renderer_api.h
deleted file mode 100644
index 15bf76d..0000000
--- a/src/platform/vulkan/vulkan_renderer_api.h
+++ /dev/null
@@ -1,38 +0,0 @@
-#pragma once
-
-#include "core/memory.h"
-#include "rendering/renderer.h"
-
-namespace Donut
-{
- class VulkanRendererAPI
- : public RendererAPI
- {
- public:
- virtual auto init() -> void override;
- virtual void set_viewport(uint32_t x, uint32_t y,
- uint32_t width, uint32_t height) override;
- virtual auto set_clear_color(const glm::vec4& color) -> void override;
- virtual auto clear() -> void override;
- virtual auto enable_depth_test() -> void override;
- virtual auto disable_depth_test() -> void override;
- virtual auto set_face_culling(bool enabled) -> void override;
- virtual auto enable_blending() -> void override;
- virtual auto disable_blending() -> void override;
-
- virtual void draw_indexed(const Ref<VertexArray>& vertex_array,
- uint32_t index_count = 0) override;
-
- virtual void draw_arrays(uint32_t vertex_count,
- uint32_t first = 0) override;
- virtual void draw_lines(const Ref<VertexArray>& vertex_array,
- uint32_t index_count = 0) override;
- virtual void bind_texture(uint32_t texture_id,
- uint32_t slot = 0) override;
- virtual void bind_image_texture(uint32_t texture_id,
- uint32_t slot = 0,
- bool read_only = false) override;
- virtual void read_pixels(uint32_t x, uint32_t y, uint32_t width, uint32_t height,
- uint32_t format, uint32_t type, void* pixels) override;
- };
-};
diff --git a/src/platform/vulkan/vulkan_shader.cpp b/src/platform/vulkan/vulkan_shader.cpp
deleted file mode 100644
index 7549761..0000000
--- a/src/platform/vulkan/vulkan_shader.cpp
+++ /dev/null
@@ -1,146 +0,0 @@
-#include "vulkan_shader.h"
-
-#include <fstream>
-#include <glm/gtc/type_ptr.hpp>
-
-namespace Donut
-{
- VulkanShader::VulkanShader(const std::string& filepath)
- {
- // TODO(Hachem): Implement Vulkan shader creation from filepath
- }
-
- VulkanShader::VulkanShader(const std::string& name, const std::string& vertex_src, const std::string& fragment_src)
- : m_name(name)
- {
- // TODO(Hachem): Implement Vulkan shader creation from source
- }
-
- VulkanShader::VulkanShader(const std::string& name, const std::string& compute_src)
- : m_name(name)
- {
- // TODO(Hachem): Implement Vulkan compute shader creation
- }
-
- VulkanShader::~VulkanShader()
- {
- // TODO(Hachem): Implement Vulkan shader cleanup
- }
-
- auto VulkanShader::bind() const -> void
- {
- // TODO(Hachem): Implement Vulkan shader binding
- }
-
- auto VulkanShader::unbind() const -> void
- {
- // TODO(Hachem): Implement Vulkan shader unbinding
- }
-
- auto VulkanShader::set_int(const std::string& name, int value) -> void
- {
- // TODO(Hachem): Implement Vulkan shader int uniform setting
- }
-
- auto VulkanShader::set_int_array(const std::string& name, int* values, uint32_t count) -> void
- {
- // TODO(Hachem): Implement Vulkan shader int array uniform setting
- }
-
- auto VulkanShader::set_float(const std::string& name, float value) -> void
- {
- // TODO(Hachem): Implement Vulkan shader float uniform setting
- }
-
- auto VulkanShader::set_float2(const std::string& name, const glm::vec2& value) -> void
- {
- // TODO(Hachem): Implement Vulkan shader float2 uniform setting
- }
-
- auto VulkanShader::set_float3(const std::string& name, const glm::vec3& value) -> void
- {
- // TODO(Hachem): Implement Vulkan shader float3 uniform setting
- }
-
- auto VulkanShader::set_float4(const std::string& name, const glm::vec4& value) -> void
- {
- // TODO(Hachem): Implement Vulkan shader float4 uniform setting
- }
-
- auto VulkanShader::set_mat4(const std::string& name, const glm::mat4& value) -> void
- {
- // TODO(Hachem): Implement Vulkan shader mat4 uniform setting
- }
-
- auto VulkanShader::dispatch(uint32_t x, uint32_t y, uint32_t z) -> void
- {
- // TODO(Hachem): Implement Vulkan compute shader dispatch
- }
-
- auto VulkanShader::dispatch_indirect(uint32_t offset) -> void
- {
- // TODO(Hachem): Implement Vulkan indirect compute shader dispatch
- }
-
- auto VulkanShader::memory_barrier(uint32_t barriers) -> void
- {
- // TODO(Hachem): Implement Vulkan memory barrier
- }
-
- auto VulkanShader::upload_uniform_int(const std::string& name, int value) -> void
- {
- // TODO(Hachem): Implement Vulkan uniform int upload
- }
-
- auto VulkanShader::upload_uniform_int_array(const std::string& name, int* values, uint32_t count) -> void
- {
- // TODO(Hachem): Implement Vulkan uniform int array upload
- }
-
- auto VulkanShader::upload_uniform_float(const std::string& name, float value) -> void
- {
- // TODO(Hachem): Implement Vulkan uniform float upload
- }
-
- auto VulkanShader::upload_uniform_float2(const std::string& name, const glm::vec2& value) -> void
- {
- // TODO(Hachem): Implement Vulkan uniform float2 upload
- }
-
- auto VulkanShader::upload_uniform_float3(const std::string& name, const glm::vec3& value) -> void
- {
- // TODO(Hachem): Implement Vulkan uniform float3 upload
- }
-
- auto VulkanShader::upload_uniform_float4(const std::string& name, const glm::vec4& value) -> void
- {
- // TODO(Hachem): Implement Vulkan uniform float4 upload
- }
-
- auto VulkanShader::upload_uniform_mat3(const std::string& name, const glm::mat3& matrix) -> void
- {
- // TODO(Hachem): Implement Vulkan uniform mat3 upload
- }
-
- auto VulkanShader::upload_uniform_mat4(const std::string& name, const glm::mat4& matrix) -> void
- {
- // TODO(Hachem): Implement Vulkan uniform mat4 upload
- }
-
- auto VulkanShader::read_file(const std::string& filepath) -> std::string
- {
- // TODO(Hachem): Implement file reading for Vulkan shader
- return "";
- }
-
- auto VulkanShader::pre_process(const std::string& source) -> std::unordered_map<uint32_t, std::string>
- {
- // TODO(Hachem): Implement shader preprocessing for Vulkan
- return {};
- }
-
- auto VulkanShader::compile(const std::unordered_map<uint32_t, std::string>& shader_sources) -> void
- {
- // TODO(Hachem): Implement Vulkan shader compilation
- }
-};
diff --git a/src/platform/vulkan/vulkan_shader.h b/src/platform/vulkan/vulkan_shader.h
deleted file mode 100644
index 9453130..0000000
--- a/src/platform/vulkan/vulkan_shader.h
+++ /dev/null
@@ -1,52 +0,0 @@
-#pragma once
-
-#include "rendering/shader.h"
-
-#include <string>
-#include <unordered_map>
-
-namespace Donut
-{
- class VulkanShader
- : public Shader
- {
- public:
- VulkanShader(const std::string& filepath);
- VulkanShader(const std::string& name, const std::string& vertex_src, const std::string& fragment_src);
- VulkanShader(const std::string& name, const std::string& compute_src);
- virtual ~VulkanShader();
-
- virtual auto bind() const -> void override;
- virtual auto unbind() const -> void override;
-
- virtual auto set_int(const std::string& name, int value) -> void override;
- virtual auto set_int_array(const std::string& name, int* values, uint32_t count) -> void override;
- virtual auto set_float(const std::string& name, float value) -> void override;
- virtual auto set_float2(const std::string& name, const glm::vec2& value) -> void override;
- virtual auto set_float3(const std::string& name, const glm::vec3& value) -> void override;
- virtual auto set_float4(const std::string& name, const glm::vec4& value) -> void override;
- virtual auto set_mat4(const std::string& name, const glm::mat4& value) -> void override;
-
- virtual auto dispatch(uint32_t x, uint32_t y = 1, uint32_t z = 1) -> void override;
- virtual auto dispatch_indirect(uint32_t offset = 0) -> void override;
- virtual auto memory_barrier(uint32_t barriers) -> void override;
-
- virtual auto get_name() const -> const std::string& override{ return m_name; }
- virtual auto get_renderer_id() const -> uint32_t override{ return m_renderer_id; }
-
- auto upload_uniform_int(const std::string& name, int value) -> void;
- auto upload_uniform_int_array(const std::string& name, int* values, uint32_t count) -> void;
- auto upload_uniform_float(const std::string& name, float value) -> void;
- auto upload_uniform_float2(const std::string& name, const glm::vec2& value) -> void;
- auto upload_uniform_float3(const std::string& name, const glm::vec3& value) -> void;
- auto upload_uniform_float4(const std::string& name, const glm::vec4& value) -> void;
- auto upload_uniform_mat3(const std::string& name, const glm::mat3& matrix) -> void;
- auto upload_uniform_mat4(const std::string& name, const glm::mat4& matrix) -> void;
- private:
- auto read_file(const std::string& filepath) -> std::string;
- auto pre_process(const std::string& source) -> std::unordered_map<uint32_t, std::string>;
- auto compile(const std::unordered_map<uint32_t, std::string>& shader_sources) -> void;
- uint32_t m_renderer_id;
- std::string m_name;
- };
-};
diff --git a/src/platform/vulkan/vulkan_texture.cpp b/src/platform/vulkan/vulkan_texture.cpp
deleted file mode 100644
index a970a53..0000000
--- a/src/platform/vulkan/vulkan_texture.cpp
+++ /dev/null
@@ -1,73 +0,0 @@
-#include "vulkan_texture.h"
-
-namespace Donut
-{
- VulkanTexture2D::VulkanTexture2D(uint32_t width, uint32_t height)
- : m_width(width), m_height(height)
- {
- m_internal_format = 0;
- m_data_format = 0;
- m_renderer_id = 0;
- }
-
- VulkanTexture2D::VulkanTexture2D(const std::string& path)
- : m_path(path)
- {
- m_width = 1;
- m_height = 1;
- m_internal_format = 0;
- m_data_format = 0;
- m_renderer_id = 0;
- }
-
- VulkanTexture2D::~VulkanTexture2D()
- {
- }
-
- auto VulkanTexture2D::set_data(void* data, uint32_t size) -> void
- {
- }
-
- auto VulkanTexture2D::bind(uint32_t slot) const -> void
- {
- }
-
- auto VulkanTexture2D::bind_as_image(uint32_t slot, bool read_only) const -> void
- {
- }
-
- // Vulkan Cubemap Implementation (Placeholder)
- VulkanCubemapTexture::VulkanCubemapTexture(uint32_t width, uint32_t height)
- : m_width(width), m_height(height)
- {
- m_internal_format = 0;
- m_data_format = 0;
- m_renderer_id = 0;
- }
-
- VulkanCubemapTexture::VulkanCubemapTexture(const std::string& path)
- : m_path(path)
- {
- m_width = 1024;
- m_height = 1024;
- m_internal_format = 0;
- m_data_format = 0;
- m_renderer_id = 0;
- }
-
- VulkanCubemapTexture::~VulkanCubemapTexture()
- {
- }
-
- auto VulkanCubemapTexture::set_data(void* data, uint32_t size) -> void
- {
- }
-
- auto VulkanCubemapTexture::bind(uint32_t slot) const -> void
- {
- }
-
- auto VulkanCubemapTexture::bind_as_image(uint32_t slot, bool read_only) const -> void
- {
- }
-};
diff --git a/src/platform/vulkan/vulkan_texture.h b/src/platform/vulkan/vulkan_texture.h
deleted file mode 100644
index ea8471b..0000000
--- a/src/platform/vulkan/vulkan_texture.h
+++ /dev/null
@@ -1,60 +0,0 @@
-#pragma once
-
-#include "rendering/texture.h"
-
-namespace Donut
-{
- class VulkanTexture2D
- : public Texture2D
- {
- public:
- VulkanTexture2D(uint32_t width, uint32_t height);
- VulkanTexture2D(const std::string& path);
- virtual ~VulkanTexture2D();
-
- virtual auto get_width() const -> uint32_t override{ return m_width; }
- virtual auto get_height() const -> uint32_t override{ return m_height; }
- virtual auto get_renderer_id() const -> uint32_t override{ return m_renderer_id; }
-
- virtual auto set_data(void* data, uint32_t size) -> void override;
- virtual auto bind(uint32_t slot = 0) const -> void override;
- virtual auto bind_as_image(uint32_t slot = 0, bool read_only = false) const -> void override;
-
- virtual bool operator==(const Texture& other) const override
- {
- return m_renderer_id == ((VulkanTexture2D&)other).m_renderer_id;
- }
- private:
- std::string m_path;
- uint32_t m_width, m_height;
- uint32_t m_renderer_id;
- uint32_t m_internal_format, m_data_format;
- };
-
- class VulkanCubemapTexture
- : public CubemapTexture
- {
- public:
- VulkanCubemapTexture(uint32_t width, uint32_t height);
- VulkanCubemapTexture(const std::string& path);
- virtual ~VulkanCubemapTexture();
-
- virtual auto get_width() const -> uint32_t override{ return m_width; }
- virtual auto get_height() const -> uint32_t override{ return m_height; }
- virtual auto get_renderer_id() const -> uint32_t override{ return m_renderer_id; }
-
- virtual auto set_data(void* data, uint32_t size) -> void override;
- virtual auto bind(uint32_t slot = 0) const -> void override;
- virtual auto bind_as_image(uint32_t slot = 0, bool read_only = false) const -> void override;
-
- virtual bool operator==(const Texture& other) const override
- {
- return m_renderer_id == ((VulkanCubemapTexture&)other).m_renderer_id;
- }
- private:
- std::string m_path;
- uint32_t m_width, m_height;
- uint32_t m_renderer_id;
- uint32_t m_internal_format, m_data_format;
- };
-};
diff --git a/src/platform/vulkan/vulkan_uniform_buffer.cpp b/src/platform/vulkan/vulkan_uniform_buffer.cpp
deleted file mode 100644
index 1a64099..0000000
--- a/src/platform/vulkan/vulkan_uniform_buffer.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-#include "vulkan_uniform_buffer.h"
-
-namespace Donut
-{
- VulkanUniformBuffer::VulkanUniformBuffer(uint32_t size, uint32_t binding)
- : m_size(size), m_binding(binding)
- {
- // TODO: Implement Vulkan uniform buffer
- }
-
- VulkanUniformBuffer::~VulkanUniformBuffer()
- {
- // TODO: Implement Vulkan uniform buffer cleanup
- }
-
- auto VulkanUniformBuffer::set_data(const void* data, uint32_t size, uint32_t offset) -> void
- {
- // TODO: Implement Vulkan uniform buffer data setting
- }
-
- auto VulkanUniformBuffer::bind(uint32_t binding) -> void
- {
- // TODO: Implement Vulkan uniform buffer binding
- }
-};
diff --git a/src/platform/vulkan/vulkan_uniform_buffer.h b/src/platform/vulkan/vulkan_uniform_buffer.h
deleted file mode 100644
index 7d9ad0a..0000000
--- a/src/platform/vulkan/vulkan_uniform_buffer.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#pragma once
-
-#include "rendering/uniform_buffer.h"
-
-namespace Donut
-{
- class VulkanUniformBuffer : public UniformBuffer
- {
- public:
- VulkanUniformBuffer(uint32_t size, uint32_t binding);
- virtual ~VulkanUniformBuffer();
-
- virtual auto set_data(const void* data, uint32_t size, uint32_t offset = 0) -> void override;
- virtual auto bind(uint32_t binding) -> void override;
- private:
- uint32_t m_size;
- uint32_t m_binding;
- };
-};
diff --git a/src/platform/vulkan/vulkan_vertex_array.cpp b/src/platform/vulkan/vulkan_vertex_array.cpp
deleted file mode 100644
index 73219b1..0000000
--- a/src/platform/vulkan/vulkan_vertex_array.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-#include "vulkan_vertex_array.h"
-
-namespace Donut
-{
- VulkanVertexArray::VulkanVertexArray()
- {
- // TODO(Hachem): Implement Vulkan vertex array creation
- }
-
- VulkanVertexArray::~VulkanVertexArray()
- {
- // TODO(Hachem): Implement Vulkan vertex array cleanup
- }
-
- auto VulkanVertexArray::bind() const -> void
- {
- // TODO(Hachem): Implement Vulkan vertex array binding
- }
-
- auto VulkanVertexArray::unbind() const -> void
- {
- // TODO(Hachem): Implement Vulkan vertex array unbinding
- }
-
- auto VulkanVertexArray::add_vertex_buffer(const Ref<VertexBuffer>& vertex_buffer) -> void
- {
- // TODO(Hachem): Implement Vulkan vertex buffer addition
- m_vertex_buffers.push_back(vertex_buffer);
- }
-
- auto VulkanVertexArray::set_index_buffer(const Ref<IndexBuffer>& index_buffer) -> void
- {
- // TODO(Hachem): Implement Vulkan index buffer setting
- m_index_buffer = index_buffer;
- }
-};
diff --git a/src/platform/vulkan/vulkan_vertex_array.h b/src/platform/vulkan/vulkan_vertex_array.h
deleted file mode 100644
index 0d282a2..0000000
--- a/src/platform/vulkan/vulkan_vertex_array.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#pragma once
-
-#include "rendering/vertex_array.h"
-#include "core/memory.h"
-
-namespace Donut
-{
- class VulkanVertexArray
- : public VertexArray
- {
- public:
- VulkanVertexArray();
- virtual ~VulkanVertexArray();
-
- virtual auto bind() const -> void override;
- virtual auto unbind() const -> void override;
-
- virtual auto add_vertex_buffer(const Ref<VertexBuffer>& vertex_buffer) -> void override;
- virtual auto set_index_buffer(const Ref<IndexBuffer>& index_buffer) -> void override;
-
- virtual auto get_vertex_buffers() const -> const std::vector<Ref<VertexBuffer>>& { return m_vertex_buffers; }
- virtual auto get_index_buffer() const -> const Ref<IndexBuffer>& { return m_index_buffer; }
- private:
- uint32_t m_renderer_id;
- std::vector<Ref<VertexBuffer>> m_vertex_buffers;
- Ref<IndexBuffer> m_index_buffer;
- };
-};
diff --git a/src/platform/vulkan/vulkan_vertex_buffer.cpp b/src/platform/vulkan/vulkan_vertex_buffer.cpp
deleted file mode 100644
index 6a222c1..0000000
--- a/src/platform/vulkan/vulkan_vertex_buffer.cpp
+++ /dev/null
@@ -1,34 +0,0 @@
-#include "vulkan_vertex_buffer.h"
-
-namespace Donut
-{
- VulkanVertexBuffer::VulkanVertexBuffer(uint32_t size)
- {
- // TODO(Hachem): Implement Vulkan vertex buffer creation with size
- }
-
- VulkanVertexBuffer::VulkanVertexBuffer(float* vertices, uint32_t size)
- {
- // TODO(Hachem): Implement Vulkan vertex buffer creation with data
- }
-
- VulkanVertexBuffer::~VulkanVertexBuffer()
- {
- // TODO(Hachem): Implement Vulkan vertex buffer cleanup
- }
-
- auto VulkanVertexBuffer::bind() const -> void
- {
- // TODO(Hachem): Implement Vulkan vertex buffer binding
- }
-
- auto VulkanVertexBuffer::unbind() const -> void
- {
- // TODO(Hachem): Implement Vulkan vertex buffer unbinding
- }
-
- auto VulkanVertexBuffer::set_data(const void* data, uint32_t size) -> void
- {
- // TODO(Hachem): Implement Vulkan vertex buffer data setting
- }
-}; \ No newline at end of file
diff --git a/src/platform/vulkan/vulkan_vertex_buffer.h b/src/platform/vulkan/vulkan_vertex_buffer.h
deleted file mode 100644
index 3218021..0000000
--- a/src/platform/vulkan/vulkan_vertex_buffer.h
+++ /dev/null
@@ -1,26 +0,0 @@
-#pragma once
-
-#include "rendering/vertex_buffer.h"
-
-namespace Donut
-{
- class VulkanVertexBuffer
- : public VertexBuffer
- {
- public:
- VulkanVertexBuffer(uint32_t size);
- VulkanVertexBuffer(float* vertices, uint32_t size);
- virtual ~VulkanVertexBuffer();
-
- virtual auto bind() const -> void override;
- virtual auto unbind() const -> void override;
-
- virtual auto set_data(const void* data, uint32_t size) -> void override;
-
- virtual auto get_layout() const -> const VertexBufferLayout& override{ return m_layout; }
- virtual auto set_layout(const VertexBufferLayout& layout) -> void override{ m_layout = layout; }
- private:
- uint32_t m_renderer_id;
- VertexBufferLayout m_layout;
- };
-};