update materials loader

pull/2/head
InkSoul 2023-05-22 22:52:27 +08:00
parent 077d91916f
commit 7733ba49ee
1 changed files with 49 additions and 18 deletions

View File

@ -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<glm::mat4> 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);
}
}