glTFLoader.Schema.Buffer CreateIndicesBuffer(Rhino.Geometry.Collections.MeshFaceList faces, out int indicesCount) { byte[] bytes = GetIndicesBytes(faces, out indicesCount); return(new glTFLoader.Schema.Buffer() { Uri = Constants.TextBufferHeader + Convert.ToBase64String(bytes), ByteLength = bytes.Length, }); }
byte[] GetIndicesBytes(Rhino.Geometry.Collections.MeshFaceList faces, out int indicesCount) { //Preallocate to reduce time spent on allocations List <uint> faceIndices = new List <uint>(faces.Count * 3); foreach (Rhino.Geometry.MeshFace face in faces) { if (face.IsTriangle) { faceIndices.AddRange(new uint[] { (uint)face.A, (uint)face.B, (uint)face.C }); } else { //Triangulate faceIndices.AddRange(new uint[] { (uint)face.A, (uint)face.B, (uint)face.C, (uint)face.A, (uint)face.C, (uint)face.D }); } } IEnumerable <byte> bytesEnumerable = faceIndices.SelectMany(value => BitConverter.GetBytes(value)); indicesCount = faceIndices.Count; return(bytesEnumerable.ToArray()); }