update materials loader
							parent
							
								
									077d91916f
								
							
						
					
					
						commit
						7733ba49ee
					
				| 
						 | 
					@ -86,6 +86,26 @@
 | 
				
			||||||
			if (glTFMaterial.values.find("baseColorTexture") != glTFMaterial.values.end()) {
 | 
								if (glTFMaterial.values.find("baseColorTexture") != glTFMaterial.values.end()) {
 | 
				
			||||||
				materials[i].baseColorTextureIndex = glTFMaterial.values["baseColorTexture"].TextureIndex();
 | 
									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())));
 | 
								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)
 | 
							if (inputNode.rotation.size() == 4)
 | 
				
			||||||
		{	//rotation is given by quaternion
 | 
							{	//rotation is given by quaternion
 | 
				
			||||||
			glm::quat q = glm::make_quat(inputNode.rotation.data());
 | 
								glm::quat q = glm::make_quat(inputNode.rotation.data());
 | 
				
			||||||
			node->matrix = glm::mat4(q);
 | 
								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)
 | 
							if (inputNode.matrix.size() == 16)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			node->matrix = glm::make_mat4x4(inputNode.matrix.data());
 | 
								node->matrix = glm::make_mat4x4(inputNode.matrix.data());
 | 
				
			||||||
| 
						 | 
					@ -318,10 +341,11 @@
 | 
				
			||||||
				const float* normalsBuffer = nullptr;
 | 
									const float* normalsBuffer = nullptr;
 | 
				
			||||||
				const float* texcoordsBuffer = nullptr;
 | 
									const float* texcoordsBuffer = nullptr;
 | 
				
			||||||
				const float* tangentsBuffer = nullptr;
 | 
									const float* tangentsBuffer = nullptr;
 | 
				
			||||||
 | 
									size_t vertexCount = 0;
 | 
				
			||||||
				//skin joints
 | 
									//skin joints
 | 
				
			||||||
				const float* jointWeightsBuffer = nullptr;
 | 
									const float* jointWeightsBuffer = nullptr;
 | 
				
			||||||
				const uint16_t * jointIndicesBuffer = nullptr;
 | 
									const uint16_t * jointIndicesBuffer = nullptr;
 | 
				
			||||||
				size_t vertexCount = 0;
 | 
									
 | 
				
			||||||
				bool hasSkin = false;
 | 
									bool hasSkin = false;
 | 
				
			||||||
				//get buffer by index in primmitive.attributes
 | 
									//get buffer by index in primmitive.attributes
 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
| 
						 | 
					@ -556,7 +580,7 @@
 | 
				
			||||||
		std::vector<glm::mat4> nodeMatrics(nodeCount);
 | 
							std::vector<glm::mat4> nodeMatrics(nodeCount);
 | 
				
			||||||
		for (auto& node : nodes)
 | 
							for (auto& node : nodes)
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			updateJoints(node);
 | 
								//updateJoints(node);
 | 
				
			||||||
			updateNodeMatrix(node, nodeMatrics);
 | 
								updateNodeMatrix(node, nodeMatrics);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		buffer.copyTo(nodeMatrics.data(), nodeCount * sizeof(glm::mat4));
 | 
							buffer.copyTo(nodeMatrics.data(), nodeCount * sizeof(glm::mat4));
 | 
				
			||||||
| 
						 | 
					@ -578,21 +602,28 @@
 | 
				
			||||||
				nodeMatrix = currentParent->matrix * nodeMatrix;
 | 
									nodeMatrix = currentParent->matrix * nodeMatrix;
 | 
				
			||||||
				currentParent = currentParent->parent;
 | 
									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) {
 | 
								for (VulkanglTFModel::Primitive& primitive : node.mesh.primitives) {
 | 
				
			||||||
				if (primitive.indexCount > 0) 
 | 
									if (primitive.indexCount > 0) {
 | 
				
			||||||
				{
 | 
					 | 
				
			||||||
					
 | 
					 | 
				
			||||||
					// Get the texture index for this primitive
 | 
										// Get the texture index for this primitive
 | 
				
			||||||
 | 
										if (textures.size() > 0)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
						VulkanglTFModel::Texture texture = textures[materials[primitive.materialIndex].baseColorTextureIndex];
 | 
											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
 | 
											// 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);
 | 
											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);
 | 
										vkCmdDrawIndexed(commandBuffer, primitive.indexCount, 1, primitive.firstIndex, 0, 0);
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue