Example #1
0
        public Task<SphereModel> Generate3D(PlanetContainer planetContainer, Action<float> callBack)
        {
            Init(planetContainer);

            __NativeGenerator = new GClassic();
            __NativeGenerator.Initialize(planetContainer.Seeds[0], ShadeType.None);

            SphereModel model;

            var container = planetContainer.Container3D;

            var token = __CancellationTokenSource.Token;
            return Task<SphereModel>.Factory.StartNew(() =>
            {
                InWork = true;

                if (container.Optimize)
                {
                    var res = GetOptimizeSkeleton(container.RecursionLevel, token);

                    if (token.IsCancellationRequested)
                        return null;

                    model = res.Item1;

                    FillSphereOptimize(model, planetContainer, res.Item2);

                    model.RemoveUselessPoints();
                }
                else
                {
                    model = GetSkeletone(container.RecursionLevel, token);

                    if (token.IsCancellationRequested)
                        return null;

                    FillSphere(model, planetContainer);
                }

                InWork = false;
                LastGenerationTime = (int)(DateTime.Now - __StartTime).TotalMilliseconds;
                return model;
            }, token);
        }
        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);
        }