public ILayerMasked GetCachedZoomedHeightmap()
        {
            if (HeightmapLayer == null)
            {
                return(null);
            }
            if (Zoom == 1)
            {
                return(HeightmapLayer);
            }
            if (Zoom == _lastZoom && _cachedZoomedLayer != null && _version == HeightmapVersion)
            {
                return(_cachedZoomedLayer);
            }
            _lastZoom = Zoom;
            _version  = HeightmapVersion;
            Layer2DObject l = new Layer2DObject(GetRecalculatedSize());

            float xScale = (float)HeightmapLayer.Resolution.X / l.Resolution.X;
            float yScale = (float)HeightmapLayer.Resolution.Y / l.Resolution.Y;

            for (int y = 0; y < l.Resolution.Y; y++)
            {
                for (int x = 0; x < l.Resolution.X; x++)
                {
                    var oldX = (int)(x * xScale);
                    var oldY = (int)(y * yScale);
                    l[x, y] = HeightmapLayer[oldX, oldY];
                }
            }
            _cachedZoomedLayer = l;
            return(l);
        }
Esempio n. 2
0
        public ILayerMasked Blur(ILayerMasked l, int fadeSize)
        {
            var m = new Layer2DObject(l.Resolution);

            blur.Process(l, m, fadeSize);
            return(m);
        }
Esempio n. 3
0
        public void PaintLayerOnLayerMasked(ILayerMasked valueLayer, ILayerMasked maskedLayer, ILayerMasked returnLayer)
        {
            if (valueLayer.Resolution != maskedLayer.Resolution || maskedLayer.Resolution != returnLayer.Resolution)
            {
                throw new ArgumentException(error_sizeDoesNotMatch);
            }
            if (maskedLayer.Mask == null || maskedLayer.Mask.Resolution != maskedLayer.Resolution)
            {
                throw new ArgumentException();
            }

            for (int y = maskedLayer.ValueArea.Top; y < valueLayer.ValueArea.Bottom; y++)
            {
                for (int x = maskedLayer.ValueArea.Left; x < valueLayer.ValueArea.Right; x++)
                {
                    var source = maskedLayer[x, y];
                    var alpha  = maskedLayer.Mask[x, y];

                    if (source.HasValue && alpha.HasValue && alpha.Value > thres)
                    {
                        var target = valueLayer[x, y];
                        if (target.HasValue)
                        {
                            returnLayer[x, y] = ab.Blend(target.Value, source.Value, alpha.Value);
                        }
                        else
                        {
                            returnLayer[x, y] = source.Value;
                        }
                    }
                }
            }
        }
Esempio n. 4
0
        private ILayerMasked merge(IBlendModeAlpha ablend, ILayerMasked baseLayer, IList <DescribedLayer> pars)
        {
            onMergeStarted();
            if (pars == null || pars.Count == 0)
            {
                throw new ArgumentException();
            }

            var final = baseLayer;

            foreach (var describ in pars)
            {
                var current   = describ.Layer;
                var blendMode = describ.GlobalParameters.BlendMode;
                var offset    = describ.GlobalParameters.Offset - .5f;

                var minY = JryMath.Max(0, -current.Offset.Y);
                var minX = JryMath.Max(0, -current.Offset.X);
                var maxY = JryMath.Min(current.Resolution.Y, final.Resolution.Y - current.Offset.Y);
                var maxX = JryMath.Min(current.Resolution.X, final.Resolution.X - current.Offset.X);
                for (int y = minY; y < maxY; y++)
                {
                    for (int x = minX; x < maxX; x++)
                    {
                        int ix = x + current.Offset.X;
                        int iy = y + current.Offset.Y;


                        var curVal = current[x, y];
                        if (!curVal.HasValue || !final[ix, iy].HasValue || !current.HasMask)
                        {
                            continue;
                        }
                        var maskValue = current.Mask[x, y];
                        if (!maskValue.HasValue)
                        {
                            continue;
                        }


                        var currentLayerValue     = curVal.Value + offset;
                        var currentLayerMaskValue = maskValue.Value;
                        //currentLayerMaskValue = 1;
                        var upToThisPointGeneratedLayerValue = final[ix, iy].Value;


                        var blended = blendMode.Blend(upToThisPointGeneratedLayerValue, currentLayerValue * currentLayerMaskValue);
                        final[ix, iy] = ablend.Blend(upToThisPointGeneratedLayerValue, blended, currentLayerMaskValue);
                        if (final[ix, iy] > 0.05f)
                        {
                        }
                    }
                }
            }

            return(baseLayer);
        }
Esempio n. 5
0
 public void PrintToLayer(ILayerMasked layer, IList <IArea> areas, Vector2 translateVector)
 {
     foreach (var area in areas)
     //Parallel.ForEach(areas, (area) =>
     {
         var translatedArea = translateArea(area, translateVector);
         drawAreaToLayer(layer, translatedArea);
     }
     //);
 }
Esempio n. 6
0
 private void doErosion(ILayerMasked final, IErosionDescriptor bs)
 {
     if (bs.HydraulicErosionParams.Strenght <= 0)
     {
         return;
     }
     onErosionStarted();
     bs.HydraulicErosion.Erode(final, bs.HydraulicErosionParams);
     _visualLogger.Log(final, "baseWithEro");
 }
Esempio n. 7
0
 private void generateRIvers(ILayerMasked final, int riverAmount)
 {
     if (riverAmount <= 0)
     {
         return;
     }
     onRiver();
     doRivers(final, riverAmount);
     _visualLogger.Log(final, "baseWithEroAndRivers");
 }
Esempio n. 8
0
        private void drawAreaToLayer(ILayerMasked layer, IArea area)
        {
            var pts = area.Points.ToArray();


            for (int i = 0; i < layer.Resolution.Y; i++)
            {
                for (int j = 0; j < layer.Resolution.X; j++)
                {
                    var coor = new Vector2(j, i);
                    //if (!_geometryUtiltiy.IsInPolygon(pts, coor)) continue;

                    var positiveDistance1 = float.MaxValue;
                    var positiveDistance2 = float.MaxValue;
                    var positiveDistance3 = float.MaxValue;
                    //var negativeDistance = float.MaxValue;
                    foreach (var seg in area.Segments)
                    {
                        var dist = _geometryUtiltiy.DistanceFromPointToSegment(coor, seg);

                        if (dist < positiveDistance1)
                        {
                            positiveDistance3 = positiveDistance2;
                            positiveDistance2 = positiveDistance1;
                            positiveDistance1 = dist;
                        }
                        else if (dist < positiveDistance2)
                        {
                            positiveDistance3 = positiveDistance2;
                            positiveDistance2 = dist;
                        }
                        else if (dist < positiveDistance3)
                        {
                            positiveDistance3 = dist;
                        }
                    }


                    if (positiveDistance1 == float.MaxValue)
                    {
                        positiveDistance1 = 0;
                    }
                    if (positiveDistance2 == float.MaxValue)
                    {
                        positiveDistance2 = 0;
                    }
                    if (positiveDistance3 == float.MaxValue)
                    {
                        positiveDistance3 = 0;
                    }

                    layer[coor] = positiveDistance1 + positiveDistance2 + positiveDistance3;
                }
            }
        }
Esempio n. 9
0
        public void InitializeSource(ILayer l)
        {
            // TODO get rid of this stupid exception
            if (initialized)
            {
                throw new InvalidOperationException("Is already initialized");
            }
            initialized  = true;
            sourceLayer  = l;
            updatedLayer = new Layer2DObject(l.Resolution);

            ResetMask(l.Resolution);
        }
Esempio n. 10
0
        public async Task Compose(IWorld w)
        {
            var param  = w.Parameters;
            var fields = w.Fields;

            var pars = await generateFields(param, fields);

            IErosionDescriptor bs;

            ILayerMasked    baseLayer;
            IBlendModeAlpha ba;

            if (w.UseBase)
            {
                var bsd = _describer.DescribeBaseLayer(param, w.BaseField);
                //baseLayer = await bsd.LayerGlobalParameters.Profile
                baseLayer = await bsd.LayerGlobalParameters.Generator.GenerateLayer();

                //_layerUtils.Normalize(baseLayer);
                //HACK baselayers mask extend it size
                var x = new Layer2DObject(w.Parameters.BitmapResolution);
                _layerUtils.IterateValues(x, (v, val) => x[v] = baseLayer[v]);
                baseLayer = x;

                ba = bsd.AlphaBlend;
                bs = bsd;
            }
            else
            {
                baseLayer      = new Layer2DObject(w.Parameters.BitmapResolution);
                baseLayer.Mask = new Mask(baseLayer.Resolution);
                _layerUtils.IterateValues(baseLayer.Mask, (v, val) => baseLayer[v] = 1);

                setUpDefaulValue(baseLayer);
                bs = new ErosionDescriptor();
                ba = new AlphaBlend();
            }

            bs.HydraulicErosionParams.Strenght = param.ErosionStrength * strengthMultpilier;

            ILayerMasked merged = merge(ba, baseLayer, pars);

            //_layerUtils.FitInto(merged, 0, 1);
            postProcessWholeLayer(merged, bs, w.Parameters.RiverAmount);
            ComposedLayer = merged;
        }
Esempio n. 11
0
        private void doRivers(ILayerMasked layer, int riverAmount)
        {
            onRiver();
            IDrainageSimulator drainageSimulator = new BallDrainageSimulator();
            var drainageMap = drainageSimulator.GetDrainageMap(layer, riverAmount);


            _visualLogger.Log(drainageMap, "drainage");

            _layerUtils.IterateValues(drainageMap,
                                      (cor, val) =>
            {
                if (drainageMap[cor].HasValue)
                {
                    layer[cor] -= drainageMap[cor].Value * .01f;
                }
            }
                                      );
        }
Esempio n. 12
0
        private void drawAreaToLayer(ILayerMasked layer, IArea area)
        {
            var pts    = area.Points.ToArray();
            var bounds = _geometryUtiltiy.GetBoundsForPoints(pts).RestrictOn(layer.Resolution);

            for (int i = bounds.Top; i < bounds.Bottom; i++)
            {
                for (int j = bounds.Left; j < bounds.Right; j++)
                {
                    if (j == 464 && i == 385)
                    {
                    }
                    if (!_geometryUtiltiy.IsInPolygon(pts, j, i))
                    {
                        continue;
                    }
                    var coor = new Vector2(j, i);
                    int indexOfClosestSeg = 0;
                    var distance          = float.MaxValue;

                    for (var k = 0; k < area.Segments.Count; k++)
                    {
                        var seg  = area.Segments[k];
                        var dist = _geometryUtiltiy.DistanceFromPointToSegmentSquare(
                            ref coor, ref seg);

                        if (dist < distance)
                        {
                            distance          = dist;
                            indexOfClosestSeg = k;
                        }
                    }
                    layer[j, i] = _geometryUtiltiy.DistanceFromPointToSegment(coor, area.Segments[indexOfClosestSeg]);
                }
            }
        }
Esempio n. 13
0
        protected void applyOffset(int extendSize, IList <Vector2> points, ILayerMasked layer)
        {
            var bounds = _geoUtils.GetBoundsForPoints(points);

            layer.Offset = new IntVector2(bounds.Left - extendSize, bounds.Top - extendSize);
        }
Esempio n. 14
0
 public DescribedLayer(ILayerGlobalParameters layerGlobalParameters, ILayerMasked layer2DObject) : this()
 {
     this.GlobalParameters = layerGlobalParameters;
     this.Layer            = layer2DObject;
 }
Esempio n. 15
0
 private void postProcessWholeLayer(ILayerMasked final, IErosionDescriptor bs, int riverAmount)
 {
     _visualLogger.Log(final, "baseNoEro");
     doErosion(final, bs);
     generateRIvers(final, riverAmount);
 }
Esempio n. 16
0
 public LayerWithInfluence(ILayerMasked layer, float influence)
 {
     Layer     = layer;
     Influence = influence;
 }
Esempio n. 17
0
 public void InitializeGeneratedObjects(ILayerMasked obj)
 {
     HeightmapLayer = obj;
     _heightmapView.RefreshView();
     HeightmapVersion = 0;
 }