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