diff --git a/src/client/render/vk/CommandCenter.cpp b/src/client/render/vk/CommandCenter.cpp index f76e926..16bdc70 100644 --- a/src/client/render/vk/CommandCenter.cpp +++ b/src/client/render/vk/CommandCenter.cpp @@ -3,7 +3,6 @@ #include "PhysicalDeviceInfo.hpp" #include "Pipeline.hpp" #include "Renderer.hpp" -#include "buffer/VertexData.hpp" using namespace render::vk; @@ -23,15 +22,6 @@ CommandCenter::CommandCenter(VkDevice device, const PhysicalDeviceInfo &info, co } } - modelBuffer = ShortIndexedVertexBuffer::Create(buffer::vk::vertices, buffer::vk::indices); - if (!modelBuffer) { - FATAL("Cannot create vertex buffer"); - } - sampleTexture = Texture::LoadFromFile(TEXTURES_DIR + opt.textures + "/terrain/Mapl.dds", {true, true, Texture::Wrap::MIRRORED_REPEAT, opt.anisotropy}); - if (!sampleTexture) { - FATAL("Failed to create texture sampler!"); - } - indicCubeBuffer = Indicator::Create(Indicator::CUBE.first, Indicator::CUBE.second); if (!indicCubeBuffer) { FATAL("Failed to create vertex buffer!"); @@ -50,6 +40,8 @@ CommandCenter::CommandCenter(VkDevice device, const PhysicalDeviceInfo &info, co colorSamples = info.samples; LOG_D("Samples: " << colorSamples); depthFormat = info.findDepthFormat(); + + loadAtlases(opt.textures); } CommandCenter::~CommandCenter() { if(!freed) @@ -57,6 +49,30 @@ CommandCenter::~CommandCenter() { vkDestroyCommandPool(device, graphicsPool, ALLOC); } +#include "../../../core/world/materials.hpp" +void CommandCenter::loadAtlases(const std::string& textures) { + voxelTextureAtlas.reset(); + voxelNormalAtlas.reset(); + voxelHOSAtlas.reset(); + + std::vector paths; + auto makePaths = [&](const std::string &suffix) { + paths.clear(); + paths.reserve(world::materials::textures.size()); + for (auto& texture: world::materials::textures) { + paths.push_back(TEXTURES_DIR + textures + "/terrain/" + texture + suffix + ".dds"); + } + return paths; + }; + voxelTextureAtlas = TextureArray::LoadFromFiles(makePaths(""), {}); //TODO: anisotropy/mipmap options + voxelNormalAtlas = TextureArray::LoadFromFiles(makePaths(".nrm"), {}); + voxelHOSAtlas = TextureArray::LoadFromFiles(makePaths(".hos"), {}); + + if(!(voxelTextureAtlas && voxelNormalAtlas && voxelHOSAtlas)) { + FATAL("Failed to load texture pack!"); + } +} + #include void CommandCenter::allocate(const std::vector& views, const Pipeline& pipe, VkExtent2D extent) { assert(freed); @@ -97,7 +113,7 @@ void CommandCenter::allocate(const std::vector& views, const Pipeli { // Uniform buffers std::vector requirements; - requirements.resize(framebuffers.size(), Buffer::requirement(sizeof(UniformBufferObject), Buffer::Usage::UNIFORM)); + requirements.resize(framebuffers.size(), Buffer::requirement(sizeof(VoxelUBO), Buffer::Usage::UNIFORM)); uniformBuffers.allocate(requirements, true); if (!uniformBuffers) { FATAL("Failed to allocate UBO"); @@ -108,7 +124,7 @@ void CommandCenter::allocate(const std::vector& views, const Pipeli poolSizes[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; poolSizes[0].descriptorCount = framebuffers.size(); poolSizes[1].type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - poolSizes[1].descriptorCount = framebuffers.size(); + poolSizes[1].descriptorCount = framebuffers.size() * 3; VkDescriptorPoolCreateInfo poolInfo{}; poolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; @@ -121,12 +137,13 @@ void CommandCenter::allocate(const std::vector& views, const Pipeli FATAL("Failed to create descriptor pool!"); } + poolSizes[1].descriptorCount = framebuffers.size(); + if (vkCreateDescriptorPool(device, &poolInfo, nullptr, &skyDescriptorPool) != VK_SUCCESS) { FATAL("Failed to create descriptor pool!"); } poolInfo.poolSizeCount = 1; - poolInfo.pPoolSizes = &poolSizes[0]; if (vkCreateDescriptorPool(device, &poolInfo, nullptr, &indicDescriptorPool) != VK_SUCCESS) { FATAL("Failed to create descriptor pool!"); @@ -155,7 +172,7 @@ void CommandCenter::allocate(const std::vector& views, const Pipeli VkDescriptorBufferInfo bufferInfo{}; bufferInfo.buffer = uniformBuffers.at(i); bufferInfo.offset = 0; - bufferInfo.range = sizeof(UniformBufferObject); + bufferInfo.range = sizeof(VoxelUBO); std::array descriptorWrites{}; descriptorWrites[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; @@ -172,17 +189,33 @@ void CommandCenter::allocate(const std::vector& views, const Pipeli descriptorWrites[1].dstArrayElement = 0; descriptorWrites[1].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; descriptorWrites[1].descriptorCount = 1; - descriptorWrites[1].pImageInfo = &sampleTexture->getDescriptor(); + descriptorWrites[1].pImageInfo = &voxelTextureAtlas->getDescriptor(); + descriptorWrites[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + descriptorWrites[2].dstSet = voxelDescriptorSets[i]; + descriptorWrites[2].dstBinding = 2; + descriptorWrites[2].dstArrayElement = 0; + descriptorWrites[2].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + descriptorWrites[2].descriptorCount = 1; + descriptorWrites[2].pImageInfo = &voxelNormalAtlas->getDescriptor(); + descriptorWrites[3].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; + descriptorWrites[3].dstSet = voxelDescriptorSets[i]; + descriptorWrites[3].dstBinding = 3; + descriptorWrites[3].dstArrayElement = 0; + descriptorWrites[3].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + descriptorWrites[3].descriptorCount = 1; + descriptorWrites[3].pImageInfo = &voxelHOSAtlas->getDescriptor(); vkUpdateDescriptorSets(device, descriptorWrites.size(), descriptorWrites.data(), 0, nullptr); + bufferInfo.range = sizeof(ViewProjUBO); + descriptorWrites[0].dstSet = skyDescriptorSets[i]; descriptorWrites[1].dstSet = skyDescriptorSets[i]; descriptorWrites[1].pImageInfo = &skyboxTexture->getDescriptor(); - vkUpdateDescriptorSets(device, descriptorWrites.size(), descriptorWrites.data(), 0, nullptr); + vkUpdateDescriptorSets(device, 2, descriptorWrites.data(), 0, nullptr); descriptorWrites[0].dstSet = indicDescriptorSets[i]; - vkUpdateDescriptorSets(device, 1, &descriptorWrites[0], 0, nullptr); + vkUpdateDescriptorSets(device, 1, descriptorWrites.data(), 0, nullptr); } } { @@ -221,10 +254,7 @@ void CommandCenter::free() { #include #include -void CommandCenter::startRecording(uint32_t idx, VkRenderPass renderPass, VkExtent2D extent, const glm::vec4& clear_color, glm::mat4 view, glm::mat4 proj) { - UniformBufferObject ubo{}; - ubo.view = view; - ubo.proj = proj; +void CommandCenter::startRecording(uint32_t idx, VkRenderPass renderPass, VkExtent2D extent, const VoxelUBO& ubo) { uniformBuffers.write(idx, data_view(&ubo, sizeof(ubo))); VkCommandBufferBeginInfo beginInfo{}; @@ -245,7 +275,7 @@ void CommandCenter::startRecording(uint32_t idx, VkRenderPass renderPass, VkExte renderPassInfo.renderArea.extent = extent; std::array clearValues{}; - clearValues[0].color = {clear_color.x, clear_color.y, clear_color.z, clear_color.a}; + clearValues[0].color = {ubo.fog.x, ubo.fog.y, ubo.fog.z, 1}; clearValues[1].depthStencil = {1.0f, 0}; renderPassInfo.clearValueCount = clearValues.size(); renderPassInfo.pClearValues = clearValues.data(); @@ -256,22 +286,17 @@ void CommandCenter::startRecording(uint32_t idx, VkRenderPass renderPass, VkExte void CommandCenter::startWorldPass(uint32_t idx, const Subpass &worldPass) { vkCmdBindPipeline(graphicsBuffers[idx], VK_PIPELINE_BIND_POINT_GRAPHICS, worldPass.pipeline); vkCmdBindDescriptorSets(graphicsBuffers[idx], VK_PIPELINE_BIND_POINT_GRAPHICS, worldPass.layout, 0, 1, &voxelDescriptorSets[idx], 0, nullptr); - - static auto startTime = std::chrono::high_resolution_clock::now(); - - auto currentTime = std::chrono::high_resolution_clock::now(); - float time = std::chrono::duration(currentTime - startTime).count(); - ModelPush push{}; - push.model = glm::translate(glm::mat4(1.0f), glm::vec3(98.0f, -2.f, -2.f)); - push.model = glm::rotate(push.model, time * glm::radians(90.0f), glm::vec3(0.0f, 0.0f, 1.0f)); - vkCmdPushConstants(graphicsBuffers[idx], worldPass.layout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(push), &push); } -void CommandCenter::recordModel(uint32_t i) { +size_t CommandCenter::recordModel(uint32_t i, const Subpass &worldPass, const UniqueCurvaturePush& push, const LodModel *const modelBuffer) { + vkCmdPushConstants(graphicsBuffers[i], worldPass.layout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, sizeof(push), &push); + VkBuffer vertexBuffers[] = {modelBuffer->getVertex()}; VkDeviceSize offsets[] = {0}; vkCmdBindVertexBuffers(graphicsBuffers[i], 0, 1, vertexBuffers, offsets); vkCmdBindIndexBuffer(graphicsBuffers[i], modelBuffer->getIndex(), 0, VK_INDEX_TYPE_UINT16); - vkCmdDrawIndexed(graphicsBuffers[i], static_cast(buffer::vk::indices.size()), 1, 0, 0, 0); + auto size = modelBuffer->getIndexSize(); + vkCmdDrawIndexed(graphicsBuffers[i], size, 1, modelBuffer->getIndexStart(), 0, 0); + return size; } void CommandCenter::startEntityPass(uint32_t) { } void CommandCenter::recordIndicator(uint32_t idx, const Subpass& indicPass, glm::mat4 model) { @@ -287,7 +312,7 @@ void CommandCenter::recordIndicator(uint32_t idx, const Subpass& indicPass, glm: vkCmdBindVertexBuffers(graphicsBuffers[idx], 0, 1, vertexBuffers, offsets); vkCmdDraw(graphicsBuffers[idx], indicCubeBuffer->size, 1, 0, 0); } -void CommandCenter::recordPostprocess(uint32_t idx, const Subpass& skyPass, bool skybox, glm::mat4, glm::mat4) { +void CommandCenter::recordPostprocess(uint32_t idx, const Subpass& skyPass, bool skybox) { vkCmdNextSubpass(graphicsBuffers[idx], VK_SUBPASS_CONTENTS_INLINE); if (skybox) { vkCmdBindPipeline(graphicsBuffers[idx], VK_PIPELINE_BIND_POINT_GRAPHICS, skyPass.pipeline); diff --git a/src/client/render/vk/CommandCenter.hpp b/src/client/render/vk/CommandCenter.hpp index fc7ccef..2e44523 100644 --- a/src/client/render/vk/CommandCenter.hpp +++ b/src/client/render/vk/CommandCenter.hpp @@ -17,18 +17,20 @@ public: CommandCenter(VkDevice, const PhysicalDeviceInfo&, const renderOptions&); ~CommandCenter(); - void startRecording(uint32_t idx, VkRenderPass, VkExtent2D, const glm::vec4& clear, glm::mat4 view, glm::mat4 proj); + void startRecording(uint32_t idx, VkRenderPass, VkExtent2D, const VoxelUBO&); void startWorldPass(uint32_t idx, const Subpass&); - void recordModel(uint32_t idx); + size_t recordModel(uint32_t idx, const Subpass &worldPass, const UniqueCurvaturePush&, const LodModel *const); void startEntityPass(uint32_t idx); void recordIndicator(uint32_t idx, const Subpass&, glm::mat4 model); - void recordPostprocess(uint32_t idx, const Subpass&, bool skybox, glm::mat4 view, glm::mat4 proj); + void recordPostprocess(uint32_t idx, const Subpass&, bool skybox); void submitGraphics(uint32_t, VkSemaphore, VkSemaphore, VkFence); void allocate(const std::vector&, const Pipeline&, VkExtent2D); void free(); private: + void loadAtlases(const std::string &texturePath); + VkDevice device; std::vector framebuffers; @@ -47,8 +49,9 @@ private: VkDescriptorPool voxelDescriptorPool; std::vector voxelDescriptorSets; - std::unique_ptr sampleTexture; - std::unique_ptr modelBuffer; + std::unique_ptr voxelTextureAtlas; + std::unique_ptr voxelNormalAtlas; + std::unique_ptr voxelHOSAtlas; VkDescriptorPool indicDescriptorPool; std::vector indicDescriptorSets; diff --git a/src/client/render/vk/Pipeline.cpp b/src/client/render/vk/Pipeline.cpp index b1aa513..492d576 100644 --- a/src/client/render/vk/Pipeline.cpp +++ b/src/client/render/vk/Pipeline.cpp @@ -3,7 +3,6 @@ #include "PhysicalDeviceInfo.hpp" #include "../../../core/data/file.hpp" #include "../Renderer.hpp" -#include "buffer/VertexData.hpp" #include "api/Models.hpp" #include @@ -129,15 +128,26 @@ Pipeline::Pipeline(VkDevice device, const PhysicalDeviceInfo &info, const render } } //MAYBE: use sets (ubo, (samplers, passInfos)) + //MAYBE: reuse sub UBO { // Voxel descriptor - VkDescriptorSetLayoutBinding samplerLayoutBinding{}; - samplerLayoutBinding.binding = 1; - samplerLayoutBinding.descriptorCount = 1; - samplerLayoutBinding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - samplerLayoutBinding.pImmutableSamplers = nullptr; - samplerLayoutBinding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; + std::array bindings{}; + bindings[0] = VoxelUBO::getLayoutBinding(); + bindings[1].binding = 1; + bindings[1].descriptorCount = 1; + bindings[1].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + bindings[1].pImmutableSamplers = nullptr; //TODO: set immuable samplers + bindings[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; + bindings[2].binding = 2; + bindings[2].descriptorCount = 1; + bindings[2].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + bindings[2].pImmutableSamplers = nullptr; + bindings[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; + bindings[3].binding = 3; + bindings[3].descriptorCount = 1; + bindings[3].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + bindings[3].pImmutableSamplers = nullptr; + bindings[3].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; - std::vector bindings = {UniformBufferObject::getLayoutBinding(), samplerLayoutBinding}; VkDescriptorSetLayoutCreateInfo layoutInfo{}; layoutInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; layoutInfo.bindingCount = bindings.size(); @@ -150,7 +160,7 @@ Pipeline::Pipeline(VkDevice device, const PhysicalDeviceInfo &info, const render { // Indicator descriptor VkDescriptorSetLayoutCreateInfo layoutInfo{}; layoutInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; - auto binding = UniformBufferObject::getLayoutBinding(); + auto binding = ViewProjUBO::getLayoutBinding(); layoutInfo.bindingCount = 1; layoutInfo.pBindings = &binding; @@ -166,7 +176,7 @@ Pipeline::Pipeline(VkDevice device, const PhysicalDeviceInfo &info, const render samplerLayoutBinding.pImmutableSamplers = nullptr; samplerLayoutBinding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; - std::vector bindings = {UniformBufferObject::getLayoutBinding(), samplerLayoutBinding}; + std::vector bindings = {ViewProjUBO::getLayoutBinding(), samplerLayoutBinding}; VkDescriptorSetLayoutCreateInfo layoutInfo{}; layoutInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; layoutInfo.bindingCount = bindings.size(); @@ -342,25 +352,35 @@ Pipeline::Pipeline(VkDevice device, const PhysicalDeviceInfo &info, const render multisampling.alphaToOneEnable = VK_FALSE; { // World pipeline - /*struct Push { - alignas(16) glm::mat4 Model; - alignas(16) glm::vec4 SphereProj; - alignas(4) float Curvature; - };*/ VkPushConstantRange pushRange{}; pushRange.offset = 0; pushRange.size = sizeof(ModelPush); pushRange.stageFlags = VK_SHADER_STAGE_VERTEX_BIT; setLayout(worldPass, {voxelDescriptorSet}, {pushRange}); - auto shaderStages = setShaders(worldPass, "Tris"); + + auto unitSize = 1; //TODO: load from world.voxel_density + std::vector speData; + std::vector speIndex; + auto specialization = makeSpecialization({ + {0, data_view(&options.voxel.fog, sizeof(bool))}, + {1, data_view(&options.voxel.pbr, sizeof(bool))}, + {2, data_view(&options.voxel.triplanar, sizeof(bool))}, + {3, data_view(&options.voxel.stochastic, sizeof(bool))}, + {4, data_view(&options.voxel.blend, sizeof(bool))}, + {5, data_view(&options.voxel.curvature, sizeof(bool))}, + {6, data_view(&options.voxel.curv_depth, sizeof(bool))}, + {16, data_view(&unitSize, sizeof(int))}}, speData, speIndex); + + auto withGeometry = options.voxel.geometry; //MAYBE: && features.geometry + auto shaderStages = setShaders(worldPass, withGeometry ? "Tris.geo" : "Tris", withGeometry, &specialization); VkPipelineVertexInputStateCreateInfo vertexInputInfo{}; vertexInputInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; - auto bindingDescription = buffer::vk::VertexData::getBindingDescription(); + auto bindingDescription = Model::getBindingDescription(); vertexInputInfo.vertexBindingDescriptionCount = 1; vertexInputInfo.pVertexBindingDescriptions = &bindingDescription; - auto attributeDescriptions = buffer::vk::VertexData::getAttributeDescriptions(); + auto attributeDescriptions = Model::getAttributeDescriptions(); vertexInputInfo.vertexAttributeDescriptionCount = attributeDescriptions.size(); vertexInputInfo.pVertexAttributeDescriptions = attributeDescriptions.data(); diff --git a/src/client/render/vk/Renderer.cpp b/src/client/render/vk/Renderer.cpp index bba0a42..8408dcc 100644 --- a/src/client/render/vk/Renderer.cpp +++ b/src/client/render/vk/Renderer.cpp @@ -411,8 +411,14 @@ void Renderer::beginFrame() { if (auto newImage = swapChain->acquireNextImage(imageAvailableSemaphores[currentFrame], inFlightFences[currentFrame])) { currentImage = newImage.value(); + VoxelUBO ubo{}; + ubo.proj = ProjectionMatrix; + ubo.view = ViewMatrix; + ubo.fog = options.clear_color; + ubo.fog.a = FogDepth; + ubo.lightInv = LightInvDir; commandCenter->startRecording(currentImage, pipeline->getRenderPass(), - getInfos().swapDetails.capabilities.currentExtent, options.clear_color, ViewMatrix, ProjectionMatrix); + getInfos().swapDetails.capabilities.currentExtent, ubo); allocator->setTracyZone("Submit"); } else { recreateSwapChain(); @@ -423,10 +429,15 @@ void Renderer::beginFrame() { std::function Renderer::beginWorldPass() { assert(currentImage < swapChain->getImageViews().size()); - commandCenter->startWorldPass(currentImage, pipeline->getWorldPass()); - commandCenter->recordModel(currentImage); - return [&](render::LodModel *const, glm::mat4, glm::vec4, float) { - return 0; //WorldPass->setup(this, model); + auto& pass = pipeline->getWorldPass(); + commandCenter->startWorldPass(currentImage, pass); + return [&](render::LodModel *const rBuffer, glm::mat4 model, glm::vec4 sphere, float curv) { + auto buffer = dynamic_cast(rBuffer); + UniqueCurvaturePush push{}; + push.model = model; + push.sphereProj = sphere; + push.curvature = curv; + return commandCenter->recordModel(currentImage, pass, push, buffer); }; } @@ -447,7 +458,7 @@ size_t Renderer::drawIndicatorCube(glm::mat4 model) { } void Renderer::postProcess() { - commandCenter->recordPostprocess(currentImage, pipeline->getSkyPass(), options.skybox, ViewMatrix, ProjectionMatrix); + commandCenter->recordPostprocess(currentImage, pipeline->getSkyPass(), options.skybox); } void Renderer::endFrame() { diff --git a/src/client/render/vk/api/Images.cpp b/src/client/render/vk/api/Images.cpp index f611c05..4377398 100644 --- a/src/client/render/vk/api/Images.cpp +++ b/src/client/render/vk/api/Images.cpp @@ -223,8 +223,8 @@ std::unique_ptr TextureCube::LoadFromFiles(const std::string& prefi std::unique_ptr TextureArray::LoadFromFiles(const std::vector& paths, const sampling& props) { std::vector> datas; std::vector views; - datas.resize(1); - views.reserve(6); + datas.resize(paths.size()); + views.reserve(paths.size()); auto header = [&] { if (auto header = render::Image::Read(paths.at(0), datas.at(0))) { views.push_back(datas.at(0)); @@ -232,7 +232,6 @@ std::unique_ptr TextureArray::LoadFromFiles(const std::vector Create(const Data &); + static VkVertexInputBindingDescription getBindingDescription() { + VkVertexInputBindingDescription description{}; + description.binding = 0; + description.stride = sizeof(PackedVertexData); + description.inputRate = VK_VERTEX_INPUT_RATE_VERTEX; + return description; + } + static std::array getAttributeDescriptions() { + std::array attributeDescriptions{}; + attributeDescriptions[0].binding = 0; + attributeDescriptions[0].location = 0; + attributeDescriptions[0].format = VK_FORMAT_R16G16B16_SFLOAT; + attributeDescriptions[0].offset = offsetof(PackedVertexData, PosMat[0]); + attributeDescriptions[1].binding = 0; + attributeDescriptions[1].location = 1; + attributeDescriptions[1].format = VK_FORMAT_R16_UINT; + attributeDescriptions[1].offset = offsetof(PackedVertexData, PosMat[3]); + attributeDescriptions[2].binding = 0; + attributeDescriptions[2].location = 2; + attributeDescriptions[2].format = VK_FORMAT_R16G16B16_SFLOAT; + attributeDescriptions[2].offset = offsetof(PackedVertexData, Nrm); + return attributeDescriptions; + } + protected: Model(size_t size, VkBuffer vertex, VkBuffer index, memory::ptr mem): ShortIndexedVertexBuffer(vertex, index, std::move(mem)), indexSize(size) { } @@ -85,6 +109,9 @@ public: static void MakeDefault(); + constexpr uint32_t getIndexStart() const { return getOffset(level); } + constexpr uint32_t getIndexSize() const { return getOffset(level+1) - getOffset(level); } + protected: LodModel(size_t size, const std::vector& off, VkBuffer vertex, VkBuffer index, memory::ptr mem): @@ -95,7 +122,7 @@ protected: } }; -struct UniformBufferObject { +struct ViewProjUBO { alignas(16) glm::mat4 view; alignas(16) glm::mat4 proj; @@ -109,9 +136,35 @@ struct UniformBufferObject { return uboLayoutBinding; } }; +struct VoxelUBO { + alignas(16) glm::mat4 view; + alignas(16) glm::mat4 proj; + + alignas(16) glm::vec3 lightInv; + //NOTE: one "free" space + alignas(16) glm::vec4 fog; + + static VkDescriptorSetLayoutBinding getLayoutBinding() { + VkDescriptorSetLayoutBinding uboLayoutBinding{}; + uboLayoutBinding.binding = 0; + uboLayoutBinding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; + uboLayoutBinding.descriptorCount = 1; + uboLayoutBinding.stageFlags = VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT; + uboLayoutBinding.pImmutableSamplers = nullptr; + return uboLayoutBinding; + } +}; struct ModelPush { alignas(16) glm::mat4 model; }; - +struct CurvaturePush { + alignas(16) glm::vec4 sphereProj; + alignas(4) float curvature; +}; +struct UniqueCurvaturePush { + alignas(16) glm::mat4 model; + alignas(16) glm::vec4 sphereProj; + alignas(4) float curvature; +}; } \ No newline at end of file diff --git a/src/client/render/vk/buffer/VertexData.hpp b/src/client/render/vk/buffer/VertexData.hpp deleted file mode 100644 index 31b7fed..0000000 --- a/src/client/render/vk/buffer/VertexData.hpp +++ /dev/null @@ -1,56 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -namespace buffer::vk { - -struct VertexData { - glm::vec3 pos; - glm::vec3 color; - glm::vec2 uv; - - static VkVertexInputBindingDescription getBindingDescription() { - VkVertexInputBindingDescription description{}; - description.binding = 0; - description.stride = sizeof(VertexData); - description.inputRate = VK_VERTEX_INPUT_RATE_VERTEX; - return description; - } - static std::array getAttributeDescriptions() { - std::array attributeDescriptions{}; - attributeDescriptions[0].binding = 0; - attributeDescriptions[0].location = 0; - attributeDescriptions[0].format = VK_FORMAT_R32G32B32_SFLOAT; - attributeDescriptions[0].offset = offsetof(VertexData, pos); - attributeDescriptions[1].binding = 0; - attributeDescriptions[1].location = 1; - attributeDescriptions[1].format = VK_FORMAT_R32G32B32_SFLOAT; - attributeDescriptions[1].offset = offsetof(VertexData, color); - attributeDescriptions[2].binding = 0; - attributeDescriptions[2].location = 2; - attributeDescriptions[2].format = VK_FORMAT_R32G32_SFLOAT; - attributeDescriptions[2].offset = offsetof(VertexData, uv); - return attributeDescriptions; - } -}; - -const std::vector vertices = { - {{-0.5f, -0.5f, 0.0f}, {1.0f, 0.0f, 0.0f}, {0.0f, 0.0f}}, - {{0.5f, -0.5f, 0.0f}, {0.0f, 1.0f, 0.0f}, {1.0f, 0.0f}}, - {{0.5f, 0.5f, 0.0f}, {0.0f, 0.0f, 1.0f}, {1.0f, 1.0f}}, - {{-0.5f, 0.5f, 0.0f}, {1.0f, 1.0f, 1.0f}, {0.0f, 1.0f}}, - - {{-0.5f, -0.5f, -0.5f}, {1.0f, 0.0f, 0.0f}, {0.0f, 0.0f}}, - {{0.5f, -0.5f, -0.5f}, {0.0f, 1.0f, 0.0f}, {1.0f, 0.0f}}, - {{0.5f, 0.5f, -0.5f}, {0.0f, 0.0f, 1.0f}, {1.0f, 1.0f}}, - {{-0.5f, 0.5f, -0.5f}, {1.0f, 1.0f, 1.0f}, {0.0f, 1.0f}}}; - -const std::vector indices = { - 0, 1, 2, 2, 3, 0, - 4, 5, 6, 6, 7, 4 -}; - -} \ No newline at end of file