Ejemplo n.º 1
0
 public void Subscribe(Vector3Int location, User user, LOD_Mode mode)
 {
     if (Columns.ContainsKey(location))
     {
         Columns[location].Subscribe(user, mode);
     }
 }
Ejemplo n.º 2
0
        public Column CreateColumn(IUser requester, Vector3Int location, LOD_Mode mode)
        {
            if (ChunkLoaded(location))
            {
                return(GetColumn(requester, location, mode));
            }

            if (ChunkExists(location))
            {
                return(LoadColumn(requester, location, mode));
            }

            Column column = new Column(this, RegionDirectory, location);

            column.Init((float)SmoothVoxelSettings.voxelsPerMeter, SmoothVoxelSettings.MeterSizeX, SmoothVoxelSettings.MeterSizeY, SmoothVoxelSettings.MeterSizeZ);
            column.BuildChunk(mode);
            column.Serialize();

            Columns[location] = column;

            //Logger.Log("Column Size: " + column.GeneratedBlocks);
            //Logger.Log("Optimized Size: " + column.surfaceBlocksCount);

            return(column);
        }
Ejemplo n.º 3
0
        public LOD_Mode Deserialize(LOD_Mode load_mode)
        {
            if (!File.Exists(ColumnFile))
            {
                return(LOD_Mode.Empty);
            }

            FileStream   stream = new FileStream(ColumnFile, FileMode.Open, FileAccess.Read, FileShare.Read);
            BinaryReader reader = new BinaryReader(stream, System.Text.Encoding.Default);

            LoadedFromDisk = true;

            Max_Mode     = (LOD_Mode)reader.ReadInt32();
            Current_Mode = (LOD_Mode)Math.Min((int)load_mode, (int)Max_Mode);
            Min          = reader.ReadInt32();
            Max          = reader.ReadInt32();
            ReduceDepth  = reader.ReadBoolean();
            Depth        = reader.ReadSingle();

            // Load heightmap
            byte[] buff = new byte[SurfaceData.Length * 4];
            reader.Read(buff, 0, buff.Length);
            Buffer.BlockCopy(buff, 0, SurfaceData, 0, buff.Length);
            Sampler.SetSurfaceData(SurfaceData);
            SurfaceGenerated = true;

            if (Max_Mode <= LOD_Mode.Heightmap || Current_Mode <= LOD_Mode.Heightmap)
            {
                reader.Close();
                return(LOD_Mode.Heightmap);
            }

            col_data.Allocate(ChunkSizeX, ChunkSizeY, ChunkSizeZ);

            // Load surface blocks
            surfaceBlocksCount = reader.ReadInt32();
            buff = new byte[surfaceBlocksCount * 4];
            reader.Read(buff, 0, buff.Length);
            Buffer.BlockCopy(buff, 0, surfaceBlocks, 0, buff.Length);


            Logger.Log("Deserializing from {0} to {1}.", Min, Max);
            int start  = Get_Flat_Index(0, Math.Max(Min - 1, 0), 0);
            int length = ((Max + 1) - (Min - 1)) * ChunkSizeX * ChunkSizeZ;

            // Load all block types
            reader.Read(blocks_type, start, length);

            // Load all block ISO
            buff = new byte[length * 4];
            reader.Read(buff, 0, buff.Length);
            Buffer.BlockCopy(buff, 0, blocks_iso, start, buff.Length);


            reader.Close();

            FullyLoaded = true;
            return((LOD_Mode)Math.Min((int)Current_Mode, (int)Max_Mode));
        }
Ejemplo n.º 4
0
 public void Subscribe(User user, LOD_Mode new_mode)
 {
     lock (_padLock)
     {
         Mode = (LOD_Mode)Math.Max((int)Mode, (int)new_mode);
         if (!Subscribers.Contains(user))
         {
             Subscribers.Enqueue(user);
         }
     }
 }
Ejemplo n.º 5
0
            public QueueEntry(Vector3Int location, Region region, LOD_Mode mode, User requester, Action <QueueEntry, Column> callback, object meta)
            {
                Column    = location;
                Region    = region;
                Mode      = mode;
                Requester = requester;
                Callback  = callback;
                Meta      = meta;

                Subscribers = new ConcurrentQueue <User>();
                Subscribers.Enqueue(requester);
            }
Ejemplo n.º 6
0
 public Column GetColumn(IUser requester, Vector3Int location, LOD_Mode mode)
 {
     if (ChunkLoaded(location))
     {
         Column col = Columns[location];
         if (col.Max_Mode < mode)
         {
             col = LoadColumn(requester, location, mode);
         }
         return(col);
     }
     return(LoadColumn(requester, location, mode));
 }
Ejemplo n.º 7
0
        public void QueueGeneration(Vector3Int location, Region region, LOD_Mode mode, User requester, Action <QueueEntry, Column> callback, object Meta)
        {
            if (Columns.ContainsKey(location))
            {
                Subscribe(location, requester, mode);
                return;
            }

            QueueEntry ent = new QueueEntry(location, region, mode, requester, callback, Meta);

            Columns[location] = ent;
            genQueue.Enqueue(location);
        }
Ejemplo n.º 8
0
    private void ReceiveChunk_cmd(Data data)
    {
        DebugTimer.Stop();
        SafeDebug.Log(string.Format("Received chunk: {0}, Time: {1}.", data.Buffer.Length, DebugTimer.Elapsed()));
        BinaryReader reader = GetReaderStream(data.Buffer);

        int      locX = reader.ReadInt32();
        int      locY = reader.ReadInt32();
        int      locZ = reader.ReadInt32();
        LOD_Mode mode = (LOD_Mode)reader.ReadByte();



        //ColumnPacket packet = new ColumnPacket();
    }
Ejemplo n.º 9
0
        public Column LoadColumn(IUser requester, Vector3Int location, LOD_Mode mode)
        {
            if (!ChunkExists(location))
            {
                throw new Exception("Column must be created with Region.CreateColumn() before attempting to load chunk.");
            }

            Column column = new Column(this, RegionDirectory, location);

            column.Init((float)SmoothVoxelSettings.voxelsPerMeter, SmoothVoxelSettings.MeterSizeX, SmoothVoxelSettings.MeterSizeY, SmoothVoxelSettings.MeterSizeZ);
            LOD_Mode loaded_mode = column.Deserialize(mode);

            Columns[location] = column;

            return(column);
        }
Ejemplo n.º 10
0
    public void RequestColumn(Vector2Int col, LOD_Mode mode, bool has_heightmap)
    {
        DebugTimer.Start();

        BinaryWriter wrt = GetWriterStream(20);

        wrt.Write(col.x);
        wrt.Write(0);
        wrt.Write(col.y);

        wrt.Write((int)mode);

        wrt.Write(has_heightmap);

        client.Send((byte)ServerCodes.RequestChunk, GetBytes(wrt.BaseStream));
        wrt.Close();
    }
Ejemplo n.º 11
0
        public Column RegenerateColumn(IUser requester, Vector3Int location, LOD_Mode mode)
        {
            if (!ChunkExists(location))
            {
                throw new Exception("Chunk must exist in order to be regenerated.");
            }

            Column column = null;

            if (ChunkLoaded(location))
            {
                column = Columns[location];
            }
            else
            {
                column = LoadColumn(requester, location, mode);
            }

            column.BuildChunk(mode);
            column.Serialize();

            return(column);
        }
Ejemplo n.º 12
0
        public void BuildChunk(LOD_Mode mode = LOD_Mode.Full)
        {
            Logger.Log("BuildChunk - mode: {0}, Current_Mode: {1}, Max_Mode:{2}", mode, Current_Mode, Max_Mode);
            if (mode <= Current_Mode)
            {
                return;
            }

            if (mode > Current_Mode && mode <= Max_Mode)
            {
                Deserialize(mode);
                return;
            }

            // mode must be greater than max
            if (Current_Mode == LOD_Mode.Empty)
            {
                switch (mode)
                {
                case LOD_Mode.Heightmap:
                    updateMode = UpdateMode.EmptyToHeightmap;
                    break;

                case LOD_Mode.ReducedDepth:
                    updateMode = UpdateMode.EmptyToReduced;
                    break;

                case LOD_Mode.Full:
                    updateMode = UpdateMode.HeightmapToFull;
                    break;
                }
            }
            else if (Current_Mode == LOD_Mode.Heightmap)
            {
                switch (mode)
                {
                case LOD_Mode.ReducedDepth:
                    updateMode = UpdateMode.HeightmapToReduced;
                    break;

                case LOD_Mode.Full:
                    updateMode = UpdateMode.HeightmapToFull;
                    break;
                }
            }
            else if (Current_Mode == LOD_Mode.ReducedDepth)
            {
                updateMode = UpdateMode.ReducedToFull;
            }
            else
            {
                return;
            }


            Max_Mode     = mode;
            Current_Mode = mode;



            GenerateHeightMap();

            if (Max_Mode == LOD_Mode.Heightmap)
            {
                return;
            }
            if (Max_Mode == LOD_Mode.ReducedDepth)
            {
                ReduceDepth = true;
            }

            Generate();

            if (Max_Mode == LOD_Mode.Full)
            {
                FullyLoaded = true;
            }
        }
Ejemplo n.º 13
0
 public void RequestChunkGen(Vector3Int chunkCord, Region region, LOD_Mode lod_Version, User requester, bool has_heightmap)
 {
     GenerationQueue.QueueGeneration(chunkCord, region, (LOD_Mode)lod_Version, requester, (queueEntry, column) => {
         Logger.Log("{0} Adding chunk to queue for (Re)generation. LOD Level: {1}.", requester.Name, ((LOD_Mode)lod_Version).ToString());
     }, has_heightmap);
 }