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); }
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 } } } }
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(); }
/// <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); }