diff --git a/homework/homework1/homework1.cpp b/homework/homework1/homework1.cpp index f3c7d3b..95b6bd4 100644 --- a/homework/homework1/homework1.cpp +++ b/homework/homework1/homework1.cpp @@ -86,6 +86,26 @@ if (glTFMaterial.values.find("baseColorTexture") != glTFMaterial.values.end()) { materials[i].baseColorTextureIndex = glTFMaterial.values["baseColorTexture"].TextureIndex(); } + if (glTFMaterial.values.find("metallicRoughnessTexture") != glTFMaterial.values.end()) { + materials[i].matalicRoughTextureIndex = glTFMaterial.values["metallicRoughnessTexture"].TextureIndex(); + } + if (glTFMaterial.additionalValues.find("normalTexture") != glTFMaterial.additionalValues.end()) + { + materials[i].normalMapTextureIndex = glTFMaterial.additionalValues["normalTexture"].TextureIndex(); + } + if (glTFMaterial.emissiveTexture.index != -1) + { + materials[i].emissiveTextureIndex = glTFMaterial.emissiveTexture.index; + } + if (glTFMaterial.emissiveFactor.size() == 3) + { + materials[i].materialData.values.emissiveFactor = glm::make_vec3(glTFMaterial.emissiveFactor.data()); + } + + if (glTFMaterial.values.find("baseColorFactor") != glTFMaterial.values.end()) + { + materials[i].materialData.values.baseColorFactor = glm::make_vec4(glTFMaterial.values["baseColorFactor"].ColorFactor().data()); + } } } @@ -280,15 +300,18 @@ { node->matrix =glm::translate(node->matrix,glm::vec3(glm::make_vec3(inputNode.translation.data()))); } - if (inputNode.scale.size() == 3) - { - node->matrix =glm::scale(node->matrix,glm::vec3(glm::make_vec3(inputNode.scale.data()))); - } + if (inputNode.rotation.size() == 4) { //rotation is given by quaternion glm::quat q = glm::make_quat(inputNode.rotation.data()); node->matrix = glm::mat4(q); } + + if (inputNode.scale.size() == 3) + { + node->matrix =glm::scale(node->matrix,glm::vec3(glm::make_vec3(inputNode.scale.data()))); + } + if (inputNode.matrix.size() == 16) { node->matrix = glm::make_mat4x4(inputNode.matrix.data()); @@ -318,10 +341,11 @@ const float* normalsBuffer = nullptr; const float* texcoordsBuffer = nullptr; const float* tangentsBuffer = nullptr; + size_t vertexCount = 0; //skin joints const float* jointWeightsBuffer = nullptr; const uint16_t * jointIndicesBuffer = nullptr; - size_t vertexCount = 0; + bool hasSkin = false; //get buffer by index in primmitive.attributes { @@ -556,7 +580,7 @@ std::vector nodeMatrics(nodeCount); for (auto& node : nodes) { - updateJoints(node); + //updateJoints(node); updateNodeMatrix(node, nodeMatrics); } buffer.copyTo(nodeMatrics.data(), nodeCount * sizeof(glm::mat4)); @@ -578,21 +602,28 @@ nodeMatrix = currentParent->matrix * nodeMatrix; currentParent = currentParent->parent; } - // Pass the final matrix to the vertex shader using push constants - vkCmdPushConstants(commandBuffer, pipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(glm::mat4), &nodeMatrix); - if (skins.size() > 0) - { - vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 1, 1, &skins[node.skin].descriptorSet, 0, nullptr); - } for (VulkanglTFModel::Primitive& primitive : node.mesh.primitives) { - if (primitive.indexCount > 0) - { - + if (primitive.indexCount > 0) { // Get the texture index for this primitive - VulkanglTFModel::Texture texture = textures[materials[primitive.materialIndex].baseColorTextureIndex]; - // Bind the descriptor for the current primitive's texture - vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 2, 1, &images[texture.imageIndex].descriptorSet, 0, nullptr); + if (textures.size() > 0) + { + VulkanglTFModel::Texture texture = textures[materials[primitive.materialIndex].baseColorTextureIndex]; + auto normalMap = textures[materials[primitive.materialIndex].normalMapTextureIndex]; + auto roughMetalMap = textures[materials[primitive.materialIndex].matalicRoughTextureIndex]; + + if (materials[primitive.materialIndex].emissiveTextureIndex >= 0) + { + auto emissiveMap = textures[materials[primitive.materialIndex].emissiveTextureIndex]; + vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 4, 1, &images[emissiveMap.imageIndex].descriptorSet, 0, nullptr); + } + + // Bind the descriptor for the current primitive's texture + vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 1, 1, &images[texture.imageIndex].descriptorSet, 0, nullptr); + vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 2, 1, &images[normalMap.imageIndex].descriptorSet, 0, nullptr); + vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 3, 1, &images[roughMetalMap.imageIndex].descriptorSet, 0, nullptr); + vkCmdBindDescriptorSets(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 5, 1, &materials[primitive.materialIndex].materialData.descriptorSet, 0, nullptr); + } vkCmdDrawIndexed(commandBuffer, primitive.indexCount, 1, primitive.firstIndex, 0, 0); } }