Example #1
0
        private void FillSphere(SphereModel model, PlanetContainer settings)
        {
            var container = settings.Container3D;
            var cc = new ColorContainer(settings.Shema.Layers[0], __NativeGenerator.GetAltRange());
            var len = model.Points.Count;

            for (int i = 0; i < len; i++)
            {
                var p = model.Points[i];
                byte s;
                var alt = __NativeGenerator.GetAlt(p.X, p.Y, p.Z, 100, out s);

                if (alt > 0)
                    p *= (1 + (float)alt * container.LandscapeOver);
                else
                    p *= (1 + (float)alt * container.LandscapeUnder);

                var color = cc.GetColor(alt);

                model.Colors[i] = color;
                model.Points[i] = p;
            }
        }
Example #2
0
        private void FillSphereOptimize(SphereModel model, PlanetContainer settings,
            Dictionary<int, List<RefTriengleOptimize>> triengles)
        {
            var container = settings.Container3D;
            var lastRank = container.RecursionLevel;

            var cc = new ColorContainer(settings.Shema.Layers[0], __NativeGenerator.GetAltRange());
            var optimazeLevel = container.OptimizePecent * 0.01f;
            var lastTriengles = triengles[lastRank];

            foreach (var triengle in lastTriengles)
                triengle.IsOk = true;

            var points = lastTriengles
                .SelectMany(e => e.Points)
                .Distinct();

            foreach (var pointIndex in points)
            {
                var p = model.Points[pointIndex];

                byte s;
                var alt = __NativeGenerator.GetAlt(p.X, p.Y, p.Z, 100, out s);

                if (alt > 0)
                    p *= (1 + (float)alt * container.LandscapeOver);
                else
                    p *= (1 + (float)alt * container.LandscapeUnder);

                var color = cc.GetColor(alt);

                model.Colors[pointIndex] = color;
                model.Points[pointIndex] = p;
            }

            var forProcess = lastTriengles;

            while (forProcess.Count > 0)
            {
                var nextWave = new List<RefTriengleOptimize>();

                foreach (var t in forProcess.Where(e => e.Parent != null && e.Rank > 2))
                {
                    if (t.Optimize(model, optimazeLevel))
                        nextWave.Add(t.Parent);
                }

                forProcess = nextWave;
            }

            var refResult = triengles
                .SelectMany(e => e.Value)
                .Where(e => e.IsOk).ToList();

            foreach (var t in refResult)
                t.FixLines(model);

            model.Triengles = refResult
                .Select(e => e.Triengle)
                .ToList();
        }
        private UBitmap Generate(
            Shema shema,
            AlgorithmType algorithmType,
            CancellationToken token,
            int x,
            int y,
            int w,
            int h,
            int width,
            int height,
            List<double> seeds,
            ProjectionType projection,
            double seaLevel = 0,
            double lng = 0,
            double lat = 0
            )
        {
            __AlgorithmType = algorithmType;

            UColor[,] resultBitmap = null;

            shema.SortByLevel();

            __LayersCount = shema.Layers.Count(l => l.IsEnable);
            __CurrentLayerIndex = 0;

            if (token.IsCancellationRequested)
                return null;

            for (int index = 0; index < shema.Layers.Count; index++)
            {
                if (token.IsCancellationRequested)
                    return null;

                var layer = shema.Layers[index];
                if (!layer.IsEnable)
                    continue;

                double seed = 0;

                if (__CurrentLayerIndex < seeds.Count)
                    seed = seeds[__CurrentLayerIndex];
                else
                {
                    seed = seeds[seeds.Count - 1];

                    for (int i = seeds.Count; i <= __CurrentLayerIndex; i++)
                        seed = rand2(seed, seed);
                }

                __ShadeType = layer.Shade;
                __PlanetAlgorithm = GetAlgorithm(__AlgorithmType, seed, __ShadeType);
                var range = __PlanetAlgorithm.GetAltRange();
                __ColorContainer = new ColorContainer(layer, range);

                var layerBmp = MainGen(token, x, y, w, h, width, height, seed, projection, seaLevel, lng, lat);

                if (token.IsCancellationRequested)
                    return null;

                if (resultBitmap == null)
                    resultBitmap = layerBmp;
                else
                {
                    for (int _x = 0; _x < w; _x++)
                    {
                        for (int _y = 0; _y < h; _y++)
                        {
                            var nc = layerBmp[_x, _y];
                            resultBitmap[_x, _y] = UColor.Merge(resultBitmap[_x, _y], nc, 255 - nc.A, nc.A, UColorFlags.R | UColorFlags.G | UColorFlags.B);
                        }
                    }
                }

                __CurrentLayerIndex++;
            }

            return new UBitmap(resultBitmap);
        }