private static byte[] GetQbFromVoxelData(VoxelData data) { List <byte> bytes = new List <byte>(); bytes.AddRange(System.BitConverter.GetBytes((uint)257)); bytes.AddRange(System.BitConverter.GetBytes((uint)0)); // Always RGBA bytes.AddRange(System.BitConverter.GetBytes((uint)1)); // Always Right Handed bytes.AddRange(System.BitConverter.GetBytes(0)); // Always Not Compressed bytes.AddRange(System.BitConverter.GetBytes((uint)1)); bytes.AddRange(System.BitConverter.GetBytes((uint)data.Voxels.Count)); for (int index = 0; index < data.Voxels.Count; index++) { var voxels = data.Voxels[index]; // Get Size int sizeX = voxels.GetLength(0); int sizeY = voxels.GetLength(1); int sizeZ = voxels.GetLength(2); // Get Position Vector3 size = data.GetModelSize(index); Vector3 pos, rot, scl; data.GetModelTransform(index, out pos, out rot, out scl); int posX = (int)pos.x - (int)size.x / 2; int posY = (int)pos.y - (int)size.y / 2; int posZ = (int)pos.z - (int)size.z / 2; // name bytes.Add(0); // size bytes.AddRange(System.BitConverter.GetBytes(sizeX)); bytes.AddRange(System.BitConverter.GetBytes(sizeY)); bytes.AddRange(System.BitConverter.GetBytes(sizeZ)); // pos bytes.AddRange(System.BitConverter.GetBytes(posX)); bytes.AddRange(System.BitConverter.GetBytes(posY)); bytes.AddRange(System.BitConverter.GetBytes(posZ)); // voxels for (int z = 0; z < sizeZ; z++) { for (int y = 0; y < sizeY; y++) { for (int x = 0; x < sizeX; x++) { int v = voxels[x, y, z]; bytes.AddRange(System.BitConverter.GetBytes( v == 0 ? 0 : ColorToInt(data.GetColorFromPalette(v)) )); } } } } return(bytes.ToArray()); }