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); }