public bool SaveData() { bool cancelled = false; using (var writer = new OCDataWriter(GetOCDataFilePath())) { writer.BeginBlock(); WriteNeighborMaxGameObjId(writer); writer.Write(_maxGameObjectIDCount); writer.Write(volumelList.Count); for (int i = 0; i < volumelList.Count; ++i) { if (Util.Progress("保存PVS数据", String.Format("Volume {0}/{1} ...", i + 1, volumelList.Count), ((float)i + 1) / volumelList.Count)) { cancelled = true; break; } var volume = volumelList[i]; volume.Save(writer); } writer.EndBlock(); //BakeStat.CompressRatio = writer.CompressRatio; return(!cancelled); } }
private void WriteNeighborMaxGameObjId(OCDataWriter writer) { //write max game object id count of neighbor scenes if (Owner == null) { writer.Write(0); } else { int tileDimension = Owner.TileDimension; writer.Write(tileDimension); for (int x = 0; x < tileDimension; ++x) { for (int y = 0; y < tileDimension; ++y) { var tile = Owner.ExistTile(new Index(x, y)); if (tile == null) { writer.Write(0); } else { writer.Write(((SingleScene)tile).MaxGameObjectIDCount); } } } } }
private void MergeOCData(byte[, ][] ocDatas) { var filePath = GetOCDataFilePath(); Load(); try { Debug.LogFormat("Merge OC Data for MultiScene Name Pattern {0}", NamePattern); using (var writer = new OCDataWriter(filePath, _tileDimension, _maxIDs)) { for (int x = 0; x < _tileDimension; ++x) { for (int y = 0; y < _tileDimension; ++y) { if (!Config.IsBatchMode) { Progress("合并OC数据", String.Format("处理OC数据{0}/{1}", x * _tileDimension + y, _tileDimension * _tileDimension), ((float)x * _tileDimension + y) / _tileDimension * _tileDimension); } var data = ocDatas[x, y]; var ocDataBlock = OCDataBlock.Empty; if (data != null) { var reader = new OCDataReader(data); ocDataBlock = reader.GetDataBlock(0); } writer.FillOCDataBlock(x * _tileDimension + y, data, ocDataBlock.Offset, ocDataBlock.Length); } } } } catch (Exception e) { Debug.LogException(e); throw; } finally { if (!Config.IsBatchMode) { EditorUtility.ClearProgressBar(); } } }
public void Save(OCDataWriter writer) { writer.Write(cellSize); writer.Write(aabb); writer.Write(cellList.Count); //foreach (var cell in cellList) //{ // cell.Save(writer); // } for (int i = cellList.Count - 1; i >= 0; i--) { var cell = cellList[i]; cell.Save(writer); //cellList.Remove(cell); } }
public void Save(OCDataWriter writer) { writer.Write(aabb.center); //OCProfiler.Start(); if (owner.owner.Owner == null) { var flag = new BitArray(owner.owner.MaxGameObjectIDCount); flag.SetAll(false); visFlagDic.Add(new Index(0, 0), flag); } else { //var mainFlag = new BitArray(0); //mainFlag.SetAll(false); //visFlagDic.Add(Index.InValidIndex, mainFlag); Index currentIndex = owner.owner.TileIndex; for (int i = -1; i < 2; i++) { for (int j = -1; j < 2; j++) { Index newIndex = new Index(i, j) + currentIndex; if (owner.owner.Owner.IsValidIndex(newIndex)) { var multiScene = owner.owner.Owner as MultiScene; if (multiScene.tileMap.Count > 9) { Debug.LogError("batch mode tile count=" + multiScene.tileMap.Count); } var scene = multiScene.ExistTile(newIndex) as SingleScene; if (scene != null) { var flag = new BitArray(scene.MaxGameObjectIDCount); flag.SetAll(false); visFlagDic.Add(new Index(i, j), flag); } else { Debug.LogError("batch mode Cell::SaveData error!"); } } } } } foreach (var obj in visibleModelList) { SingleScene scene = obj.Owner; if (scene.Owner != null) { if (scene.Owner.IsValidIndex(scene.TileIndex)) { int deltaX = scene.TileIndex.x - owner.owner.TileIndex.x; int deltaY = scene.TileIndex.y - owner.owner.TileIndex.y; visFlagDic[new Index(deltaX, deltaY)].Set(obj.GUID, true); } else { //main scene //visFlagDic[Index.InValidIndex].Set(obj.GUID, true); } } else { visFlagDic[new Index(0, 0)].Set(obj.GUID, true); } } //var cellSaveInitTime = OCProfiler.Stop(); foreach (var bitArray in visFlagDic) { writer.Write(OC.Util.ConvertBitArray(bitArray.Value)); } writer.Write(children.Count); foreach (var child in children) { writer.Write(child.aabb.center); } Clear(); }