diff options
author | Frederico Linhares <fred@linhares.blue> | 2023-09-07 15:14:14 -0300 |
---|---|---|
committer | Frederico Linhares <fred@linhares.blue> | 2023-09-15 14:12:15 -0300 |
commit | 25bf78bfb4785e2cbed683cc56d3cec4271d8b5a (patch) | |
tree | 6fa728091bd662ee0c90a7490bc5ee8e6e23cac4 /src/vk/graphics_pipeline_3d_layout.cpp | |
parent | e1399befee43ab4549c31ce179e900ad71651edc (diff) |
feat Create skeletal mesh
Diffstat (limited to 'src/vk/graphics_pipeline_3d_layout.cpp')
-rw-r--r-- | src/vk/graphics_pipeline_3d_layout.cpp | 78 |
1 files changed, 60 insertions, 18 deletions
diff --git a/src/vk/graphics_pipeline_3d_layout.cpp b/src/vk/graphics_pipeline_3d_layout.cpp index db5d210..cbb73e5 100644 --- a/src/vk/graphics_pipeline_3d_layout.cpp +++ b/src/vk/graphics_pipeline_3d_layout.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2022 Frederico de Oliveira Linhares + * Copyright 2022-2023 Frederico de Oliveira Linhares * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -103,18 +103,64 @@ unload_descriptor_set_view(void *obj) } void -load_descriptor_set_model_instance(void *obj) +load_descriptor_set_skeletal_model(void *obj) { auto self = static_cast<VK::GraphicsPipeline3DLayout*>(obj); - std::array<VkDescriptorSetLayoutBinding, 1> layout_bindings{}; - + std::array<VkDescriptorSetLayoutBinding, 2> layout_bindings; layout_bindings[0].binding = 0; - layout_bindings[0].descriptorType = + layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; + layout_bindings[0].descriptorCount = 1; + layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT; + layout_bindings[0].pImmutableSamplers = nullptr; + layout_bindings[1].binding = 1; + layout_bindings[1].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + layout_bindings[1].descriptorCount = 1; + layout_bindings[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; + layout_bindings[1].pImmutableSamplers = nullptr; + + VkDescriptorSetLayoutCreateInfo layout_info{}; + layout_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; + layout_info.pNext = nullptr; + layout_info.flags = 0; + layout_info.bindingCount = static_cast<uint32_t>(layout_bindings.size()); + layout_info.pBindings = layout_bindings.data(); + + if(vkCreateDescriptorSetLayout( + cg_core.vk_device_with_swapchain->device, &layout_info, nullptr, + &self->descriptor_set_skeletal_model) != VK_SUCCESS) + throw CommandError{ + "Failed to create Vulkan descriptor set layout for model instance."}; +} + +void +unload_descriptor_set_skeletal_model(void *obj) +{ + auto self = static_cast<VK::GraphicsPipeline3DLayout*>(obj); + + vkDestroyDescriptorSetLayout( + cg_core.vk_device_with_swapchain->device, + self->descriptor_set_skeletal_model, nullptr); +} + +void +load_descriptor_set_static_model(void *obj) +{ + auto self = static_cast<VK::GraphicsPipeline3DLayout*>(obj); + + std::array<VkDescriptorSetLayoutBinding, 2> layout_bindings; + layout_bindings[0].binding = 0; + layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; layout_bindings[0].descriptorCount = 1; - layout_bindings[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; + layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT; layout_bindings[0].pImmutableSamplers = nullptr; + layout_bindings[1].binding = 1; + layout_bindings[1].descriptorType = + VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; + layout_bindings[1].descriptorCount = 1; + layout_bindings[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; + layout_bindings[1].pImmutableSamplers = nullptr; VkDescriptorSetLayoutCreateInfo layout_info{}; layout_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO; @@ -125,19 +171,19 @@ load_descriptor_set_model_instance(void *obj) if(vkCreateDescriptorSetLayout( cg_core.vk_device_with_swapchain->device, &layout_info, nullptr, - &self->descriptor_set_model_instance) != VK_SUCCESS) + &self->descriptor_set_static_model) != VK_SUCCESS) throw CommandError{ "Failed to create Vulkan descriptor set layout for model instance."}; } void -unload_descriptor_set_model_instance(void *obj) +unload_descriptor_set_static_model(void *obj) { auto self = static_cast<VK::GraphicsPipeline3DLayout*>(obj); vkDestroyDescriptorSetLayout( cg_core.vk_device_with_swapchain->device, - self->descriptor_set_model_instance, nullptr); + self->descriptor_set_static_model, nullptr); } void @@ -148,19 +194,14 @@ load_pipeline(void *obj) std::array<VkDescriptorSetLayout, 3> set_layouts{ self->descriptor_set_world, self->descriptor_set_view, - self->descriptor_set_model_instance}; - - std::array<VkPushConstantRange, 1> push_constants; - push_constants[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT; - push_constants[0].offset = 0; - push_constants[0].size = sizeof(VK::ODOModelInstance); + self->descriptor_set_skeletal_model}; VkPipelineLayoutCreateInfo pipeline_layout_info{}; pipeline_layout_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO; pipeline_layout_info.setLayoutCount = set_layouts.size(); pipeline_layout_info.pSetLayouts = set_layouts.data(); - pipeline_layout_info.pushConstantRangeCount = push_constants.size(); - pipeline_layout_info.pPushConstantRanges = push_constants.data(); + pipeline_layout_info.pushConstantRangeCount = 0; + pipeline_layout_info.pPushConstantRanges = nullptr; if(vkCreatePipelineLayout( cg_core.vk_device_with_swapchain->device, @@ -266,7 +307,8 @@ unload_render_pass(void *obj) const CommandChain loader{ {&load_descriptor_set_world, &unload_descriptor_set_world}, {&load_descriptor_set_view, &unload_descriptor_set_view}, - {&load_descriptor_set_model_instance, &unload_descriptor_set_model_instance}, + {&load_descriptor_set_skeletal_model, &unload_descriptor_set_skeletal_model}, + {&load_descriptor_set_static_model, &unload_descriptor_set_static_model}, {&load_pipeline, &unload_pipeline}, {&load_render_pass, &unload_render_pass} }; |