public int QueryMaterialIndex(VAMaterial vcmat) { if (vcmat == null) { return(-1); } // Find the same material for (int i = 0; i < MAT_ARR_CNT; ++i) { if (m_Materials[i] != null && vcmat.m_Guid == m_Materials[i].m_Guid) { return(i); } } return(-1); }
// Query a voxel type for a specified VAMaterial public int QueryVoxelType(VAMaterial vcmat) { if (vcmat == null) { return(-1); } // Find the same material for (int i = 0; i < MAT_ARR_CNT; ++i) { if (m_Materials[i] != null && vcmat.m_Guid == m_Materials[i].m_Guid) { return(i); } } // Find a null position for (int i = 0; i < MAT_ARR_CNT; ++i) { if (m_Materials[i] == null) { return(i); } } // Full, find not used int[] used_count = new int [MAT_ARR_CNT]; for (int i = 0; i < MAT_ARR_CNT; ++i) { used_count[i] = 0; } foreach (KeyValuePair <int, VCVoxel> kvp in m_Voxels) { if (kvp.Value.Type != 0x7f) { int type = kvp.Value.Type & 0x7f; used_count[type]++; } } for (int i = 0; i < MAT_ARR_CNT; ++i) { if (used_count[i] == 0) { return(i); } } // Unfortunately, no material avaliable return(-1); }
public bool Import(byte[] buffer, VAOption options) { if (buffer == null) { return(false); } Reset(options); int min_iso_size = 48; if (buffer.Length < min_iso_size) { return(false); } 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: { // 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 //{ // VAMaterial vcmat = new VAMaterial (); // vcmat.Import(mat_buffer); // VCEAssetMgr.s_TempMaterials.Add(guid, vcmat); // m_Materials[i] = vcmat; //} } // If not for editor, these materials are belong to the iso. else { m_Materials[i] = new VAMaterial(); 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); 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); } }