From 7e43a55a767b2a76ac4e42c32bdb69c811ea71ec Mon Sep 17 00:00:00 2001 From: saschawillems Date: Sat, 11 Feb 2017 14:18:24 +0100 Subject: [PATCH] Removed old mesh loader, replaced with new model loader and vertex layout class in all examples (Refs #260) --- base/vulkanMeshLoader.hpp | 648 ------------------ base/vulkanexamplebase.cpp | 32 - base/vulkanexamplebase.h | 14 - bloom/bloom.cpp | 60 +- computecullandlod/computecullandlod.cpp | 40 +- debugmarker/debugmarker.cpp | 312 ++------- deferred/deferred.cpp | 84 +-- .../deferredmultisampling.cpp | 61 +- deferredshadows/deferredshadows.cpp | 124 ++-- displacement/displacement.cpp | 36 +- geometryshader/geometryshader.cpp | 38 +- indirectdraw/indirectdraw.cpp | 78 +-- instancing/instancing.cpp | 52 +- multisampling/multisampling.cpp | 40 +- multithreading/multithreading.cpp | 52 +- occlusionquery/occlusionquery.cpp | 89 ++- offscreen/offscreen.cpp | 76 +- parallaxmapping/parallaxmapping.cpp | 42 +- pipelines/pipelines.cpp | 43 +- pushconstants/pushconstants.cpp | 38 +- radialblur/radialblur.cpp | 48 +- screenshot/screenshot.cpp | 32 +- shadowmapping/shadowmapping.cpp | 63 +- shadowmappingomni/shadowmappingomni.cpp | 54 +- .../specializationconstants.cpp | 40 +- sphericalenvmapping/sphericalenvmapping.cpp | 49 +- ssao/ssao.cpp | 42 +- subpasses/subpasses.cpp | 50 +- terraintessellation/terraintessellation.cpp | 72 +- tessellation/tessellation.cpp | 37 +- texture3d/texture3d.cpp | 11 +- texturecubemap/texturecubemap.cpp | 63 +- texturemipmapgen/texturemipmapgen.cpp | 30 +- .../texturesparseresidency.cpp | 6 - vulkanExamples.sln | 2 - 35 files changed, 843 insertions(+), 1715 deletions(-) delete mode 100644 base/vulkanMeshLoader.hpp diff --git a/base/vulkanMeshLoader.hpp b/base/vulkanMeshLoader.hpp deleted file mode 100644 index e937be04..00000000 --- a/base/vulkanMeshLoader.hpp +++ /dev/null @@ -1,648 +0,0 @@ -/* -* Mesh loader for creating Vulkan resources from models loaded with ASSIMP -* -* Copyright (C) 2016 by Sascha Willems - www.saschawillems.de -* -* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT) -*/ - -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#ifdef _WIN32 -#include -#include -#include -#else -#endif - -#include "vulkan/vulkan.h" - -#include -#include -#include -#include - -#include -#include -#include - -#include "vulkandevice.hpp" - -#if defined(__ANDROID__) -#include -#endif - -namespace vkMeshLoader -{ - typedef enum VertexLayout { - VERTEX_LAYOUT_POSITION = 0x0, - VERTEX_LAYOUT_NORMAL = 0x1, - VERTEX_LAYOUT_COLOR = 0x2, - VERTEX_LAYOUT_UV = 0x3, - VERTEX_LAYOUT_TANGENT = 0x4, - VERTEX_LAYOUT_BITANGENT = 0x5, - VERTEX_LAYOUT_DUMMY_FLOAT = 0x6, - VERTEX_LAYOUT_DUMMY_VEC4 = 0x7 - } VertexLayout; - - struct MeshBufferInfo - { - VkBuffer buf = VK_NULL_HANDLE; - VkDeviceMemory mem = VK_NULL_HANDLE; - size_t size = 0; - }; - - /** @brief Stores a mesh's vertex and index descriptions */ - struct MeshDescriptor - { - uint32_t vertexCount; - uint32_t indexBase; - uint32_t indexCount; - }; - - /** @brief Mesh representation storing all data required to generate buffers */ - struct MeshBuffer - { - VkDevice device = VK_NULL_HANDLE; - std::vector meshDescriptors; - MeshBufferInfo vertices; - MeshBufferInfo indices; - uint32_t indexCount; - glm::vec3 dim; - /** @brief Release all Vulkan resources held by this texture */ - void destroy() - { - vkDestroyBuffer(device, vertices.buf, nullptr); - vkFreeMemory(device, vertices.mem, nullptr); - if (indices.buf != VK_NULL_HANDLE) - { - vkDestroyBuffer(device, indices.buf, nullptr); - vkFreeMemory(device, indices.mem, nullptr); - } - } - }; - - /** @brief Holds parameters for mesh creation */ - struct MeshCreateInfo - { - glm::vec3 center; - glm::vec3 scale; - glm::vec2 uvscale; - }; - - /** - * Get the size of a vertex layout - * - * @param layout VertexLayout to get the size for - * - * @return Size of the vertex layout in bytes - */ - static uint32_t vertexSize(std::vector layout) - { - uint32_t vSize = 0; - for (auto& layoutDetail : layout) - { - switch (layoutDetail) - { - // UV only has two components - case VERTEX_LAYOUT_UV: - vSize += 2 * sizeof(float); - break; - default: - vSize += 3 * sizeof(float); - } - } - return vSize; - } - - /** - * Generate vertex attribute descriptions for a layout at the given binding point - * - * @param layout VertexLayout from which to generate the descriptions - * @param attributeDescriptions Refernce to a vector of the descriptions to generate - * @param binding Index of the attribute description binding point - * - * @note Always assumes float formats - */ - static void getVertexInputAttributeDescriptions(std::vector layout, std::vector &attributeDescriptions, uint32_t binding) - { - uint32_t offset = 0; - uint32_t location = 0; - for (auto& layoutDetail : layout) - { - VkVertexInputAttributeDescription inputAttribDescription = {}; - inputAttribDescription.binding = binding; - inputAttribDescription.location = location; - inputAttribDescription.offset = offset; - - switch (layoutDetail) - { - // UV only has two components - case VERTEX_LAYOUT_UV: - offset += 2 * sizeof(float); - inputAttribDescription.format = VK_FORMAT_R32G32_SFLOAT; - break; - default: - offset += 3 * sizeof(float); - inputAttribDescription.format = VK_FORMAT_R32G32B32_SFLOAT; - } - attributeDescriptions.push_back(inputAttribDescription); - location++; - } - } - - // Stores some additonal info and functions for - // specifying pipelines, vertex bindings, etc. - class Mesh - { - public: - MeshBuffer buffers; - - VkPipelineLayout pipelineLayout = VK_NULL_HANDLE; - VkPipeline pipeline = VK_NULL_HANDLE; - VkDescriptorSet descriptorSet = VK_NULL_HANDLE; - - uint32_t vertexBufferBinding = 0; - - VkPipelineVertexInputStateCreateInfo vertexInputState; - VkVertexInputBindingDescription bindingDescription; - std::vector attributeDescriptions; - - void setupVertexInputState(std::vector layout) - { - bindingDescription = vkTools::initializers::vertexInputBindingDescription( - vertexBufferBinding, - vertexSize(layout), - VK_VERTEX_INPUT_RATE_VERTEX); - - attributeDescriptions.clear(); - uint32_t offset = 0; - uint32_t binding = 0; - for (auto& layoutDetail : layout) - { - // Format (layout) - VkFormat format = (layoutDetail == VERTEX_LAYOUT_UV) ? VK_FORMAT_R32G32_SFLOAT : VK_FORMAT_R32G32B32_SFLOAT; - - attributeDescriptions.push_back( - vkTools::initializers::vertexInputAttributeDescription( - vertexBufferBinding, - binding, - format, - offset)); - - // Offset - offset += (layoutDetail == VERTEX_LAYOUT_UV) ? (2 * sizeof(float)) : (3 * sizeof(float)); - binding++; - } - - vertexInputState = vkTools::initializers::pipelineVertexInputStateCreateInfo(); - vertexInputState.vertexBindingDescriptionCount = 1; - vertexInputState.pVertexBindingDescriptions = &bindingDescription; - vertexInputState.vertexAttributeDescriptionCount = static_cast(attributeDescriptions.size()); - vertexInputState.pVertexAttributeDescriptions = attributeDescriptions.data(); - } - - void drawIndexed(VkCommandBuffer cmdBuffer) - { - VkDeviceSize offsets[1] = { 0 }; - if (pipeline != VK_NULL_HANDLE) - { - vkCmdBindPipeline(cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); - } - if ((pipelineLayout != VK_NULL_HANDLE) && (descriptorSet != VK_NULL_HANDLE)) - { - vkCmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSet, 0, NULL); - } - vkCmdBindVertexBuffers(cmdBuffer, vertexBufferBinding, 1, &buffers.vertices.buf, offsets); - vkCmdBindIndexBuffer(cmdBuffer, buffers.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(cmdBuffer, buffers.indexCount, 1, 0, 0, 0); - } - }; - - static void freeMeshBufferResources(VkDevice device, vkMeshLoader::MeshBuffer *meshBuffer) - { - vkDestroyBuffer(device, meshBuffer->vertices.buf, nullptr); - vkFreeMemory(device, meshBuffer->vertices.mem, nullptr); - if (meshBuffer->indices.buf != VK_NULL_HANDLE) - { - vkDestroyBuffer(device, meshBuffer->indices.buf, nullptr); - vkFreeMemory(device, meshBuffer->indices.mem, nullptr); - } - } -} - -// Simple mesh class for getting all the necessary stuff from models loaded via ASSIMP -class VulkanMeshLoader -{ -private: - vk::VulkanDevice *vulkanDevice; - - static const int defaultFlags = aiProcess_FlipWindingOrder | aiProcess_Triangulate | aiProcess_PreTransformVertices | aiProcess_CalcTangentSpace | aiProcess_GenSmoothNormals; - - struct Vertex - { - glm::vec3 m_pos; - glm::vec2 m_tex; - glm::vec3 m_normal; - glm::vec3 m_color; - glm::vec3 m_tangent; - glm::vec3 m_binormal; - - Vertex() {} - - Vertex(const glm::vec3& pos, const glm::vec2& tex, const glm::vec3& normal, const glm::vec3& tangent, const glm::vec3& bitangent, const glm::vec3& color) - { - m_pos = pos; - m_tex = tex; - m_normal = normal; - m_color = color; - m_tangent = tangent; - m_binormal = bitangent; - } - }; - - struct MeshEntry { - uint32_t NumIndices; - uint32_t MaterialIndex; - uint32_t vertexBase; - std::vector Vertices; - std::vector Indices; - }; - -public: -#if defined(__ANDROID__) - AAssetManager* assetManager = nullptr; -#endif - - std::vector m_Entries; - - struct Dimension - { - glm::vec3 min = glm::vec3(FLT_MAX); - glm::vec3 max = glm::vec3(-FLT_MAX); - glm::vec3 size; - } dim; - - uint32_t numVertices = 0; - - Assimp::Importer Importer; - const aiScene* pScene; - - /** - * Default constructor - * - * @param vulkanDevice Pointer to a valid VulkanDevice - */ - VulkanMeshLoader(vk::VulkanDevice *vulkanDevice) - { - assert(vulkanDevice != nullptr); - this->vulkanDevice = vulkanDevice; - } - - /** - * Default destructor - * - * @note Does not free any Vulkan resources - */ - ~VulkanMeshLoader() - { - m_Entries.clear(); - } - - /** - * Load a scene from a supported 3D file format - * - * @param filename Name of the file (or asset) to load - * @param flags (Optional) Set of ASSIMP processing flags - * - * @return Returns true if the scene has been loaded - */ - bool LoadMesh(const std::string& filename, int flags = defaultFlags) - { -#if defined(__ANDROID__) - // Meshes are stored inside the apk on Android (compressed) - // So they need to be loaded via the asset manager - - AAsset* asset = AAssetManager_open(assetManager, filename.c_str(), AASSET_MODE_STREAMING); - assert(asset); - size_t size = AAsset_getLength(asset); - - assert(size > 0); - - void *meshData = malloc(size); - AAsset_read(asset, meshData, size); - AAsset_close(asset); - - pScene = Importer.ReadFileFromMemory(meshData, size, flags); - - free(meshData); -#else - pScene = Importer.ReadFile(filename.c_str(), flags); -#endif - - if (pScene) - { - m_Entries.clear(); - m_Entries.resize(pScene->mNumMeshes); - // Read in all meshes in the scene - for (auto i = 0; i < m_Entries.size(); i++) - { - m_Entries[i].vertexBase = numVertices; - numVertices += pScene->mMeshes[i]->mNumVertices; - const aiMesh* paiMesh = pScene->mMeshes[i]; - InitMesh(&m_Entries[i], paiMesh, pScene); - } - return true; - } - else - { - printf("Error parsing '%s': '%s'\n", filename.c_str(), Importer.GetErrorString()); -#if defined(__ANDROID__) - LOGE("Error parsing '%s': '%s'", filename.c_str(), Importer.GetErrorString()); -#endif - return false; - } - } - - /** - * Read mesh data from ASSIMP mesh to an internal mesh representation that can be used to generate Vulkan buffers - * - * @param meshEntry Pointer to the target MeshEntry strucutre for the mesh data - * @param paiMesh ASSIMP mesh to get the data from - * @param pScene Scene file of the ASSIMP mesh - */ - void InitMesh(MeshEntry *meshEntry, const aiMesh* paiMesh, const aiScene* pScene) - { - meshEntry->MaterialIndex = paiMesh->mMaterialIndex; - - aiColor3D pColor(0.f, 0.f, 0.f); - pScene->mMaterials[paiMesh->mMaterialIndex]->Get(AI_MATKEY_COLOR_DIFFUSE, pColor); - - aiVector3D Zero3D(0.0f, 0.0f, 0.0f); - - for (unsigned int i = 0; i < paiMesh->mNumVertices; i++) - { - aiVector3D* pPos = &(paiMesh->mVertices[i]); - aiVector3D* pNormal = &(paiMesh->mNormals[i]); - aiVector3D* pTexCoord = (paiMesh->HasTextureCoords(0)) ? &(paiMesh->mTextureCoords[0][i]) : &Zero3D; - aiVector3D* pTangent = (paiMesh->HasTangentsAndBitangents()) ? &(paiMesh->mTangents[i]) : &Zero3D; - aiVector3D* pBiTangent = (paiMesh->HasTangentsAndBitangents()) ? &(paiMesh->mBitangents[i]) : &Zero3D; - - Vertex v( - glm::vec3(pPos->x, -pPos->y, pPos->z), - glm::vec2(pTexCoord->x , pTexCoord->y), - glm::vec3(pNormal->x, pNormal->y, pNormal->z), - glm::vec3(pTangent->x, pTangent->y, pTangent->z), - glm::vec3(pBiTangent->x, pBiTangent->y, pBiTangent->z), - glm::vec3(pColor.r, pColor.g, pColor.b) - ); - - dim.max.x = fmax(pPos->x, dim.max.x); - dim.max.y = fmax(pPos->y, dim.max.y); - dim.max.z = fmax(pPos->z, dim.max.z); - - dim.min.x = fmin(pPos->x, dim.min.x); - dim.min.y = fmin(pPos->y, dim.min.y); - dim.min.z = fmin(pPos->z, dim.min.z); - - meshEntry->Vertices.push_back(v); - } - - dim.size = dim.max - dim.min; - - uint32_t indexBase = static_cast(meshEntry->Indices.size()); - for (unsigned int i = 0; i < paiMesh->mNumFaces; i++) - { - const aiFace& Face = paiMesh->mFaces[i]; - if (Face.mNumIndices != 3) - continue; - meshEntry->Indices.push_back(indexBase + Face.mIndices[0]); - meshEntry->Indices.push_back(indexBase + Face.mIndices[1]); - meshEntry->Indices.push_back(indexBase + Face.mIndices[2]); - } - } - - /** - * Create Vulkan buffers for the index and vertex buffer using a vertex layout - * - * @note Only does staging if a valid command buffer and transfer queue are passed - * - * @param meshBuffer Pointer to the mesh buffer containing buffer handles and memory - * @param layout Vertex layout for the vertex buffer - * @param createInfo Structure containing information for mesh creation time (center, scaling, etc.) - * @param useStaging If true, buffers are staged to device local memory - * @param copyCmd (Required for staging) Command buffer to put the copy commands into - * @param copyQueue (Required for staging) Queue to put copys into - */ - void createBuffers( - vkMeshLoader::MeshBuffer *meshBuffer, - std::vector layout, - vkMeshLoader::MeshCreateInfo *createInfo, - bool useStaging, - VkQueue copyQueue) - { - glm::vec3 scale; - glm::vec2 uvscale; - glm::vec3 center; - if (createInfo == nullptr) - { - scale = glm::vec3(1.0f); - uvscale = glm::vec2(1.0f); - center = glm::vec3(0.0f); - } - else - { - scale = createInfo->scale; - uvscale = createInfo->uvscale; - center = createInfo->center; - } - - std::vector vertexBuffer; - for (int m = 0; m < m_Entries.size(); m++) - { - for (int i = 0; i < m_Entries[m].Vertices.size(); i++) - { - // Push vertex data depending on layout - for (auto& layoutDetail : layout) - { - // Position - if (layoutDetail == vkMeshLoader::VERTEX_LAYOUT_POSITION) - { - vertexBuffer.push_back(m_Entries[m].Vertices[i].m_pos.x * scale.x + center.x); - vertexBuffer.push_back(m_Entries[m].Vertices[i].m_pos.y * scale.y + center.y); - vertexBuffer.push_back(m_Entries[m].Vertices[i].m_pos.z * scale.z + center.z); - } - // Normal - if (layoutDetail == vkMeshLoader::VERTEX_LAYOUT_NORMAL) - { - vertexBuffer.push_back(m_Entries[m].Vertices[i].m_normal.x); - vertexBuffer.push_back(-m_Entries[m].Vertices[i].m_normal.y); - vertexBuffer.push_back(m_Entries[m].Vertices[i].m_normal.z); - } - // Texture coordinates - if (layoutDetail == vkMeshLoader::VERTEX_LAYOUT_UV) - { - vertexBuffer.push_back(m_Entries[m].Vertices[i].m_tex.s * uvscale.s); - vertexBuffer.push_back(m_Entries[m].Vertices[i].m_tex.t * uvscale.t); - } - // Color - if (layoutDetail == vkMeshLoader::VERTEX_LAYOUT_COLOR) - { - vertexBuffer.push_back(m_Entries[m].Vertices[i].m_color.r); - vertexBuffer.push_back(m_Entries[m].Vertices[i].m_color.g); - vertexBuffer.push_back(m_Entries[m].Vertices[i].m_color.b); - } - // Tangent - if (layoutDetail == vkMeshLoader::VERTEX_LAYOUT_TANGENT) - { - vertexBuffer.push_back(m_Entries[m].Vertices[i].m_tangent.x); - vertexBuffer.push_back(m_Entries[m].Vertices[i].m_tangent.y); - vertexBuffer.push_back(m_Entries[m].Vertices[i].m_tangent.z); - } - // Bitangent - if (layoutDetail == vkMeshLoader::VERTEX_LAYOUT_BITANGENT) - { - vertexBuffer.push_back(m_Entries[m].Vertices[i].m_binormal.x); - vertexBuffer.push_back(m_Entries[m].Vertices[i].m_binormal.y); - vertexBuffer.push_back(m_Entries[m].Vertices[i].m_binormal.z); - } - // Dummy layout components for padding - if (layoutDetail == vkMeshLoader::VERTEX_LAYOUT_DUMMY_FLOAT) - { - vertexBuffer.push_back(0.0f); - } - if (layoutDetail == vkMeshLoader::VERTEX_LAYOUT_DUMMY_VEC4) - { - vertexBuffer.push_back(0.0f); - vertexBuffer.push_back(0.0f); - vertexBuffer.push_back(0.0f); - vertexBuffer.push_back(0.0f); - } - } - } - } - meshBuffer->vertices.size = vertexBuffer.size() * sizeof(float); - - dim.min *= scale; - dim.max *= scale; - dim.size *= scale; - - std::vector indexBuffer; - for (uint32_t m = 0; m < m_Entries.size(); m++) - { - uint32_t indexBase = static_cast(indexBuffer.size()); - for (uint32_t i = 0; i < m_Entries[m].Indices.size(); i++) - { - indexBuffer.push_back(m_Entries[m].Indices[i] + indexBase); - } - vkMeshLoader::MeshDescriptor descriptor{}; - descriptor.indexBase = indexBase; - descriptor.indexCount = static_cast(m_Entries[m].Indices.size()); - descriptor.vertexCount = static_cast(m_Entries[m].Vertices.size()); - meshBuffer->meshDescriptors.push_back(descriptor); - } - meshBuffer->indices.size = indexBuffer.size() * sizeof(uint32_t); - meshBuffer->indexCount = static_cast(indexBuffer.size()); - meshBuffer->device = vulkanDevice->logicalDevice; - - // Use staging buffer to move vertex and index buffer to device local memory - if (useStaging && copyQueue != VK_NULL_HANDLE) - { - // Create staging buffers - struct { - VkBuffer buffer; - VkDeviceMemory memory; - } vertexStaging, indexStaging; - - // Vertex buffer - vulkanDevice->createBuffer( - VK_BUFFER_USAGE_TRANSFER_SRC_BIT, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, - meshBuffer->vertices.size, - &vertexStaging.buffer, - &vertexStaging.memory, - vertexBuffer.data()); - - // Index buffer - vulkanDevice->createBuffer( - VK_BUFFER_USAGE_TRANSFER_SRC_BIT, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, - meshBuffer->indices.size, - &indexStaging.buffer, - &indexStaging.memory, - indexBuffer.data()); - - // Create device local target buffers - // Vertex buffer - vulkanDevice->createBuffer( - VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, - VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, - meshBuffer->vertices.size, - &meshBuffer->vertices.buf, - &meshBuffer->vertices.mem); - - // Index buffer - vulkanDevice->createBuffer( - VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, - VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, - meshBuffer->indices.size, - &meshBuffer->indices.buf, - &meshBuffer->indices.mem); - - // Copy from staging buffers - VkCommandBuffer copyCmd = vulkanDevice->createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true); - - VkBufferCopy copyRegion = {}; - - copyRegion.size = meshBuffer->vertices.size; - vkCmdCopyBuffer( - copyCmd, - vertexStaging.buffer, - meshBuffer->vertices.buf, - 1, - ©Region); - - copyRegion.size = meshBuffer->indices.size; - vkCmdCopyBuffer( - copyCmd, - indexStaging.buffer, - meshBuffer->indices.buf, - 1, - ©Region); - - vulkanDevice->flushCommandBuffer(copyCmd, copyQueue); - - vkDestroyBuffer(vulkanDevice->logicalDevice, vertexStaging.buffer, nullptr); - vkFreeMemory(vulkanDevice->logicalDevice, vertexStaging.memory, nullptr); - vkDestroyBuffer(vulkanDevice->logicalDevice, indexStaging.buffer, nullptr); - vkFreeMemory(vulkanDevice->logicalDevice, indexStaging.memory, nullptr); - } - else - { - // Generate vertex buffer - vulkanDevice->createBuffer( - VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, - meshBuffer->vertices.size, - &meshBuffer->vertices.buf, - &meshBuffer->vertices.mem, - vertexBuffer.data()); - - // Generate index buffer - vulkanDevice->createBuffer( - VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, - meshBuffer->indices.size, - &meshBuffer->indices.buf, - &meshBuffer->indices.mem, - indexBuffer.data()); - } - } -}; \ No newline at end of file diff --git a/base/vulkanexamplebase.cpp b/base/vulkanexamplebase.cpp index d14ad030..4a11bdbf 100644 --- a/base/vulkanexamplebase.cpp +++ b/base/vulkanexamplebase.cpp @@ -210,38 +210,6 @@ VkPipelineShaderStageCreateInfo VulkanExampleBase::loadShader(std::string fileNa return shaderStage; } -void VulkanExampleBase::loadMesh(std::string filename, vkMeshLoader::MeshBuffer * meshBuffer, std::vector vertexLayout, float scale) -{ - vkMeshLoader::MeshCreateInfo meshCreateInfo; - meshCreateInfo.scale = glm::vec3(scale); - meshCreateInfo.center = glm::vec3(0.0f); - meshCreateInfo.uvscale = glm::vec2(1.0f); - loadMesh(filename, meshBuffer, vertexLayout, &meshCreateInfo); -} - -void VulkanExampleBase::loadMesh(std::string filename, vkMeshLoader::MeshBuffer * meshBuffer, std::vector vertexLayout, vkMeshLoader::MeshCreateInfo *meshCreateInfo) -{ - VulkanMeshLoader *mesh = new VulkanMeshLoader(vulkanDevice); - -#if defined(__ANDROID__) - mesh->assetManager = androidApp->activity->assetManager; -#endif - - mesh->LoadMesh(filename); - assert(mesh->m_Entries.size() > 0); - - mesh->createBuffers( - meshBuffer, - vertexLayout, - meshCreateInfo, - true, - queue); - - meshBuffer->dim = mesh->dim.size; - - delete(mesh); -} - void VulkanExampleBase::renderLoop() { destWidth = width; diff --git a/base/vulkanexamplebase.h b/base/vulkanexamplebase.h index bd49a286..a2382f8b 100644 --- a/base/vulkanexamplebase.h +++ b/base/vulkanexamplebase.h @@ -44,7 +44,6 @@ #include "VulkanInitializers.hpp" #include "vulkandevice.hpp" #include "vulkanswapchain.hpp" -#include "vulkanMeshLoader.hpp" #include "vulkantextoverlay.hpp" #include "camera.hpp" @@ -355,19 +354,6 @@ public: // Load a SPIR-V shader VkPipelineShaderStageCreateInfo loadShader(std::string fileName, VkShaderStageFlagBits stage); - // Load a mesh (using ASSIMP) and create vulkan vertex and index buffers with given vertex layout - void loadMesh( - std::string fiename, - vkMeshLoader::MeshBuffer *meshBuffer, - std::vector vertexLayout, - float scale); - void loadMesh( - std::string filename, - vkMeshLoader::MeshBuffer *meshBuffer, - std::vector - vertexLayout, - vkMeshLoader::MeshCreateInfo *meshCreateInfo); - // Start the main render loop void renderLoop(); diff --git a/bloom/bloom.cpp b/bloom/bloom.cpp index 88bae9fc..cd4e1895 100644 --- a/bloom/bloom.cpp +++ b/bloom/bloom.cpp @@ -20,6 +20,7 @@ #include #include "vulkanexamplebase.h" #include "VulkanTexture.hpp" +#include "VulkanModel.hpp" #include "vulkanbuffer.hpp" #define VERTEX_BUFFER_BIND_ID 0 @@ -29,15 +30,6 @@ #define FB_DIM 256 #define FB_COLOR_FORMAT VK_FORMAT_R8G8B8A8_UNORM -// Vertex layout for this example -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_UV, - vkMeshLoader::VERTEX_LAYOUT_COLOR, - vkMeshLoader::VERTEX_LAYOUT_NORMAL -}; - class VulkanExample : public VulkanExampleBase { public: @@ -47,11 +39,19 @@ public: vks::TextureCubeMap cubemap; } textures; + // Vertex layout for the models + vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_UV, + vks::VERTEX_COMPONENT_COLOR, + vks::VERTEX_COMPONENT_NORMAL, + }); + struct { - vkMeshLoader::MeshBuffer ufo; - vkMeshLoader::MeshBuffer ufoGlow; - vkMeshLoader::MeshBuffer skyBox; - } meshes; + vks::Model ufo; + vks::Model ufoGlow; + vks::Model skyBox; + } models; struct { VkPipelineVertexInputStateCreateInfo inputState; @@ -174,10 +174,10 @@ public: vkDestroyDescriptorSetLayout(device, descriptorSetLayouts.blur, nullptr); vkDestroyDescriptorSetLayout(device, descriptorSetLayouts.scene, nullptr); - // Meshes - vkMeshLoader::freeMeshBufferResources(device, &meshes.ufo); - vkMeshLoader::freeMeshBufferResources(device, &meshes.ufoGlow); - vkMeshLoader::freeMeshBufferResources(device, &meshes.skyBox); + // Models + models.ufo.destroy(); + models.ufoGlow.destroy(); + models.skyBox.destroy(); // Uniform buffers uniformBuffers.scene.destroy(); @@ -416,9 +416,9 @@ public: vkCmdBindPipeline(offscreenPass.commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.glowPass); VkDeviceSize offsets[1] = { 0 }; - vkCmdBindVertexBuffers(offscreenPass.commandBuffer, VERTEX_BUFFER_BIND_ID, 1, &meshes.ufoGlow.vertices.buf, offsets); - vkCmdBindIndexBuffer(offscreenPass.commandBuffer, meshes.ufoGlow.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(offscreenPass.commandBuffer, meshes.ufoGlow.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(offscreenPass.commandBuffer, VERTEX_BUFFER_BIND_ID, 1, &models.ufoGlow.vertices.buffer, offsets); + vkCmdBindIndexBuffer(offscreenPass.commandBuffer, models.ufoGlow.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(offscreenPass.commandBuffer, models.ufoGlow.indexCount, 1, 0, 0, 0); vkCmdEndRenderPass(offscreenPass.commandBuffer); @@ -487,17 +487,17 @@ public: vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayouts.scene, 0, 1, &descriptorSets.skyBox, 0, NULL); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.skyBox); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.skyBox.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.skyBox.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.skyBox.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.skyBox.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.skyBox.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(drawCmdBuffers[i], models.skyBox.indexCount, 1, 0, 0, 0); // 3D scene vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayouts.scene, 0, 1, &descriptorSets.scene, 0, NULL); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.phongPass); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.ufo.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.ufo.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.ufo.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.ufo.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.ufo.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(drawCmdBuffers[i], models.ufo.indexCount, 1, 0, 0, 0); // Render vertical blurred scene applying a horizontal blur // Render the (vertically blurred) contents of the second framebuffer and apply a horizontal blur @@ -522,9 +522,9 @@ public: void loadAssets() { - loadMesh(getAssetPath() + "models/retroufo.dae", &meshes.ufo, vertexLayout, 0.05f); - loadMesh(getAssetPath() + "models/retroufo_glow.dae", &meshes.ufoGlow, vertexLayout, 0.05f); - loadMesh(getAssetPath() + "models/cube.obj", &meshes.skyBox, vertexLayout, 1.0f); + models.ufo.loadFromFile(getAssetPath() + "models/retroufo.dae", vertexLayout, 0.05f, vulkanDevice, queue); + models.ufoGlow.loadFromFile(getAssetPath() + "models/retroufo_glow.dae", vertexLayout, 0.05f, vulkanDevice, queue); + models.skyBox.loadFromFile(getAssetPath() + "models/cube.obj", vertexLayout, 1.0f, vulkanDevice, queue); textures.cubemap.loadFromFile(getAssetPath() + "textures/cubemap_space.ktx", VK_FORMAT_R8G8B8A8_UNORM, vulkanDevice, queue); } @@ -536,7 +536,7 @@ public: vertices.bindingDescriptions[0] = vkTools::initializers::vertexInputBindingDescription( VERTEX_BUFFER_BIND_ID, - vkMeshLoader::vertexSize(vertexLayout), + vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX); // Attribute descriptions diff --git a/computecullandlod/computecullandlod.cpp b/computecullandlod/computecullandlod.cpp index 9da59087..ac69378c 100644 --- a/computecullandlod/computecullandlod.cpp +++ b/computecullandlod/computecullandlod.cpp @@ -23,6 +23,7 @@ #include #include "vulkanexamplebase.h" #include "vulkanbuffer.hpp" +#include "VulkanModel.hpp" #include "frustum.hpp" #define VERTEX_BUFFER_BIND_ID 0 @@ -38,14 +39,6 @@ #define MAX_LOD_LEVEL 5 -// Vertex layout for this example -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_NORMAL, - vkMeshLoader::VERTEX_LAYOUT_COLOR -}; - class VulkanExample : public VulkanExampleBase { public: @@ -57,9 +50,16 @@ public: std::vector attributeDescriptions; } vertices; + // Vertex layout for the models + vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_NORMAL, + vks::VERTEX_COMPONENT_COLOR, + }); + struct { - vkMeshLoader::MeshBuffer lodObject; - } meshes; + vks::Model lodObject; + } models; // Per-instance data block struct InstanceData { @@ -136,7 +136,7 @@ public: vkDestroyPipeline(device, pipelines.plants, nullptr); vkDestroyPipelineLayout(device, pipelineLayout, nullptr); vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); - vkMeshLoader::freeMeshBufferResources(device, &meshes.lodObject); + models.lodObject.destroy(); instanceBuffer.destroy(); indirectCommandsBuffer.destroy(); uniformData.scene.destroy(); @@ -195,10 +195,10 @@ public: // Mesh containing the LODs vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.plants); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.lodObject.vertices.buf, offsets); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.lodObject.vertices.buffer, offsets); vkCmdBindVertexBuffers(drawCmdBuffers[i], INSTANCE_BUFFER_BIND_ID, 1, &instanceBuffer.buffer, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.lodObject.indices.buf, 0, VK_INDEX_TYPE_UINT32); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.lodObject.indices.buffer, 0, VK_INDEX_TYPE_UINT32); if (vulkanDevice->features.multiDrawIndirect) { @@ -221,7 +221,7 @@ public: void loadAssets() { - loadMesh(getAssetPath() + "models/suzanne_lods.dae", &meshes.lodObject, vertexLayout, 0.1f); + models.lodObject.loadFromFile(getAssetPath() + "models/suzanne_lods.dae", vertexLayout, 0.1f, vulkanDevice, queue); } void setupVertexDescriptions() @@ -230,7 +230,7 @@ public: // Binding 0: Per vertex vertices.bindingDescriptions[0] = - vkTools::initializers::vertexInputBindingDescription(VERTEX_BUFFER_BIND_ID, vkMeshLoader::vertexSize(vertexLayout), VK_VERTEX_INPUT_RATE_VERTEX); + vkTools::initializers::vertexInputBindingDescription(VERTEX_BUFFER_BIND_ID, vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX); // Binding 1: Per instance vertices.bindingDescriptions[1] = @@ -573,12 +573,12 @@ public: }; std::vector LODLevels; uint32_t n = 0; - for (auto meshDescriptor : meshes.lodObject.meshDescriptors) + for (auto modelPart : models.lodObject.parts) { LOD lod; - lod.firstIndex = meshDescriptor.indexBase; // First index for this LOD - lod.indexCount = meshDescriptor.indexCount; // Index count for this LOD - lod.distance = 5.0f + n * 5.0f; // Starting distance (to viewer) for this LOD + lod.firstIndex = modelPart.indexBase; // First index for this LOD + lod.indexCount = modelPart.indexCount; // Index count for this LOD + lod.distance = 5.0f + n * 5.0f; // Starting distance (to viewer) for this LOD n++; LODLevels.push_back(lod); } @@ -721,7 +721,7 @@ public: specializationEntry.offset = 0; specializationEntry.size = sizeof(uint32_t); - uint32_t specializationData = static_cast(meshes.lodObject.meshDescriptors.size()) - 1; + uint32_t specializationData = static_cast(models.lodObject.parts.size()) - 1; VkSpecializationInfo specializationInfo; specializationInfo.mapEntryCount = 1; diff --git a/debugmarker/debugmarker.cpp b/debugmarker/debugmarker.cpp index 3bab8c5c..7b7ce711 100644 --- a/debugmarker/debugmarker.cpp +++ b/debugmarker/debugmarker.cpp @@ -20,6 +20,7 @@ #include #include "vulkanexamplebase.h" #include "vulkanbuffer.hpp" +#include "VulkanModel.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -147,45 +148,36 @@ namespace DebugMarker } }; -// Vertex layout used in this example -struct Vertex { - glm::vec3 pos; - glm::vec3 normal; - glm::vec2 uv; - glm::vec3 color; -}; +// Vertex layout for the models +vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_NORMAL, + vks::VERTEX_COMPONENT_UV, + vks::VERTEX_COMPONENT_COLOR, +}); struct Scene { - struct { - VkBuffer buf; - VkDeviceMemory mem; - } vertices; - struct { - VkBuffer buf; - VkDeviceMemory mem; - } indices; - // Store mesh offsets for vertex and indexbuffers - struct Mesh - { - uint32_t indexStart; - uint32_t indexCount; - std::string name; - }; - std::vector meshes; + vks::Model model; + std::vector modelPartNames; void draw(VkCommandBuffer cmdBuffer) { VkDeviceSize offsets[1] = { 0 }; - vkCmdBindVertexBuffers(cmdBuffer, VERTEX_BUFFER_BIND_ID, 1, &vertices.buf, offsets); - vkCmdBindIndexBuffer(cmdBuffer, indices.buf, 0, VK_INDEX_TYPE_UINT32); - for (auto mesh : meshes) + vkCmdBindVertexBuffers(cmdBuffer, VERTEX_BUFFER_BIND_ID, 1, &model.vertices.buffer, offsets); + vkCmdBindIndexBuffer(cmdBuffer, model.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + for (auto i = 0; i < model.parts.size(); i++) { // Add debug marker for mesh name - DebugMarker::insert(cmdBuffer, "Draw \"" + mesh.name + "\"", glm::vec4(0.0f)); - vkCmdDrawIndexed(cmdBuffer, mesh.indexCount, 1, mesh.indexStart, 0, 0); + DebugMarker::insert(cmdBuffer, "Draw \"" + modelPartNames[i] + "\"", glm::vec4(0.0f)); + vkCmdDrawIndexed(cmdBuffer, model.parts[i].indexCount, 1, model.parts[i].indexBase, 0, 0); } } + + void loadFromFile(std::string filename, vk::VulkanDevice* vulkanDevice, VkQueue queue) + { + model.loadFromFile(filename, vertexLayout, 1.0f, vulkanDevice, queue); + } }; class VulkanExample : public VulkanExampleBase @@ -194,12 +186,6 @@ public: bool wireframe = true; bool glow = true; - struct { - VkPipelineVertexInputStateCreateInfo inputState; - std::vector bindingDescriptions; - std::vector attributeDescriptions; - } vertices; - Scene scene, sceneGlow; vk::Buffer uniformBuffer; @@ -275,14 +261,8 @@ public: vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); // Destroy and free mesh resources - vkDestroyBuffer(device, scene.vertices.buf, nullptr); - vkFreeMemory(device, scene.vertices.mem, nullptr); - vkDestroyBuffer(device, scene.indices.buf, nullptr); - vkFreeMemory(device, scene.indices.mem, nullptr); - vkDestroyBuffer(device, sceneGlow.vertices.buf, nullptr); - vkFreeMemory(device, sceneGlow.vertices.mem, nullptr); - vkDestroyBuffer(device, sceneGlow.indices.buf, nullptr); - vkFreeMemory(device, sceneGlow.indices.mem, nullptr); + scene.model.destroy(); + sceneGlow.model.destroy(); uniformBuffer.destroy(); @@ -532,172 +512,27 @@ public: VK_CHECK_RESULT(vkEndCommandBuffer(offscreenPass.commandBuffer)); } - // Load a model file as separate meshes into a scene - void loadModel(std::string filename, Scene *scene) - { - VulkanMeshLoader *meshLoader = new VulkanMeshLoader(vulkanDevice); -#if defined(__ANDROID__) - meshLoader->assetManager = androidApp->activity->assetManager; -#endif - meshLoader->LoadMesh(filename); - - scene->meshes.resize(meshLoader->m_Entries.size()); - - // Generate vertex buffer - float scale = 1.0f; - std::vector vertexBuffer; - // Iterate through all meshes in the file - // and extract the vertex information used in this demo - for (uint32_t m = 0; m < meshLoader->m_Entries.size(); m++) - { - for (uint32_t i = 0; i < meshLoader->m_Entries[m].Vertices.size(); i++) - { - Vertex vertex; - - vertex.pos = meshLoader->m_Entries[m].Vertices[i].m_pos * scale; - vertex.normal = meshLoader->m_Entries[m].Vertices[i].m_normal; - vertex.uv = meshLoader->m_Entries[m].Vertices[i].m_tex; - vertex.color = meshLoader->m_Entries[m].Vertices[i].m_color; - - vertexBuffer.push_back(vertex); - } - } - uint32_t vertexBufferSize = vertexBuffer.size() * sizeof(Vertex); - - // Generate index buffer from loaded mesh file - std::vector indexBuffer; - for (uint32_t m = 0; m < meshLoader->m_Entries.size(); m++) - { - uint32_t indexBase = indexBuffer.size(); - for (uint32_t i = 0; i < meshLoader->m_Entries[m].Indices.size(); i++) - { - indexBuffer.push_back(meshLoader->m_Entries[m].Indices[i] + indexBase); - } - scene->meshes[m].indexStart = indexBase; - scene->meshes[m].indexCount = meshLoader->m_Entries[m].Indices.size(); - } - uint32_t indexBufferSize = indexBuffer.size() * sizeof(uint32_t); - - // Static mesh should always be device local - - bool useStaging = true; - - if (useStaging) - { - struct { - VkBuffer buffer; - VkDeviceMemory memory; - } vertexStaging, indexStaging; - - // Create staging buffers - // Vertex data - VK_CHECK_RESULT(vulkanDevice->createBuffer( - VK_BUFFER_USAGE_TRANSFER_SRC_BIT, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - vertexBufferSize, - &vertexStaging.buffer, - &vertexStaging.memory, - vertexBuffer.data())); - // Index data - VK_CHECK_RESULT(vulkanDevice->createBuffer( - VK_BUFFER_USAGE_TRANSFER_SRC_BIT, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - indexBufferSize, - &indexStaging.buffer, - &indexStaging.memory, - indexBuffer.data())); - - // Create device local buffers - // Vertex buffer - VK_CHECK_RESULT(vulkanDevice->createBuffer( - VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, - VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, - vertexBufferSize, - &scene->vertices.buf, - &scene->vertices.mem)); - // Index buffer - VK_CHECK_RESULT(vulkanDevice->createBuffer( - VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, - VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, - indexBufferSize, - &scene->indices.buf, - &scene->indices.mem)); - - // Copy from staging buffers - VkCommandBuffer copyCmd = VulkanExampleBase::createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true); - - VkBufferCopy copyRegion = {}; - - copyRegion.size = vertexBufferSize; - vkCmdCopyBuffer( - copyCmd, - vertexStaging.buffer, - scene->vertices.buf, - 1, - ©Region); - - copyRegion.size = indexBufferSize; - vkCmdCopyBuffer( - copyCmd, - indexStaging.buffer, - scene->indices.buf, - 1, - ©Region); - - VulkanExampleBase::flushCommandBuffer(copyCmd, queue, true); - - vkDestroyBuffer(device, vertexStaging.buffer, nullptr); - vkFreeMemory(device, vertexStaging.memory, nullptr); - vkDestroyBuffer(device, indexStaging.buffer, nullptr); - vkFreeMemory(device, indexStaging.memory, nullptr); - } - else - { - // Vertex buffer - vulkanDevice->createBuffer( - VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - vertexBufferSize, - &scene->vertices.buf, - &scene->vertices.mem, - vertexBuffer.data()); - // Index buffer - vulkanDevice->createBuffer( - VK_BUFFER_USAGE_INDEX_BUFFER_BIT, - VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, - indexBufferSize, - &scene->indices.buf, - &scene->indices.mem, - indexBuffer.data()); - } - - delete(meshLoader); - } - void loadScene() { - loadModel(getAssetPath() + "models/treasure_smooth.dae", &scene); - loadModel(getAssetPath() + "models/treasure_glow.dae", &sceneGlow); + scene.loadFromFile(getAssetPath() + "models/treasure_smooth.dae", vulkanDevice, queue); + sceneGlow.loadFromFile(getAssetPath() + "models/treasure_glow.dae", vulkanDevice, queue); // Name the meshes - // ASSIMP does not load mesh names from the COLLADA file used in this example - // so we need to set them manually + // ASSIMP does not load mesh names from the COLLADA file used in this example so we need to set them manually // These names are used in command buffer creation for setting debug markers - // Scene - std::vector names = { "hill", "rocks", "cave", "tree", "mushroom stems", "blue mushroom caps", "red mushroom caps", "grass blades", "chest box", "chest fittings" }; - for (size_t i = 0; i < names.size(); i++) - { - scene.meshes[i].name = names[i]; - sceneGlow.meshes[i].name = names[i]; + std::vector names = { "hill", "crystals", "rocks", "cave", "tree", "mushroom stems", "blue mushroom caps", "red mushroom caps", "grass blades", "chest box", "chest fittings" }; + for (size_t i = 0; i < names.size(); i++) { + scene.modelPartNames.push_back(names[i]); + sceneGlow.modelPartNames.push_back(names[i]); } // Name the buffers for debugging // Scene - DebugMarker::setObjectName(device, (uint64_t)scene.vertices.buf, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "Scene vertex buffer"); - DebugMarker::setObjectName(device, (uint64_t)scene.indices.buf, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "Scene index buffer"); + DebugMarker::setObjectName(device, (uint64_t)scene.model.vertices.buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "Scene vertex buffer"); + DebugMarker::setObjectName(device, (uint64_t)scene.model.indices.buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "Scene index buffer"); // Glow - DebugMarker::setObjectName(device, (uint64_t)sceneGlow.vertices.buf, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "Glow vertex buffer"); - DebugMarker::setObjectName(device, (uint64_t)sceneGlow.indices.buf, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "Glow index buffer"); + DebugMarker::setObjectName(device, (uint64_t)sceneGlow.model.vertices.buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "Glow vertex buffer"); + DebugMarker::setObjectName(device, (uint64_t)sceneGlow.model.indices.buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, "Glow index buffer"); } void reBuildCommandBuffers() @@ -797,55 +632,7 @@ public: VK_CHECK_RESULT(vkEndCommandBuffer(drawCmdBuffers[i])); } } - - void setupVertexDescriptions() - { - // Binding description - vertices.bindingDescriptions.resize(1); - vertices.bindingDescriptions[0] = - vkTools::initializers::vertexInputBindingDescription( - VERTEX_BUFFER_BIND_ID, - sizeof(Vertex), - VK_VERTEX_INPUT_RATE_VERTEX); - // Attribute descriptions - // Describes memory layout and shader positions - vertices.attributeDescriptions.resize(4); - // Location 0 : Position - vertices.attributeDescriptions[0] = - vkTools::initializers::vertexInputAttributeDescription( - VERTEX_BUFFER_BIND_ID, - 0, - VK_FORMAT_R32G32B32_SFLOAT, - 0); - // Location 1 : Normal - vertices.attributeDescriptions[1] = - vkTools::initializers::vertexInputAttributeDescription( - VERTEX_BUFFER_BIND_ID, - 1, - VK_FORMAT_R32G32B32_SFLOAT, - sizeof(float) * 3); - // Location 2 : Texture coordinates - vertices.attributeDescriptions[2] = - vkTools::initializers::vertexInputAttributeDescription( - VERTEX_BUFFER_BIND_ID, - 2, - VK_FORMAT_R32G32_SFLOAT, - sizeof(float) * 6); - // Location 3 : Color - vertices.attributeDescriptions[3] = - vkTools::initializers::vertexInputAttributeDescription( - VERTEX_BUFFER_BIND_ID, - 3, - VK_FORMAT_R32G32B32_SFLOAT, - sizeof(float) * 8); - - vertices.inputState = vkTools::initializers::pipelineVertexInputStateCreateInfo(); - vertices.inputState.vertexBindingDescriptionCount = vertices.bindingDescriptions.size(); - vertices.inputState.pVertexBindingDescriptions = vertices.bindingDescriptions.data(); - vertices.inputState.vertexAttributeDescriptionCount = vertices.attributeDescriptions.size(); - vertices.inputState.pVertexAttributeDescriptions = vertices.attributeDescriptions.data(); - } void setupDescriptorPool() { @@ -978,20 +765,14 @@ public: dynamicStateEnables.size(), 0); - // Phong lighting pipeline - // Load shaders std::array shaderStages; - shaderStages[0] = loadShader(getAssetPath() + "shaders/debugmarker/toon.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); - shaderStages[1] = loadShader(getAssetPath() + "shaders/debugmarker/toon.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); - VkGraphicsPipelineCreateInfo pipelineCreateInfo = vkTools::initializers::pipelineCreateInfo( pipelineLayout, renderPass, 0); - pipelineCreateInfo.pVertexInputState = &vertices.inputState; pipelineCreateInfo.pInputAssemblyState = &inputAssemblyState; pipelineCreateInfo.pRasterizationState = &rasterizationState; pipelineCreateInfo.pColorBlendState = &colorBlendState; @@ -1002,6 +783,32 @@ public: pipelineCreateInfo.stageCount = shaderStages.size(); pipelineCreateInfo.pStages = shaderStages.data(); + // Shared vertex inputs + + // Binding description + VkVertexInputBindingDescription vertexInputBinding = + vkTools::initializers::vertexInputBindingDescription(VERTEX_BUFFER_BIND_ID, vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX); + + // Attribute descriptions + // Describes memory layout and shader positions + std::vector vertexInputAttributes = { + vkTools::initializers::vertexInputAttributeDescription(VERTEX_BUFFER_BIND_ID, 0, VK_FORMAT_R32G32B32_SFLOAT, 0), // Location 0: Position + vkTools::initializers::vertexInputAttributeDescription(VERTEX_BUFFER_BIND_ID, 1, VK_FORMAT_R32G32B32_SFLOAT, sizeof(float) * 3), // Location 1: Normal + vkTools::initializers::vertexInputAttributeDescription(VERTEX_BUFFER_BIND_ID, 2, VK_FORMAT_R32G32_SFLOAT, sizeof(float) * 6), // Location 2: Texture coordinates + vkTools::initializers::vertexInputAttributeDescription(VERTEX_BUFFER_BIND_ID, 3, VK_FORMAT_R32G32B32_SFLOAT, sizeof(float) * 8), // Location 3: Color + }; + + VkPipelineVertexInputStateCreateInfo vertexInputState = vkTools::initializers::pipelineVertexInputStateCreateInfo(); + vertexInputState.vertexBindingDescriptionCount = 1; + vertexInputState.pVertexBindingDescriptions = &vertexInputBinding; + vertexInputState.vertexAttributeDescriptionCount = static_cast(vertexInputAttributes.size()); + vertexInputState.pVertexAttributeDescriptions = vertexInputAttributes.data(); + + pipelineCreateInfo.pVertexInputState = &vertexInputState; + + // Toon shading pipeline + shaderStages[0] = loadShader(getAssetPath() + "shaders/debugmarker/toon.vert.spv", VK_SHADER_STAGE_VERTEX_BIT); + shaderStages[1] = loadShader(getAssetPath() + "shaders/debugmarker/toon.frag.spv", VK_SHADER_STAGE_FRAGMENT_BIT); VK_CHECK_RESULT(vkCreateGraphicsPipelines(device, pipelineCache, 1, &pipelineCreateInfo, nullptr, &pipelines.toonshading)); // Color only pipeline @@ -1122,7 +929,6 @@ public: DebugMarker::setup(device, physicalDevice); loadScene(); prepareOffscreen(); - setupVertexDescriptions(); prepareUniformBuffers(); setupDescriptorSetLayout(); preparePipelines(); diff --git a/deferred/deferred.cpp b/deferred/deferred.cpp index 47024178..a0698cbc 100644 --- a/deferred/deferred.cpp +++ b/deferred/deferred.cpp @@ -19,8 +19,9 @@ #include #include "vulkanexamplebase.h" -#include "VulkanTexture.hpp" #include "vulkanbuffer.hpp" +#include "VulkanTexture.hpp" +#include "VulkanModel.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -32,16 +33,6 @@ // Offscreen frame buffer properties #define FB_DIM TEX_DIM -// Vertex layout for this example -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_UV, - vkMeshLoader::VERTEX_LAYOUT_COLOR, - vkMeshLoader::VERTEX_LAYOUT_NORMAL, - vkMeshLoader::VERTEX_LAYOUT_TANGENT -}; - class VulkanExample : public VulkanExampleBase { public: @@ -58,11 +49,20 @@ public: } floor; } textures; + // Vertex layout for the models + vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_UV, + vks::VERTEX_COMPONENT_COLOR, + vks::VERTEX_COMPONENT_NORMAL, + vks::VERTEX_COMPONENT_TANGENT, + }); + struct { - vkMeshLoader::MeshBuffer model; - vkMeshLoader::MeshBuffer floor; - vkMeshLoader::MeshBuffer quad; - } meshes; + vks::Model model; + vks::Model floor; + vks::Model quad; + } models; struct { VkPipelineVertexInputStateCreateInfo inputState; @@ -189,9 +189,9 @@ public: vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); // Meshes - vkMeshLoader::freeMeshBufferResources(device, &meshes.model); - vkMeshLoader::freeMeshBufferResources(device, &meshes.floor); - vkMeshLoader::freeMeshBufferResources(device, &meshes.quad); + models.model.destroy(); + models.floor.destroy(); + models.quad.destroy(); // Uniform buffers uniformBuffers.vsOffscreen.destroy(); @@ -459,15 +459,15 @@ public: // Background vkCmdBindDescriptorSets(offScreenCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayouts.offscreen, 0, 1, &descriptorSets.floor, 0, NULL); - vkCmdBindVertexBuffers(offScreenCmdBuffer, VERTEX_BUFFER_BIND_ID, 1, &meshes.floor.vertices.buf, offsets); - vkCmdBindIndexBuffer(offScreenCmdBuffer, meshes.floor.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(offScreenCmdBuffer, meshes.floor.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(offScreenCmdBuffer, VERTEX_BUFFER_BIND_ID, 1, &models.floor.vertices.buffer, offsets); + vkCmdBindIndexBuffer(offScreenCmdBuffer, models.floor.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(offScreenCmdBuffer, models.floor.indexCount, 1, 0, 0, 0); // Object vkCmdBindDescriptorSets(offScreenCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayouts.offscreen, 0, 1, &descriptorSets.model, 0, NULL); - vkCmdBindVertexBuffers(offScreenCmdBuffer, VERTEX_BUFFER_BIND_ID, 1, &meshes.model.vertices.buf, offsets); - vkCmdBindIndexBuffer(offScreenCmdBuffer, meshes.model.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(offScreenCmdBuffer, meshes.model.indexCount, 3, 0, 0, 0); + vkCmdBindVertexBuffers(offScreenCmdBuffer, VERTEX_BUFFER_BIND_ID, 1, &models.model.vertices.buffer, offsets); + vkCmdBindIndexBuffer(offScreenCmdBuffer, models.model.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(offScreenCmdBuffer, models.model.indexCount, 3, 0, 0, 0); vkCmdEndRenderPass(offScreenCmdBuffer); @@ -476,13 +476,13 @@ public: void loadAssets() { - loadMesh(getAssetPath() + "models/armor/armor.dae", &meshes.model, vertexLayout, 1.0f); + models.model.loadFromFile(getAssetPath() + "models/armor/armor.dae", vertexLayout, 1.0f, vulkanDevice, queue); - vkMeshLoader::MeshCreateInfo meshCreateInfo; - meshCreateInfo.scale = glm::vec3(2.0f); - meshCreateInfo.uvscale = glm::vec2(4.0f); - meshCreateInfo.center = glm::vec3(0.0f, 2.35f, 0.0f); - loadMesh(getAssetPath() + "models/plane.obj", &meshes.floor, vertexLayout, &meshCreateInfo); + vks::ModelCreateInfo modelCreateInfo; + modelCreateInfo.scale = glm::vec3(2.0f); + modelCreateInfo.uvscale = glm::vec2(4.0f); + modelCreateInfo.center = glm::vec3(0.0f, 2.35f, 0.0f); + models.floor.loadFromFile(getAssetPath() + "models/plane.obj", vertexLayout, &modelCreateInfo, vulkanDevice, queue); textures.model.colorMap.loadFromFile(getAssetPath() + "models/armor/colormap.ktx", VK_FORMAT_BC3_UNORM_BLOCK, vulkanDevice, queue); textures.model.normalMap.loadFromFile(getAssetPath() + "models/armor/normalmap.ktx", VK_FORMAT_BC3_UNORM_BLOCK, vulkanDevice, queue); @@ -539,9 +539,9 @@ public: if (debugDisplay) { vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.debug); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.quad.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.quad.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.quad.indexCount, 1, 0, 0, 1); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.quad.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.quad.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(drawCmdBuffers[i], models.quad.indexCount, 1, 0, 0, 1); // Move viewport to display final composition in lower right corner viewport.x = viewport.width * 0.5f; viewport.y = viewport.height * 0.5f; @@ -552,8 +552,8 @@ public: // Final composition as full screen quad vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.deferred); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.quad.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.quad.indices.buf, 0, VK_INDEX_TYPE_UINT32); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.quad.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.quad.indices.buffer, 0, VK_INDEX_TYPE_UINT32); vkCmdDrawIndexed(drawCmdBuffers[i], 6, 1, 0, 0, 1); vkCmdEndRenderPass(drawCmdBuffers[i]); @@ -597,8 +597,8 @@ public: VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, vertexBuffer.size() * sizeof(Vertex), - &meshes.quad.vertices.buf, - &meshes.quad.vertices.mem, + &models.quad.vertices.buffer, + &models.quad.vertices.memory, vertexBuffer.data())); // Setup indices @@ -611,15 +611,17 @@ public: indexBuffer.push_back(i * 4 + index); } } - meshes.quad.indexCount = static_cast(indexBuffer.size()); + models.quad.indexCount = static_cast(indexBuffer.size()); VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, indexBuffer.size() * sizeof(uint32_t), - &meshes.quad.indices.buf, - &meshes.quad.indices.mem, + &models.quad.indices.buffer, + &models.quad.indices.memory, indexBuffer.data())); + + models.quad.device = device; } void setupVertexDescriptions() @@ -629,7 +631,7 @@ public: vertices.bindingDescriptions[0] = vkTools::initializers::vertexInputBindingDescription( VERTEX_BUFFER_BIND_ID, - vkMeshLoader::vertexSize(vertexLayout), + vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX); // Attribute descriptions diff --git a/deferredmultisampling/deferredmultisampling.cpp b/deferredmultisampling/deferredmultisampling.cpp index 84116154..392cb29a 100644 --- a/deferredmultisampling/deferredmultisampling.cpp +++ b/deferredmultisampling/deferredmultisampling.cpp @@ -19,24 +19,15 @@ #include #include "vulkanexamplebase.h" -#include "VulkanTexture.hpp" #include "vulkanbuffer.hpp" +#include "VulkanTexture.hpp" +#include "VulkanModel.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false // todo: check if hardware supports sample number (or select max. supported) #define SAMPLE_COUNT VK_SAMPLE_COUNT_8_BIT -// Vertex layout for this example -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_UV, - vkMeshLoader::VERTEX_LAYOUT_COLOR, - vkMeshLoader::VERTEX_LAYOUT_NORMAL, - vkMeshLoader::VERTEX_LAYOUT_TANGENT -}; - class VulkanExample : public VulkanExampleBase { public: @@ -55,11 +46,20 @@ public: } floor; } textures; + // Vertex layout for the models + vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_UV, + vks::VERTEX_COMPONENT_COLOR, + vks::VERTEX_COMPONENT_NORMAL, + vks::VERTEX_COMPONENT_TANGENT, + }); + struct { - vkMeshLoader::MeshBuffer model; - vkMeshLoader::MeshBuffer floor; - vkMeshLoader::MeshBuffer quad; - } meshes; + vks::Model model; + vks::Model floor; + vks::Model quad; + } models; struct { VkPipelineVertexInputStateCreateInfo inputState; @@ -194,9 +194,8 @@ public: vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); // Meshes - vkMeshLoader::freeMeshBufferResources(device, &meshes.model); - vkMeshLoader::freeMeshBufferResources(device, &meshes.floor); - //vkMeshLoader::freeMeshBufferResources(device, &meshes.quad); + models.model.destroy(); + models.floor.destroy(); // Uniform buffers uniformBuffers.vsOffscreen.destroy(); @@ -479,15 +478,15 @@ public: // Background vkCmdBindDescriptorSets(offScreenCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayouts.offscreen, 0, 1, &descriptorSets.floor, 0, NULL); - vkCmdBindVertexBuffers(offScreenCmdBuffer, VERTEX_BUFFER_BIND_ID, 1, &meshes.floor.vertices.buf, offsets); - vkCmdBindIndexBuffer(offScreenCmdBuffer, meshes.floor.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(offScreenCmdBuffer, meshes.floor.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(offScreenCmdBuffer, VERTEX_BUFFER_BIND_ID, 1, &models.floor.vertices.buffer, offsets); + vkCmdBindIndexBuffer(offScreenCmdBuffer, models.floor.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(offScreenCmdBuffer, models.floor.indexCount, 1, 0, 0, 0); // Object vkCmdBindDescriptorSets(offScreenCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayouts.offscreen, 0, 1, &descriptorSets.model, 0, NULL); - vkCmdBindVertexBuffers(offScreenCmdBuffer, VERTEX_BUFFER_BIND_ID, 1, &meshes.model.vertices.buf, offsets); - vkCmdBindIndexBuffer(offScreenCmdBuffer, meshes.model.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(offScreenCmdBuffer, meshes.model.indexCount, 3, 0, 0, 0); + vkCmdBindVertexBuffers(offScreenCmdBuffer, VERTEX_BUFFER_BIND_ID, 1, &models.model.vertices.buffer, offsets); + vkCmdBindIndexBuffer(offScreenCmdBuffer, models.model.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(offScreenCmdBuffer, models.model.indexCount, 3, 0, 0, 0); vkCmdEndRenderPass(offScreenCmdBuffer); @@ -572,13 +571,13 @@ public: textures.floor.colorMap.loadFromFile(getAssetPath() + "textures/pattern_57_diffuse_bc3.ktx", VK_FORMAT_BC3_UNORM_BLOCK, vulkanDevice, queue); textures.floor.normalMap.loadFromFile(getAssetPath() + "textures/pattern_57_normal_bc3.ktx", VK_FORMAT_BC3_UNORM_BLOCK, vulkanDevice, queue); - loadMesh(getAssetPath() + "models/armor/armor.dae", &meshes.model, vertexLayout, 1.0f); + models.model.loadFromFile(getAssetPath() + "models/armor/armor.dae", vertexLayout, 1.0f, vulkanDevice, queue); - vkMeshLoader::MeshCreateInfo meshCreateInfo; - meshCreateInfo.scale = glm::vec3(15.0f); - meshCreateInfo.uvscale = glm::vec2(8.0f, 8.0f); - meshCreateInfo.center = glm::vec3(0.0f, 2.3f, 0.0f); - loadMesh(getAssetPath() + "models/openbox.dae", &meshes.floor, vertexLayout, &meshCreateInfo); + vks::ModelCreateInfo modelCreateInfo; + modelCreateInfo.scale = glm::vec3(15.0f); + modelCreateInfo.uvscale = glm::vec2(8.0f, 8.0f); + modelCreateInfo.center = glm::vec3(0.0f, 2.3f, 0.0f); + models.floor.loadFromFile(getAssetPath() + "models/openbox.dae", vertexLayout, &modelCreateInfo, vulkanDevice, queue); } void setupVertexDescriptions() @@ -588,7 +587,7 @@ public: vertices.bindingDescriptions[0] = vkTools::initializers::vertexInputBindingDescription( VERTEX_BUFFER_BIND_ID, - vkMeshLoader::vertexSize(vertexLayout), + vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX); // Attribute descriptions diff --git a/deferredshadows/deferredshadows.cpp b/deferredshadows/deferredshadows.cpp index 11c26b69..1e2f06e8 100644 --- a/deferredshadows/deferredshadows.cpp +++ b/deferredshadows/deferredshadows.cpp @@ -20,9 +20,10 @@ #include #include "vulkanexamplebase.h" -#include "VulkanTexture.hpp" -#include "vulkanframebuffer.hpp" #include "vulkanbuffer.hpp" +#include "vulkanframebuffer.hpp" +#include "VulkanTexture.hpp" +#include "VulkanModel.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -46,17 +47,6 @@ // Must match the LIGHT_COUNT define in the shadow and deferred shaders #define LIGHT_COUNT 3 -// Vertex layout for this example -// todo: create class for vertex layout -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_UV, - vkMeshLoader::VERTEX_LAYOUT_COLOR, - vkMeshLoader::VERTEX_LAYOUT_NORMAL, - vkMeshLoader::VERTEX_LAYOUT_TANGENT -}; - class VulkanExample : public VulkanExampleBase { public: @@ -84,11 +74,20 @@ public: } background; } textures; + // Vertex layout for the models + vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_UV, + vks::VERTEX_COMPONENT_COLOR, + vks::VERTEX_COMPONENT_NORMAL, + vks::VERTEX_COMPONENT_TANGENT, + }); + struct { - vkMeshLoader::MeshBuffer model; - vkMeshLoader::MeshBuffer background; - vkMeshLoader::MeshBuffer quad; - } meshes; + vks::Model model; + vks::Model background; + vks::Model quad; + } models; struct { VkPipelineVertexInputStateCreateInfo inputState; @@ -212,9 +211,9 @@ public: vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); // Meshes - vkMeshLoader::freeMeshBufferResources(device, &meshes.model); - vkMeshLoader::freeMeshBufferResources(device, &meshes.background); - vkMeshLoader::freeMeshBufferResources(device, &meshes.quad); + models.model.destroy(); + models.background.destroy(); + models.quad.destroy(); // Uniform buffers uniformBuffers.vsOffscreen.destroy(); @@ -325,15 +324,15 @@ public: // Background vkCmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayouts.offscreen, 0, 1, shadow ? &descriptorSets.shadow : &descriptorSets.background, 0, NULL); - vkCmdBindVertexBuffers(cmdBuffer, VERTEX_BUFFER_BIND_ID, 1, &meshes.background.vertices.buf, offsets); - vkCmdBindIndexBuffer(cmdBuffer, meshes.background.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(cmdBuffer, meshes.background.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(cmdBuffer, VERTEX_BUFFER_BIND_ID, 1, &models.background.vertices.buffer, offsets); + vkCmdBindIndexBuffer(cmdBuffer, models.background.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(cmdBuffer, models.background.indexCount, 1, 0, 0, 0); // Objects vkCmdBindDescriptorSets(cmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayouts.offscreen, 0, 1, shadow ? &descriptorSets.shadow : &descriptorSets.model, 0, NULL); - vkCmdBindVertexBuffers(cmdBuffer, VERTEX_BUFFER_BIND_ID, 1, &meshes.model.vertices.buf, offsets); - vkCmdBindIndexBuffer(cmdBuffer, meshes.model.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(cmdBuffer, meshes.model.indexCount, 3, 0, 0, 0); + vkCmdBindVertexBuffers(cmdBuffer, VERTEX_BUFFER_BIND_ID, 1, &models.model.vertices.buffer, offsets); + vkCmdBindIndexBuffer(cmdBuffer, models.model.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(cmdBuffer, models.model.indexCount, 3, 0, 0, 0); } // Build a secondary command buffer for rendering the scene values to the offscreen frame buffer attachments @@ -420,13 +419,13 @@ public: void loadAssets() { - loadMesh(getAssetPath() + "models/armor/armor.dae", &meshes.model, vertexLayout, 1.0f); + models.model.loadFromFile(getAssetPath() + "models/armor/armor.dae", vertexLayout, 1.0f, vulkanDevice, queue); - vkMeshLoader::MeshCreateInfo meshCreateInfo; - meshCreateInfo.scale = glm::vec3(15.0f); - meshCreateInfo.uvscale = glm::vec2(1.0f, 1.5f); - meshCreateInfo.center = glm::vec3(0.0f, 2.3f, 0.0f); - loadMesh(getAssetPath() + "models/openbox.dae", &meshes.background, vertexLayout, &meshCreateInfo); + vks::ModelCreateInfo modelCreateInfo; + modelCreateInfo.scale = glm::vec3(15.0f); + modelCreateInfo.uvscale = glm::vec2(1.0f, 1.5f); + modelCreateInfo.center = glm::vec3(0.0f, 2.3f, 0.0f); + models.background.loadFromFile(getAssetPath() + "models/openbox.dae", vertexLayout, &modelCreateInfo, vulkanDevice, queue); textures.model.colorMap.loadFromFile(getAssetPath() + "models/armor/colormap.ktx", VK_FORMAT_BC3_UNORM_BLOCK, vulkanDevice, queue); textures.model.normalMap.loadFromFile(getAssetPath() + "models/armor/normalmap.ktx", VK_FORMAT_BC3_UNORM_BLOCK, vulkanDevice, queue); @@ -481,8 +480,8 @@ public: // Final composition as full screen quad vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.deferred); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.quad.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.quad.indices.buf, 0, VK_INDEX_TYPE_UINT32); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.quad.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.quad.indices.buffer, 0, VK_INDEX_TYPE_UINT32); vkCmdDrawIndexed(drawCmdBuffers[i], 6, 1, 0, 0, 0); if (debugDisplay) @@ -520,8 +519,8 @@ public: VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, vertexBuffer.size() * sizeof(Vertex), - &meshes.quad.vertices.buf, - &meshes.quad.vertices.mem, + &models.quad.vertices.buffer, + &models.quad.vertices.memory, vertexBuffer.data())); // Setup indices @@ -534,15 +533,17 @@ public: indexBuffer.push_back(i * 4 + index); } } - meshes.quad.indexCount = static_cast(indexBuffer.size()); + models.quad.indexCount = static_cast(indexBuffer.size()); VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, indexBuffer.size() * sizeof(uint32_t), - &meshes.quad.indices.buf, - &meshes.quad.indices.mem, + &models.quad.indices.buffer, + &models.quad.indices.memory, indexBuffer.data())); + + models.quad.device = device; } void setupVertexDescriptions() @@ -552,15 +553,46 @@ public: vertices.bindingDescriptions[0] = vkTools::initializers::vertexInputBindingDescription( VERTEX_BUFFER_BIND_ID, - vkMeshLoader::vertexSize(vertexLayout), + vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX); // Attribute descriptions - vertices.attributeDescriptions.clear(); - vkMeshLoader::getVertexInputAttributeDescriptions( - vertexLayout, - vertices.attributeDescriptions, - VERTEX_BUFFER_BIND_ID); + vertices.attributeDescriptions.resize(5); + // Location 0: Position + vertices.attributeDescriptions[0] = + vkTools::initializers::vertexInputAttributeDescription( + VERTEX_BUFFER_BIND_ID, + 0, + VK_FORMAT_R32G32B32_SFLOAT, + 0); + // Location 1: Texture coordinates + vertices.attributeDescriptions[1] = + vkTools::initializers::vertexInputAttributeDescription( + VERTEX_BUFFER_BIND_ID, + 1, + VK_FORMAT_R32G32_SFLOAT, + sizeof(float) * 3); + // Location 2: Color + vertices.attributeDescriptions[2] = + vkTools::initializers::vertexInputAttributeDescription( + VERTEX_BUFFER_BIND_ID, + 2, + VK_FORMAT_R32G32B32_SFLOAT, + sizeof(float) * 5); + // Location 3: Normal + vertices.attributeDescriptions[3] = + vkTools::initializers::vertexInputAttributeDescription( + VERTEX_BUFFER_BIND_ID, + 3, + VK_FORMAT_R32G32B32_SFLOAT, + sizeof(float) * 8); + // Location 4: Tangent + vertices.attributeDescriptions[4] = + vkTools::initializers::vertexInputAttributeDescription( + VERTEX_BUFFER_BIND_ID, + 4, + VK_FORMAT_R32G32B32_SFLOAT, + sizeof(float) * 11); vertices.inputState = vkTools::initializers::pipelineVertexInputStateCreateInfo(); vertices.inputState.vertexBindingDescriptionCount = static_cast(vertices.bindingDescriptions.size()); @@ -1031,8 +1063,6 @@ public: uboFragmentLights.lights[i].viewMatrix = uboShadowGS.mvp[i]; } - uint8_t *pData; - memcpy(uboShadowGS.instancePos, uboOffscreenVS.instancePos, sizeof(uboOffscreenVS.instancePos)); memcpy(uniformBuffers.uboShadowGS.mapped, &uboShadowGS, sizeof(uboShadowGS)); diff --git a/displacement/displacement.cpp b/displacement/displacement.cpp index 0dd6ea18..6cae6723 100644 --- a/displacement/displacement.cpp +++ b/displacement/displacement.cpp @@ -21,17 +21,11 @@ #include #include "vulkanexamplebase.h" #include "VulkanTexture.hpp" -#include "vulkanMeshLoader.hpp" +#include "VulkanModel.hpp" +#include "vulkanbuffer.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false -// Vertex layout for this example -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_NORMAL, - vkMeshLoader::VERTEX_LAYOUT_UV -}; class VulkanExample : public VulkanExampleBase { @@ -49,9 +43,16 @@ public: std::vector attributeDescriptions; } vertices; + // Vertex layout for the models + vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_NORMAL, + vks::VERTEX_COMPONENT_UV, + }); + struct { - vkMeshLoader::MeshBuffer object; - } meshes; + vks::Model object; + } models; struct { vk::Buffer tessControl, tessEval; @@ -103,14 +104,13 @@ public: uniformBuffers.tessControl.destroy(); uniformBuffers.tessEval.destroy(); - - vkMeshLoader::freeMeshBufferResources(device, &meshes.object); + models.object.destroy(); textures.colorHeightMap.destroy(); } void loadAssets() { - loadMesh(getAssetPath() + "models/plane.obj", &meshes.object, vertexLayout, 0.25f); + models.object.loadFromFile(getAssetPath() + "models/plane.obj", vertexLayout, 0.25f, vulkanDevice, queue); textures.colorHeightMap.loadFromFile(getAssetPath() + "textures/pattern_36_bc3.ktx", VK_FORMAT_BC3_UNORM_BLOCK, vulkanDevice, queue); } @@ -161,19 +161,19 @@ public: vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSet, 0, NULL); VkDeviceSize offsets[1] = { 0 }; - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.object.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.object.indices.buf, 0, VK_INDEX_TYPE_UINT32); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.object.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.object.indices.buffer, 0, VK_INDEX_TYPE_UINT32); if (splitScreen) { vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.wireframe); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.object.indexCount, 1, 0, 0, 0); + vkCmdDrawIndexed(drawCmdBuffers[i], models.object.indexCount, 1, 0, 0, 0); scissor.offset.x = width / 2; vkCmdSetScissor(drawCmdBuffers[i], 0, 1, &scissor); } vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.solid); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.object.indexCount, 1, 0, 0, 0); + vkCmdDrawIndexed(drawCmdBuffers[i], models.object.indexCount, 1, 0, 0, 0); vkCmdEndRenderPass(drawCmdBuffers[i]); @@ -188,7 +188,7 @@ public: vertices.bindingDescriptions[0] = vkTools::initializers::vertexInputBindingDescription( VERTEX_BUFFER_BIND_ID, - vkMeshLoader::vertexSize(vertexLayout), + vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX); // Attribute descriptions diff --git a/geometryshader/geometryshader.cpp b/geometryshader/geometryshader.cpp index 750f7d91..84a844f2 100644 --- a/geometryshader/geometryshader.cpp +++ b/geometryshader/geometryshader.cpp @@ -19,18 +19,11 @@ #include #include "vulkanexamplebase.h" +#include "VulkanModel.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false -// Vertex layout for this example -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_NORMAL, - vkMeshLoader::VERTEX_LAYOUT_COLOR -}; - class VulkanExample : public VulkanExampleBase { public: @@ -42,9 +35,16 @@ public: std::vector attributeDescriptions; } vertices; + // Vertex layout for the models + vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_NORMAL, + vks::VERTEX_COMPONENT_COLOR, + }); + struct { - vkMeshLoader::MeshBuffer object; - } meshes; + vks::Model object; + } models; struct { glm::mat4 projection; @@ -91,7 +91,7 @@ public: vkDestroyPipelineLayout(device, pipelineLayout, nullptr); vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); - vkMeshLoader::freeMeshBufferResources(device, &meshes.object); + models.object.destroy(); uniformBuffers.GS.destroy(); uniformBuffers.VS.destroy(); @@ -145,18 +145,18 @@ public: vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSet, 0, NULL); VkDeviceSize offsets[1] = { 0 }; - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.object.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.object.indices.buf, 0, VK_INDEX_TYPE_UINT32); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.object.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.object.indices.buffer, 0, VK_INDEX_TYPE_UINT32); // Solid shading vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.solid); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.object.indexCount, 1, 0, 0, 0); + vkCmdDrawIndexed(drawCmdBuffers[i], models.object.indexCount, 1, 0, 0, 0); // Normal debugging if (displayNormals) { vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.normals); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.object.indexCount, 1, 0, 0, 0); + vkCmdDrawIndexed(drawCmdBuffers[i], models.object.indexCount, 1, 0, 0, 0); } vkCmdEndRenderPass(drawCmdBuffers[i]); @@ -165,9 +165,9 @@ public: } } - void loadMeshes() + void loadAssets() { - loadMesh(getAssetPath() + "models/suzanne.obj", &meshes.object, vertexLayout, 0.25f); + models.object.loadFromFile(getAssetPath() + "models/suzanne.obj", vertexLayout, 0.25f, vulkanDevice, queue); } void setupVertexDescriptions() @@ -177,7 +177,7 @@ public: vertices.bindingDescriptions[0] = vkTools::initializers::vertexInputBindingDescription( VERTEX_BUFFER_BIND_ID, - vkMeshLoader::vertexSize(vertexLayout), + vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX); // Attribute descriptions @@ -438,7 +438,7 @@ public: void prepare() { VulkanExampleBase::prepare(); - loadMeshes(); + loadAssets(); setupVertexDescriptions(); prepareUniformBuffers(); setupDescriptorSetLayout(); diff --git a/indirectdraw/indirectdraw.cpp b/indirectdraw/indirectdraw.cpp index 72c8f3dd..a21bc466 100644 --- a/indirectdraw/indirectdraw.cpp +++ b/indirectdraw/indirectdraw.cpp @@ -34,8 +34,9 @@ #include #include "vulkanexamplebase.h" -#include "VulkanTexture.hpp" #include "vulkanbuffer.hpp" +#include "VulkanTexture.hpp" +#include "VulkanModel.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define INSTANCE_BUFFER_BIND_ID 1 @@ -52,35 +53,34 @@ #define PLANT_RADIUS 25.0f #endif -// Vertex layout for this example -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_NORMAL, - vkMeshLoader::VERTEX_LAYOUT_UV, - vkMeshLoader::VERTEX_LAYOUT_COLOR -}; - class VulkanExample : public VulkanExampleBase { public: + struct { + vks::Texture2DArray plants; + vks::Texture2D ground; + } textures; + + // Vertex layout for the models + vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_NORMAL, + vks::VERTEX_COMPONENT_UV, + vks::VERTEX_COMPONENT_COLOR, + }); + + struct { + vks::Model plants; + vks::Model ground; + vks::Model skysphere; + } models; + struct { VkPipelineVertexInputStateCreateInfo inputState; std::vector bindingDescriptions; std::vector attributeDescriptions; } vertices; - struct { - vkMeshLoader::MeshBuffer plants; - vkMeshLoader::MeshBuffer ground; - vkMeshLoader::MeshBuffer skysphere; - } meshes; - - struct { - vks::Texture2DArray plants; - vks::Texture2D ground; - } textures; - // Per-instance data block struct InstanceData { glm::vec3 pos; @@ -139,9 +139,9 @@ public: vkDestroyPipeline(device, pipelines.skysphere, nullptr); vkDestroyPipelineLayout(device, pipelineLayout, nullptr); vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); - vkMeshLoader::freeMeshBufferResources(device, &meshes.plants); - vkMeshLoader::freeMeshBufferResources(device, &meshes.ground); - vkMeshLoader::freeMeshBufferResources(device, &meshes.skysphere); + models.plants.destroy(); + models.ground.destroy(); + models.skysphere.destroy(); textures.plants.destroy(); textures.ground.destroy(); instanceBuffer.destroy(); @@ -195,11 +195,11 @@ public: // Plants vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.plants); // Binding point 0 : Mesh vertex buffer - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.plants.vertices.buf, offsets); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.plants.vertices.buffer, offsets); // Binding point 1 : Instance data buffer vkCmdBindVertexBuffers(drawCmdBuffers[i], INSTANCE_BUFFER_BIND_ID, 1, &instanceBuffer.buffer, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.plants.indices.buf, 0, VK_INDEX_TYPE_UINT32); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.plants.indices.buffer, 0, VK_INDEX_TYPE_UINT32); // If the multi draw feature is supported: // One draw call for an arbitrary number of ojects @@ -219,14 +219,14 @@ public: // Ground vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.ground); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.ground.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.ground.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.ground.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.ground.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.ground.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(drawCmdBuffers[i], models.ground.indexCount, 1, 0, 0, 0); // Skysphere vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.skysphere); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.skysphere.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.skysphere.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.skysphere.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.skysphere.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.skysphere.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(drawCmdBuffers[i], models.skysphere.indexCount, 1, 0, 0, 0); vkCmdEndRenderPass(drawCmdBuffers[i]); @@ -236,9 +236,9 @@ public: void loadAssets() { - loadMesh(getAssetPath() + "models/plants.dae", &meshes.plants, vertexLayout, 0.0025f); - loadMesh(getAssetPath() + "models/plane_circle.dae", &meshes.ground, vertexLayout, PLANT_RADIUS + 1.0f); - loadMesh(getAssetPath() + "models/skysphere.dae", &meshes.skysphere, vertexLayout, 512.0f / 10.0f); + models.plants.loadFromFile(getAssetPath() + "models/plants.dae", vertexLayout, 0.0025f, vulkanDevice, queue); + models.ground.loadFromFile(getAssetPath() + "models/plane_circle.dae", vertexLayout, PLANT_RADIUS + 1.0f, vulkanDevice, queue); + models.skysphere.loadFromFile(getAssetPath() + "models/skysphere.dae", vertexLayout, 512.0f / 10.0f, vulkanDevice, queue); textures.plants.loadFromFile(getAssetPath() + "textures/texturearray_plants_bc3.ktx", VK_FORMAT_BC3_UNORM_BLOCK, vulkanDevice, queue); textures.ground.loadFromFile(getAssetPath() + "textures/ground_dry_bc3.ktx", VK_FORMAT_BC3_UNORM_BLOCK, vulkanDevice, queue); @@ -253,7 +253,7 @@ public: vertices.bindingDescriptions[0] = vkTools::initializers::vertexInputBindingDescription( VERTEX_BUFFER_BIND_ID, - vkMeshLoader::vertexSize(vertexLayout), + vertexLayout.stride(), // Input rate for the data passed to shader // Step for each vertex rendered VK_VERTEX_INPUT_RATE_VERTEX); @@ -515,13 +515,13 @@ public: // Create on indirect command for each mesh in the scene uint32_t m = 0; - for (auto& meshDescriptor : meshes.plants.meshDescriptors) + for (auto& modelPart : models.plants.parts) { VkDrawIndexedIndirectCommand indirectCmd{}; indirectCmd.instanceCount = OBJECT_INSTANCE_COUNT; indirectCmd.firstInstance = m * OBJECT_INSTANCE_COUNT; - indirectCmd.firstIndex = meshDescriptor.indexBase; - indirectCmd.indexCount = meshDescriptor.indexCount; + indirectCmd.firstIndex = modelPart.indexBase; + indirectCmd.indexCount = modelPart.indexCount; indirectCommands.push_back(indirectCmd); diff --git a/instancing/instancing.cpp b/instancing/instancing.cpp index 9b3c71ff..bb52b6f8 100644 --- a/instancing/instancing.cpp +++ b/instancing/instancing.cpp @@ -21,36 +21,36 @@ #include #include "vulkanexamplebase.h" -#include "VulkanTexture.hpp" #include "vulkanbuffer.hpp" +#include "VulkanTexture.hpp" +#include "VulkanModel.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define INSTANCE_BUFFER_BIND_ID 1 #define ENABLE_VALIDATION false #define INSTANCE_COUNT 8192 -// Vertex layout for this example -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_NORMAL, - vkMeshLoader::VERTEX_LAYOUT_UV, - vkMeshLoader::VERTEX_LAYOUT_COLOR -}; - class VulkanExample : public VulkanExampleBase { public: - struct { - vkMeshLoader::MeshBuffer rock; - vkMeshLoader::MeshBuffer planet; - } meshes; - struct { vks::Texture2DArray rocks; vks::Texture2D planet; } textures; + // Vertex layout for the models + vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_NORMAL, + vks::VERTEX_COMPONENT_UV, + vks::VERTEX_COMPONENT_COLOR, + }); + + struct { + vks::Model rock; + vks::Model planet; + } models; + // Per-instance data block struct InstanceData { glm::vec3 pos; @@ -111,8 +111,8 @@ public: vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); vkDestroyBuffer(device, instanceBuffer.buffer, nullptr); vkFreeMemory(device, instanceBuffer.memory, nullptr); - meshes.rock.destroy(); - meshes.planet.destroy(); + models.rock.destroy(); + models.planet.destroy(); textures.rocks.destroy(); textures.planet.destroy(); uniformBuffers.scene.destroy(); @@ -158,22 +158,22 @@ public: // Planet vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSets.planet, 0, NULL); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.planet); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.planet.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.planet.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.planet.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.planet.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.planet.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(drawCmdBuffers[i], models.planet.indexCount, 1, 0, 0, 0); // Instanced rocks vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSets.instancedRocks, 0, NULL); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.instancedRocks); // Binding point 0 : Mesh vertex buffer - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.rock.vertices.buf, offsets); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.rock.vertices.buffer, offsets); // Binding point 1 : Instance data buffer vkCmdBindVertexBuffers(drawCmdBuffers[i], INSTANCE_BUFFER_BIND_ID, 1, &instanceBuffer.buffer, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.rock.indices.buf, 0, VK_INDEX_TYPE_UINT32); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.rock.indices.buffer, 0, VK_INDEX_TYPE_UINT32); // Render instances - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.rock.indexCount, INSTANCE_COUNT, 0, 0, 0); + vkCmdDrawIndexed(drawCmdBuffers[i], models.rock.indexCount, INSTANCE_COUNT, 0, 0, 0); vkCmdEndRenderPass(drawCmdBuffers[i]); @@ -183,8 +183,8 @@ public: void loadAssets() { - loadMesh(getAssetPath() + "models/rock01.dae", &meshes.rock, vertexLayout, 0.1f); - loadMesh(getAssetPath() + "models/sphere.obj", &meshes.planet, vertexLayout, 0.2f); + models.rock.loadFromFile(getAssetPath() + "models/rock01.dae", vertexLayout, 0.1f, vulkanDevice, queue); + models.planet.loadFromFile(getAssetPath() + "models/sphere.obj", vertexLayout, 0.2f, vulkanDevice, queue); textures.rocks.loadFromFile(getAssetPath() + "textures/texturearray_rocks_bc3.ktx", VK_FORMAT_BC3_UNORM_BLOCK, vulkanDevice, queue); textures.planet.loadFromFile(getAssetPath() + "textures/lavaplanet_bc3.ktx", VK_FORMAT_BC3_UNORM_BLOCK, vulkanDevice, queue); } @@ -340,7 +340,7 @@ public: // The instancing pipeline uses a vertex input state with two bindings bindingDescriptions = { // Binding point 0: Mesh vertex layout description at per-vertex rate - vkTools::initializers::vertexInputBindingDescription(VERTEX_BUFFER_BIND_ID, vkMeshLoader::vertexSize(vertexLayout), VK_VERTEX_INPUT_RATE_VERTEX), + vkTools::initializers::vertexInputBindingDescription(VERTEX_BUFFER_BIND_ID, vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX), // Binding point 1: Instanced data at per-instance rate vkTools::initializers::vertexInputBindingDescription(INSTANCE_BUFFER_BIND_ID, sizeof(InstanceData), VK_VERTEX_INPUT_RATE_INSTANCE) }; diff --git a/multisampling/multisampling.cpp b/multisampling/multisampling.cpp index f38672bf..b193717c 100644 --- a/multisampling/multisampling.cpp +++ b/multisampling/multisampling.cpp @@ -19,8 +19,9 @@ #include #include "vulkanexamplebase.h" -#include "VulkanTexture.hpp" #include "vulkanbuffer.hpp" +#include "VulkanTexture.hpp" +#include "VulkanModel.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -39,15 +40,6 @@ struct { } depth; } multisampleTarget; -// Vertex layout for this example -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_NORMAL, - vkMeshLoader::VERTEX_LAYOUT_UV, - vkMeshLoader::VERTEX_LAYOUT_COLOR, -}; - class VulkanExample : public VulkanExampleBase { public: @@ -57,16 +49,24 @@ public: vks::Texture2D colorMap; } textures; + // Vertex layout for the models + vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_NORMAL, + vks::VERTEX_COMPONENT_UV, + vks::VERTEX_COMPONENT_COLOR, + }); + + struct { + vks::Model example; + } models; + struct { VkPipelineVertexInputStateCreateInfo inputState; std::vector bindingDescriptions; std::vector attributeDescriptions; } vertices; - struct { - vkMeshLoader::MeshBuffer example; - } meshes; - vk::Buffer uniformBuffer; struct UBOVS { @@ -103,7 +103,7 @@ public: vkDestroyPipelineLayout(device, pipelineLayout, nullptr); vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); - vkMeshLoader::freeMeshBufferResources(device, &meshes.example); + models.example.destroy(); // Destroy MSAA target vkDestroyImage(device, multisampleTarget.color.image, nullptr); @@ -403,9 +403,9 @@ public: vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, useSampleShading ? pipelines.MSAASampleShading : pipelines.MSAA); VkDeviceSize offsets[1] = { 0 }; - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.example.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.example.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.example.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.example.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.example.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(drawCmdBuffers[i], models.example.indexCount, 1, 0, 0, 0); vkCmdEndRenderPass(drawCmdBuffers[i]); @@ -415,7 +415,7 @@ public: void loadAssets() { - loadMesh(getAssetPath() + "models/voyager/voyager.dae", &meshes.example, vertexLayout, 1.0f); + models.example.loadFromFile(getAssetPath() + "models/voyager/voyager.dae", vertexLayout, 1.0f, vulkanDevice, queue); textures.colorMap.loadFromFile(getAssetPath() + "models/voyager/voyager.ktx", VK_FORMAT_BC3_UNORM_BLOCK, vulkanDevice, queue); } @@ -426,7 +426,7 @@ public: vertices.bindingDescriptions[0] = vkTools::initializers::vertexInputBindingDescription( VERTEX_BUFFER_BIND_ID, - vkMeshLoader::vertexSize(vertexLayout), + vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX); // Attribute descriptions diff --git a/multithreading/multithreading.cpp b/multithreading/multithreading.cpp index e26371a9..d69ce083 100644 --- a/multithreading/multithreading.cpp +++ b/multithreading/multithreading.cpp @@ -25,32 +25,32 @@ #include "threadpool.hpp" #include "frustum.hpp" +#include "VulkanModel.hpp" + #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false -// Vertex layout used in this example -// Vertex layout for this example -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_NORMAL, - vkMeshLoader::VERTEX_LAYOUT_COLOR, -}; - class VulkanExample : public VulkanExampleBase { public: + // Vertex layout for the models + vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_NORMAL, + vks::VERTEX_COMPONENT_COLOR, + }); + + struct { + vks::Model ufo; + vks::Model skysphere; + } models; + struct { VkPipelineVertexInputStateCreateInfo inputState; std::vector bindingDescriptions; std::vector attributeDescriptions; } vertices; - struct { - vkMeshLoader::MeshBuffer ufo; - vkMeshLoader::MeshBuffer skysphere; - } meshes; - // Shared matrices used for thread push constant blocks struct { glm::mat4 projection; @@ -153,8 +153,8 @@ public: vkFreeCommandBuffers(device, cmdPool, 1, &primaryCommandBuffer); vkFreeCommandBuffers(device, cmdPool, 1, &secondaryCommandBuffer); - vkMeshLoader::freeMeshBufferResources(device, &meshes.ufo); - vkMeshLoader::freeMeshBufferResources(device, &meshes.skysphere); + models.ufo.destroy(); + models.skysphere.destroy(); for (auto& thread : threadData) { @@ -297,9 +297,9 @@ public: &thread->pushConstBlock[cmdBufferIndex]); VkDeviceSize offsets[1] = { 0 }; - vkCmdBindVertexBuffers(cmdBuffer, 0, 1, &meshes.ufo.vertices.buf, offsets); - vkCmdBindIndexBuffer(cmdBuffer, meshes.ufo.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(cmdBuffer, meshes.ufo.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(cmdBuffer, 0, 1, &models.ufo.vertices.buffer, offsets); + vkCmdBindIndexBuffer(cmdBuffer, models.ufo.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(cmdBuffer, models.ufo.indexCount, 1, 0, 0, 0); VK_CHECK_RESULT(vkEndCommandBuffer(cmdBuffer)); } @@ -337,9 +337,9 @@ public: &mvp); VkDeviceSize offsets[1] = { 0 }; - vkCmdBindVertexBuffers(secondaryCommandBuffer, 0, 1, &meshes.skysphere.vertices.buf, offsets); - vkCmdBindIndexBuffer(secondaryCommandBuffer, meshes.skysphere.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(secondaryCommandBuffer, meshes.skysphere.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(secondaryCommandBuffer, 0, 1, &models.skysphere.vertices.buffer, offsets); + vkCmdBindIndexBuffer(secondaryCommandBuffer, models.skysphere.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(secondaryCommandBuffer, models.skysphere.indexCount, 1, 0, 0, 0); VK_CHECK_RESULT(vkEndCommandBuffer(secondaryCommandBuffer)); } @@ -420,9 +420,9 @@ public: void loadMeshes() { - loadMesh(getAssetPath() + "models/retroufo_red_lowpoly.dae", &meshes.ufo, vertexLayout, 0.12f); - loadMesh(getAssetPath() + "models/sphere.obj", &meshes.skysphere, vertexLayout, 1.0f); - objectSphereDim = std::max(std::max(meshes.ufo.dim.x, meshes.ufo.dim.y), meshes.ufo.dim.z); + models.ufo.loadFromFile(getAssetPath() + "models/retroufo_red_lowpoly.dae", vertexLayout, 0.12f, vulkanDevice, queue); + models.skysphere.loadFromFile(getAssetPath() + "models/sphere.obj", vertexLayout, 1.0f, vulkanDevice, queue); + objectSphereDim = std::max(std::max(models.ufo.dim.size.x, models.ufo.dim.size.y), models.ufo.dim.size.z); } void setupVertexDescriptions() @@ -432,7 +432,7 @@ public: vertices.bindingDescriptions[0] = vkTools::initializers::vertexInputBindingDescription( VERTEX_BUFFER_BIND_ID, - vkMeshLoader::vertexSize(vertexLayout), + vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX); // Attribute descriptions diff --git a/occlusionquery/occlusionquery.cpp b/occlusionquery/occlusionquery.cpp index 8464dac5..e903543c 100644 --- a/occlusionquery/occlusionquery.cpp +++ b/occlusionquery/occlusionquery.cpp @@ -20,33 +20,26 @@ #include #include "vulkanexamplebase.h" #include "vulkanbuffer.hpp" +#include "VulkanModel.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false -// Vertex layout used in this example -// Vertex layout for this example -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_NORMAL, - vkMeshLoader::VERTEX_LAYOUT_COLOR, -}; - class VulkanExample : public VulkanExampleBase { public: - struct { - VkPipelineVertexInputStateCreateInfo inputState; - std::vector bindingDescriptions; - std::vector attributeDescriptions; - } vertices; + // Vertex layout for the models + vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_NORMAL, + vks::VERTEX_COMPONENT_COLOR, + }); struct { - vkMeshLoader::MeshBuffer teapot; - vkMeshLoader::MeshBuffer plane; - vkMeshLoader::MeshBuffer sphere; - } meshes; + vks::Model teapot; + vks::Model plane; + vks::Model sphere; + } models; struct { vk::Buffer occluder; @@ -61,6 +54,12 @@ public: float visible; } uboVS; + struct { + VkPipelineVertexInputStateCreateInfo inputState; + std::vector bindingDescriptions; + std::vector attributeDescriptions; + } vertices; + struct { VkPipeline solid; VkPipeline occluder; @@ -119,9 +118,9 @@ public: uniformBuffers.sphere.destroy(); uniformBuffers.teapot.destroy(); - vkMeshLoader::freeMeshBufferResources(device, &meshes.sphere); - vkMeshLoader::freeMeshBufferResources(device, &meshes.plane); - vkMeshLoader::freeMeshBufferResources(device, &meshes.teapot); + models.sphere.destroy(); + models.plane.destroy(); + models.teapot.destroy(); } // Create a buffer for storing the query result @@ -226,17 +225,17 @@ public: // Occluder first vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSet, 0, NULL); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.plane.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.plane.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.plane.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.plane.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.plane.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(drawCmdBuffers[i], models.plane.indexCount, 1, 0, 0, 0); // Teapot vkCmdBeginQuery(drawCmdBuffers[i], queryPool, 0, VK_FLAGS_NONE); vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSets.teapot, 0, NULL); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.teapot.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.teapot.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.teapot.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.teapot.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.teapot.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(drawCmdBuffers[i], models.teapot.indexCount, 1, 0, 0, 0); vkCmdEndQuery(drawCmdBuffers[i], queryPool, 0); @@ -244,9 +243,9 @@ public: vkCmdBeginQuery(drawCmdBuffers[i], queryPool, 1, VK_FLAGS_NONE); vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSets.sphere, 0, NULL); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.sphere.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.sphere.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.sphere.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.sphere.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.sphere.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(drawCmdBuffers[i], models.sphere.indexCount, 1, 0, 0, 0); vkCmdEndQuery(drawCmdBuffers[i], queryPool, 1); @@ -277,22 +276,22 @@ public: // Teapot vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSets.teapot, 0, NULL); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.teapot.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.teapot.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.teapot.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.teapot.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.teapot.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(drawCmdBuffers[i], models.teapot.indexCount, 1, 0, 0, 0); // Sphere vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSets.sphere, 0, NULL); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.sphere.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.sphere.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.sphere.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.sphere.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.sphere.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(drawCmdBuffers[i], models.sphere.indexCount, 1, 0, 0, 0); // Occluder vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.occluder); vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSet, 0, NULL); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.plane.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.plane.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.plane.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.plane.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.plane.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(drawCmdBuffers[i], models.plane.indexCount, 1, 0, 0, 0); vkCmdEndRenderPass(drawCmdBuffers[i]); @@ -314,11 +313,11 @@ public: VulkanExampleBase::submitFrame(); } - void loadMeshes() + void loadAssets() { - loadMesh(getAssetPath() + "models/plane_z.3ds", &meshes.plane, vertexLayout, 0.4f); - loadMesh(getAssetPath() + "models/teapot.3ds", &meshes.teapot, vertexLayout, 0.3f); - loadMesh(getAssetPath() + "models/sphere.3ds", &meshes.sphere, vertexLayout, 0.3f); + models.plane.loadFromFile(getAssetPath() + "models/plane_z.3ds", vertexLayout, 0.4f, vulkanDevice, queue); + models.teapot.loadFromFile(getAssetPath() + "models/teapot.3ds", vertexLayout, 0.3f, vulkanDevice, queue); + models.sphere.loadFromFile(getAssetPath() + "models/sphere.3ds", vertexLayout, 0.3f, vulkanDevice, queue); } void setupVertexDescriptions() @@ -328,7 +327,7 @@ public: vertices.bindingDescriptions[0] = vkTools::initializers::vertexInputBindingDescription( VERTEX_BUFFER_BIND_ID, - vkMeshLoader::vertexSize(vertexLayout), + vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX); // Attribute descriptions @@ -604,7 +603,7 @@ public: void prepare() { VulkanExampleBase::prepare(); - loadMeshes(); + loadAssets(); setupQueryResultBuffer(); setupVertexDescriptions(); prepareUniformBuffers(); diff --git a/offscreen/offscreen.cpp b/offscreen/offscreen.cpp index 93a28660..1a47ed76 100644 --- a/offscreen/offscreen.cpp +++ b/offscreen/offscreen.cpp @@ -20,6 +20,7 @@ #include #include "vulkanexamplebase.h" #include "VulkanTexture.hpp" +#include "VulkanModel.hpp" #include "vulkanbuffer.hpp" #define VERTEX_BUFFER_BIND_ID 0 @@ -29,15 +30,6 @@ #define FB_DIM 512 #define FB_COLOR_FORMAT VK_FORMAT_R8G8B8A8_UNORM -// Vertex layout for this example -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_UV, - vkMeshLoader::VERTEX_LAYOUT_COLOR, - vkMeshLoader::VERTEX_LAYOUT_NORMAL -}; - class VulkanExample : public VulkanExampleBase { public: @@ -47,11 +39,19 @@ public: vks::Texture2D colorMap; } textures; + // Vertex layout for the models + vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_UV, + vks::VERTEX_COMPONENT_COLOR, + vks::VERTEX_COMPONENT_NORMAL, + }); + struct { - vkMeshLoader::MeshBuffer example; - vkMeshLoader::MeshBuffer quad; - vkMeshLoader::MeshBuffer plane; - } meshes; + vks::Model example; + vks::Model quad; + vks::Model plane; + } models; struct { VkPipelineVertexInputStateCreateInfo inputState; @@ -163,10 +163,10 @@ public: vkDestroyDescriptorSetLayout(device, descriptorSetLayouts.shaded, nullptr); vkDestroyDescriptorSetLayout(device, descriptorSetLayouts.textured, nullptr); - // Meshes - vkMeshLoader::freeMeshBufferResources(device, &meshes.example); - vkMeshLoader::freeMeshBufferResources(device, &meshes.quad); - vkMeshLoader::freeMeshBufferResources(device, &meshes.plane); + // Models + models.example.destroy(); + models.quad.destroy(); + models.plane.destroy(); // Uniform buffers uniformBuffers.vsShared.destroy(); @@ -390,9 +390,9 @@ public: // Mirrored scene vkCmdBindDescriptorSets(offscreenPass.commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayouts.shaded, 0, 1, &descriptorSets.offscreen, 0, NULL); vkCmdBindPipeline(offscreenPass.commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.shadedOffscreen); - vkCmdBindVertexBuffers(offscreenPass.commandBuffer, VERTEX_BUFFER_BIND_ID, 1, &meshes.example.vertices.buf, offsets); - vkCmdBindIndexBuffer(offscreenPass.commandBuffer, meshes.example.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(offscreenPass.commandBuffer, meshes.example.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(offscreenPass.commandBuffer, VERTEX_BUFFER_BIND_ID, 1, &models.example.vertices.buffer, offsets); + vkCmdBindIndexBuffer(offscreenPass.commandBuffer, models.example.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(offscreenPass.commandBuffer, models.example.indexCount, 1, 0, 0, 0); vkCmdEndRenderPass(offscreenPass.commandBuffer); @@ -447,9 +447,9 @@ public: { vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayouts.textured, 0, 1, &descriptorSets.debugQuad, 0, NULL); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.debug); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.quad.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.quad.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.quad.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.quad.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.quad.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(drawCmdBuffers[i], models.quad.indexCount, 1, 0, 0, 0); } // Scene @@ -459,17 +459,17 @@ public: vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayouts.textured, 0, 1, &descriptorSets.mirror, 0, NULL); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.mirror); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.plane.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.plane.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.plane.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.plane.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.plane.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(drawCmdBuffers[i], models.plane.indexCount, 1, 0, 0, 0); // Model vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayouts.shaded, 0, 1, &descriptorSets.model, 0, NULL); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.shaded); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.example.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.example.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.example.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.example.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.example.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(drawCmdBuffers[i], models.example.indexCount, 1, 0, 0, 0); vkCmdEndRenderPass(drawCmdBuffers[i]); @@ -479,8 +479,8 @@ public: void loadAssets() { - loadMesh(getAssetPath() + "models/plane.obj", &meshes.plane, vertexLayout, 0.5f); - loadMesh(getAssetPath() + "models/chinesedragon.dae", &meshes.example, vertexLayout, 0.3f); + models.plane.loadFromFile(getAssetPath() + "models/plane.obj", vertexLayout, 0.5f, vulkanDevice, queue); + models.example.loadFromFile(getAssetPath() + "models/chinesedragon.dae", vertexLayout, 0.3f, vulkanDevice, queue); textures.colorMap.loadFromFile(getAssetPath() + "textures/darkmetal_bc3.ktx", VK_FORMAT_BC3_UNORM_BLOCK, vulkanDevice, queue); } @@ -508,21 +508,23 @@ public: VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, vertexBuffer.size() * sizeof(Vertex), - &meshes.quad.vertices.buf, - &meshes.quad.vertices.mem, + &models.quad.vertices.buffer, + &models.quad.vertices.memory, vertexBuffer.data())); // Setup indices std::vector indexBuffer = { 0,1,2, 2,3,0 }; - meshes.quad.indexCount = indexBuffer.size(); + models.quad.indexCount = indexBuffer.size(); VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, indexBuffer.size() * sizeof(uint32_t), - &meshes.quad.indices.buf, - &meshes.quad.indices.mem, + &models.quad.indices.buffer, + &models.quad.indices.memory, indexBuffer.data())); + + models.quad.device = device; } void setupVertexDescriptions() @@ -532,7 +534,7 @@ public: vertices.bindingDescriptions[0] = vkTools::initializers::vertexInputBindingDescription( VERTEX_BUFFER_BIND_ID, - vkMeshLoader::vertexSize(vertexLayout), + vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX); // Attribute descriptions diff --git a/parallaxmapping/parallaxmapping.cpp b/parallaxmapping/parallaxmapping.cpp index 0c233054..71d484b7 100644 --- a/parallaxmapping/parallaxmapping.cpp +++ b/parallaxmapping/parallaxmapping.cpp @@ -20,22 +20,13 @@ #include #include "vulkanexamplebase.h" -#include "VulkanTexture.hpp" #include "vulkanbuffer.hpp" +#include "VulkanTexture.hpp" +#include "VulkanModel.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false -// Vertex layout for this example -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_UV, - vkMeshLoader::VERTEX_LAYOUT_NORMAL, - vkMeshLoader::VERTEX_LAYOUT_TANGENT, - vkMeshLoader::VERTEX_LAYOUT_BITANGENT -}; - class VulkanExample : public VulkanExampleBase { public: @@ -53,9 +44,18 @@ public: std::vector attributeDescriptions; } vertices; + // Vertex layout for the models + vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_UV, + vks::VERTEX_COMPONENT_NORMAL, + vks::VERTEX_COMPONENT_TANGENT, + vks::VERTEX_COMPONENT_BITANGENT, + }); + struct { - vkMeshLoader::MeshBuffer quad; - } meshes; + vks::Model quad; + } models; struct { vk::Buffer vertexShader; @@ -115,8 +115,8 @@ public: vkDestroyPipelineLayout(device, pipelineLayout, nullptr); vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); - vkMeshLoader::freeMeshBufferResources(device, &meshes.quad); - + models.quad.destroy(); + uniformBuffers.vertexShader.destroy(); uniformBuffers.fragmentShader.destroy(); @@ -126,7 +126,7 @@ public: void loadAssets() { - loadMesh(getAssetPath() + "models/plane_z.obj", &meshes.quad, vertexLayout, 0.1f); + models.quad.loadFromFile(getAssetPath() + "models/plane_z.obj", vertexLayout, 0.1f, vulkanDevice, queue); textures.colorMap.loadFromFile(getAssetPath() + "textures/rocks_color_bc3.dds", VK_FORMAT_BC3_UNORM_BLOCK, vulkanDevice, queue); textures.normalHeightMap.loadFromFile(getAssetPath() + "textures/rocks_normal_height_rgba.dds", VK_FORMAT_R8G8B8A8_UNORM, vulkanDevice, queue); } @@ -176,13 +176,13 @@ public: vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSet, 0, NULL); VkDeviceSize offsets[1] = { 0 }; - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.quad.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.quad.indices.buf, 0, VK_INDEX_TYPE_UINT32); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.quad.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.quad.indices.buffer, 0, VK_INDEX_TYPE_UINT32); // Parallax enabled vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.parallaxMapping); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.quad.indexCount, 1, 0, 0, 1); + vkCmdDrawIndexed(drawCmdBuffers[i], models.quad.indexCount, 1, 0, 0, 1); // Normal mapping if (splitScreen) @@ -190,7 +190,7 @@ public: viewport.x = (float)width / 2.0f; vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.normalMapping); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.quad.indexCount, 1, 0, 0, 1); + vkCmdDrawIndexed(drawCmdBuffers[i], models.quad.indexCount, 1, 0, 0, 1); } vkCmdEndRenderPass(drawCmdBuffers[i]); @@ -206,7 +206,7 @@ public: vertices.bindingDescriptions[0] = vkTools::initializers::vertexInputBindingDescription( VERTEX_BUFFER_BIND_ID, - vkMeshLoader::vertexSize(vertexLayout), + vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX); // Attribute descriptions diff --git a/pipelines/pipelines.cpp b/pipelines/pipelines.cpp index faad0170..d01f524f 100644 --- a/pipelines/pipelines.cpp +++ b/pipelines/pipelines.cpp @@ -19,20 +19,12 @@ #include #include "vulkanexamplebase.h" +#include "VulkanModel.hpp" #include "vulkanbuffer.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false -// Vertex layout for this example -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_NORMAL, - vkMeshLoader::VERTEX_LAYOUT_UV, - vkMeshLoader::VERTEX_LAYOUT_COLOR -}; - class VulkanExample: public VulkanExampleBase { public: @@ -42,9 +34,17 @@ public: std::vector attributeDescriptions; } vertices; + // Vertex layout for the models + vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_NORMAL, + vks::VERTEX_COMPONENT_UV, + vks::VERTEX_COMPONENT_COLOR, + }); + struct { - vkMeshLoader::MeshBuffer cube; - } meshes; + vks::Model cube; + } models; vk::Buffer uniformBuffer; @@ -90,8 +90,7 @@ public: vkDestroyPipelineLayout(device, pipelineLayout, nullptr); vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); - vkMeshLoader::freeMeshBufferResources(device, &meshes.cube); - + models.cube.destroy(); uniformBuffer.destroy(); } @@ -130,22 +129,22 @@ public: vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSet, 0, NULL); VkDeviceSize offsets[1] = { 0 }; - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.cube.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.cube.indices.buf, 0, VK_INDEX_TYPE_UINT32); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.cube.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.cube.indices.buffer, 0, VK_INDEX_TYPE_UINT32); // Left : Solid colored viewport.width = (float)width / 3.0; vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.phong); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.cube.indexCount, 1, 0, 0, 0); + vkCmdDrawIndexed(drawCmdBuffers[i], models.cube.indexCount, 1, 0, 0, 0); // Center : Toon viewport.x = (float)width / 3.0; vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.toon); vkCmdSetLineWidth(drawCmdBuffers[i], 2.0f); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.cube.indexCount, 1, 0, 0, 0); + vkCmdDrawIndexed(drawCmdBuffers[i], models.cube.indexCount, 1, 0, 0, 0); if (deviceFeatures.fillModeNonSolid) { @@ -153,7 +152,7 @@ public: viewport.x = (float)width / 3.0 + (float)width / 3.0; vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.wireframe); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.cube.indexCount, 1, 0, 0, 0); + vkCmdDrawIndexed(drawCmdBuffers[i], models.cube.indexCount, 1, 0, 0, 0); } vkCmdEndRenderPass(drawCmdBuffers[i]); @@ -162,9 +161,9 @@ public: } } - void loadMeshes() + void loadAssets() { - loadMesh(getAssetPath() + "models/treasure_smooth.dae", &meshes.cube, vertexLayout, 1.0f); + models.cube.loadFromFile(getAssetPath() + "models/treasure_smooth.dae", vertexLayout, 1.0f, vulkanDevice, queue); } void setupVertexDescriptions() @@ -174,7 +173,7 @@ public: vertices.bindingDescriptions[0] = vkTools::initializers::vertexInputBindingDescription( VERTEX_BUFFER_BIND_ID, - vkMeshLoader::vertexSize(vertexLayout), + vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX); // Attribute descriptions @@ -432,7 +431,7 @@ public: void prepare() { VulkanExampleBase::prepare(); - loadMeshes(); + loadAssets(); setupVertexDescriptions(); prepareUniformBuffers(); setupDescriptorSetLayout(); diff --git a/pushconstants/pushconstants.cpp b/pushconstants/pushconstants.cpp index d932a9b1..9c5b7a9f 100644 --- a/pushconstants/pushconstants.cpp +++ b/pushconstants/pushconstants.cpp @@ -20,19 +20,11 @@ #include #include "vulkanexamplebase.h" #include "vulkanbuffer.hpp" +#include "VulkanModel.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false -// Vertex layout for this example -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_NORMAL, - vkMeshLoader::VERTEX_LAYOUT_UV, - vkMeshLoader::VERTEX_LAYOUT_COLOR -}; - class VulkanExample : public VulkanExampleBase { public: @@ -42,9 +34,17 @@ public: std::vector attributeDescriptions; } vertices; + // Vertex layout for the models + vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_NORMAL, + vks::VERTEX_COMPONENT_UV, + vks::VERTEX_COMPONENT_COLOR, + }); + struct { - vkMeshLoader::MeshBuffer scene; - } meshes; + vks::Model scene; + } models; vk::Buffer uniformBuffer; @@ -86,7 +86,7 @@ public: vkDestroyPipelineLayout(device, pipelineLayout, nullptr); vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); - vkMeshLoader::freeMeshBufferResources(device, &meshes.scene); + models.scene.destroy(); uniformBuffer.destroy(); } @@ -163,10 +163,10 @@ public: vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSet, 0, NULL); VkDeviceSize offsets[1] = { 0 }; - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.scene.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.scene.indices.buf, 0, VK_INDEX_TYPE_UINT32); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.scene.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.scene.indices.buffer, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.scene.indexCount, 1, 0, 0, 0); + vkCmdDrawIndexed(drawCmdBuffers[i], models.scene.indexCount, 1, 0, 0, 0); vkCmdEndRenderPass(drawCmdBuffers[i]); @@ -174,9 +174,9 @@ public: } } - void loadMeshes() + void loadAssets() { - loadMesh(getAssetPath() + "models/samplescene.dae", &meshes.scene, vertexLayout, 0.35f); + models.scene.loadFromFile(getAssetPath() + "models/samplescene.dae", vertexLayout, 0.35f, vulkanDevice, queue); } void setupVertexDescriptions() @@ -186,7 +186,7 @@ public: vertices.bindingDescriptions[0] = vkTools::initializers::vertexInputBindingDescription( VERTEX_BUFFER_BIND_ID, - vkMeshLoader::vertexSize(vertexLayout), + vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX); // Attribute descriptions @@ -439,7 +439,7 @@ public: // Specs require 128 bytes, so if the device complies our push constant buffer should always fit into memory assert(sizeof(pushConstants) <= vulkanDevice->properties.limits.maxPushConstantsSize); - loadMeshes(); + loadAssets(); setupVertexDescriptions(); prepareUniformBuffers(); setupDescriptorSetLayout(); diff --git a/radialblur/radialblur.cpp b/radialblur/radialblur.cpp index f0805c64..f0004079 100644 --- a/radialblur/radialblur.cpp +++ b/radialblur/radialblur.cpp @@ -19,8 +19,9 @@ #include #include "vulkanexamplebase.h" -#include "VulkanTexture.hpp" #include "vulkanbuffer.hpp" +#include "VulkanTexture.hpp" +#include "VulkanModel.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -29,29 +30,28 @@ #define FB_DIM 512 #define FB_COLOR_FORMAT VK_FORMAT_R8G8B8A8_UNORM -// Vertex layout for this example -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_UV, - vkMeshLoader::VERTEX_LAYOUT_COLOR, - vkMeshLoader::VERTEX_LAYOUT_NORMAL -}; - class VulkanExample : public VulkanExampleBase { public: bool blur = true; bool displayTexture = false; - struct { - vkMeshLoader::MeshBuffer example; - } meshes; - struct { vks::Texture2D gradient; } textures; + // Vertex layout for the models + vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_UV, + vks::VERTEX_COMPONENT_COLOR, + vks::VERTEX_COMPONENT_NORMAL, + }); + + struct { + vks::Model example; + } models; + struct { VkPipelineVertexInputStateCreateInfo inputState; std::vector bindingDescriptions; @@ -156,10 +156,8 @@ public: vkDestroyDescriptorSetLayout(device, descriptorSetLayouts.scene, nullptr); vkDestroyDescriptorSetLayout(device, descriptorSetLayouts.radialBlur, nullptr); - // Meshes - vkMeshLoader::freeMeshBufferResources(device, &meshes.example); + models.example.destroy(); - // Uniform buffers uniformBuffers.scene.destroy(); uniformBuffers.blurParams.destroy(); @@ -379,9 +377,9 @@ public: vkCmdBindPipeline(offscreenPass.commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.colorPass); VkDeviceSize offsets[1] = { 0 }; - vkCmdBindVertexBuffers(offscreenPass.commandBuffer, VERTEX_BUFFER_BIND_ID, 1, &meshes.example.vertices.buf, offsets); - vkCmdBindIndexBuffer(offscreenPass.commandBuffer, meshes.example.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(offscreenPass.commandBuffer, meshes.example.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(offscreenPass.commandBuffer, VERTEX_BUFFER_BIND_ID, 1, &models.example.vertices.buffer, offsets); + vkCmdBindIndexBuffer(offscreenPass.commandBuffer, models.example.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(offscreenPass.commandBuffer, models.example.indexCount, 1, 0, 0, 0); vkCmdEndRenderPass(offscreenPass.commandBuffer); @@ -436,9 +434,9 @@ public: vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayouts.scene, 0, 1, &descriptorSets.scene, 0, NULL); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.phongPass); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.example.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.example.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.example.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.example.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.example.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(drawCmdBuffers[i], models.example.indexCount, 1, 0, 0, 0); // Fullscreen triangle (clipped to a quad) with radial blur if (blur) @@ -456,7 +454,7 @@ public: void loadAssets() { - loadMesh(getAssetPath() + "models/glowsphere.dae", &meshes.example, vertexLayout, 0.05f); + models.example.loadFromFile(getAssetPath() + "models/glowsphere.dae", vertexLayout, 0.05f, vulkanDevice, queue); textures.gradient.loadFromFile(getAssetPath() + "textures/particle_gradient_rgba.ktx", VK_FORMAT_R8G8B8A8_UNORM, vulkanDevice, queue); } @@ -467,7 +465,7 @@ public: vertices.bindingDescriptions[0] = vkTools::initializers::vertexInputBindingDescription( VERTEX_BUFFER_BIND_ID, - vkMeshLoader::vertexSize(vertexLayout), + vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX); // Attribute descriptions diff --git a/screenshot/screenshot.cpp b/screenshot/screenshot.cpp index 9bdb95fa..9ace966b 100644 --- a/screenshot/screenshot.cpp +++ b/screenshot/screenshot.cpp @@ -19,18 +19,11 @@ #include #include "vulkanexamplebase.h" +#include "VulkanModel.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false -// Vertex layout for this example -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_NORMAL, - vkMeshLoader::VERTEX_LAYOUT_COLOR -}; - class VulkanExample : public VulkanExampleBase { public: @@ -40,9 +33,16 @@ public: std::vector attributeDescriptions; } vertices; + // Vertex layout for the models + vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_NORMAL, + vks::VERTEX_COMPONENT_COLOR, + }); + struct { - vkMeshLoader::MeshBuffer object; - } meshes; + vks::Model object; + } models; vk::Buffer uniformBuffer; @@ -77,14 +77,14 @@ public: vkDestroyPipelineLayout(device, pipelineLayout, nullptr); vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); - vkMeshLoader::freeMeshBufferResources(device, &meshes.object); + models.object.destroy(); uniformBuffer.destroy(); } void loadAssets() { - loadMesh(getAssetPath() + "models/chinesedragon.dae", &meshes.object, vertexLayout, 0.1f); + models.object.loadFromFile(getAssetPath() + "models/chinesedragon.dae", vertexLayout, 0.1f, vulkanDevice, queue); } void buildCommandBuffers() @@ -123,10 +123,10 @@ public: vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); VkDeviceSize offsets[1] = { 0 }; - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.object.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.object.indices.buf, 0, VK_INDEX_TYPE_UINT32); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.object.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.object.indices.buffer, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.object.indexCount, 1, 0, 0, 0); + vkCmdDrawIndexed(drawCmdBuffers[i], models.object.indexCount, 1, 0, 0, 0); vkCmdEndRenderPass(drawCmdBuffers[i]); @@ -141,7 +141,7 @@ public: vertices.bindingDescriptions[0] = vkTools::initializers::vertexInputBindingDescription( VERTEX_BUFFER_BIND_ID, - vkMeshLoader::vertexSize(vertexLayout), + vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX); // Attribute descriptions diff --git a/shadowmapping/shadowmapping.cpp b/shadowmapping/shadowmapping.cpp index 38630c5e..a732cd4e 100644 --- a/shadowmapping/shadowmapping.cpp +++ b/shadowmapping/shadowmapping.cpp @@ -19,8 +19,8 @@ #include #include "vulkanexamplebase.h" -#include "vulkanMeshLoader.hpp" #include "vulkanbuffer.hpp" +#include "vulkanModel.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -39,15 +39,6 @@ // Offscreen frame buffer properties #define FB_COLOR_FORMAT VK_FORMAT_R8G8B8A8_UNORM -// Vertex layout for this example -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_UV, - vkMeshLoader::VERTEX_LAYOUT_COLOR, - vkMeshLoader::VERTEX_LAYOUT_NORMAL -}; - class VulkanExample : public VulkanExampleBase { public: @@ -69,10 +60,18 @@ public: glm::vec3 lightPos = glm::vec3(); float lightFOV = 45.0f; + // Vertex layout for the models + vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_UV, + vks::VERTEX_COMPONENT_COLOR, + vks::VERTEX_COMPONENT_NORMAL, + }); + struct { - vkMeshLoader::MeshBuffer scene; - vkMeshLoader::MeshBuffer quad; - } meshes; + vks::Model scene; + vks::Model quad; + } models; struct { VkPipelineVertexInputStateCreateInfo inputState; @@ -178,8 +177,8 @@ public: vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); // Meshes - vkMeshLoader::freeMeshBufferResources(device, &meshes.scene); - vkMeshLoader::freeMeshBufferResources(device, &meshes.quad); + models.scene.destroy(); + models.quad.destroy(); // Uniform buffers uniformBuffers.offscreen.destroy(); @@ -366,9 +365,9 @@ public: vkCmdBindDescriptorSets(offscreenPass.commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayouts.offscreen, 0, 1, &descriptorSets.offscreen, 0, NULL); VkDeviceSize offsets[1] = { 0 }; - vkCmdBindVertexBuffers(offscreenPass.commandBuffer, VERTEX_BUFFER_BIND_ID, 1, &meshes.scene.vertices.buf, offsets); - vkCmdBindIndexBuffer(offscreenPass.commandBuffer, meshes.scene.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(offscreenPass.commandBuffer, meshes.scene.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(offscreenPass.commandBuffer, VERTEX_BUFFER_BIND_ID, 1, &models.scene.vertices.buffer, offsets); + vkCmdBindIndexBuffer(offscreenPass.commandBuffer, models.scene.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(offscreenPass.commandBuffer, models.scene.indexCount, 1, 0, 0, 0); vkCmdEndRenderPass(offscreenPass.commandBuffer); @@ -415,18 +414,18 @@ public: // Visualize shadow map if (displayShadowMap) { - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.quad.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.quad.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.quad.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.quad.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.quad.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(drawCmdBuffers[i], models.quad.indexCount, 1, 0, 0, 0); } // 3D scene vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayouts.quad, 0, 1, &descriptorSets.scene, 0, NULL); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, (filterPCF) ? pipelines.sceneShadowPCF : pipelines.sceneShadow); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.scene.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.scene.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.scene.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.scene.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.scene.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(drawCmdBuffers[i], models.scene.indexCount, 1, 0, 0, 0); vkCmdEndRenderPass(drawCmdBuffers[i]); @@ -436,7 +435,7 @@ public: void loadAssets() { - loadMesh(getAssetPath() + "models/vulkanscene_shadow.dae", &meshes.scene, vertexLayout, 4.0f); + models.scene.loadFromFile(getAssetPath() + "models/vulkanscene_shadow.dae", vertexLayout, 4.0f, vulkanDevice, queue); } void generateQuad() @@ -463,21 +462,23 @@ public: VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, vertexBuffer.size() * sizeof(Vertex), - &meshes.quad.vertices.buf, - &meshes.quad.vertices.mem, + &models.quad.vertices.buffer, + &models.quad.vertices.memory, vertexBuffer.data())); // Setup indices std::vector indexBuffer = { 0,1,2, 2,3,0 }; - meshes.quad.indexCount = indexBuffer.size(); + models.quad.indexCount = indexBuffer.size(); VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_INDEX_BUFFER_BIT, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, indexBuffer.size() * sizeof(uint32_t), - &meshes.quad.indices.buf, - &meshes.quad.indices.mem, + &models.quad.indices.buffer, + &models.quad.indices.memory, indexBuffer.data())); + + models.quad.device = device; } void setupVertexDescriptions() @@ -487,7 +488,7 @@ public: vertices.bindingDescriptions[0] = vkTools::initializers::vertexInputBindingDescription( VERTEX_BUFFER_BIND_ID, - vkMeshLoader::vertexSize(vertexLayout), + vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX); // Attribute descriptions diff --git a/shadowmappingomni/shadowmappingomni.cpp b/shadowmappingomni/shadowmappingomni.cpp index 1595c88a..35f07dac 100644 --- a/shadowmappingomni/shadowmappingomni.cpp +++ b/shadowmappingomni/shadowmappingomni.cpp @@ -19,8 +19,9 @@ #include #include "vulkanexamplebase.h" -#include "VulkanTexture.hpp" #include "vulkanbuffer.hpp" +#include "VulkanTexture.hpp" +#include "VulkanModel.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -33,15 +34,6 @@ #define FB_DIM TEX_DIM #define FB_COLOR_FORMAT VK_FORMAT_R32_SFLOAT -// Vertex layout for this example -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_UV, - vkMeshLoader::VERTEX_LAYOUT_COLOR, - vkMeshLoader::VERTEX_LAYOUT_NORMAL -}; - class VulkanExample : public VulkanExampleBase { public: @@ -56,10 +48,18 @@ public: std::vector attributeDescriptions; } vertices; + // Vertex layout for the models + vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_UV, + vks::VERTEX_COMPONENT_COLOR, + vks::VERTEX_COMPONENT_NORMAL, + }); + struct { - vkMeshLoader::MeshBuffer skybox; - vkMeshLoader::MeshBuffer scene; - } meshes; + vks::Model skybox; + vks::Model scene; + } models; struct { vk::Buffer scene; @@ -170,8 +170,8 @@ public: vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); // Meshes - vkMeshLoader::freeMeshBufferResources(device, &meshes.scene); - vkMeshLoader::freeMeshBufferResources(device, &meshes.skybox); + models.scene.destroy(); + models.skybox.destroy(); // Uniform buffers uniformBuffers.offscreen.destroy(); @@ -435,9 +435,9 @@ public: vkCmdBindDescriptorSets(offscreenPass.commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayouts.offscreen, 0, 1, &descriptorSets.offscreen, 0, NULL); VkDeviceSize offsets[1] = { 0 }; - vkCmdBindVertexBuffers(offscreenPass.commandBuffer, VERTEX_BUFFER_BIND_ID, 1, &meshes.scene.vertices.buf, offsets); - vkCmdBindIndexBuffer(offscreenPass.commandBuffer, meshes.scene.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(offscreenPass.commandBuffer, meshes.scene.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(offscreenPass.commandBuffer, VERTEX_BUFFER_BIND_ID, 1, &models.scene.vertices.buffer, offsets); + vkCmdBindIndexBuffer(offscreenPass.commandBuffer, models.scene.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(offscreenPass.commandBuffer, models.scene.indexCount, 1, 0, 0, 0); vkCmdEndRenderPass(offscreenPass.commandBuffer); // Make sure color writes to the framebuffer are finished before using it as transfer source @@ -598,16 +598,16 @@ public: if (displayCubeMap) { vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.cubeMap); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.skybox.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.skybox.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.skybox.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.skybox.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.skybox.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(drawCmdBuffers[i], models.skybox.indexCount, 1, 0, 0, 0); } else { vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.scene); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.scene.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.scene.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.scene.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.scene.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.scene.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(drawCmdBuffers[i], models.scene.indexCount, 1, 0, 0, 0); } vkCmdEndRenderPass(drawCmdBuffers[i]); @@ -618,8 +618,8 @@ public: void loadAssets() { - loadMesh(getAssetPath() + "models/cube.obj", &meshes.skybox, vertexLayout, 2.0f); - loadMesh(getAssetPath() + "models/shadowscene_fire.dae", &meshes.scene, vertexLayout, 2.0f); + models.skybox.loadFromFile(getAssetPath() + "models/cube.obj", vertexLayout, 2.0f, vulkanDevice, queue); + models.scene.loadFromFile(getAssetPath() + "models/shadowscene_fire.dae", vertexLayout, 2.0f, vulkanDevice, queue); } void setupVertexDescriptions() @@ -629,7 +629,7 @@ public: vertices.bindingDescriptions[0] = vkTools::initializers::vertexInputBindingDescription( VERTEX_BUFFER_BIND_ID, - vkMeshLoader::vertexSize(vertexLayout), + vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX); // Attribute descriptions diff --git a/specializationconstants/specializationconstants.cpp b/specializationconstants/specializationconstants.cpp index 3eae6fbd..ef82c04d 100644 --- a/specializationconstants/specializationconstants.cpp +++ b/specializationconstants/specializationconstants.cpp @@ -22,20 +22,12 @@ #include #include "vulkanexamplebase.h" #include "VulkanTexture.hpp" +#include "VulkanModel.hpp" #include "vulkanbuffer.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false -// Vertex layout for this example -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_NORMAL, - vkMeshLoader::VERTEX_LAYOUT_UV, - vkMeshLoader::VERTEX_LAYOUT_COLOR -}; - class VulkanExample: public VulkanExampleBase { public: @@ -45,9 +37,17 @@ public: std::vector attributeDescriptions; } vertices; + // Vertex layout for the models + vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_NORMAL, + vks::VERTEX_COMPONENT_UV, + vks::VERTEX_COMPONENT_COLOR, + }); + struct { - vkMeshLoader::MeshBuffer cube; - } meshes; + vks::Model cube; + } models; struct { vks::Texture2D colormap; @@ -91,10 +91,8 @@ public: vkDestroyPipelineLayout(device, pipelineLayout, nullptr); vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); - vkMeshLoader::freeMeshBufferResources(device, &meshes.cube); - + models.cube.destroy(); textures.colormap.destroy(); - uniformBuffer.destroy(); } @@ -133,27 +131,27 @@ public: vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSet, 0, NULL); VkDeviceSize offsets[1] = { 0 }; - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.cube.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.cube.indices.buf, 0, VK_INDEX_TYPE_UINT32); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.cube.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.cube.indices.buffer, 0, VK_INDEX_TYPE_UINT32); // Left viewport.width = (float)width / 3.0f; vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.phong); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.cube.indexCount, 1, 0, 0, 0); + vkCmdDrawIndexed(drawCmdBuffers[i], models.cube.indexCount, 1, 0, 0, 0); // Center viewport.x = (float)width / 3.0f; vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.toon); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.cube.indexCount, 1, 0, 0, 0); + vkCmdDrawIndexed(drawCmdBuffers[i], models.cube.indexCount, 1, 0, 0, 0); // Right viewport.x = (float)width / 3.0f + (float)width / 3.0f; vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.textured); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.cube.indexCount, 1, 0, 0, 0); + vkCmdDrawIndexed(drawCmdBuffers[i], models.cube.indexCount, 1, 0, 0, 0); vkCmdEndRenderPass(drawCmdBuffers[i]); @@ -163,7 +161,7 @@ public: void loadAssets() { - loadMesh(getAssetPath() + "models/color_teapot_spheres.dae", &meshes.cube, vertexLayout, 0.1f); + models.cube.loadFromFile(getAssetPath() + "models/color_teapot_spheres.dae", vertexLayout, 0.1f, vulkanDevice, queue); textures.colormap.loadFromFile(getAssetPath() + "textures/metalplate_nomips_rgba.ktx", VK_FORMAT_R8G8B8A8_UNORM, vulkanDevice, queue); } @@ -172,7 +170,7 @@ public: // Binding description vertices.bindingDescriptions.resize(1); vertices.bindingDescriptions = { - vkTools::initializers::vertexInputBindingDescription(VERTEX_BUFFER_BIND_ID, vkMeshLoader::vertexSize(vertexLayout), VK_VERTEX_INPUT_RATE_VERTEX), + vkTools::initializers::vertexInputBindingDescription(VERTEX_BUFFER_BIND_ID, vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX), }; // Attribute descriptions diff --git a/sphericalenvmapping/sphericalenvmapping.cpp b/sphericalenvmapping/sphericalenvmapping.cpp index a14cfe34..bb843cb2 100644 --- a/sphericalenvmapping/sphericalenvmapping.cpp +++ b/sphericalenvmapping/sphericalenvmapping.cpp @@ -24,21 +24,13 @@ #include #include "vulkanexamplebase.h" -#include "VulkanTexture.hpp" #include "vulkanbuffer.hpp" +#include "VulkanTexture.hpp" +#include "VulkanModel.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false -// Vertex layout for this example -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_NORMAL, - vkMeshLoader::VERTEX_LAYOUT_UV, - vkMeshLoader::VERTEX_LAYOUT_COLOR -}; - class VulkanExample : public VulkanExampleBase { public: @@ -48,9 +40,17 @@ public: std::vector attributeDescriptions; } vertices; + // Vertex layout for the models + vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_NORMAL, + vks::VERTEX_COMPONENT_UV, + vks::VERTEX_COMPONENT_COLOR, + }); + struct { - vkMeshLoader::MeshBuffer object; - } meshes; + vks::Model object; + } models; struct { vks::Texture2DArray matCapArray; @@ -90,17 +90,16 @@ public: vkDestroyPipelineLayout(device, pipelineLayout, nullptr); vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); - vkMeshLoader::freeMeshBufferResources(device, &meshes.object); + models.object.destroy(); uniformBuffer.destroy(); textures.matCapArray.destroy(); } - void loadTextures() + void loadAssets() { - // Several mat caps are stored in a single texture array - // so they can easily be switched inside the shader - // just by updating the index in a uniform buffer + models.object.loadFromFile(getAssetPath() + "models/chinesedragon.dae", vertexLayout, 0.05f, vulkanDevice, queue); + // Multiple mat caps are stored in a single texture array so they can easily be switched inside the shader just by updating the index in a uniform buffer textures.matCapArray.loadFromFile(getAssetPath() + "textures/matcap_array_rgba.ktx", VK_FORMAT_R8G8B8A8_UNORM, vulkanDevice, queue); } @@ -140,10 +139,10 @@ public: vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline); VkDeviceSize offsets[1] = { 0 }; - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.object.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.object.indices.buf, 0, VK_INDEX_TYPE_UINT32); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.object.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.object.indices.buffer, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.object.indexCount, 1, 0, 0, 0); + vkCmdDrawIndexed(drawCmdBuffers[i], models.object.indexCount, 1, 0, 0, 0); vkCmdEndRenderPass(drawCmdBuffers[i]); @@ -151,11 +150,6 @@ public: } } - void loadMeshes() - { - loadMesh(getAssetPath() + "models/chinesedragon.dae", &meshes.object, vertexLayout, 0.05f); - } - void prepareVertices() { // Binding description @@ -163,7 +157,7 @@ public: vertices.bindingDescriptions[0] = vkTools::initializers::vertexInputBindingDescription( VERTEX_BUFFER_BIND_ID, - vkMeshLoader::vertexSize(vertexLayout), + vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX); // Attribute descriptions @@ -407,8 +401,7 @@ public: void prepare() { VulkanExampleBase::prepare(); - loadTextures(); - loadMeshes(); + loadAssets(); prepareVertices(); prepareUniformBuffers(); setupDescriptorSetLayout(); diff --git a/ssao/ssao.cpp b/ssao/ssao.cpp index 9ec944fe..0aa016f8 100644 --- a/ssao/ssao.cpp +++ b/ssao/ssao.cpp @@ -21,6 +21,7 @@ #include #include "vulkanexamplebase.h" #include "VulkanTexture.hpp" +#include "VulkanModel.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -34,15 +35,6 @@ #define SSAO_NOISE_DIM 4 #endif -// Vertex layout for this example -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_UV, - vkMeshLoader::VERTEX_LAYOUT_COLOR, - vkMeshLoader::VERTEX_LAYOUT_NORMAL, -}; - class VulkanExample : public VulkanExampleBase { public: @@ -50,9 +42,17 @@ public: vks::Texture2D ssaoNoise; } textures; + // Vertex layout for the models + vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_UV, + vks::VERTEX_COMPONENT_COLOR, + vks::VERTEX_COMPONENT_NORMAL, + }); + struct { - vkMeshLoader::MeshBuffer scene; - } meshes; + vks::Model scene; + } models; struct { VkPipelineVertexInputStateCreateInfo inputState; @@ -204,7 +204,7 @@ public: vkDestroyDescriptorSetLayout(device, descriptorSetLayouts.composition, nullptr); // Meshes - vkMeshLoader::freeMeshBufferResources(device, &meshes.scene); + models.scene.destroy(); // Uniform buffers uniformBuffers.sceneMatrices.destroy(); @@ -574,9 +574,9 @@ public: vkCmdBindPipeline(offScreenCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.offscreen); vkCmdBindDescriptorSets(offScreenCmdBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayouts.gBuffer, 0, 1, &descriptorSets.floor, 0, NULL); - vkCmdBindVertexBuffers(offScreenCmdBuffer, VERTEX_BUFFER_BIND_ID, 1, &meshes.scene.vertices.buf, offsets); - vkCmdBindIndexBuffer(offScreenCmdBuffer, meshes.scene.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(offScreenCmdBuffer, meshes.scene.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(offScreenCmdBuffer, VERTEX_BUFFER_BIND_ID, 1, &models.scene.vertices.buffer, offsets); + vkCmdBindIndexBuffer(offScreenCmdBuffer, models.scene.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(offScreenCmdBuffer, models.scene.indexCount, 1, 0, 0, 0); vkCmdEndRenderPass(offScreenCmdBuffer); @@ -632,11 +632,11 @@ public: void loadAssets() { - vkMeshLoader::MeshCreateInfo meshCreateInfo; - meshCreateInfo.scale = glm::vec3(0.5f); - meshCreateInfo.uvscale = glm::vec2(1.0f); - meshCreateInfo.center = glm::vec3(0.0f, 0.0f, 0.0f); - loadMesh(getAssetPath() + "models/sibenik/sibenik.dae", &meshes.scene, vertexLayout, &meshCreateInfo); + vks::ModelCreateInfo modelCreateInfo; + modelCreateInfo.scale = glm::vec3(0.5f); + modelCreateInfo.uvscale = glm::vec2(1.0f); + modelCreateInfo.center = glm::vec3(0.0f, 0.0f, 0.0f); + models.scene.loadFromFile(getAssetPath() + "models/sibenik/sibenik.dae", vertexLayout, &modelCreateInfo, vulkanDevice, queue); } void reBuildCommandBuffers() @@ -701,7 +701,7 @@ public: vertices.bindingDescriptions[0] = vkTools::initializers::vertexInputBindingDescription( VERTEX_BUFFER_BIND_ID, - vkMeshLoader::vertexSize(vertexLayout), + vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX); // Attribute descriptions diff --git a/subpasses/subpasses.cpp b/subpasses/subpasses.cpp index d98e368a..0e51a1e0 100644 --- a/subpasses/subpasses.cpp +++ b/subpasses/subpasses.cpp @@ -21,33 +21,33 @@ #include #include "vulkanexamplebase.h" #include "VulkanTexture.hpp" +#include "VulkanModel.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false #define NUM_LIGHTS 64 -// Vertex layout for this example -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_COLOR, - vkMeshLoader::VERTEX_LAYOUT_NORMAL, - vkMeshLoader::VERTEX_LAYOUT_UV, -}; - class VulkanExample : public VulkanExampleBase { public: - struct { - vkMeshLoader::MeshBuffer scene; - vkMeshLoader::MeshBuffer transparent; - } meshes; - struct { vks::Texture2D glass; } textures; + // Vertex layout for the models + vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_COLOR, + vks::VERTEX_COMPONENT_NORMAL, + vks::VERTEX_COMPONENT_UV, + }); + + struct { + vks::Model scene; + vks::Model transparent; + } models; + struct { VkPipelineVertexInputStateCreateInfo inputState; std::vector bindingDescriptions; @@ -155,8 +155,8 @@ public: vkDestroyDescriptorSetLayout(device, descriptorSetLayouts.transparent, nullptr); textures.glass.destroy(); - meshes.scene.destroy(); - meshes.transparent.destroy(); + models.scene.destroy(); + models.transparent.destroy(); uniformBuffers.GBuffer.destroy(); uniformBuffers.lights.destroy(); } @@ -455,9 +455,9 @@ public: vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.offscreen); vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayouts.offscreen, 0, 1, &descriptorSets.scene, 0, NULL); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.scene.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.scene.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.scene.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.scene.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.scene.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(drawCmdBuffers[i], models.scene.indexCount, 1, 0, 0, 0); // Second sub pass // This subpass will use the G-Buffer components that have been filled in the first subpass as input attachment for the final compositing @@ -474,9 +474,9 @@ public: vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.transparent); vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayouts.transparent, 0, 1, &descriptorSets.transparent, 0, NULL); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.transparent.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.transparent.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.transparent.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.transparent.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.transparent.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(drawCmdBuffers[i], models.transparent.indexCount, 1, 0, 0, 0); vkCmdEndRenderPass(drawCmdBuffers[i]); @@ -486,8 +486,8 @@ public: void loadAssets() { - loadMesh(getAssetPath() + "models/samplebuilding.dae", &meshes.scene, vertexLayout, 1.0f); - loadMesh(getAssetPath() + "models/samplebuilding_glass.dae", &meshes.transparent, vertexLayout, 1.0f); + models.scene.loadFromFile(getAssetPath() + "models/samplebuilding.dae", vertexLayout, 1.0f, vulkanDevice, queue); + models.transparent.loadFromFile(getAssetPath() + "models/samplebuilding_glass.dae", vertexLayout, 1.0f, vulkanDevice, queue); textures.glass.loadFromFile(getAssetPath() + "textures/colored_glass_bc3.ktx", VK_FORMAT_BC3_UNORM_BLOCK, vulkanDevice, queue); } @@ -497,7 +497,7 @@ public: vertices.bindingDescriptions = { vkTools::initializers::vertexInputBindingDescription( VERTEX_BUFFER_BIND_ID, - vkMeshLoader::vertexSize(vertexLayout), + vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX), }; diff --git a/terraintessellation/terraintessellation.cpp b/terraintessellation/terraintessellation.cpp index 4691d18c..952547ae 100644 --- a/terraintessellation/terraintessellation.cpp +++ b/terraintessellation/terraintessellation.cpp @@ -21,32 +21,37 @@ #include #include "vulkanexamplebase.h" -#include "VulkanTexture.hpp" #include "vulkanbuffer.hpp" +#include "VulkanTexture.hpp" +#include "VulkanModel.hpp" #include "frustum.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false -// Vertex layout for this example -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_NORMAL, - vkMeshLoader::VERTEX_LAYOUT_UV -}; - class VulkanExample : public VulkanExampleBase { -private: +public: + bool wireframe = false; + bool tessellation = true; + struct { vks::Texture2D heightMap; vks::Texture2D skySphere; vks::Texture2DArray terrainArray; } textures; -public: - bool wireframe = false; - bool tessellation = true; + + // Vertex layout for the models + vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_NORMAL, + vks::VERTEX_COMPONENT_UV, + }); + + struct { + vks::Model terrain; + vks::Model skysphere; + } models; struct { VkPipelineVertexInputStateCreateInfo inputState; @@ -54,11 +59,6 @@ public: std::vector attributeDescriptions; } vertices; - struct { - vkMeshLoader::MeshBuffer terrain; - vkMeshLoader::MeshBuffer skysphere; - } meshes; - struct { vk::Buffer terrainTessellation; vk::Buffer skysphereVertex; @@ -146,8 +146,8 @@ public: vkDestroyDescriptorSetLayout(device, descriptorSetLayouts.terrain, nullptr); vkDestroyDescriptorSetLayout(device, descriptorSetLayouts.skysphere, nullptr); - vkMeshLoader::freeMeshBufferResources(device, &meshes.terrain); - vkMeshLoader::freeMeshBufferResources(device, &meshes.skysphere); + models.terrain.destroy(); + models.skysphere.destroy(); uniformBuffers.skysphereVertex.destroy(); uniformBuffers.terrainTessellation.destroy(); @@ -211,7 +211,7 @@ public: void loadAssets() { - loadMesh(getAssetPath() + "models/geosphere.obj", &meshes.skysphere, vertexLayout, 1.0f); + models.skysphere.loadFromFile(getAssetPath() + "models/geosphere.obj", vertexLayout, 1.0f, vulkanDevice, queue); textures.skySphere.loadFromFile(getAssetPath() + "textures/skysphere_bc3.ktx", VK_FORMAT_BC3_UNORM_BLOCK, vulkanDevice, queue); // Height data is stored in a one-channel texture @@ -309,9 +309,9 @@ public: // Skysphere vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.skysphere); vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayouts.skysphere, 0, 1, &descriptorSets.skysphere, 0, NULL); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.skysphere.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.skysphere.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.skysphere.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.skysphere.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.skysphere.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(drawCmdBuffers[i], models.skysphere.indexCount, 1, 0, 0, 0); // Terrrain // Begin pipeline statistics query @@ -319,9 +319,9 @@ public: // Render vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, wireframe ? pipelines.wireframe : pipelines.terrain); vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayouts.terrain, 0, 1, &descriptorSets.terrain, 0, NULL); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.terrain.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.terrain.indices.buf, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.terrain.indexCount, 1, 0, 0, 0); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.terrain.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.terrain.indices.buffer, 0, VK_INDEX_TYPE_UINT32); + vkCmdDrawIndexed(drawCmdBuffers[i], models.terrain.indexCount, 1, 0, 0, 0); // End pipeline statistics query vkCmdEndQuery(drawCmdBuffers[i], queryPool, 0); @@ -456,7 +456,7 @@ public: indices[index + 3] = indices[index] + 1; } } - meshes.terrain.indexCount = (PATCH_SIZE - 1) * (PATCH_SIZE - 1) * 4; + models.terrain.indexCount = (PATCH_SIZE - 1) * (PATCH_SIZE - 1) * 4; uint32_t vertexBufferSize = (PATCH_SIZE * PATCH_SIZE * 4) * sizeof(Vertex); uint32_t indexBufferSize = (w * w * 4) * sizeof(uint32_t); @@ -488,15 +488,15 @@ public: VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, vertexBufferSize, - &meshes.terrain.vertices.buf, - &meshes.terrain.vertices.mem)); + &models.terrain.vertices.buffer, + &models.terrain.vertices.memory)); VK_CHECK_RESULT(vulkanDevice->createBuffer( VK_BUFFER_USAGE_INDEX_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, indexBufferSize, - &meshes.terrain.indices.buf, - &meshes.terrain.indices.mem)); + &models.terrain.indices.buffer, + &models.terrain.indices.memory)); // Copy from staging buffers VkCommandBuffer copyCmd = VulkanExampleBase::createCommandBuffer(VK_COMMAND_BUFFER_LEVEL_PRIMARY, true); @@ -507,7 +507,7 @@ public: vkCmdCopyBuffer( copyCmd, vertexStaging.buffer, - meshes.terrain.vertices.buf, + models.terrain.vertices.buffer, 1, ©Region); @@ -515,12 +515,14 @@ public: vkCmdCopyBuffer( copyCmd, indexStaging.buffer, - meshes.terrain.indices.buf, + models.terrain.indices.buffer, 1, ©Region); VulkanExampleBase::flushCommandBuffer(copyCmd, queue, true); + models.terrain.device = device; + vkDestroyBuffer(device, vertexStaging.buffer, nullptr); vkFreeMemory(device, vertexStaging.memory, nullptr); vkDestroyBuffer(device, indexStaging.buffer, nullptr); @@ -537,7 +539,7 @@ public: vertices.bindingDescriptions[0] = vkTools::initializers::vertexInputBindingDescription( VERTEX_BUFFER_BIND_ID, - vkMeshLoader::vertexSize(vertexLayout), + vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX); // Attribute descriptions diff --git a/tessellation/tessellation.cpp b/tessellation/tessellation.cpp index 7937fb6e..4665a216 100644 --- a/tessellation/tessellation.cpp +++ b/tessellation/tessellation.cpp @@ -23,19 +23,12 @@ #include #include "vulkanexamplebase.h" #include "VulkanTexture.hpp" +#include "VulkanModel.hpp" #include "vulkanbuffer.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false -// Vertex layout for this example -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_NORMAL, - vkMeshLoader::VERTEX_LAYOUT_UV -}; - class VulkanExample : public VulkanExampleBase { public: @@ -51,9 +44,16 @@ public: std::vector attributeDescriptions; } vertices; + // Vertex layout for the models + vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_NORMAL, + vks::VERTEX_COMPONENT_UV, + }); + struct { - vkMeshLoader::MeshBuffer object; - } meshes; + vks::Model object; + } models; struct { vk::Buffer tessControl, tessEval; @@ -108,8 +108,7 @@ public: vkDestroyPipelineLayout(device, pipelineLayout, nullptr); vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); - vkMeshLoader::freeMeshBufferResources(device, &meshes.object); - + models.object.destroy(); uniformBuffers.tessControl.destroy(); uniformBuffers.tessEval.destroy(); textures.colorMap.destroy(); @@ -162,20 +161,20 @@ public: vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSet, 0, NULL); VkDeviceSize offsets[1] = { 0 }; - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.object.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.object.indices.buf, 0, VK_INDEX_TYPE_UINT32); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.object.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.object.indices.buffer, 0, VK_INDEX_TYPE_UINT32); if (splitScreen) { vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineLeft); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.object.indexCount, 1, 0, 0, 0); + vkCmdDrawIndexed(drawCmdBuffers[i], models.object.indexCount, 1, 0, 0, 0); viewport.x = float(width) / 2; } vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, *pipelineRight); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.object.indexCount, 1, 0, 0, 0); + vkCmdDrawIndexed(drawCmdBuffers[i], models.object.indexCount, 1, 0, 0, 0); vkCmdEndRenderPass(drawCmdBuffers[i]); @@ -185,7 +184,7 @@ public: void loadAssets() { - loadMesh(getAssetPath() + "models/lowpoly/deer.dae", &meshes.object, vertexLayout, 1.0f); + models.object.loadFromFile(getAssetPath() + "models/lowpoly/deer.dae", vertexLayout, 1.0f, vulkanDevice, queue); textures.colorMap.loadFromFile(getAssetPath() + "textures/deer.ktx", VK_FORMAT_BC3_UNORM_BLOCK, vulkanDevice, queue); } @@ -196,7 +195,7 @@ public: vertices.bindingDescriptions[0] = vkTools::initializers::vertexInputBindingDescription( VERTEX_BUFFER_BIND_ID, - vkMeshLoader::vertexSize(vertexLayout), + vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX); // Attribute descriptions @@ -467,8 +466,6 @@ public: uboTessEval.model = glm::rotate(uboTessEval.model, glm::radians(rotation.y), glm::vec3(0.0f, 1.0f, 0.0f)); uboTessEval.model = glm::rotate(uboTessEval.model, glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f)); - uint8_t *pData; - // Tessellation evaulation uniform block memcpy(uniformBuffers.tessEval.mapped, &uboTessEval, sizeof(uboTessEval)); diff --git a/texture3d/texture3d.cpp b/texture3d/texture3d.cpp index 9aa5520d..ba59581c 100644 --- a/texture3d/texture3d.cpp +++ b/texture3d/texture3d.cpp @@ -24,6 +24,7 @@ #include "vulkanexamplebase.h" #include "vulkandevice.hpp" #include "vulkanbuffer.hpp" +#include "VulkanModel.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false @@ -161,8 +162,8 @@ public: bool regenerateNoise = true; struct { - vkMeshLoader::MeshBuffer cube; - } meshes; + vks::Model cube; + } models; struct { VkPipelineVertexInputStateCreateInfo inputState; @@ -197,7 +198,7 @@ public: rotation = { 0.0f, 15.0f, 0.0f }; title = "Vulkan Example - 3D textures"; enableTextOverlay = true; - srand(std::time(0)); + srand((unsigned int)time(NULL)); } ~VulkanExample() @@ -233,7 +234,7 @@ public: VkFormatProperties formatProperties; vkGetPhysicalDeviceFormatProperties(physicalDevice, texture.format, &formatProperties); // Check if format supports transfer - if (!formatProperties.optimalTilingFeatures & VK_IMAGE_USAGE_TRANSFER_DST_BIT) + if (!formatProperties.optimalTilingFeatures && VK_IMAGE_USAGE_TRANSFER_DST_BIT) { std::cout << "Error: Device does not support flag TRANSFER_DST for selected texture format!" << std::endl; return; @@ -332,7 +333,7 @@ public: #pragma omp parallel for for (int32_t z = 0; z < texture.depth; z++) { - for (int32_t y = 0; y < texture.height; y++) + for (uint32_t y = 0; y < texture.height; y++) { for (int32_t x = 0; x < texture.width; x++) { diff --git a/texturecubemap/texturecubemap.cpp b/texturecubemap/texturecubemap.cpp index f66c1d1c..b8206b4c 100644 --- a/texturecubemap/texturecubemap.cpp +++ b/texturecubemap/texturecubemap.cpp @@ -21,20 +21,13 @@ #include #include "vulkanexamplebase.h" -#include "VulkanTexture.hpp" #include "vulkanbuffer.hpp" +#include "VulkanTexture.hpp" +#include "VulkanModel.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false -// Vertex layout for this example -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_NORMAL, - vkMeshLoader::VERTEX_LAYOUT_UV -}; - class VulkanExample : public VulkanExampleBase { public: @@ -48,11 +41,18 @@ public: std::vector attributeDescriptions; } vertices; + // Vertex layout for the models + vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_NORMAL, + vks::VERTEX_COMPONENT_UV, + }); + struct Meshes { - vkMeshLoader::MeshBuffer skybox; - std::vector objects; + vks::Model skybox; + std::vector objects; uint32_t objectIndex = 0; - } meshes; + } models; struct { vk::Buffer object; @@ -104,11 +104,10 @@ public: vkDestroyPipelineLayout(device, pipelineLayout, nullptr); vkDestroyDescriptorSetLayout(device, descriptorSetLayout, nullptr); - for (size_t i = 0; i < meshes.objects.size(); i++) - { - vkMeshLoader::freeMeshBufferResources(device, &meshes.objects[i]); + for (auto& model : models.objects) { + model.destroy(); } - vkMeshLoader::freeMeshBufferResources(device, &meshes.skybox); + models.skybox.destroy(); uniformBuffers.object.destroy(); uniformBuffers.skybox.destroy(); @@ -348,18 +347,18 @@ public: if (displaySkybox) { vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSets.skybox, 0, NULL); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.skybox.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.skybox.indices.buf, 0, VK_INDEX_TYPE_UINT32); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.skybox.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.skybox.indices.buffer, 0, VK_INDEX_TYPE_UINT32); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.skybox); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.skybox.indexCount, 1, 0, 0, 0); + vkCmdDrawIndexed(drawCmdBuffers[i], models.skybox.indexCount, 1, 0, 0, 0); } // 3D object vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSets.object, 0, NULL); - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.objects[meshes.objectIndex].vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.objects[meshes.objectIndex].indices.buf, 0, VK_INDEX_TYPE_UINT32); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.objects[models.objectIndex].vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.objects[models.objectIndex].indices.buffer, 0, VK_INDEX_TYPE_UINT32); vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.reflect); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.objects[meshes.objectIndex].indexCount, 1, 0, 0, 0); + vkCmdDrawIndexed(drawCmdBuffers[i], models.objects[models.objectIndex].indexCount, 1, 0, 0, 0); vkCmdEndRenderPass(drawCmdBuffers[i]); @@ -370,12 +369,14 @@ public: void loadMeshes() { // Skybox - loadMesh(getAssetPath() + "models/cube.obj", &meshes.skybox, vertexLayout, 0.05f); + models.skybox.loadFromFile(getAssetPath() + "models/cube.obj", vertexLayout, 0.05f, vulkanDevice, queue); // Objects - meshes.objects.resize(3); - loadMesh(getAssetPath() + "models/sphere.obj", &meshes.objects[0], vertexLayout, 0.05f); - loadMesh(getAssetPath() + "models/teapot.dae", &meshes.objects[1], vertexLayout, 0.05f); - loadMesh(getAssetPath() + "models/torusknot.obj", &meshes.objects[2], vertexLayout, 0.05f); + std::vector filenames = { "sphere.obj", "teapot.dae", "torusknot.obj" }; + for (auto file : filenames) { + vks::Model model; + model.loadFromFile(getAssetPath() + "models/" + file, vertexLayout, 0.05f, vulkanDevice, queue); + models.objects.push_back(model); + } } void setupVertexDescriptions() @@ -385,7 +386,7 @@ public: vertices.bindingDescriptions[0] = vkTools::initializers::vertexInputBindingDescription( VERTEX_BUFFER_BIND_ID, - vkMeshLoader::vertexSize(vertexLayout), + vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX); // Attribute descriptions @@ -710,10 +711,10 @@ public: void toggleObject() { - meshes.objectIndex++; - if (meshes.objectIndex >= static_cast(meshes.objects.size())) + models.objectIndex++; + if (models.objectIndex >= static_cast(models.objects.size())) { - meshes.objectIndex = 0; + models.objectIndex = 0; } reBuildCommandBuffers(); } diff --git a/texturemipmapgen/texturemipmapgen.cpp b/texturemipmapgen/texturemipmapgen.cpp index e0643987..39195168 100644 --- a/texturemipmapgen/texturemipmapgen.cpp +++ b/texturemipmapgen/texturemipmapgen.cpp @@ -25,16 +25,11 @@ #include "vulkanexamplebase.h" #include "vulkandevice.hpp" #include "vulkanbuffer.hpp" +#include "VulkanModel.hpp" #define VERTEX_BUFFER_BIND_ID 0 #define ENABLE_VALIDATION false -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_UV, - vkMeshLoader::VERTEX_LAYOUT_NORMAL -}; class VulkanExample : public VulkanExampleBase { public: @@ -51,9 +46,16 @@ public: std::vector samplerNames{ "No mip maps" , "With mip maps (bilinear)" , "With mip maps (anisotropic)" }; std::vector samplers; + // Vertex layout for the models + vks::VertexLayout vertexLayout = vks::VertexLayout({ + vks::VERTEX_COMPONENT_POSITION, + vks::VERTEX_COMPONENT_UV, + vks::VERTEX_COMPONENT_NORMAL, + }); + struct { - vkMeshLoader::MeshBuffer tunnel; - } meshes; + vks::Model tunnel; + } models; struct { VkPipelineVertexInputStateCreateInfo inputState; @@ -105,7 +107,7 @@ public: { vkDestroySampler(device, sampler, nullptr); } - vkMeshLoader::freeMeshBufferResources(device, &meshes.tunnel); + models.tunnel.destroy(); } void loadTexture(std::string fileName, VkFormat format, bool forceLinearTiling) @@ -399,10 +401,10 @@ public: vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelines.solid); VkDeviceSize offsets[1] = { 0 }; - vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &meshes.tunnel.vertices.buf, offsets); - vkCmdBindIndexBuffer(drawCmdBuffers[i], meshes.tunnel.indices.buf, 0, VK_INDEX_TYPE_UINT32); + vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.tunnel.vertices.buffer, offsets); + vkCmdBindIndexBuffer(drawCmdBuffers[i], models.tunnel.indices.buffer, 0, VK_INDEX_TYPE_UINT32); - vkCmdDrawIndexed(drawCmdBuffers[i], meshes.tunnel.indexCount, 1, 0, 0, 0); + vkCmdDrawIndexed(drawCmdBuffers[i], models.tunnel.indexCount, 1, 0, 0, 0); vkCmdEndRenderPass(drawCmdBuffers[i]); @@ -426,7 +428,7 @@ public: void loadAssets() { - loadMesh(getAssetPath() + "models/tunnel_cylinder.dae", &meshes.tunnel, vertexLayout, 1.0f); + models.tunnel.loadFromFile(getAssetPath() + "models/tunnel_cylinder.dae", vertexLayout, 1.0f, vulkanDevice, queue); loadTexture(getAssetPath() + "textures/metalplate_nomips_rgba.ktx", VK_FORMAT_R8G8B8A8_UNORM, false); } @@ -437,7 +439,7 @@ public: vertices.bindingDescriptions[0] = vkTools::initializers::vertexInputBindingDescription( VERTEX_BUFFER_BIND_ID, - vkMeshLoader::vertexSize(vertexLayout), + vertexLayout.stride(), VK_VERTEX_INPUT_RATE_VERTEX); // Attribute descriptions diff --git a/texturesparseresidency/texturesparseresidency.cpp b/texturesparseresidency/texturesparseresidency.cpp index 1c532ee8..4018561e 100644 --- a/texturesparseresidency/texturesparseresidency.cpp +++ b/texturesparseresidency/texturesparseresidency.cpp @@ -44,12 +44,6 @@ struct Vertex { float normal[3]; float uv[2]; }; -std::vector vertexLayout = -{ - vkMeshLoader::VERTEX_LAYOUT_POSITION, - vkMeshLoader::VERTEX_LAYOUT_NORMAL, - vkMeshLoader::VERTEX_LAYOUT_UV, -}; // Virtual texture page as a part of the partially resident texture // Contains memory bindings, offsets and status information diff --git a/vulkanExamples.sln b/vulkanExamples.sln index 700a3f73..43d5275c 100644 --- a/vulkanExamples.sln +++ b/vulkanExamples.sln @@ -89,9 +89,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Base", "Base", "{09B9A54B-F base\vulkanframebuffer.hpp = base\vulkanframebuffer.hpp base\vulkanheightmap.hpp = base\vulkanheightmap.hpp base\VulkanInitializers.hpp = base\VulkanInitializers.hpp - base\vulkanMeshLoader.hpp = base\vulkanMeshLoader.hpp base\VulkanModel.hpp = base\VulkanModel.hpp - base\vulkanscene.hpp = base\vulkanscene.hpp base\vulkanswapchain.hpp = base\vulkanswapchain.hpp base\vulkantextoverlay.hpp = base\vulkantextoverlay.hpp base\VulkanTexture.hpp = base\VulkanTexture.hpp