Exemplo n.º 1
0
        public ZoneRatio GetInfluence(Vector2 worldPosition)
        {
            _influenceTime.Start();

            var lookupResult = new float[(int)_zoneMaxType + 1];

            foreach (var zone in _zones)
            {
                if (zone.Type != ZoneType.Empty)
                {
                    var idwSimplestWeighting = IDWSimplestWeighting(zone.Center, worldPosition);
                    lookupResult[(int)zone.Type] += idwSimplestWeighting;
                }
            }

            var result = new ZoneRatio(
                lookupResult.Select((v, i) => new ZoneValue((ZoneType)i, v)).Where(v => v.Value > 0).ToArray(),
                _zoneTypesCount);

            //foreach (var zone in _zones.OrderBy(z => Vector3.SqrMagnitude(z.Center - worldPosition)).Take(10))
            //result[zone.Type] += IDWSimplestWeighting(zone.Center, worldPosition);

            //var result = new ZoneRatio(_zoneMaxType);
            //result.Normalize();

            _influenceTime.Stop();
            _influenceCounter++;

            return(result);
        }
        protected override BlockType GenerateBlock(Vector2i worldPosition, Vector2i turbulence, Vector3 normal, ZoneRatio influence)
        {
            if (Vector3.Angle(Vector3.up, normal) > 65)
                return BlockType.Rock;

            return base.GenerateBlock(worldPosition, turbulence, normal, influence);
        }
Exemplo n.º 3
0
        public ZoneContent Generate()
        {
            var zoneBounds     = _zone.Bounds;
            var zoneInfluences = new ZoneRatio[zoneBounds.Size.X + 1, zoneBounds.Size.Z + 1];
            var zoneHeightmap  = new float[zoneBounds.Size.X + 1, zoneBounds.Size.Z + 1];
            var zoneNormalmap  = new Vector3[zoneBounds.Size.X, zoneBounds.Size.Z];
            var zoneBlocks     = new BlockType[zoneBounds.Size.X, zoneBounds.Size.Z];

            Blocks = _zone.GetBlocks2().ToArray();
            foreach (var blockPos in Blocks)
            {
                var localPos = blockPos - zoneBounds.Min;

                //Build heightmap
                CalculateVertex(blockPos, zoneInfluences, zoneHeightmap);
                CalculateVertex(blockPos + Vector2i.Right, zoneInfluences, zoneHeightmap);
                CalculateVertex(blockPos + Vector2i.Forward, zoneInfluences, zoneHeightmap);
                CalculateVertex(blockPos + Vector2i.One, zoneInfluences, zoneHeightmap);

                zoneNormalmap[localPos.X, localPos.Z] = CalculateNormal(localPos, zoneHeightmap);

                //Build block
                ZoneRatio blockInfluence;

                var turbulenceX = (Mathf.PerlinNoise(blockPos.X * 0.1f, blockPos.Z * 0.1f) - 0.5f) * 10;
                var turbulenceZ = (Mathf.PerlinNoise(blockPos.Z * 0.1f, blockPos.X * 0.1f) - 0.5f) * 10;

                var localTurbulated = localPos + new Vector2i(turbulenceX, turbulenceZ);
                if (localTurbulated.X >= 0 && localTurbulated.X < zoneBounds.Size.X + 1 &&
                    localTurbulated.Z >= 0 && localTurbulated.Z < zoneBounds.Size.Z + 1)
                {
                    if (!zoneInfluences[localTurbulated.X, localTurbulated.Z].IsEmpty)
                    {
                        blockInfluence = zoneInfluences[localTurbulated.X, localTurbulated.Z];
                    }
                    else
                    {
                        var worldTurbulated = blockPos + new Vector2i(turbulenceX, turbulenceZ);
                        blockInfluence =
                            zoneInfluences[localPos.X, localPos.Z] =
                                Land.GetInfluence((Vector2)worldTurbulated);
                    }
                }
                else
                {
                    var worldTurbulated = blockPos + new Vector2i(turbulenceX, turbulenceZ);
                    blockInfluence = Land.GetInfluence((Vector2)worldTurbulated);
                }

                zoneBlocks[localPos.X, localPos.Z] = GenerateBlock(blockPos, new Vector2i(turbulenceX, turbulenceZ),
                                                                   zoneNormalmap[localPos.X, localPos.Z], blockInfluence);
            }

            var props = DecorateZone(zoneInfluences, zoneHeightmap, zoneNormalmap, zoneBlocks);

            return(new ZoneContent(_zone, zoneInfluences, zoneHeightmap, zoneNormalmap, zoneBlocks, props));
        }
        public ZoneContent Generate()
        {
            var zoneBounds = _zone.Bounds;
            var zoneInfluences = new ZoneRatio[zoneBounds.Size.X + 1, zoneBounds.Size.Z + 1];
            var zoneHeightmap = new float[zoneBounds.Size.X + 1, zoneBounds.Size.Z + 1];
            var zoneNormalmap = new Vector3[zoneBounds.Size.X, zoneBounds.Size.Z];
            var zoneBlocks = new BlockType[zoneBounds.Size.X, zoneBounds.Size.Z];

            Blocks = _zone.GetBlocks2().ToArray();
            foreach (var blockPos in Blocks)
            {
                var localPos = blockPos - zoneBounds.Min;

                //Build heightmap
                CalculateVertex(blockPos, zoneInfluences, zoneHeightmap);
                CalculateVertex(blockPos + Vector2i.Right, zoneInfluences, zoneHeightmap);
                CalculateVertex(blockPos + Vector2i.Forward, zoneInfluences, zoneHeightmap);
                CalculateVertex(blockPos + Vector2i.One, zoneInfluences, zoneHeightmap);

                zoneNormalmap[localPos.X, localPos.Z] = CalculateNormal(localPos, zoneHeightmap);

                //Build block
                ZoneRatio blockInfluence;

                var turbulenceX = (Mathf.PerlinNoise(blockPos.X * 0.1f, blockPos.Z * 0.1f) - 0.5f) * 10;
                var turbulenceZ = (Mathf.PerlinNoise(blockPos.Z * 0.1f, blockPos.X * 0.1f) - 0.5f) * 10;

                var localTurbulated = localPos + new Vector2i(turbulenceX, turbulenceZ);
                if (localTurbulated.X >= 0 && localTurbulated.X < zoneBounds.Size.X + 1
                    && localTurbulated.Z >= 0 && localTurbulated.Z < zoneBounds.Size.Z + 1)
                {
                    if (!zoneInfluences[localTurbulated.X, localTurbulated.Z].IsEmpty)
                    {
                        blockInfluence = zoneInfluences[localTurbulated.X, localTurbulated.Z];
                    }
                    else
                    {
                        var worldTurbulated = blockPos + new Vector2i(turbulenceX, turbulenceZ);
                        blockInfluence =
                            zoneInfluences[localPos.X, localPos.Z] =
                                Land.GetInfluence((Vector2)worldTurbulated);}
                }
                else
                {
                    var worldTurbulated = blockPos + new Vector2i(turbulenceX, turbulenceZ);
                    blockInfluence = Land.GetInfluence((Vector2)worldTurbulated);
                }

                zoneBlocks[localPos.X, localPos.Z] = GenerateBlock(blockPos, new Vector2i(turbulenceX, turbulenceZ),
                    zoneNormalmap[localPos.X, localPos.Z], blockInfluence);

            }

            var props = DecorateZone(zoneInfluences, zoneHeightmap, zoneNormalmap, zoneBlocks);

            return new ZoneContent(_zone, zoneInfluences, zoneHeightmap, zoneNormalmap, zoneBlocks, props);
        }
        private Color Lerp(ZoneRatio ratio)
        {
            var result = Color.black;
            for (var i = 0; i < _zoneTypes.Length; i++)
            {
                var zoneType = _zoneTypes[i];
                result += _zoneInfluenceColors[(int)zoneType] * ratio[zoneType];
            }

            return result;
        }
Exemplo n.º 6
0
        private Color Lerp(ZoneRatio ratio)
        {
            var result = Color.black;

            for (var i = 0; i < _zoneTypes.Length; i++)
            {
                var zoneType = _zoneTypes[i];
                result += _zoneInfluenceColors[(int)zoneType] * ratio[zoneType];
            }

            return(result);
        }
        protected override BlockType GenerateBlock(Vector2i worldPosition, Vector2i turbulence, Vector3 normal, ZoneRatio influence)
        {
            var mountInfluence = influence[ZoneType.Mountains];

            if (mountInfluence > 0.85f && Vector3.Angle(Vector3.up, normal) < 45)
                return BlockType.Snow;

            if (mountInfluence < 0.6f && Vector3.Angle(Vector3.up, normal) < 45)
                return BlockType.Grass;

            return base.GenerateBlock(worldPosition, turbulence, normal, influence);
        }
Exemplo n.º 8
0
        public ZoneRatio GetBilinearInterpolationInfluence(Vector2 position, Vector2 min, Vector2 max, ZoneRatio q11, ZoneRatio q12, ZoneRatio q21, ZoneRatio q22)
        {
            _bilinearTime.Start();

            var x = position.x;
            var y = position.y;
            var x1 = min.x;
            var x2 = max.x;
            var y1 = min.y;
            var y2 = max.y;

            var result = (1 / (x2 - x1) * (y2 - y1)) *
                         (q11 * (x2 - x) * (y2 - y) + q21 * (x - x1) * (y2 - y) + q12 * (x2 - x) * (y - y1) + q22 * (x - x1) * (y - y1));
            result.Normalize();

            _bilinearTime.Stop();
            _bilinearCounter++;

            return result;
        }
Exemplo n.º 9
0
        public static IZoneNoiseSettings Lerp(ZoneSettings[] zones, ZoneRatio ratio)
        {
            var outScale1 = 0f;
            var outScale2 = 0f;
            var outScale3 = 0f;
            var height = 0f;

            for (int i = 0; i < zones.Length; i++)
            {
                var zoneNoiseSettings = zones[i];
                var zoneRatio = ratio[zoneNoiseSettings.Type];
                height += zoneNoiseSettings.Height*zoneRatio;
                outScale1 += zoneNoiseSettings.OutScale1*zoneRatio;
                outScale2 += zoneNoiseSettings.OutScale2*zoneRatio;
                outScale3 += zoneNoiseSettings.OutScale3*zoneRatio;
            }

            var result = new ZoneSettings2(Color.black, height, outScale1, outScale2, outScale3);

            return result;
        }
        protected override Vector3[] DecorateZone(ZoneRatio[,] zoneInfluences, float[,] zoneHeightmap, Vector3[,] zoneNormalmap, BlockType[,] zoneBlocks)
        {
            var trees = new List<Vector3>();
            var bounds = _zone.Bounds;
            for (int i = 0; i < 100; i++)
            {
                var position = new Vector3(Random.Range(bounds.Min.X, bounds.Max.X), 0, Random.Range(bounds.Min.Z, bounds.Max.Z));
                var blockPos = (Vector2i) position;
                var localBlockPos = blockPos - bounds.Min;

                //Check zone bounds
                if (bounds.Contains(blockPos) && !zoneInfluences[localBlockPos.X, localBlockPos.Z].IsEmpty
                    && zoneInfluences[localBlockPos.X, localBlockPos.Z][ZoneType.Forest] > 0.5f)
                {
                    //Check slopiness
                    if (Vector3.Angle(Vector3.up, zoneNormalmap[localBlockPos.X, localBlockPos.Z]) < 20)
                        trees.Add(new Vector3(position.x, zoneHeightmap[localBlockPos.X, localBlockPos.Z], position.z));
                }
            }

            return trees.ToArray();
        }
Exemplo n.º 11
0
 public ZoneContent(ZoneLayout zone, ZoneRatio[,] influences, float[,] heightMap, Vector3[,] normalMap, BlockType[,] blocks, Vector3[] objects)
 {
     Zone = zone;
     Influences = influences;
     HeightMap = heightMap;
     NormalMap = normalMap;
     Blocks = blocks;
     Objects = objects;
 }
Exemplo n.º 12
0
        private void CalculateVertex(Vector2i vertPos, ZoneRatio[,] zoneInfluences, float[,] zoneHeightmap)
        {
            var localPos = vertPos - _zone.Bounds.Min;

            if (zoneInfluences[localPos.X, localPos.Z].IsEmpty)
            {
                zoneInfluences[localPos.X, localPos.Z] = Land.GetInfluence((Vector2) vertPos);
                var settings = Land.GetZoneNoiseSettings(zoneInfluences[localPos.X, localPos.Z]);
                var yValue = GenerateBaseHeight(vertPos.X, vertPos.Z, settings);
                zoneHeightmap[localPos.X, localPos.Z] = yValue;
            }
        }
Exemplo n.º 13
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="worldPosition"></param>
 /// <param name="turbulence"></param>
 /// <param name="normal"></param>
 /// <param name="influence"></param>
 /// <returns></returns>
 protected virtual BlockType GenerateBlock(Vector2i worldPosition, Vector2i turbulence, Vector3 normal, ZoneRatio influence)
 {
     var zoneValue = influence[0];
     return _landSettings[zoneValue.Zone].DefaultBlock;
 }
Exemplo n.º 14
0
 protected virtual Vector3[] DecorateZone(ZoneRatio[,] zoneInfluences, float[,] zoneHeightmap, Vector3[,] zoneNormalmap, BlockType[,] zoneBlocks)
 {
     return new Vector3[0];
 }
Exemplo n.º 15
0
 public IZoneNoiseSettings GetZoneNoiseSettings(ZoneRatio influence)
 {
     return ZoneSettings.Lerp(_zoneSettings, influence);
 }
Exemplo n.º 16
0
        public ZoneRatio GetInfluence(Vector2 worldPosition)
        {
            _influenceTime.Start();

            var lookupResult = new float[(int) _zoneMaxType + 1];
            foreach (var zone in _zones)
            {
                if (zone.Type != ZoneType.Empty)
                {
                    var idwSimplestWeighting = IDWSimplestWeighting(zone.Center, worldPosition);
                    lookupResult[(int) zone.Type] += idwSimplestWeighting;
                }
            }

            var result = new ZoneRatio(
                lookupResult.Select((v, i) => new ZoneValue((ZoneType)i, v)).Where(v => v.Value > 0).ToArray(),
                _zoneTypesCount);

            //foreach (var zone in _zones.OrderBy(z => Vector3.SqrMagnitude(z.Center - worldPosition)).Take(10))
            //result[zone.Type] += IDWSimplestWeighting(zone.Center, worldPosition);

            //var result = new ZoneRatio(_zoneMaxType);
            //result.Normalize();

            _influenceTime.Stop();
            _influenceCounter++;

            return result;
        }
Exemplo n.º 17
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="worldPosition"></param>
        /// <param name="turbulence"></param>
        /// <param name="normal"></param>
        /// <param name="influence"></param>
        /// <returns></returns>
        protected virtual BlockType GenerateBlock(Vector2i worldPosition, Vector2i turbulence, Vector3 normal, ZoneRatio influence)
        {
            var zoneValue = influence[0];

            return(_landSettings[zoneValue.Zone].DefaultBlock);
        }
Exemplo n.º 18
0
 public IZoneNoiseSettings GetZoneNoiseSettings(ZoneRatio influence)
 {
     return(ZoneSettings.Lerp(_zoneSettings, influence));
 }
 protected override BlockType GenerateBlock(Vector2i worldPosition, Vector2i turbulence, Vector3 normal, ZoneRatio influence)
 {
     return(GetDiagonalLines(worldPosition));
 }
Exemplo n.º 20
0
        public ZoneRatio GetBilinearInterpolationInfluence(Vector2 position, Vector2 min, Vector2 max, ZoneRatio q11, ZoneRatio q12, ZoneRatio q21, ZoneRatio q22)
        {
            _bilinearTime.Start();

            var x  = position.x;
            var y  = position.y;
            var x1 = min.x;
            var x2 = max.x;
            var y1 = min.y;
            var y2 = max.y;

            var result = (1 / (x2 - x1) * (y2 - y1)) *
                         (q11 * (x2 - x) * (y2 - y) + q21 * (x - x1) * (y2 - y) + q12 * (x2 - x) * (y - y1) + q22 * (x - x1) * (y - y1));

            result.Normalize();

            _bilinearTime.Stop();
            _bilinearCounter++;

            return(result);
        }
 protected override BlockType GenerateBlock(Vector2i worldPosition, Vector2i turbulence, Vector3 normal, ZoneRatio influence)
 {
     return GetDiagonalLines(worldPosition);
 }
Exemplo n.º 22
0
        protected override BlockType GenerateBlock(Vector2i worldPosition, Vector2i turbulence, Vector3 normal, ZoneRatio influence)
        {
            if (Vector3.Angle(Vector3.up, normal) < 5)
            {
                return(BlockType.Water);
            }

            return(base.GenerateBlock(worldPosition, turbulence, normal, influence));
        }
        protected override BlockType GenerateBlock(Vector2i worldPosition, Vector2i turbulence, Vector3 normal, ZoneRatio influence)
        {
            var mountInfluence = influence[ZoneType.Mountains];

            if (mountInfluence > 0.85f && Vector3.Angle(Vector3.up, normal) < 45)
            {
                return(BlockType.Snow);
            }

            if (mountInfluence < 0.6f && Vector3.Angle(Vector3.up, normal) < 45)
            {
                return(BlockType.Grass);
            }

            return(base.GenerateBlock(worldPosition, turbulence, normal, influence));
        }