diff --git a/base/vulkanMeshLoader.hpp b/base/vulkanMeshLoader.hpp index 4be810ba..7dc66bbf 100644 --- a/base/vulkanMeshLoader.hpp +++ b/base/vulkanMeshLoader.hpp @@ -1,5 +1,5 @@ /* -* Simple wrapper for getting an index buffer and vertices out of an assimp mesh +* Mesh loader for creating Vulkan resources from models loaded with ASSIMP * * Copyright (C) 2016 by Sascha Willems - www.saschawillems.de * @@ -64,6 +64,14 @@ namespace vkMeshLoader glm::vec3 dim; }; + // Used to set parameters upon mesh creation + struct MeshCreateInfo + { + glm::vec3 center; + glm::vec3 scale; + glm::vec2 uvscale; + }; + // Get vertex size from vertex layout static uint32_t vertexSize(std::vector layout) { @@ -349,7 +357,7 @@ public: 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(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) @@ -418,11 +426,27 @@ public: VkPhysicalDeviceMemoryProperties deviceMemoryProperties, vkMeshLoader::MeshBuffer *meshBuffer, std::vector layout, - float scale, + vkMeshLoader::MeshCreateInfo *createInfo, bool useStaging, VkCommandBuffer copyCmd, 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++) { @@ -434,9 +458,9 @@ public: // Position if (layoutDetail == vkMeshLoader::VERTEX_LAYOUT_POSITION) { - vertexBuffer.push_back(m_Entries[m].Vertices[i].m_pos.x * scale); - vertexBuffer.push_back(m_Entries[m].Vertices[i].m_pos.y * scale); - vertexBuffer.push_back(m_Entries[m].Vertices[i].m_pos.z * scale); + 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) @@ -448,8 +472,8 @@ public: // Texture coordinates if (layoutDetail == vkMeshLoader::VERTEX_LAYOUT_UV) { - vertexBuffer.push_back(m_Entries[m].Vertices[i].m_tex.s); - vertexBuffer.push_back(m_Entries[m].Vertices[i].m_tex.t); + 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) @@ -634,23 +658,4 @@ public: vkUnmapMemory(device, meshBuffer->indices.mem); } } - - // Create vertex and index buffer with given layout - void createVulkanBuffers( - VkDevice device, - VkPhysicalDeviceMemoryProperties deviceMemoryProperties, - vkMeshLoader::MeshBuffer *meshBuffer, - std::vector layout, - float scale) - { - createBuffers( - device, - deviceMemoryProperties, - meshBuffer, - layout, - scale, - false, - VK_NULL_HANDLE, - VK_NULL_HANDLE); - } }; \ No newline at end of file diff --git a/base/vulkanexamplebase.cpp b/base/vulkanexamplebase.cpp index a84b612b..ae41406a 100644 --- a/base/vulkanexamplebase.cpp +++ b/base/vulkanexamplebase.cpp @@ -362,11 +362,16 @@ VkBool32 VulkanExampleBase::createBuffer(VkBufferUsageFlags usage, VkMemoryPrope } } -void VulkanExampleBase::loadMesh( - std::string filename, - vkMeshLoader::MeshBuffer * meshBuffer, - std::vector vertexLayout, - float scale) +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(); @@ -384,7 +389,7 @@ void VulkanExampleBase::loadMesh( deviceMemoryProperties, meshBuffer, vertexLayout, - scale, + meshCreateInfo, true, copyCmd, queue); @@ -1147,7 +1152,7 @@ void VulkanExampleBase::handleMessages(HWND hWnd, UINT uMsg, WPARAM wParam, LPAR int32_t posy = HIWORD(lParam); rotation.x += (mousePos.y - (float)posy) * 1.25f * rotationSpeed; rotation.y -= (mousePos.x - (float)posx) * 1.25f * rotationSpeed; - camera.rotate(glm::vec3((mousePos.y - (float)posy), -(mousePos.x - (float)posx), 0.0f)); + camera.rotate(glm::vec3((mousePos.y - (float)posy) * camera.rotationSpeed, -(mousePos.x - (float)posx) * camera.rotationSpeed, 0.0f)); mousePos = glm::vec2((float)posx, (float)posy); viewChanged(); } diff --git a/base/vulkanexamplebase.h b/base/vulkanexamplebase.h index d8236a4d..1900c4f0 100644 --- a/base/vulkanexamplebase.h +++ b/base/vulkanexamplebase.h @@ -337,10 +337,16 @@ public: // 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, + 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();