Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
 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);
                 }
             }
         }
     }
 }
Ejemplo n.º 3
0
        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();
                }
            }
        }
Ejemplo n.º 4
0
        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);
            }
        }
Ejemplo n.º 5
0
        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();
        }