private RenderGeometryCompression CompressVertexBuffer(VertexBufferDefinition vertexBuffer) { Debug.Assert(vertexBuffer.Format == VertexBufferFormat.Rigid); var compression = new RenderGeometryCompression(); var rigidVertices = new List <RigidVertex>(); using (var stream = new MemoryStream(vertexBuffer.Data.Data)) { var vertexStream = VertexStreamFactory.Create(DestCache.Version, stream); for (int i = 0; i < vertexBuffer.Count; i++) { var vertex = vertexStream.ReadRigidVertex(); rigidVertices.Add(vertex); } } var positions = rigidVertices.Select(v => v.Position); var texCoords = rigidVertices.Select(v => v.Texcoord); if (positions != null && positions.Count() > 0) { compression.X.Lower = Math.Min(compression.X.Lower, positions.Min(v => v.I)); compression.Y.Lower = Math.Min(compression.Y.Lower, positions.Min(v => v.J)); compression.Z.Lower = Math.Min(compression.Z.Lower, positions.Min(v => v.K)); compression.X.Upper = Math.Max(compression.X.Upper, positions.Max(v => v.I)); compression.Y.Upper = Math.Max(compression.Y.Upper, positions.Max(v => v.J)); compression.Z.Upper = Math.Max(compression.Z.Upper, positions.Max(v => v.K)); } if (texCoords != null && texCoords.Count() > 0) { compression.U.Lower = Math.Min(compression.U.Lower, texCoords.Min(v => v.I)); compression.V.Lower = Math.Min(compression.V.Lower, texCoords.Min(v => v.J)); compression.U.Upper = Math.Max(compression.U.Upper, texCoords.Max(v => v.I)); compression.V.Upper = Math.Max(compression.V.Upper, texCoords.Max(v => v.J)); } var compressor = new VertexCompressor(compression); using (var outStream = new MemoryStream()) { var outVertexStream = VertexStreamFactory.Create(DestCache.Version, outStream); foreach (var vertex in rigidVertices) { vertex.Position = compressor.CompressPosition(vertex.Position); vertex.Texcoord = compressor.CompressUv(vertex.Texcoord); outVertexStream.WriteRigidVertex(vertex); } vertexBuffer.Data.Data = outStream.ToArray(); } return(compression); }