Example #1
0
    // Init iso, destroy first, collections, header are ready.
    public void Init(int version, VCESceneSetting setting, VCIsoOption options)
    {
        // Destroy old data
        Destroy();

        // Init header data
        m_HeadInfo          = new VCIsoHeadData();
        m_HeadInfo.Version  = version;
        m_HeadInfo.Category = setting.m_Category;
        m_HeadInfo.Author   = "";
        m_HeadInfo.Name     = "";
        m_HeadInfo.Desc     = "";
        m_HeadInfo.Remarks  = "<REMARKS />";
        m_HeadInfo.xSize    = setting.m_EditorSize.x;
        m_HeadInfo.ySize    = setting.m_EditorSize.y;
        m_HeadInfo.zSize    = setting.m_EditorSize.z;
        m_HeadInfo.IconTex  = new byte [0];
        m_HeadInfo.EnsureIconTexValid();

        // Allocate material, voxel, component, color.
        m_Materials   = new VCMaterial [MAT_ARR_CNT];
        m_DecalAssets = new VCDecalAsset[DECAL_ARR_CNT];
        m_Voxels      = new Dictionary <int, VCVoxel> ();
        m_Components  = new List <VCComponentData> ();
        m_Colors      = new Dictionary <int, Color32> ();

        // Option
        m_Options = options;
    }
Example #2
0
    //
    // Member functions
    //

    // Reset iso, destroy first, collections are ready.
    public void Reset(VCIsoOption options)
    {
        // Destroy old data
        Destroy();

        // Set default header
        m_HeadInfo         = new VCIsoHeadData();
        m_HeadInfo.Author  = "";
        m_HeadInfo.Name    = "";
        m_HeadInfo.Desc    = "";
        m_HeadInfo.Remarks = "<REMARKS />";
        m_HeadInfo.IconTex = new byte [0];

        // Allocate material, voxel, component, color.
        m_Materials   = new VCMaterial [MAT_ARR_CNT];
        m_DecalAssets = new VCDecalAsset[DECAL_ARR_CNT];
        m_Voxels      = new Dictionary <int, VCVoxel> ();
        m_Components  = new List <VCComponentData> ();
        m_Colors      = new Dictionary <int, Color32> ();

        // Set options
        m_Options = options;
    }
Example #3
0
    public bool Import(byte[] buffer, VCIsoOption options)
    {
        if (buffer == null)
        {
            return(false);
        }
        Reset(options);
        int min_iso_size = 48;

        if (buffer.Length < min_iso_size)
        {
            return(false);
        }

        try
        {
            using (MemoryStream ms_iso = new MemoryStream(buffer))
            {
                BinaryReader r = new BinaryReader(ms_iso);

                // Header
                string check_str = r.ReadString();                      // r, string
                if (check_str != "VCISO")
                {
                    r.Close();
                    return(false);
                }
                int l = 0;
                m_HeadInfo.Version  = r.ReadInt32();                    // r, int
                m_HeadInfo.Category = (EVCCategory)(r.ReadInt32());     // r, int
                string author = "";
                if (m_HeadInfo.Version >= 0x02020000)
                {
                    author = r.ReadString();
                }
                m_HeadInfo.Name = r.ReadString();                       // r, string
                m_HeadInfo.Desc = r.ReadString();                       // r, string
                string remarks = "";
                if (m_HeadInfo.Version >= 0x02020000)
                {
                    remarks = r.ReadString();
                }
                m_HeadInfo.xSize = r.ReadInt32();       // r, int
                m_HeadInfo.ySize = r.ReadInt32();       // r, int
                m_HeadInfo.zSize = r.ReadInt32();       // r, int
                l = r.ReadInt32();                      // r, int
                m_HeadInfo.IconTex = r.ReadBytes(l);    // r, byte[]
                m_HeadInfo.EnsureIconTexValid();

                m_HeadInfo.Author  = "";
                m_HeadInfo.Remarks = "";
                if (m_HeadInfo.Version >= 0x02020000)
                {
                    for (int c = 0; c < author.Length; ++c)
                    {
                        m_HeadInfo.Author += (char)(author[c] ^ (char)(0xAC));
                    }
                    for (int c = 0; c < remarks.Length; ++c)
                    {
                        m_HeadInfo.Remarks += (char)(remarks[c] ^ (char)(0xAC));
                    }
                }

                switch (m_HeadInfo.Version)
                {
                case 0x02000000:
                case 0x02010000:
                case 0x02020000:
                case 0x02020001:
                case 0x02030001:
                {
                    // Counts
                    int mat_cnt = r.ReadInt32();        // r, int
                    int dcl_cnt = 0;
                    if (m_HeadInfo.Version >= 0x02010000)
                    {
                        dcl_cnt = r.ReadInt32();                        // r, int
                    }
                    int com_cnt = r.ReadInt32();                        // r, int
                    int vxl_cnt = r.ReadInt32();                        // r, int
                    int clr_cnt = r.ReadInt32();                        // r, int

                    // Materials
                    for (int i = 0; i < mat_cnt; ++i)
                    {
                        ulong guid = r.ReadUInt64();                            // r, ulong;
                        if (guid != 0)
                        {
                            l = r.ReadInt32();                                  // r, int
                            byte[] mat_buffer = r.ReadBytes(l);                 // r, byte[]

                            // Option
                            // If for editor, find mats in VCEAssetMgr for the iso, or create mats in VCEAssetMgr.
                            if (m_Options.ForEditor)
                            {
                                if (VCEAssetMgr.s_Materials.ContainsKey(guid))
                                {
                                    m_Materials[i] = VCEAssetMgr.s_Materials[guid];
                                }
                                else
                                {
                                    VCMaterial vcmat = new VCMaterial();
                                    vcmat.Import(mat_buffer);
                                    //VCEAssetMgr.s_TempMaterials.Add(guid, vcmat);
                                    VCEAssetMgr.s_TempMaterials[guid] = vcmat;  //log:lz-2016.05.17 直接Add会报错,key可能已存在
                                    m_Materials[i] = vcmat;
                                }
                            }
                            // If not for editor, these materials are belong to the iso.
                            else
                            {
                                m_Materials[i] = new VCMaterial();
                                m_Materials[i].Import(mat_buffer);
                            }
                        }
                    }
                    // Decals
                    for (int i = 0; i < dcl_cnt; ++i)
                    {
                        ulong guid = r.ReadUInt64();                            // r, ulong;
                        if (guid != 0)
                        {
                            l = r.ReadInt32();                                  // r, int
                            byte[] dcl_buffer = r.ReadBytes(l);                 // r, byte[]

                            // Option
                            // If for editor, find decals in VCEAssetMgr for the iso, or create decals in VCEAssetMgr.
                            if (m_Options.ForEditor)
                            {
                                if (VCEAssetMgr.s_Decals.ContainsKey(guid))
                                {
                                    m_DecalAssets[i] = VCEAssetMgr.s_Decals[guid];
                                }
                                else
                                {
                                    VCDecalAsset vcdcl = new VCDecalAsset();
                                    vcdcl.Import(dcl_buffer);
                                    //VCEAssetMgr.s_TempDecals.Add(guid, vcdcl);    //log:lz-2016.05.17 直接Add会报错,key可能已存在
                                    VCEAssetMgr.s_TempDecals[guid] = vcdcl;
                                    m_DecalAssets[i] = vcdcl;
                                }
                            }
                            // If not for editor, these decals are belong to the iso.
                            else
                            {
                                m_DecalAssets[i] = new VCDecalAsset();
                                m_DecalAssets[i].Import(dcl_buffer);
                            }
                        }
                    }

                    // Read compressed data
                    //
                    using (MemoryStream ms_zip = new MemoryStream())
                    {
                        l = r.ReadInt32();                              // r, int
                        ms_zip.Write(r.ReadBytes(l), 0, l);             // r, byte[]	zip, byte[]

                        // Decompress data
                        //
                        using (MemoryStream ms_unzip = new MemoryStream())
                        {
                            ms_zip.Seek((long)(0), SeekOrigin.Begin);
                            IonicZlib.Decompress(ms_zip, ms_unzip);
                            ms_unzip.Seek((long)(0), SeekOrigin.Begin);
                            BinaryReader r_unzip = new BinaryReader(ms_unzip);

                            // Components
                            for (int i = 0; i < com_cnt; ++i)
                            {
                                l = r_unzip.ReadInt32();                                        // unzip, int
                                if (l > 0)
                                {
                                    byte[]          com_buffer = r_unzip.ReadBytes(l);                                  // unzip, byte[]
                                    EVCComponent    com_type   = (EVCComponent)(r_unzip.ReadInt32());                   // unzip, int
                                    VCComponentData cdata      = VCComponentData.Create(com_type, com_buffer);
                                    if (cdata != null)
                                    {
                                        cdata.m_CurrIso = this;
                                        m_Components.Add(cdata);
                                    }
                                }
                            }

                            if (m_HeadInfo.Version >= 0x02020001)
                            {
                                ulong sig = r_unzip.ReadUInt64();
                                if (m_HeadInfo.HeadSignature != sig)
                                {
                                    Debug.LogError("Check sig failed");
                                    return(false);
                                }
                            }

                            // Voxels
                            for (int i = 0; i < vxl_cnt; ++i)
                            {
                                int    key = r_unzip.ReadInt32();                               // unzip, int
                                ushort val = r_unzip.ReadUInt16();                              // unzip, ushort
                                m_Voxels[key] = (VCVoxel)(val);
                            }

                            // Colors
                            for (int i = 0; i < clr_cnt; ++i)
                            {
                                int     key = r_unzip.ReadInt32();                              // unzip, int
                                Color32 val;
                                val.r = r_unzip.ReadByte();                                     // unzip, byte
                                val.g = r_unzip.ReadByte();                                     // unzip, byte
                                val.b = r_unzip.ReadByte();                                     // unzip, byte
                                val.a = r_unzip.ReadByte();                                     // unzip, byte
                                m_Colors.Add(key, val);
                            }
                            r_unzip.Close();
                        }
                    }
                    break;
                }

                default: return(false);
                }
                r.Close();
                return(true);
            }
        }
        catch (Exception e)
        {
            Debug.LogError("Importing ISO Failed :" + e.ToString());
            return(false);
        }
    }