public xxFace Clone() { xxFace face = new xxFace(); face.VertexIndices = (ushort[])VertexIndices.Clone(); return(face); }
protected List <xxFace> ParseFaceList() { int numFaces = reader.ReadInt32() / 3; List <xxFace> faceList = new List <xxFace>(numFaces); for (int i = 0; i < numFaces; i++) { xxFace face = new xxFace(); faceList.Add(face); face.VertexIndices = reader.ReadUInt16Array(3); } return(faceList); }
public static xxMesh CreateMesh(WorkspaceMesh mesh, int xxFormat, out string[] materialNames, out int[] indices, out bool[] worldCoords, out bool[] replaceSubmeshesOption) { int numUncheckedSubmeshes = 0; foreach (ImportedSubmesh submesh in mesh.SubmeshList) { if (!mesh.isSubmeshEnabled(submesh)) { numUncheckedSubmeshes++; } } int numSubmeshes = mesh.SubmeshList.Count - numUncheckedSubmeshes; materialNames = new string[numSubmeshes]; indices = new int[numSubmeshes]; worldCoords = new bool[numSubmeshes]; replaceSubmeshesOption = new bool[numSubmeshes]; xxMesh xxMesh = new xxMesh(); xxMesh.BoneList = CreateBoneList(mesh.BoneList); xxMesh.SubmeshList = new List <xxSubmesh>(mesh.SubmeshList.Count); for (int i = 0, submeshIdx = 0; i < numSubmeshes; i++, submeshIdx++) { while (!mesh.isSubmeshEnabled(mesh.SubmeshList[submeshIdx])) { submeshIdx++; } xxSubmesh xxSubmesh = new xxSubmesh(); xxMesh.SubmeshList.Add(xxSubmesh); xxSubmesh.MaterialIndex = -1; materialNames[i] = mesh.SubmeshList[submeshIdx].Material; indices[i] = mesh.SubmeshList[submeshIdx].Index; worldCoords[i] = mesh.SubmeshList[submeshIdx].WorldCoords; replaceSubmeshesOption[i] = mesh.isSubmeshReplacingOriginal(mesh.SubmeshList[submeshIdx]); List <ImportedVertex> vertexList = mesh.SubmeshList[submeshIdx].VertexList; List <xxVertex> xxVertexList = new List <xxVertex>(vertexList.Count); for (int j = 0; j < vertexList.Count; j++) { ImportedVertex vert = vertexList[j]; xxVertex xxVertex; if (xxFormat >= 4) { xxVertex = new xxVertexUShort(); CreateUnknown(xxVertex); } else { xxVertex = new xxVertexInt(); } xxVertex.Index = j; xxVertex.Normal = vert.Normal; xxVertex.UV = (float[])vert.UV.Clone(); xxVertex.Weights3 = new float[3] { vert.Weights[0], vert.Weights[1], vert.Weights[2] }; xxVertex.BoneIndices = (byte[])vert.BoneIndices.Clone(); xxVertex.Position = vert.Position; xxVertexList.Add(xxVertex); } xxSubmesh.VertexList = xxVertexList; List <ImportedFace> faceList = mesh.SubmeshList[submeshIdx].FaceList; List <xxFace> xxFaceList = new List <xxFace>(faceList.Count); for (int j = 0; j < faceList.Count; j++) { int[] vertexIndices = faceList[j].VertexIndices; xxFace xxFace = new xxFace(); xxFace.VertexIndices = new ushort[3] { (ushort)vertexIndices[0], (ushort)vertexIndices[1], (ushort)vertexIndices[2] }; xxFaceList.Add(xxFace); } xxSubmesh.FaceList = xxFaceList; } xxMesh.VertexListDuplicate = CreateVertexListDup(xxMesh.SubmeshList); return(xxMesh); }
public static void CalculateNormals(List <Tuple <List <xxFace>, List <xxVertex> > > pairList, float threshold) { if (threshold < 0) { VertexRef[][] vertRefArray = new VertexRef[pairList.Count][]; for (int i = 0; i < pairList.Count; i++) { List <xxVertex> vertList = pairList[i].Item2; vertRefArray[i] = new VertexRef[vertList.Count]; for (int j = 0; j < vertList.Count; j++) { xxVertex vert = vertList[j]; VertexRef vertRef = new VertexRef(); vertRef.vert = vert; vertRef.norm = new Vector3(); vertRefArray[i][j] = vertRef; } } for (int i = 0; i < pairList.Count; i++) { List <xxFace> faceList = pairList[i].Item1; for (int j = 0; j < faceList.Count; j++) { xxFace face = faceList[j]; Vector3 v1 = vertRefArray[i][face.VertexIndices[1]].vert.Position - vertRefArray[i][face.VertexIndices[2]].vert.Position; Vector3 v2 = vertRefArray[i][face.VertexIndices[0]].vert.Position - vertRefArray[i][face.VertexIndices[2]].vert.Position; Vector3 norm = Vector3.Cross(v2, v1); norm.Normalize(); for (int k = 0; k < face.VertexIndices.Length; k++) { vertRefArray[i][face.VertexIndices[k]].norm += norm; } } } for (int i = 0; i < vertRefArray.Length; i++) { for (int j = 0; j < vertRefArray[i].Length; j++) { Vector3 norm = vertRefArray[i][j].norm; norm.Normalize(); vertRefArray[i][j].vert.Normal = norm; } } } else { int vertCount = 0; for (int i = 0; i < pairList.Count; i++) { vertCount += pairList[i].Item2.Count; } VertexRefComparerX vertRefComparerX = new VertexRefComparerX(); List <VertexRef> vertRefListX = new List <VertexRef>(vertCount); VertexRef[][] vertRefArray = new VertexRef[pairList.Count][]; for (int i = 0; i < pairList.Count; i++) { var vertList = pairList[i].Item2; vertRefArray[i] = new VertexRef[vertList.Count]; for (int j = 0; j < vertList.Count; j++) { xxVertex vert = vertList[j]; VertexRef vertRef = new VertexRef(); vertRef.vert = vert; vertRef.norm = new Vector3(); vertRefArray[i][j] = vertRef; vertRefListX.Add(vertRef); } } vertRefListX.Sort(vertRefComparerX); for (int i = 0; i < pairList.Count; i++) { var faceList = pairList[i].Item1; for (int j = 0; j < faceList.Count; j++) { xxFace face = faceList[j]; Vector3 v1 = vertRefArray[i][face.VertexIndices[1]].vert.Position - vertRefArray[i][face.VertexIndices[2]].vert.Position; Vector3 v2 = vertRefArray[i][face.VertexIndices[0]].vert.Position - vertRefArray[i][face.VertexIndices[2]].vert.Position; Vector3 norm = Vector3.Cross(v2, v1); norm.Normalize(); for (int k = 0; k < face.VertexIndices.Length; k++) { vertRefArray[i][face.VertexIndices[k]].norm += norm; } } } float squaredThreshold = threshold * threshold; while (vertRefListX.Count > 0) { VertexRef vertRef = vertRefListX[vertRefListX.Count - 1]; List <VertexRef> dupList = new List <VertexRef>(); List <VertexRef> dupListX = GetAxisDups(vertRef, vertRefListX, 0, threshold, null); foreach (VertexRef dupRef in dupListX) { if (((vertRef.vert.Position.Y - dupRef.vert.Position.Y) <= threshold) && ((vertRef.vert.Position.Z - dupRef.vert.Position.Z) <= threshold) && ((vertRef.vert.Position - dupRef.vert.Position).LengthSquared() <= squaredThreshold)) { dupList.Add(dupRef); } } vertRefListX.RemoveAt(vertRefListX.Count - 1); Vector3 norm = vertRef.norm; foreach (VertexRef dupRef in dupList) { norm += dupRef.norm; vertRefListX.Remove(dupRef); } norm.Normalize(); vertRef.vert.Normal = norm; foreach (VertexRef dupRef in dupList) { dupRef.vert.Normal = norm; vertRefListX.Remove(dupRef); } } } }