Mercurial > gemma
diff pkg/mesh/meshserialize_v2.go @ 5680:a87900c0fd11 sr-v2
Remove triangles that are not registered in the spatial index.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Sun, 11 Feb 2024 18:40:37 +0100 |
parents | |
children | 33499bd1b829 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pkg/mesh/meshserialize_v2.go Sun Feb 11 18:40:37 2024 +0100 @@ -0,0 +1,50 @@ +// This is Free Software under GNU Affero General Public License v >= 3.0 +// without warranty, see README.md and license for details. +// +// SPDX-License-Identifier: AGPL-3.0-or-later +// License-Filename: LICENSES/AGPL-3.0.txt +// +// Copyright (C) 2024 by via donau +// – Österreichische Wasserstraßen-Gesellschaft mbH +// Software engineering by Intevation GmbH +// +// Author(s): +// * Sascha L. Teichmann <sascha.teichmann@intevation.de> + +package mesh + +func (s *STRTree) optimizeForSerializationV2() { + s.removeUnusedTriangles() + // TODO: Implement me! +} + +// removeUnusedTriangles removes all triangles from the +// TIN that are not registered in the spatial index. +func (s *STRTree) removeUnusedTriangles() { + used := make([]bool, len(s.tin.Triangles)) + unused := len(used) + s.allTriangleIndices(func(indices []int32) { + for _, idx := range indices { + used[idx] = true + unused-- // They only occur once in the spatial index. + } + }) + if unused <= 0 { + return + } + newTris := make([][]int32, 0, len(s.tin.Triangles)-unused) + remap := map[int32]int32{} + for idx, tri := range s.tin.Triangles { + if used[idx] { + remap[int32(idx)] = int32(len(newTris)) + newTris = append(newTris, tri) + } + } + s.tin.Triangles = newTris + // Update the spatial index as the gaps are now closed. + s.allTriangleIndices(func(indices []int32) { + for i, idx := range indices { + indices[i] = remap[idx] + } + }) +}