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