Ejemplo n.º 1
0
        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());
        }