Exemplo n.º 1
0
 public Biome(string id, BiomeTemperature temperature, int minHeight, int maxHeight, Rgba32I grassColor, World world,
              int seed)
 {
     _id          = id;
     _temperature = temperature;
     _minHeight   = minHeight;
     _maxHeight   = maxHeight;
     _grassColor  = grassColor;
     _world       = world;
     _seed        = seed;
 }
Exemplo n.º 2
0
        public bool Load()
        {
            var stopwatch = new Stopwatch();

            stopwatch.Start();
            var regionsFolder = _world.Folder + Path.DirectorySeparatorChar + World2dRegionFolder;

            FolderUtils.CreateRegionFolderIfNotExist(regionsFolder);
            var file = regionsFolder + Path.DirectorySeparatorChar + _position.X + "-" + _position.Y + ".reg";

            if (!File.Exists(file))
            {
                return(false);
            }

            var stream    = new DeflateStream(File.Open(file, FileMode.Open, FileAccess.Read), CompressionMode.Decompress);
            var formatter = new BinaryFormatter();
            var version   = (uint)formatter.Deserialize(stream);

            var grid = _world.WorldGenerator.BiomeGrid;

            for (var x = 0; x < RegionLength; x++)
            {
                for (var z = 0; z < RegionLength; z++)
                {
                    _biomes[x, z]                  = grid.GetBiomeOrDefault((string)formatter.Deserialize(stream));
                    _heights[x, z]                 = (int)formatter.Deserialize(stream);
                    _interpolatedHeights[x, z]     = (int)formatter.Deserialize(stream);
                    _interpolatedGrassColors[x, z] = new Rgba32I(
                        (byte)formatter.Deserialize(stream),
                        (byte)formatter.Deserialize(stream),
                        (byte)formatter.Deserialize(stream),
                        (byte)formatter.Deserialize(stream));

                    var light = new SunlightData(this, new Vector2i(x, z));
                    light.Load(stream, formatter);
                    _sunlightData[x, z] = light;
                }
            }

            stream.Close();

            stopwatch.Stop();
            _world.DelayViewer.AddRegion2dLoad(stopwatch.ElapsedTicks);

            return(true);
        }
Exemplo n.º 3
0
        public Block(BlockStaticData staticData, Chunk chunk, Vector3i position, Rgba32I textureFilter)
        {
            _weakReference = new WeakReference <Block>(this);

            _staticData      = staticData;
            _chunk           = chunk;
            _position        = position;
            _collidableFaces = new bool[6];
            _textureFilter   = textureFilter;
            _neighbours      = new WeakReference <Block> [6];

            _blockLight = new BlockLight();
            var lightSource = staticData.LightSource;

            _blockLightSource = lightSource ? new BlockLightSource(this, staticData.LightSourceLight) : null;
            if (!lightSource)
            {
                return;
            }
            _blockLight.Light  = _blockLightSource.SourceLight;
            _blockLight.Source = _blockLightSource;
        }
Exemplo n.º 4
0
        public override void AddData(int mapperIndex, Block block, int blockLight, int sunlight)
        {
            if (!(block is BlockWater water))
            {
                return;
            }
            var mapper = _mappers[mapperIndex];
            var pos    = BitUtils.IntBitsToFloat(block.Position);
            var filter = block.TextureFilter;
            var index  = BlockWater.TextureIndex;
            var levels = water.VertexWaterLevel;
            var t      = water.HasWaterOnTop;

            var waterLevel = new Rgba32I((byte)(t ? 8 : levels[0]), (byte)(t ? 8 : levels[1]),
                                         (byte)(t ? 8 : levels[2]),
                                         (byte)(t ? 8 : levels[3]));

            mapper.AddTask(new VboMapperTask <Block>(VboMapperTaskType.Add, block,
                                                     new[] {
                pos.X, pos.Y, pos.Z, index,
                filter.ValueF, blockLight / Block.MaxBlockLightF,
                sunlight / Block.MaxBlockLightF, waterLevel.ValueF
            }, 0));
        }
Exemplo n.º 5
0
 public CrossBlock(BlockStaticDataCross staticData, Chunk chunk, Vector3i position, Rgba32I textureFilter)
     : base(staticData, chunk, position, textureFilter)
 {
 }
Exemplo n.º 6
0
        public override BlockSnapshot GetBlockSnapshot(Vector3i position, int columnHeight, Rgba32I grassColor)
        {
            var y = position.Y;

            if (y > columnHeight)
            {
                return(y > 60 ? BlockSnapshotAir.Instance : (BlockSnapshot) new BlockSnapshotWater(8));
            }

            if (y == columnHeight)
            {
                if (y > 59)
                {
                    return(new BlockSnapshotGrass(grassColor));
                }

                return(BlockSnapshotDirt.Instance);
            }

            if (y > columnHeight - 4)
            {
                return(BlockSnapshotDirt.Instance);
            }

            return(BlockSnapshotStone.Instance);
        }
Exemplo n.º 7
0
 public abstract BlockSnapshot GetBlockSnapshot(Vector3i position, int columnHeight, Rgba32I grassColor);
Exemplo n.º 8
0
 public SlabBlock(BlockStaticDataSlab staticData, Chunk chunk, Vector3i position, Rgba32I textureFilter,
                  bool upside)
     : base(staticData, chunk, position, textureFilter)
 {
     _upside       = upside;
     _visibleFaces = 0;
 }
Exemplo n.º 9
0
 public CubicBlock(BlockStaticDataCubic staticData, Chunk chunk, Vector3i position, Rgba32I textureFilter)
     : base(staticData, chunk, position, textureFilter)
 {
     _visibleFaces = 0;
 }
Exemplo n.º 10
0
 public BlockSnapshotOakLeaves(Rgba32I grassColor) : base("default:oak_leaves", BlockStaticDataOakLeaves.Instance)
 {
     _grassColor = grassColor;
 }
Exemplo n.º 11
0
 public MultiTexturedSlabBlock(BlockStaticDataMultiTexturedSlab staticData, Chunk chunk, Vector3i position,
                               Rgba32I textureFilter, bool upside)
     : base(staticData, chunk, position, textureFilter, upside)
 {
 }
Exemplo n.º 12
0
        public override BlockSnapshot GetBlockSnapshot(Vector3i position, int columnHeight, Rgba32I grassColor)
        {
            var y    = position.Y;
            var cave = _caveGenerator.Noise(1, 10, true, position.X, position.Y, position.Z) > 0.5;

            if (cave)
            {
                return(BlockSnapshotAir.Instance);
            }
            if (y > columnHeight)
            {
                return(y > 60 ? BlockSnapshotAir.Instance : (BlockSnapshot) new BlockSnapshotWater(8));
            }

            if (y == columnHeight)
            {
                if (y > 59)
                {
                    if (_random.NextDouble() > 0.9995)
                    {
                        _treeGenerator.TryToGenerate(position + new Vector3i(0, 1, 0), _world);
                    }

                    else if (_random.NextDouble() > 0.96)
                    {
                        _world.UnloadedChunkGenerationManager.AddBlock(position + new Vector3i(0, 1, 0),
                                                                       new BlockSnapshotTallGrass(grassColor), false);
                    }

                    return(new BlockSnapshotGrass(grassColor));
                }

                return(BlockSnapshotDirt.Instance);
            }

            if (y > columnHeight - 4)
            {
                return(BlockSnapshotDirt.Instance);
            }

            return(BlockSnapshotStone.Instance);
        }
Exemplo n.º 13
0
 public MultiTexturedCubicBlock(BlockStaticDataMultiTexturedCubic staticData, Chunk chunk, Vector3i position,
                                Rgba32I textureFilter)
     : base(staticData, chunk, position, textureFilter)
 {
 }
Exemplo n.º 14
0
        public override BlockSnapshot GetBlockSnapshot(Vector3i position, int columnHeight, Rgba32I grassColor)
        {
            var y = position.Y;

            if (y > columnHeight)
            {
                return(y > 60 ? BlockSnapshotAir.Instance : (BlockSnapshot) new BlockSnapshotWater(8));
            }

            if (y == columnHeight)
            {
                if (y > 59)
                {
                    var generateTreeGrass = _treeOctaveGenerator.Noise(100, 100, true,
                                                                       position.X, y, position.Z);
                    if (generateTreeGrass > 0.99)
                    {
                        _treeGenerator.TryToGenerate(position + new Vector3i(0, 1, 0), _world);
                    }

                    else if (generateTreeGrass > 0.5)
                    {
                        _world.UnloadedChunkGenerationManager.AddBlock(position + new Vector3i(0, 1, 0),
                                                                       new BlockSnapshotTallGrass(grassColor), false);
                    }

                    return(new BlockSnapshotGrass(grassColor));
                }

                return(BlockSnapshotDirt.Instance);
            }

            if (y > columnHeight - 4)
            {
                return(BlockSnapshotDirt.Instance);
            }

            return(BlockSnapshotStone.Instance);
        }
Exemplo n.º 15
0
 public BlockSnapshotTallGrass(Rgba32I grassColor) : base("default:tall_grass", BlockStaticDataTallGrass.Instance)
 {
     _grassColor = grassColor;
 }
Exemplo n.º 16
0
        private void Interpolate(World2dRegion[,] regions, Vector2i position, Vector2i local, out int height,
                                 out Rgba32I grassColor)
        {
            const int radius = 5;

            height = 0;
            var gColor = Vector3i.Zero;

            for (var x = -radius; x <= radius; x++)
            {
                for (var z = -radius; z <= radius; z++)
                {
                    var rx            = 1;
                    var rz            = 1;
                    var relative      = position + new Vector2i(x, z);
                    var relativeLocal = local + new Vector2i(x, z);

                    if (relativeLocal.X < 0)
                    {
                        relativeLocal.X += RegionLength;
                        rx--;
                    }
                    else if (relativeLocal.X >= RegionLength)
                    {
                        relativeLocal.X -= RegionLength;
                        rx++;
                    }

                    if (relativeLocal.Y < 0)
                    {
                        relativeLocal.Y += RegionLength;
                        rz--;
                    }
                    else if (relativeLocal.Y >= RegionLength)
                    {
                        relativeLocal.Y -= RegionLength;
                        rz++;
                    }
                    var region = regions[rx, rz];
                    if (region == null)
                    {
                        var biome = _world.WorldGenerator.BiomeGrid.GetBiome(relative);
                        height += biome.GetColumnHeight(relative);
                        var bgColor = biome.GrassColor;
                        gColor += new Vector3i(bgColor.R, bgColor.G, bgColor.B);
                    }
                    else
                    {
                        height += region._heights[relativeLocal.X, relativeLocal.Y];
                        var bgColor = region._biomes[relativeLocal.X, relativeLocal.Y].GrassColor;
                        gColor += new Vector3i(bgColor.R, bgColor.G, bgColor.B);
                    }
                }
            }

            const int d = radius * 2 + 1;

            height    /= d * d;
            gColor    /= d * d;
            grassColor = new Rgba32I((byte)gColor.X, (byte)gColor.Y, (byte)gColor.Z, 255);
        }
Exemplo n.º 17
0
        public override BlockSnapshot GetBlockSnapshot(Vector3i position, int columnHeight, Rgba32I grassColor)
        {
            var y = position.Y;

            if (y > columnHeight)
            {
                return(y > 60 ? BlockSnapshotAir.Instance : (BlockSnapshot) new BlockSnapshotWater(8));
            }

            if (y == columnHeight)
            {
                if (y > 59)
                {
                    var generateTree = _treeOctaveGenerator.Noise(100, 10, true,
                                                                  position.X, y, position.Z) > 0.7;
                    if (generateTree)
                    {
                        _treeGenerator.TryToGenerate(position + new Vector3i(0, 1, 0), _world);
                    }

                    return(new BlockSnapshotGrass(grassColor));
                }

                return(BlockSnapshotDirt.Instance);
            }

            if (y > columnHeight - 4)
            {
                return(BlockSnapshotDirt.Instance);
            }

            return(BlockSnapshotStone.Instance);
        }