public static VArtifactData GetIsoData(string isoName, out ulong guid) { guid = GetGuidFromIsoName(isoName); if (guid == 0) { Debug.LogError("isoName not exist!"); return(null); } if (!isos.ContainsKey(guid)) { LoadIso(GetISONameFullPath(isoName)); } VArtifactData isoData = isos[guid]; return(isoData); }
public static bool LoadIso(string path) { VArtifactData ISO; long tick = System.DateTime.Now.Ticks; try { ISO = new VArtifactData(); string fullpath = path; string filename = Path.GetFileNameWithoutExtension(fullpath); //TextAsset ta = Resources.Load(fullpath,typeof(TextAsset)) as TextAsset; using (FileStream fs = new FileStream(fullpath, FileMode.Open, FileAccess.Read)) { byte[] iso_buffer = new byte[(int)(fs.Length)]; //byte[] iso_buffer = ta.bytes; ulong guid = CRC64.Compute(iso_buffer); fs.Read(iso_buffer, 0, (int)(fs.Length)); fs.Close(); if (ISO.Import(iso_buffer, new VAOption(false))) { isos[guid] = ISO; isoNameId[filename] = guid; Debug.Log("loadIso Time: " + (System.DateTime.Now.Ticks - tick)); return(true); } else { ISO = null; return(false); } } } catch (Exception e) { Debug.LogError("Failed to load file " + path); GameLog.HandleIOException(e, GameLog.EIOFileType.InstallFiles); ISO = null; return(false); } }
public bool CanSee(Vector3 iso_pos) { int x = Mathf.FloorToInt(iso_pos.x); int y = Mathf.FloorToInt(iso_pos.y); int z = Mathf.FloorToInt(iso_pos.z); if (x <= 0 || y <= 0 || z <= 0 || x >= m_HeadInfo.xSize - 1 || y >= m_HeadInfo.ySize - 1 || z >= m_HeadInfo.zSize - 1) { return(true); } if (GetVoxel(VArtifactData.IPosToKey(x + 1, y, z)).Volume < 128) { return(true); } if (GetVoxel(VArtifactData.IPosToKey(x - 1, y, z)).Volume < 128) { return(true); } if (GetVoxel(VArtifactData.IPosToKey(x, y + 1, z)).Volume < 128) { return(true); } if (GetVoxel(VArtifactData.IPosToKey(x, y - 1, z)).Volume < 128) { return(true); } if (GetVoxel(VArtifactData.IPosToKey(x, y, z + 1)).Volume < 128) { return(true); } if (GetVoxel(VArtifactData.IPosToKey(x, y, z - 1)).Volume < 128) { return(true); } return(false); }
public static void GetArtifactUnit(VArtifactTown townData, ArtifactUnit[] artifactUnitArray, System.Random myRand) { int townPosXMin = townData.PosGen.x; int townPosZMin = townData.PosGen.y; int townPosXMax = townData.PosGen.x; int townPosZMax = townData.PosGen.y; int unitIndex = 0; for (int m = 0; m < artifactUnitArray.Count(); m++) { IntVector2 posXZ = VArtifactUtil.GetIntVector2FromStr(artifactUnitArray[m].pos); int unitID; if (artifactUnitArray[m].id.Equals("-1")) { List <int> idList = VArtifactUtil.townArtifactsData.Keys.ToList(); unitID = idList[myRand.Next(idList.Count)]; } else { unitID = VArtifactUtil.RandIntFromStr(artifactUnitArray[m].id, myRand); } //Debug.Log("unitID:" + unitID); Town_artifacts townDataFromDataBase = VArtifactUtil.townArtifactsData[unitID]; string isoName = townDataFromDataBase.isoName; float rot; if (artifactUnitArray[m].rot.Equals("-1")) { //--to do: "type" is not used rot = (float)(myRand.NextDouble() * 360); } else { rot = VArtifactUtil.RandFloatFromStr(artifactUnitArray[m].rot, myRand); } //--to do: get the isoData from id; ulong guid; //townData.isodataList.Add(posXZ,GetIsoData(isoName,out guid)); VArtifactUnit vau = new VArtifactUnit(); VArtifactData isoData = VArtifactUtil.GetIsoData(isoName, out guid); if (isoData == null) { Debug.LogError("unitID:" + unitID + " isoName not found! IsoName: " + isoName); continue; } vau.isoName = isoName; vau.unitIndex = unitIndex++; vau.isoId = unitID; vau.isoGuId = guid; vau.vat = townData; vau.rot = rot; vau.PosCenter = posXZ + townData.PosGen; int xIsoSize = isoData.m_HeadInfo.xSize; int zIsoSize = isoData.m_HeadInfo.zSize; vau.isoStartPos = new IntVector2(posXZ.x - xIsoSize / 2, posXZ.y - zIsoSize / 2) + townData.PosGen; vau.isoEndPos = new IntVector2(posXZ.x + xIsoSize / 2, posXZ.y + zIsoSize / 2) + townData.PosGen; int xSize = townDataFromDataBase.vaSize.x; int zSize = townDataFromDataBase.vaSize.y; vau.PosStart = new IntVector2(posXZ.x - xSize / 2, posXZ.y - zSize / 2) + townData.PosGen; vau.PosEnd = new IntVector2(posXZ.x + xSize / 2, posXZ.y + zSize / 2) + townData.PosGen; vau.level = townData.level; vau.type = townData.type; vau.buildingIdNum = artifactUnitArray[m].buildingIdNum.ToList(); vau.npcIdNum = artifactUnitArray[m].npcIdNum.ToList(); vau.buildingCell = townDataFromDataBase.buildingCell; vau.npcPos = townDataFromDataBase.npcPos; vau.vaSize = townDataFromDataBase.vaSize; vau.towerPos = townDataFromDataBase.towerPos; if (vau.PosStart.x < townPosXMin) { townPosXMin = vau.PosStart.x; } if (vau.PosStart.y < townPosZMin) { townPosZMin = vau.PosStart.y; } if (vau.PosEnd.x > townPosXMax) { townPosXMax = vau.PosEnd.x; } if (vau.PosEnd.y > townPosZMax) { townPosZMax = vau.PosEnd.y; } townData.VAUnits.Add(vau); } townData.PosStart = new IntVector2(townPosXMin, townPosZMin); townData.PosEnd = new IntVector2(townPosXMax, townPosZMax); townData.PosCenter = new IntVector2((townPosXMin + townPosXMax) / 2, (townPosZMin + townPosZMax) / 2); // townData.height = Mathf.CeilToInt(townData.VAUnits[0].worldPos.y + townData.VAUnits[0].vaSize.z); // townData.TransPos = new Vector3(townData.PosCenter.x, townData.height, townData.PosCenter.y); townData.radius = (int)Mathf.Sqrt(Mathf.Pow((townPosXMax - townPosXMin) / 2, 2) + Mathf.Pow((townPosZMax - townPosZMin) / 2, 2)); }
//public static void OutputVoxels(Vector3 worldPos, ulong guid, VArtifactTown newTown) //{ // ISO = isos[guid]; // OutputVoxels(worldPos,newTown); //} //public static void OutputVoxels(Vector3 worldPos, int townId, VArtifactTown newTown) //{ // ulong guid = townIdIso[townId]; // ISO = isos[guid]; // OutputVoxels(worldPos,newTown); //} public static void OutputVoxels(Vector3 worldPos, VArtifactUnit newTown, float rotation = 0) { if (!isos.ContainsKey(newTown.isoGuId)) { LoadIso(GetISONameFullPath(newTown.isoName)); } if (!isos.ContainsKey(newTown.isoGuId)) { Debug.LogError("isoGuId error: " + newTown.isoGuId + "isoName: " + newTown.isoName); return; } VArtifactData isoData = isos[newTown.isoGuId]; //long tick = System.DateTime.Now.Ticks; Quaternion q = new Quaternion(); q.eulerAngles = new Vector3(0, rotation, 0); Vector3 XDir = (q * Vector3.right).normalized; Vector3 YDir = (q * Vector3.up).normalized; Vector3 ZDir = (q * Vector3.forward).normalized; //Vector3 XDir = Vector3.right; //Vector3 YDir = Vector3.up; //Vector3 ZDir = Vector3.forward; Vector3 ofs = new Vector3(isoData.m_HeadInfo.xSize, 0, isoData.m_HeadInfo.zSize) * (-0.5f); Vector3 new_pos = worldPos + q * ofs; foreach (KeyValuePair <int, VCVoxel> kvp in isoData.m_Voxels) { Vector3 lpos = new Vector3(kvp.Key & 0x3ff, kvp.Key >> 20, (kvp.Key >> 10) & 0x3ff); Vector3 wpos = new_pos + lpos.x * XDir + lpos.y * YDir + lpos.z * ZDir; INTVECTOR3 wpos_floor = new INTVECTOR3(Mathf.FloorToInt(wpos.x), Mathf.FloorToInt(wpos.y), Mathf.FloorToInt(wpos.z)); INTVECTOR3 wpos_ceil = new INTVECTOR3(Mathf.CeilToInt(wpos.x), Mathf.CeilToInt(wpos.y), Mathf.CeilToInt(wpos.z)); if (wpos_floor == wpos_ceil) { OutputTownVoxel(wpos_floor.x, wpos_floor.y, wpos_floor.z, kvp.Value, newTown); } else { for (int x = wpos_floor.x; x <= wpos_ceil.x; ++x) { for (int y = wpos_floor.y; y <= wpos_ceil.y; ++y) { for (int z = wpos_floor.z; z <= wpos_ceil.z; ++z) { float deltax = 1 - Mathf.Abs(wpos.x - x); float deltay = 1 - Mathf.Abs(wpos.y - y); float deltaz = 1 - Mathf.Abs(wpos.z - z); float u = deltax * deltay * deltaz; if (u < 0.5f) { u = u / (0.5f + u); } else { u = 0.5f / (1.5f - u); } VCVoxel voxel = kvp.Value; voxel.Volume = (byte)Mathf.CeilToInt(voxel.Volume * u); if (voxel.Volume > 1) { OutputTownVoxel(x, y, z, voxel, newTown); } } } } } } // Debug.LogError("Output Time: " + (System.DateTime.Now.Ticks - tick) + " townCount:" + (++townCount)); }