private void EndModel() { if (skeletons.Count > 0) { Skeleton skeleton = skeletons[skeletons.Count - 1]; if (skeleton.GetNumBones() > 0) { for (int i = 0; i < skeleton.GetNumBones(); i++) skeleton.GetBone(i).SetToBindingPose(); skeleton.GetBone(0).CalculateBindingRotation(); skeleton.GetBone(0).CalculateBindingTranslation(); for (int i = 0; i < skeleton.GetNumBones(); i++) { skeleton.GetBone(i).StoreBindingPose(); skeleton.GetBone(i).ClearPose(); } skeleton.GetBone(0).UpdateTransform(); } if (hasAnimations) { for (int j = 0; j < animations.Count; j++) { skeletons[0].AddAnimation(animations[j]); } nodes[0].AddController(new AnimationController(skeletons[0])); } } for (int i = 0; i < meshes.Count; i++) { List<Vertex> cVerts = vertices[i]; List<int> cFaces = faces[i]; List<Vector3f> cPos = positions[i]; List<Vector3f> cNorm = normals[i]; List<Vector2f> tc0 = texcoords0[i]; List<Vector2f> tc1 = texcoords1[i]; List<BoneAssign> ba = null; Mesh mesh = meshes[i]; if (boneAssigns.Count > 0) { ba = boneAssigns[i]; } int stride = 3; if (tc1.Count > 0) stride++; for (int j = 0; j < cFaces.Count; j += stride) { Vertex v = new Vertex(cPos[cFaces[j]]); if (cNorm.Count > 0) { mesh.GetAttributes().SetAttribute(VertexAttributes.NORMALS); v.SetNormal(cNorm[cFaces[j + 1]]); } if (tc0.Count > 0) { mesh.GetAttributes().SetAttribute(VertexAttributes.TEXCOORDS0); v.SetTexCoord1(tc0[cFaces[j + 2]]); } if (tc1.Count > 0) { mesh.GetAttributes().SetAttribute(VertexAttributes.TEXCOORDS1); v.SetTexCoord1(tc1[cFaces[j + 3]]); } cVerts.Add(v); } List<int> indexData = new List<int>(); if (skeletons.Count > 0) { mesh.SetSkeleton(skeletons[0]); if (boneAssigns.Count > 0) { for (int j = 0; j < ba.Count; j++) { Vertex v = cVerts[ba[j].GetVertexIndex()]; v.AddBoneIndex(ba[j].GetBoneIndex()); v.AddBoneWeight(ba[j].GetBoneWeight()); } } } mesh.SetVertices(cVerts); if (geoms.Count > 0) { Geometry parent = geoms[i]; Material material = null; if (geomMats.ContainsKey(parent)) material = geomMats[parent]; else material = new Material(); parent.Mesh = mesh; parent.Material = material; } } }
private void LoopThrough(List<int> faces, ref List<Vertex> outVerts) { for (int i = 0; i < faces.Count; i++) { Vertex v = new Vertex(positions[faces[i]], texCoords.Count > 0 ? texCoords[faces[i]] : null, normals.Count > 0 ? normals[faces[i]] : null); if (boneAssigns.ContainsKey(faces[i])) { BoneAssign[] vertBoneAssigns = boneAssigns[faces[i]]; for (int j = 0; j < vertBoneAssigns.Length; j++) { if (vertBoneAssigns[j] != null) { v.AddBoneIndex(vertBoneAssigns[j].GetBoneIndex()); v.AddBoneWeight(vertBoneAssigns[j].GetBoneWeight()); } } } outVerts.Add(v); } }