public bool Optimize(SphereModel model, float optimizeIndent) { if (__Proccessed) return false; __Proccessed = true; if (Childs == null) { IsOk = true; return true; } if (Childs.Any(e => !e.IsOk)) return false; var pointIndexes = Childs.SelectMany(e => e.Points).Distinct().ToList(); var points = pointIndexes.Select(index => model.Points[index]).ToList(); var colors = pointIndexes.Select(index => model.Colors[index]).ToArray(); var lens = points.Select(e => e.Length).ToList(); var minPointLenght = lens.Min(); var maxPointLenght = lens.Max(); var div = (maxPointLenght / minPointLenght - 1); if (Math.Abs(div) < optimizeIndent && IsColorDivEnabled(colors, optimizeIndent)) { Optimize(model); return true; } return false; }
private void Optimize(SphereModel model) { IsOk = true; foreach (var child in Childs) child.IsOk = false; }
public void FixLines(SphereModel model) { OptimazeLine(model, Points[0], Points[1]); OptimazeLine(model, Points[1], Points[2]); OptimazeLine(model, Points[2], Points[0]); }
private void OptimazeLine(SphereModel model, int p1, int p2) { int pIndex; if (model.Cache.Get(p1, p2, out pIndex)) { model.Points[pIndex] = (model.Points[p1] + model.Points[p2]) * 0.5f; OptimazeLine(model, p1, pIndex); OptimazeLine(model, p2, pIndex); } }
private SphereModel GetSkeletone(int recursionLevel, CancellationToken token) { var res = GetBaseSkeleton(); var bp = res.Item2; var triengles = res.Item1; var model = new SphereModel(bp); for (int i = 0; i < recursionLevel; i++) { var newTriengles = new List<RefTriengle>(); foreach (var t in triengles) { if (token.IsCancellationRequested) return null; var a = model.MiddlePoint(t.Points[0], t.Points[1]); var b = model.MiddlePoint(t.Points[1], t.Points[2]); var c = model.MiddlePoint(t.Points[2], t.Points[0]); newTriengles.Add(new RefTriengle(t.Points[0], a, c)); newTriengles.Add(new RefTriengle(t.Points[1], b, a)); newTriengles.Add(new RefTriengle(t.Points[2], c, b)); newTriengles.Add(new RefTriengle(a, b, c)); } triengles = newTriengles; } model.Normalize(); model.Triengles = triengles; return model; }
private Tuple<SphereModel, Dictionary<int, List<RefTriengleOptimize>>> GetOptimizeSkeleton(int recursionLevel, CancellationToken token) { var res = GetBaseSkeleton(); var bp = res.Item2; var triengles = res.Item1; var resultDic = new Dictionary<int, List<RefTriengleOptimize>>(); resultDic[0] = triengles.Select(e => new RefTriengleOptimize(e, 0)).ToList(); var model = new SphereModel(bp); for (int i = 0; i < recursionLevel; i++) { var parents = resultDic[i]; var childs = new List<RefTriengleOptimize>(); foreach (var t in parents) { if (token.IsCancellationRequested) return null; var a = model.MiddlePoint(t.Points[0], t.Points[1]); var b = model.MiddlePoint(t.Points[1], t.Points[2]); var c = model.MiddlePoint(t.Points[2], t.Points[0]); var refs = new List<RefTriengleOptimize> { new RefTriengleOptimize(new RefTriengle(t.Points[0], a, c),i+1), new RefTriengleOptimize(new RefTriengle(t.Points[1], b, a),i+1), new RefTriengleOptimize(new RefTriengle(t.Points[2], c, b),i+1), new RefTriengleOptimize(new RefTriengle(a, b, c),i+1) }; foreach (var refT in refs) refT.Parent = t; t.Childs = refs.ToArray(); childs.AddRange(refs); } resultDic[i + 1] = childs; } model.Normalize(); model.Triengles = triengles; return new Tuple<SphereModel, Dictionary<int, List<RefTriengleOptimize>>>(model, resultDic); }
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 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; } }