Example #1
0
        static public CubeArray3D ReSize(CubeArray3D _array, int _newsizeX, int _newsizeY, int _newsizeZ)
        {
            Debug.Assert(_newsizeX != _array.CUBESIZEX || _newsizeY == _array.CUBESIZEY || _newsizeZ == _array.CUBESIZEZ);

            CubeArray3D newCubeArray = new CubeArray3D();

            newCubeArray.SetSize(_newsizeX, _newsizeY, _newsizeZ);

            int middleX = (_array.CUBESIZEX >> 1);
            int middleY = (_array.CUBESIZEY >> 1);
            int middleZ = (_array.CUBESIZEZ >> 1);

            int newmiddleX = (_newsizeX >> 1);
            int newmiddleY = (_newsizeY >> 1);
            int newmiddleZ = (_newsizeZ >> 1);

            SmallCube c;
            int       x, y, z;
            int       x2, y2, z2;

            for (x = 0; x < _array.CUBESIZEX; x++)
            {
                for (z = 0; z < _array.CUBESIZEZ; z++)
                {
                    for (y = 0; y < _array.CUBESIZEY; y++)
                    {
                        x2 = (x - middleX) + newmiddleX;
                        y2 = (y - middleY) + newmiddleY;
                        z2 = (z - middleZ) + newmiddleZ;

                        if (x2 < 0 || y2 < 0 || z2 < 0)
                        {
                            continue;
                        }
                        if (x2 >= _newsizeX || y2 >= _newsizeY || z2 >= _newsizeZ)
                        {
                            continue;
                        }

                        _array.GetCube(x, y, z, out c); //Get Source
                        if (c.byMatL0 != 0)
                        {
                            //Set destination
                            newCubeArray.SetCube(x2, y2, z2, c);
                        }
                    }
                }
            }

            //Return new buffer
            return(newCubeArray);
        }
Example #2
0
        static public void Copy(CubeArray3D _src, CubeArray3D _dst)
        {
            _dst.Clear();
            _dst.SetSize(_src.CUBESIZEX, _src.CUBESIZEY, _src.CUBESIZEZ);

            SmallCube c;
            int       x, y, z;

            for (x = 0; x < _src.CUBESIZEX; x++)
            {
                for (z = 0; z < _src.CUBESIZEZ; z++)
                {
                    for (y = 0; y < _src.CUBESIZEY; y++)
                    {
                        _src.GetCube(x, y, z, out c); //Get Source
                        _dst.SetCube(x, y, z, c);     //Set Destination
                    }
                }
            }
        }
Example #3
0
        public void SetSize(int _sizeX, int _sizeY, int _sizeZ)
        {
            //Check if size have changed
            if (m_array != null && (_sizeX == m_array.CUBESIZEX && _sizeY == m_array.CUBESIZEY && _sizeZ == m_array.CUBESIZEZ))
            {
                return;
            }

            //3D Array
            if (m_array == null)
            {
                m_array = new CubeArray3D();
                m_array.SetSize(_sizeX, _sizeY, _sizeZ);
            }
            else
            {
                m_array = CubeArray3D.ReSize(m_array, _sizeX, _sizeY, _sizeZ);
            }

            //Init
            InitFromNewArray();
        }
Example #4
0
        /// <summary>
        /// Read .VOX File and return a CubeArray3D
        /// </summary>
        /// <param name="_strPath"></param>
        /// <returns></returns>
        //public bool ReadFile(Windows.Storage.Streams.DataReader _br)
        public bool ReadFile(BinaryReader _br)
        {
            //////////////////////////////////////////////////
            //Read Header
            //4 bytes: magic number ('V' 'O' 'X' 'space' )
            //4 bytes: version number (current version is 150 )
            UInt32 signature = _br.ReadUInt32();

            if (signature != 0x20584F56)  //56 4F 58 20
            {
                Debug.WriteLine("Not an MagicaVoxel File format");
                return(false);
            }

            UInt32 version = _br.ReadUInt32();

            if (version < 150)
            {
                Debug.WriteLine("MagicaVoxel version too old");
                return(false);
            }


            // header
            //4 bytes: chunk id
            //4 bytes: size of chunk contents (n)
            //4 bytes: total size of children chunks(m)

            //// chunk content
            //n bytes: chunk contents

            //// children chunks : m bytes
            //{ child chunk 0 }
            //{ child chunk 1 }
            int sizeX, sizeY, sizeZ;

            sizeX = sizeY = sizeZ = 0;
            int numVoxels = 0;
            int offsetX, offsetY, offsetZ;

            offsetX = offsetY = offsetZ = 0;

            SmallCube cube = new SmallCube();

#if ANDROID
            while (_br.BaseStream.IsDataAvailable())
#else
            while (_br.BaseStream.Position < _br.BaseStream.Length)
#endif
            {
                string chunkName           = new string(_br.ReadChars(4));
                UInt32 chunkSize           = _br.ReadUInt32();
                UInt32 chunkTotalChildSize = _br.ReadUInt32();


                if (chunkName == "SIZE")
                {
                    //(4 bytes x 3 : x, y, z )
                    sizeX = _br.ReadInt32();
                    sizeY = _br.ReadInt32();
                    sizeZ = _br.ReadInt32();

                    //Align size to chunk size
                    int sx = sizeX + ((CubeArray3D.CHUNKSIZE - (sizeX % CubeArray3D.CHUNKSIZE)) % CubeArray3D.CHUNKSIZE);
                    int sy = sizeY + ((CubeArray3D.CHUNKSIZE - (sizeY % CubeArray3D.CHUNKSIZE)) % CubeArray3D.CHUNKSIZE);
                    int sz = sizeZ + ((CubeArray3D.CHUNKSIZE - (sizeZ % CubeArray3D.CHUNKSIZE)) % CubeArray3D.CHUNKSIZE);

                    m_carray.SetSize(sx, sz, sy); //Reversed y-z

                    offsetX = (sx - sizeX) >> 1;
                    offsetY = (sz - sizeZ) >> 1; //Reversed y-z
                    offsetZ = (sy - sizeY) >> 1; //Reversed y-z
                }
                else if (chunkName == "XYZI")
                {
                    //(numVoxels : 4 bytes )
                    //(each voxel: 1 byte x 4 : x, y, z, colorIndex ) x numVoxels
                    numVoxels = _br.ReadInt32();
                    while (numVoxels > 0)
                    {
                        byte vx = _br.ReadByte();
                        byte vy = _br.ReadByte();
                        byte vz = _br.ReadByte();
                        byte vi = _br.ReadByte();
                        cube.byMatL0 = vi;
                        m_carray.SetCube(offsetX + vx, offsetY + vz, m_carray.CUBESIZEZ - vy - 1 - offsetZ, cube);  //Reserved y-z

                        numVoxels--;
                    }
                }
                else if (chunkName == "RGBA")
                {
                    //(each pixel: 1 byte x 4 : r, g, b, a ) x 256
                    for (int i = 0; i < 256; i++)
                    {
                        byte r = _br.ReadByte();
                        byte g = _br.ReadByte();
                        byte b = _br.ReadByte();
                        byte a = _br.ReadByte();

                        m_palette[i] = Color.FromNonPremultiplied(r, g, b, a);
                    }
                }
            }

            return(true);
        }