private static List <UltimateVertex> CreateVertices(Mesh mesh, ISBSkeleton Skeleton, MeshObject meshObject, SsbhVertexAccessor vertexAccessor, uint[] vertexIndices) { // Read attribute values. var positions = vertexAccessor.ReadAttribute("Position0", 0, meshObject.VertexCount, meshObject); var normals = vertexAccessor.ReadAttribute("Normal0", 0, meshObject.VertexCount, meshObject); var tangents = vertexAccessor.ReadAttribute("Tangent0", 0, meshObject.VertexCount, meshObject); var map1Values = vertexAccessor.ReadAttribute("map1", 0, meshObject.VertexCount, meshObject); var uvSetValues = vertexAccessor.ReadAttribute("uvSet", 0, meshObject.VertexCount, meshObject); var uvSet1Values = vertexAccessor.ReadAttribute("uvSet1", 0, meshObject.VertexCount, meshObject); var uvSet2Values = vertexAccessor.ReadAttribute("uvSet2", 0, meshObject.VertexCount, meshObject); var bake1Values = vertexAccessor.ReadAttribute("bake1", 0, meshObject.VertexCount, meshObject); var colorSet1Values = vertexAccessor.ReadAttribute("colorSet1", 0, meshObject.VertexCount, meshObject); var colorSet2Values = vertexAccessor.ReadAttribute("colorSet2", 0, meshObject.VertexCount, meshObject); var colorSet21Values = vertexAccessor.ReadAttribute("colorSet21", 0, meshObject.VertexCount, meshObject); var colorSet22Values = vertexAccessor.ReadAttribute("colorSet22", 0, meshObject.VertexCount, meshObject); var colorSet23Values = vertexAccessor.ReadAttribute("colorSet23", 0, meshObject.VertexCount, meshObject); var colorSet3Values = vertexAccessor.ReadAttribute("colorSet3", 0, meshObject.VertexCount, meshObject); var colorSet4Values = vertexAccessor.ReadAttribute("colorSet4", 0, meshObject.VertexCount, meshObject); var colorSet5Values = vertexAccessor.ReadAttribute("colorSet5", 0, meshObject.VertexCount, meshObject); var colorSet6Values = vertexAccessor.ReadAttribute("colorSet6", 0, meshObject.VertexCount, meshObject); var colorSet7Values = vertexAccessor.ReadAttribute("colorSet7", 0, meshObject.VertexCount, meshObject); // Generate bitangents. // TODO: Use vec4 tangents instead. var positionVectors = GetVectors3d(positions); var normalVectors = GetVectors3d(normals); var map1Vectors = GetVectors2d(map1Values); SFGraphics.Utils.TriangleListUtils.CalculateTangentsBitangents(positionVectors, normalVectors, map1Vectors, (int[])(object)vertexIndices, out Vector3[] tangentVectors, out Vector3[] bitangentVectors);
private static List <UltimateVertex> CreateVertices(MESH mesh, ISBSkeleton Skeleton, MeshObject meshObject, SSBHVertexAccessor vertexAccessor, uint[] vertexIndices) { // Read attribute values. var positions = vertexAccessor.ReadAttribute("Position0", 0, meshObject.VertexCount, meshObject); var normals = vertexAccessor.ReadAttribute("Normal0", 0, meshObject.VertexCount, meshObject); var tangents = vertexAccessor.ReadAttribute("Tangent0", 0, meshObject.VertexCount, meshObject); var map1Values = vertexAccessor.ReadAttribute("map1", 0, meshObject.VertexCount, meshObject); var uvSetValues = vertexAccessor.ReadAttribute("uvSet", 0, meshObject.VertexCount, meshObject); var uvSet1Values = vertexAccessor.ReadAttribute("uvSet1", 0, meshObject.VertexCount, meshObject); var bake1Values = vertexAccessor.ReadAttribute("bake1", 0, meshObject.VertexCount, meshObject); var colorSet1Values = vertexAccessor.ReadAttribute("colorSet1", 0, meshObject.VertexCount, meshObject); var colorSet5Values = vertexAccessor.ReadAttribute("colorSet5", 0, meshObject.VertexCount, meshObject); var generatedBitangents = GenerateBitangents(vertexIndices, positions, map1Values); var riggingAccessor = new SSBHRiggingAccessor(mesh); var influences = riggingAccessor.ReadRiggingBuffer(meshObject.Name, (int)meshObject.SubMeshIndex); var indexByBoneName = new Dictionary <string, int>(); if (Skeleton != null) { var Bones = Skeleton.Bones; for (int i = 0; i < Bones.Length; i++) { indexByBoneName.Add(Bones[i].Name, i); } } GetRiggingData(positions, influences, indexByBoneName, out IVec4[] boneIndices, out Vector4[] boneWeights);