public static void TestShadowFromTo() { var ft1 = new ShadowFromTo(new Point(0, 0), new Point(1, 1)); var ary = new Horizon[TerrainPatch.DefaultSize][]; for (var i = 0; i < TerrainPatch.DefaultSize; i++) { ary[i] = new Horizon[TerrainPatch.DefaultSize]; } for (var i = 0; i < TerrainPatch.DefaultSize; i++) { for (var j = 0; j < TerrainPatch.DefaultSize; j++) { ary[i][j] = new Horizon().Init(); } } ft1.Horizons = ary; var r = new Random(); var totalSamples = TerrainPatch.DefaultSize * TerrainPatch.DefaultSize * Horizon.HorizonSamples; for (var i = 0; i < 1000; i++) { var len = (int)(100 * r.NextDouble()); var start = (int)(totalSamples * r.NextDouble()); var stop = start + len; for (var ptr = start; ptr < stop; ptr++) { var index = ptr % totalSamples; var z = index % Horizon.HorizonSamples; index /= Horizon.HorizonSamples; var y = index % TerrainPatch.DefaultSize; index /= TerrainPatch.DefaultSize; var x = index; ary[x][y].Buffer[z] = ptr; } } const string filename = "test_ft.bin"; ft1.Write(filename); var ft2 = ShadowFromTo.ReadFrom(filename); for (var x = 0; x < TerrainPatch.DefaultSize; x++) { for (var y = 0; y < TerrainPatch.DefaultSize; y++) { for (var z = 0; z < Horizon.HorizonSamples; z++) { if (ft1.Horizons[x][y].Buffer[z] != ft2.Horizons[x][y].Buffer[z]) { Console.WriteLine($"Error in cell {x} {y} {z}"); } } } } }
private void btnGpuCalculate_Click(object sender, EventArgs e) { if (!(Selection1.HasValue && (Selection2.Count > 0 || cbGpuSelfShadow.Checked))) { return; } var processor = new GPUProcessor { Terrain = Terrain }; var useCache = cbUseCache.Checked; var target = GetPatch(Selection1.Value); ShadowFromTo selfShadow = null; if (cbGpuSelfShadow.Checked) { var to_key = target.Id; var path = ShadowFromTo.GenerateSelfShadowPath(to_key); if (useCache && File.Exists(path)) { selfShadow = ShadowFromTo.ReadFrom(path); } else { target.InitializeHorizons(); if (false) { target.FillPointsAndMatrices(Terrain); target.ParallelAddNearHorizon(Terrain); } else { target.FillPoints(Terrain); target.FillMatricesRelativeToPoint(Terrain, target.Points[0][0]); // GPU processor.AddNearHorizon(target); } var self_shadow = new ShadowFromTo(to_key, to_key); self_shadow.CopyFrom(target.Horizons); _selfShadowDictionary[to_key] = self_shadow; } } else { target.InitializeHorizons(); } if (selfShadow != null) { for (var line = 0; line < TerrainPatch.DefaultSize; line++) { for (var sample = 0; sample < TerrainPatch.DefaultSize; sample++) { target.Horizons[line][sample].Merge(selfShadow.Horizons[line][sample]); } } } // Now, for the main show var casters = Selection2.Select(ToGlobalKey).Select(TerrainPatch.FromId).ToList(); processor.UpdateHorizons(target, casters); for (var line = 0; line < TerrainPatch.DefaultSize; line++) { for (var sample = 0; sample < TerrainPatch.DefaultSize; sample++) { target.Horizons[line][sample].ConvertSlopeToDegrees(); } } RenderMode = PatchRenderMode.AzEl; Invalidate(); }
private void btnShadow2To1_Click(object sender, EventArgs e) { if (!(Selection1.HasValue && (Selection2.Count > 0 || cbSelfShadow.Checked))) { return; } var useCache = cbUseCache.Checked; var to_patch = GetPatch(Selection1.Value); var to_key = to_patch.Id; foreach (var local_from_key in Selection2) { var from_key = ToGlobalKey(local_from_key); var label = new FromToLabel(from_key.X, from_key.Y, to_key.X, to_key.Y); if (!useCache || !_fromToDictionary.ContainsKey(label)) { ShadowFromTo fromto = null; if (useCache) { string path = ShadowFromTo.GenerateDefaultPath(from_key.X, from_key.Y, to_key.X, to_key.Y); if (File.Exists(path)) { fromto = ShadowFromTo.ReadFrom(path); _fromToDictionary[label] = fromto; } } if (fromto != null) { continue; } var s2 = GetPatch(local_from_key); to_patch.FillPointsAndMatrices(Terrain); s2.FillPoints(Terrain); to_patch.InitializeHorizons(); to_patch.UpdateHorizon(s2); fromto = new ShadowFromTo(from_key, to_key); fromto.Horizons = to_patch.Horizons; _fromToDictionary[label] = fromto; to_patch.InitializeHorizons(); } } ShadowFromTo selfShadow = null; if (cbSelfShadow.Checked) { var path = ShadowFromTo.GenerateSelfShadowPath(to_key); if (File.Exists(path)) { selfShadow = ShadowFromTo.ReadFrom(path); } else { to_patch.FillPointsAndMatrices(Terrain); to_patch.InitializeHorizons(); to_patch.ParallelAddNearHorizon(Terrain); var self_shadow = new ShadowFromTo(to_key, to_key); self_shadow.CopyFrom(to_patch.Horizons); _selfShadowDictionary[to_key] = self_shadow; } } to_patch.InitializeHorizons(); if (selfShadow != null) { for (var line = 0; line < TerrainPatch.DefaultSize; line++) { for (var sample = 0; sample < TerrainPatch.DefaultSize; sample++) { to_patch.Horizons[line][sample].Merge(selfShadow.Horizons[line][sample]); } } } foreach (var local_from_key in Selection2) { var from_key = ToGlobalKey(local_from_key); var label = new FromToLabel(from_key.X, from_key.Y, to_key.X, to_key.Y); var other = _fromToDictionary[label]; for (var line = 0; line < TerrainPatch.DefaultSize; line++) { for (var sample = 0; sample < TerrainPatch.DefaultSize; sample++) { to_patch.Horizons[line][sample].Merge(other.Horizons[line][sample]); } } } for (var line = 0; line < TerrainPatch.DefaultSize; line++) { for (var sample = 0; sample < TerrainPatch.DefaultSize; sample++) { to_patch.Horizons[line][sample].ConvertSlopeToDegrees(); } } RenderMode = PatchRenderMode.AzEl; Invalidate(); }