diff --git a/modules/asset_loader/include/vkcv/asset/asset_loader.hpp b/modules/asset_loader/include/vkcv/asset/asset_loader.hpp index 0591ef3c974e850d7c0112ec6d370f3b889e8ad5..d1bcea4f090c75eeea994e3a442a592031469db2 100644 --- a/modules/asset_loader/include/vkcv/asset/asset_loader.hpp +++ b/modules/asset_loader/include/vkcv/asset/asset_loader.hpp @@ -137,6 +137,7 @@ typedef struct { * such as Materials. */ typedef struct { std::string name; + std::array<float, 16> modelMatrix; std::vector<int> vertexGroups; } Mesh; diff --git a/modules/asset_loader/src/vkcv/asset/asset_loader.cpp b/modules/asset_loader/src/vkcv/asset/asset_loader.cpp index b7604092c24e61c64a7b5fe2bc6478901e3b799e..48ec170e9c0b12bb2eb15c7ffa2db840ca7cc4e2 100644 --- a/modules/asset_loader/src/vkcv/asset/asset_loader.cpp +++ b/modules/asset_loader/src/vkcv/asset/asset_loader.cpp @@ -71,6 +71,41 @@ enum IndexType getIndexType(const enum fx::gltf::Accessor::ComponentType &t) } } +std::array<float, 16> computeModelMatrix(std::array<float, 3> translation, std::array<float, 3> scale, std::array<float, 4> rotation){ + std::array<float, 16> modelMatrix; + // row 4 + modelMatrix[12] = 0; + modelMatrix[13] = 0; + modelMatrix[14] = 0; + modelMatrix[15] = 1; + // translation + modelMatrix[3] = translation[0]; + modelMatrix[7] = translation[1]; + modelMatrix[11] = translation[2]; + // scale + //modelMatrix[0] = scale[0]; + //modelMatrix[5] = scale[1]; + //modelMatrix[10] = scale[2]; + // rotation and scale + auto a = rotation[0]; + auto q1 = rotation[1]; + auto q2 = rotation[2]; + auto q3 = rotation[3]; + + modelMatrix[0] = (2 * (a * a + q1 * q1) + 1) * scale[0]; + modelMatrix[1] = (2 * (q1 * q2 - a * q3)) * scale[1]; + modelMatrix[2] = (2 * (q1 * q3 + a * q2)) * scale[2]; + + modelMatrix[4] = (2 * (q1 * q2 + a * q3)) * scale[0]; + modelMatrix[5] = (2 * (a * a + q2 * q2) + 1) * scale[1]; + modelMatrix[6] = (2 * (q2 * q3 - a * q1)) * scale[2]; + + modelMatrix[8] = (2 * (q1 * q3 - a * q2)) * scale[0]; + modelMatrix[9] = (2 * (q2 * q3 + a * q1)) * scale[1]; + modelMatrix[10] = (2 * (a * a + q3 * q3) - 1) * scale[2]; + return modelMatrix; +} + int loadMesh(const std::string &path, Mesh &mesh) { fx::gltf::Document object; @@ -200,6 +235,7 @@ int loadMesh(const std::string &path, Mesh &mesh) { std::vector<int> vertexGroupsIndex; + //glm::mat4 modelMatrix = object.nodes[0].matrix; for(int i = 0; i < numVertexGroups; i++){ vertexGroupsIndex.push_back(i); } @@ -207,6 +243,7 @@ int loadMesh(const std::string &path, Mesh &mesh) { mesh = { object.meshes[0].name, + object.nodes[0].matrix, vertexGroupsIndex, }; @@ -391,14 +428,23 @@ int loadScene(const std::string &path, Scene &scene){ vertexGroupsIndex.push_back(groupCount); } + std::array<float, 16> modelMatrix = computeModelMatrix(sceneObjects.nodes[i].translation, sceneObjects.nodes[i].scale, sceneObjects.nodes[i].rotation); mesh = { sceneObjects.meshes[i].name, + modelMatrix, vertexGroupsIndex, }; + /*mesh.name = sceneObjects.meshes[i].name; + mesh.vertexGroups = vertexGroupsIndex;*/ + meshes.push_back(mesh); } + /*for(int m = 0; m < sceneObjects.nodes.size(); m++){ + meshes[sceneObjects.nodes[m].mesh].modelMatrix = sceneObjects.nodes[m].matrix; + }*/ + if (sceneObjects.textures.size() > 0){ textures.reserve(sceneObjects.textures.size()); diff --git a/projects/first_scene/src/main.cpp b/projects/first_scene/src/main.cpp index 93611076869a09d260097728980ef9a31b628aea..b5d67372c8f4adcd2ac76818829dad61194fdf9c 100644 --- a/projects/first_scene/src/main.cpp +++ b/projects/first_scene/src/main.cpp @@ -5,6 +5,19 @@ #include <chrono> #include <vkcv/asset/asset_loader.hpp> +glm::mat4 arrayTo4x4Matrix(std::array<float,16> array){ + glm::mat4 matrix; + int r = 0; + for (int i = 0; i < 4; i++){ + for (int j = 0; j < 4; j++){ + matrix[i][j] = array[r]; + r++; + std::cout << matrix[i][j] << std::endl; + } + } + return matrix; +} + int main(int argc, const char** argv) { const char* applicationName = "First Scene"; @@ -178,6 +191,13 @@ int main(int argc, const char** argv) { drawcalls.push_back(vkcv::DrawcallInfo(renderMesh, {descriptorUsage})); } + std::vector<glm::mat4> modelMatrices; + modelMatrices.clear(); + for(int m = 0; m < scene.meshes.size(); m++){ + modelMatrices.push_back(arrayTo4x4Matrix(scene.meshes[m].modelMatrix)); + } + std::vector<glm::mat4> mvp; + auto start = std::chrono::system_clock::now(); while (window.isWindowOpen()) { vkcv::Window::pollEvents(); @@ -201,11 +221,18 @@ int main(int argc, const char** argv) { auto deltatime = end - start; start = end; cameraManager.getCamera().updateView(std::chrono::duration<double>(deltatime).count()); - const glm::mat4 mvp = cameraManager.getCamera().getProjection() * cameraManager.getCamera().getView(); + const glm::mat4 vp = cameraManager.getCamera().getProjection() * cameraManager.getCamera().getView(); + + mvp.clear(); + for (const auto& m : modelMatrices) { + mvp.push_back(vp * m); + } + + //vkcv::PushConstantData pushConstantData((void*)mainPassMatrices.data(), 2 * sizeof(glm::mat4)); - std::vector<glm::mat4> pushConstantDataVector(drawcalls.size(), mvp); + //std::vector<glm::mat4> pushConstantDataVector(drawcalls.size(), mvp); - vkcv::PushConstantData pushConstantData((void*)pushConstantDataVector.data(), sizeof(glm::mat4)); + vkcv::PushConstantData pushConstantData((void*)mvp.data(), sizeof(glm::mat4)); const std::vector<vkcv::ImageHandle> renderTargets = { swapchainInput, depthBuffer }; auto cmdStream = core.createCommandStream(vkcv::QueueType::Graphics);