/// <summary> /// Finds the convex hull and creates the TFace objects. /// </summary> /// <typeparam name="TVertex"></typeparam> /// <typeparam name="TFace"></typeparam> /// <returns></returns> private IEnumerable <TFace> GetConvexFacesInternal <TVertex, TFace>() where TFace : ConvexFace <TVertex, TFace>, new() where TVertex : IVertex { if (!Computed) { GetConvexHullInternal <TVertex>(true); } var faces = ConvexFaces; int cellCount = faces.Count; var cells = new TFace[cellCount]; for (int i = 0; i < cellCount; i++) { var face = faces[i]; var vertices = new TVertex[Dimension]; for (int j = 0; j < Dimension; j++) { vertices[j] = (TVertex)face.Vertices[j].Vertex; } cells[i] = new TFace { Vertices = vertices, Adjacency = new TFace[Dimension], Normal = face.Normal }; face.Tag = i; } for (int i = 0; i < cellCount; i++) { var face = faces[i]; var cell = cells[i]; for (int j = 0; j < Dimension; j++) { if (face.AdjacentFaces[j] == null) { continue; } cell.Adjacency[j] = cells[face.AdjacentFaces[j].Tag]; } // Fix the vertex orientation. if (face.IsNormalFlipped) { var tempVert = cell.Vertices[0]; cell.Vertices[0] = cell.Vertices[Dimension - 1]; cell.Vertices[Dimension - 1] = tempVert; var tempAdj = cell.Adjacency[0]; cell.Adjacency[0] = cell.Adjacency[Dimension - 1]; cell.Adjacency[Dimension - 1] = tempAdj; } } return(cells); }
/// <summary> /// Finds the convex hull and creates the TFace objects. /// </summary> /// <typeparam name="TFace">The type of the t face.</typeparam> /// <typeparam name="TVertex">The type of the t vertex.</typeparam> /// <returns>TFace[].</returns> private TFace[] GetConvexFaces <TVertex, TFace>() where TFace : ConvexFace <TVertex, TFace>, new() where TVertex : IVertex { var faces = ConvexFaces; var cellCount = faces.Count; var cells = new TFace[cellCount]; for (var i = 0; i < cellCount; i++) { var face = FacePool[faces[i]]; var vertices = new TVertex[NumOfDimensions]; for (var j = 0; j < NumOfDimensions; j++) { vertices[j] = (TVertex)Vertices[face.Vertices[j]]; } cells[i] = new TFace { Vertices = vertices, Adjacency = new TFace[NumOfDimensions], Normal = IsLifted ? null : face.Normal }; face.Tag = i; } for (var i = 0; i < cellCount; i++) { var face = FacePool[faces[i]]; var cell = cells[i]; for (var j = 0; j < NumOfDimensions; j++) { if (face.AdjacentFaces[j] < 0) { continue; } cell.Adjacency[j] = cells[FacePool[face.AdjacentFaces[j]].Tag]; } // Fix the vertex orientation. if (face.IsNormalFlipped) { var tempVert = cell.Vertices[0]; cell.Vertices[0] = cell.Vertices[NumOfDimensions - 1]; cell.Vertices[NumOfDimensions - 1] = tempVert; var tempAdj = cell.Adjacency[0]; cell.Adjacency[0] = cell.Adjacency[NumOfDimensions - 1]; cell.Adjacency[NumOfDimensions - 1] = tempAdj; } } return(cells); }
/// <summary> /// Поиск выпуклой оболочки и создание объекта Face /// </summary> TFace[] GetConvexFaces <TVertex, TFace>() where TFace : ConvexFace <TVertex, TFace>, new() where TVertex : IVertex { var faces = ConvexFaces; int cellCount = faces.Count; var cells = new TFace[cellCount]; for (int i = 0; i < cellCount; i++) { var face = FacePool[faces[i]]; var vertices = new TVertex[Dimension]; for (int j = 0; j < Dimension; j++) { vertices[j] = (TVertex)this.Vertices[face.Vertices[j]]; } cells[i] = new TFace { Vertices = vertices, Adjacency = new TFace[Dimension], Normal = IsLifted ? null : face.Normal }; face.Tag = i; } for (int i = 0; i < cellCount; i++) { var face = FacePool[faces[i]]; var cell = cells[i]; for (int j = 0; j < Dimension; j++) { if (face.AdjacentFaces[j] < 0) { continue; } cell.Adjacency[j] = cells[FacePool[face.AdjacentFaces[j]].Tag]; } // Закрепление ориентации вершин if (face.IsNormalFlipped) { var tempVert = cell.Vertices[0]; cell.Vertices[0] = cell.Vertices[Dimension - 1]; cell.Vertices[Dimension - 1] = tempVert; var tempAdj = cell.Adjacency[0]; cell.Adjacency[0] = cell.Adjacency[Dimension - 1]; cell.Adjacency[Dimension - 1] = tempAdj; } } return(cells); }
public override void Read(BinaryReader r) { base.Read(r); NumIntFaces = DataSize / 6; // This is an array of TFaces, which are 3 uint16. Faces = new TFace[NumIntFaces]; for (var i = 0; i < NumIntFaces; i++) { Faces[i].i0 = r.ReadUInt16(); Faces[i].i1 = r.ReadUInt16(); Faces[i].i2 = r.ReadUInt16(); } var skin = GetSkinningInfo(); skin.IntFaces = Faces.ToList(); }
public override void Read(BinaryReader b) { base.Read(b); NumIntFaces = this.DataSize / 6; // This is an array of TFaces, which are 3 uint16. Faces = new TFace[NumIntFaces]; for (int i = 0; i < NumIntFaces; i++) { Faces[i].i0 = b.ReadUInt16(); Faces[i].i1 = b.ReadUInt16(); Faces[i].i2 = b.ReadUInt16(); } SkinningInfo skin = GetSkinningInfo(); skin.IntFaces = Faces.ToList(); }
private TFace[] GetConvexFaces <TVertex, TFace>() where TVertex : IVertex where TFace : ConvexFace <TVertex, TFace>, new() { IndexBuffer convexFaces = ConvexFaces; int count = ((SimpleList <int>)convexFaces).Count; TFace[] array = new TFace[count]; for (int i = 0; i < count; i++) { ConvexFaceInternal convexFaceInternal = FacePool[((SimpleList <int>)convexFaces)[i]]; TVertex[] array2 = new TVertex[NumOfDimensions]; for (int j = 0; j < NumOfDimensions; j++) { array2[j] = (TVertex)Vertices[convexFaceInternal.Vertices[j]]; } TFace[] array3 = array; int num = i; TFace val = new TFace(); ((ConvexFace <TVertex, TFace>)val).Vertices = array2; ((ConvexFace <TVertex, TFace>)val).Adjacency = new TFace[NumOfDimensions]; ((ConvexFace <TVertex, TFace>)val).Normal = ((!IsLifted) ? convexFaceInternal.Normal : null); array3[num] = val; convexFaceInternal.Tag = i; } for (int k = 0; k < count; k++) { ConvexFaceInternal convexFaceInternal2 = FacePool[((SimpleList <int>)convexFaces)[k]]; TFace val2 = array[k]; for (int l = 0; l < NumOfDimensions; l++) { if (convexFaceInternal2.AdjacentFaces[l] >= 0) { ((ConvexFace <TVertex, TFace>)val2).Adjacency[l] = array[FacePool[convexFaceInternal2.AdjacentFaces[l]].Tag]; } } if (convexFaceInternal2.IsNormalFlipped) { TVertex val3 = ((ConvexFace <TVertex, TFace>)val2).Vertices[0]; ((ConvexFace <TVertex, TFace>)val2).Vertices[0] = ((ConvexFace <TVertex, TFace>)val2).Vertices[NumOfDimensions - 1]; ((ConvexFace <TVertex, TFace>)val2).Vertices[NumOfDimensions - 1] = val3; TFace val4 = ((ConvexFace <TVertex, TFace>)val2).Adjacency[0]; ((ConvexFace <TVertex, TFace>)val2).Adjacency[0] = ((ConvexFace <TVertex, TFace>)val2).Adjacency[NumOfDimensions - 1]; ((ConvexFace <TVertex, TFace>)val2).Adjacency[NumOfDimensions - 1] = val4; } } return(array); }
private TFace[] GetConvexFaces <TVertex, TFace>() where TVertex : IVertex where TFace : ConvexFace <TVertex, TFace>, new() { IndexBuffer convexFaces = this.ConvexFaces; int count = convexFaces.Count; TFace[] localArray = new TFace[count]; int index = 0; while (index < count) { ConvexFaceInternal internal2 = this.FacePool[convexFaces[index]]; TVertex[] localArray2 = new TVertex[this.Dimension]; int num3 = 0; while (true) { if (num3 >= this.Dimension) { TFace local = Activator.CreateInstance <TFace>(); local.Vertices = localArray2; local.Adjacency = new TFace[this.Dimension]; local.Normal = !this.IsLifted ? internal2.Normal : null; localArray[index] = local; internal2.Tag = index; index++; break; } localArray2[num3] = (TVertex)this.Vertices[internal2.Vertices[num3]]; num3++; } } int num4 = 0; while (num4 < count) { ConvexFaceInternal internal3 = this.FacePool[convexFaces[num4]]; TFace local2 = localArray[num4]; int num5 = 0; while (true) { if (num5 >= this.Dimension) { if (internal3.IsNormalFlipped) { TVertex local3 = local2.Vertices[0]; local2.Vertices[0] = local2.Vertices[this.Dimension - 1]; local2.Vertices[this.Dimension - 1] = local3; TFace local4 = local2.Adjacency[0]; local2.Adjacency[0] = local2.Adjacency[this.Dimension - 1]; local2.Adjacency[this.Dimension - 1] = local4; } num4++; break; } if (internal3.AdjacentFaces[num5] >= 0) { local2.Adjacency[num5] = localArray[this.FacePool[internal3.AdjacentFaces[num5]].Tag]; } num5++; } } return(localArray); }