diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 15d650c..442879c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -21,7 +21,7 @@ set(GLTF_MODEL_LOADER "${PLUMAGE_RENDER}/glTFMaterial.cpp" "${PLUMAGE_RENDER}/glTFPrimitive.cpp" - "render/glTFPrimitive.h") + "render/glTFPrimitive.h" "render/glTFMesh.h" "render/glTFMesh.cpp") set(VULKAN_BASE "${PLUMAGE_RENDER}/VulkanBase_Marco.h" diff --git a/src/render/glTFMesh.cpp b/src/render/glTFMesh.cpp new file mode 100644 index 0000000..47e962b --- /dev/null +++ b/src/render/glTFMesh.cpp @@ -0,0 +1,42 @@ +#include "glTFMesh.h" +#include + + +GLTFLOADER_NAMESPACE_BEGIN + + +glTFMesh::glTFMesh(VulkanBase::VulkanDevice* device, glm::mat4 matrix) + :m_device(device) + +{ + m_uniformBlock.matrix = matrix; + + VK_CHECK_RESULT(m_device->createBuffer( + VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, + VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, + sizeof(m_uniformBlock), + &m_uniformBuffer.buffer, + &m_uniformBuffer.memory, + &m_uniformBlock)); + VK_CHECK_RESULT(vkMapMemory(m_device->getLogicalDevice(), m_uniformBuffer.memory, 0, sizeof(m_uniformBlock), 0, &m_uniformBuffer.mapped)); + m_uniformBuffer.descriptor = { m_uniformBuffer.buffer, 0, sizeof(m_uniformBlock) }; +} + +glTFMesh::~glTFMesh() +{ + vkDestroyBuffer(m_device->getLogicalDevice(), m_uniformBuffer.buffer, nullptr); + vkFreeMemory(m_device->getLogicalDevice(), m_uniformBuffer.memory, nullptr); + for (glTFPrimitive* primitive : m_primitives) + { + delete primitive; + } + m_primitives.clear(); +} + +void glTFMesh::setBoundingBox(glm::vec3 min, glm::vec3 max) +{ + m_boundingBox.setBoundingBox(min, max); +} + + +GLTFLOADER_NAMESPACE_END \ No newline at end of file diff --git a/src/render/glTFMesh.h b/src/render/glTFMesh.h new file mode 100644 index 0000000..e87641e --- /dev/null +++ b/src/render/glTFMesh.h @@ -0,0 +1,48 @@ +#ifndef GLTFMESH_H +#define GLTFMESH_H + +#include "glTFModel_Marco.h" + +#include "VulkanDevice.h" +#include "glTFPrimitive.h" +#include "glTFBoundingBox.h" + +#include + +GLTFLOADER_NAMESPACE_BEGIN + +class glTFMesh +{ +public: + glTFMesh(VulkanBase::VulkanDevice* device, glm::mat4 matrix); + ~glTFMesh(); + + void setBoundingBox(glm::vec3 min, glm::vec3 max); + +private: + + VulkanBase::VulkanDevice* m_device; + std::vector m_primitives; + glTFBoundingBox m_boundingBox; + glTFBoundingBox m_aabb; + struct UniformBuffer { + VkBuffer buffer; + VkDeviceMemory memory; + VkDescriptorBufferInfo descriptor; + VkDescriptorSet descriptorSet; + void* mapped = nullptr; + } m_uniformBuffer; + struct UniformBlock { + glm::mat4 matrix; + glm::mat4 jointMatrix[128]{}; + float jointcount{ 0 }; + } m_uniformBlock; + +}; + + + +GLTFLOADER_NAMESPACE_END + +#endif // !GLTFMESH_H +