summaryrefslogtreecommitdiff
path: root/src/vk/graphics_pipeline_3d_layout.cpp
diff options
context:
space:
mode:
authorFrederico Linhares <fred@linhares.blue>2023-09-07 15:14:14 -0300
committerFrederico Linhares <fred@linhares.blue>2023-09-15 14:12:15 -0300
commit25bf78bfb4785e2cbed683cc56d3cec4271d8b5a (patch)
tree6fa728091bd662ee0c90a7490bc5ee8e6e23cac4 /src/vk/graphics_pipeline_3d_layout.cpp
parente1399befee43ab4549c31ce179e900ad71651edc (diff)
feat Create skeletal mesh
Diffstat (limited to 'src/vk/graphics_pipeline_3d_layout.cpp')
-rw-r--r--src/vk/graphics_pipeline_3d_layout.cpp78
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}
};