annotate pkg/mesh/meshserialize_v2.go @ 5695:ef80748ae4f3 sr-v2

Finish deserializing v2 of the mesh index.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 12 Feb 2024 21:23:55 +0100
parents d920f0fa2f04
children 45240edad249
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5680
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1 // This is Free Software under GNU Affero General Public License v >= 3.0
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
2 // without warranty, see README.md and license for details.
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
3 //
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
4 // SPDX-License-Identifier: AGPL-3.0-or-later
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
5 // License-Filename: LICENSES/AGPL-3.0.txt
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
6 //
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
7 // Copyright (C) 2024 by via donau
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
8 // – Österreichische Wasserstraßen-Gesellschaft mbH
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
9 // Software engineering by Intevation GmbH
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
10 //
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
11 // Author(s):
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de>
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
13
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
14 package mesh
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
15
5684
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
16 import (
5686
c33a5354328d Add stubs for de/serialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5685
diff changeset
17 "bufio"
5684
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
18 "cmp"
5687
8ff842858434 More stubs for serializing v2.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5686
diff changeset
19 "encoding/binary"
5686
c33a5354328d Add stubs for de/serialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5685
diff changeset
20 "io"
5684
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
21 "math"
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
22 "slices"
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
23 "sort"
5688
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
24
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
25 "gemma.intevation.de/gemma/pkg/common"
5684
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
26 )
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
27
5688
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
28 const quantScale = 1_000
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
29
5690
da9720b4aa42 More stubs and refactoring to deserialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5689
diff changeset
30 func quant(x float64) int64 { return int64(math.Round(x * quantScale)) }
da9720b4aa42 More stubs and refactoring to deserialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5689
diff changeset
31 func unquant(x int64) float64 { return float64(x) / quantScale }
5688
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
32
5686
c33a5354328d Add stubs for de/serialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5685
diff changeset
33 func (s *STRTree) serializeV2(w io.Writer) error {
5692
d920f0fa2f04 User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5691
diff changeset
34 return serializer(w, s,
d920f0fa2f04 User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5691
diff changeset
35 serializeHeader(),
d920f0fa2f04 User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5691
diff changeset
36 serializeVersion(2),
d920f0fa2f04 User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5691
diff changeset
37 (*STRTree).serializeTinV2,
d920f0fa2f04 User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5691
diff changeset
38 (*STRTree).serializeEntries,
d920f0fa2f04 User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5691
diff changeset
39 (*STRTree).serializeIndexV2,
d920f0fa2f04 User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5691
diff changeset
40 (*STRTree).serializeBBoxesV2,
d920f0fa2f04 User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5691
diff changeset
41 )
d920f0fa2f04 User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5691
diff changeset
42 }
5690
da9720b4aa42 More stubs and refactoring to deserialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5689
diff changeset
43
5692
d920f0fa2f04 User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5691
diff changeset
44 func (s *STRTree) serializeTinV2(w io.Writer) error {
d920f0fa2f04 User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5691
diff changeset
45 return s.tin.serializeV2(w)
5687
8ff842858434 More stubs for serializing v2.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5686
diff changeset
46 }
8ff842858434 More stubs for serializing v2.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5686
diff changeset
47
8ff842858434 More stubs for serializing v2.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5686
diff changeset
48 func (t *Tin) serializeV2(w io.Writer) error {
5692
d920f0fa2f04 User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5691
diff changeset
49 return serializer(w, t,
d920f0fa2f04 User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5691
diff changeset
50 (*Tin).serializeEPSG,
d920f0fa2f04 User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5691
diff changeset
51 (*Tin).serializeExtent,
d920f0fa2f04 User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5691
diff changeset
52 (*Tin).serializeVerticesV2,
d920f0fa2f04 User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5691
diff changeset
53 (*Tin).serializeTrianglesV2,
d920f0fa2f04 User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5691
diff changeset
54 )
5688
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
55 }
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
56
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
57 func zigZag(buf []byte, w io.Writer, x int64) error {
5689
159291854063 Simplify zug zig store call.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5688
diff changeset
58 _, err := w.Write(buf[:binary.PutVarint(buf, x)])
159291854063 Simplify zug zig store call.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5688
diff changeset
59 return err
5688
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
60 }
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
61
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
62 func (t *Tin) serializeVerticesV2(w io.Writer) error {
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
63 vertices := t.Vertices
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
64 if err := binary.Write(w, binary.LittleEndian, uint32(len(vertices))); err != nil {
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
65 return err
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
66 }
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
67 m := t.Min
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
68 buf := make([]byte, binary.MaxVarintLen64)
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
69 for dim := range 3 {
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
70 delta := common.Delta()
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
71 for i := range vertices {
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
72 var v float64
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
73 switch dim {
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
74 case 0:
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
75 v = vertices[i].X - m.X
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
76 case 1:
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
77 v = vertices[i].Y - m.Y
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
78 case 2:
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
79 v = vertices[i].Z - m.Z
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
80 }
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
81 q := quant(v)
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
82 d := delta(q)
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
83 if err := zigZag(buf, w, d); err != nil {
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
84 return err
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
85 }
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
86 }
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
87 }
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
88 return nil
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
89 }
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
90
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
91 func (t *Tin) serializeTrianglesV2(w io.Writer) error {
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
92 triangles := t.Triangles
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
93 if err := binary.Write(w, binary.LittleEndian, uint32(len(triangles))); err != nil {
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
94 return err
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
95 }
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
96 buf := make([]byte, binary.MaxVarintLen64)
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
97 delta := common.Delta()
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
98 for _, tri := range triangles {
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
99 for _, idx := range tri {
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
100 d := delta(int64(idx))
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
101 if err := zigZag(buf, w, d); err != nil {
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
102 return err
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
103 }
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
104 }
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
105 }
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
106 return nil
5687
8ff842858434 More stubs for serializing v2.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5686
diff changeset
107 }
8ff842858434 More stubs for serializing v2.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5686
diff changeset
108
8ff842858434 More stubs for serializing v2.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5686
diff changeset
109 func (s *STRTree) serializeIndexV2(w io.Writer) error {
5688
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
110 index := s.index
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
111 if err := binary.Write(w, binary.LittleEndian, uint32(len(index))); err != nil {
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
112 return err
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
113 }
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
114 buf := make([]byte, binary.MaxVarintLen64)
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
115 delta := common.Delta()
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
116 for _, idx := range index {
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
117 d := delta(int64(idx))
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
118 if err := zigZag(buf, w, d); err != nil {
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
119 return err
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
120 }
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
121 }
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
122 return nil
5687
8ff842858434 More stubs for serializing v2.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5686
diff changeset
123 }
8ff842858434 More stubs for serializing v2.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5686
diff changeset
124
8ff842858434 More stubs for serializing v2.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5686
diff changeset
125 func (s *STRTree) serializeBBoxesV2(w io.Writer) error {
5688
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
126 boxes := s.bboxes
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
127 if err := binary.Write(w, binary.LittleEndian, uint32(len(boxes))); err != nil {
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
128 return err
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
129 }
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
130 var (
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
131 m = s.Min()
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
132 x1 = func(b Box2D) int64 { return quant(b.X1 - m.X) }
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
133 y1 = func(b Box2D) int64 { return quant(b.Y1 - m.Y) }
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
134 width = func(b Box2D) int64 { return quant(b.X2 - b.X1) }
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
135 height = func(b Box2D) int64 { return quant(b.Y2 - b.Y1) }
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
136 buf = make([]byte, binary.MaxVarintLen64)
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
137 )
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
138 for _, proj := range []func(Box2D) int64{x1, y1, width, height} {
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
139 delta := common.Delta()
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
140 for _, b := range boxes {
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
141 v := delta(proj(b))
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
142 if err := zigZag(buf, w, v); err != nil {
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
143 return err
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
144 }
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
145 }
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
146 }
6281c18b109f Finsh serializing v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5687
diff changeset
147 return nil
5686
c33a5354328d Add stubs for de/serialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5685
diff changeset
148 }
c33a5354328d Add stubs for de/serialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5685
diff changeset
149
c33a5354328d Add stubs for de/serialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5685
diff changeset
150 func (s *STRTree) deserializeV2(r *bufio.Reader) error {
5690
da9720b4aa42 More stubs and refactoring to deserialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5689
diff changeset
151 // The header is already skipped here.
5692
d920f0fa2f04 User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5691
diff changeset
152 return serializer(r, s,
5691
9d2e74225104 Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5690
diff changeset
153 (*STRTree).deserializeTinV2,
9d2e74225104 Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5690
diff changeset
154 (*STRTree).deserializeEntries,
9d2e74225104 Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5690
diff changeset
155 (*STRTree).deserializeIndexV2,
9d2e74225104 Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5690
diff changeset
156 (*STRTree).deserializeBBoxesV2,
9d2e74225104 Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5690
diff changeset
157 )
9d2e74225104 Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5690
diff changeset
158 }
9d2e74225104 Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5690
diff changeset
159
9d2e74225104 Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5690
diff changeset
160 func (s *STRTree) deserializeTinV2(r *bufio.Reader) error {
5690
da9720b4aa42 More stubs and refactoring to deserialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5689
diff changeset
161 s.tin = new(Tin)
5691
9d2e74225104 Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5690
diff changeset
162 return s.tin.deserializeV2(r)
5690
da9720b4aa42 More stubs and refactoring to deserialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5689
diff changeset
163 }
da9720b4aa42 More stubs and refactoring to deserialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5689
diff changeset
164
da9720b4aa42 More stubs and refactoring to deserialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5689
diff changeset
165 func (s *STRTree) deserializeBBoxesV2(r *bufio.Reader) error {
5695
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
166 var numBoxes uint32
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
167 if err := binary.Read(r, binary.LittleEndian, &numBoxes); err != nil {
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
168 return err
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
169 }
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
170 boxes := make([]Box2D, numBoxes)
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
171 s.bboxes = boxes
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
172 var (
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
173 m = s.Min()
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
174 x1 = func(b *Box2D, v float64) { b.X1 = v + m.X }
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
175 y1 = func(b *Box2D, v float64) { b.Y1 = v + m.Y }
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
176 width = func(b *Box2D, v float64) { b.X2 = b.X1 + v }
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
177 height = func(b *Box2D, v float64) { b.Y2 = b.Y1 + v }
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
178 )
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
179 for _, unproj := range []func(*Box2D, float64){x1, y1, width, height} {
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
180 invDelta := common.InvDelta()
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
181 for i := range boxes {
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
182 v, err := binary.ReadVarint(r)
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
183 if err != nil {
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
184 return err
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
185 }
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
186 unproj(&boxes[i], unquant(invDelta(v)))
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
187 }
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
188 }
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
189 return nil
5690
da9720b4aa42 More stubs and refactoring to deserialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5689
diff changeset
190 }
da9720b4aa42 More stubs and refactoring to deserialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5689
diff changeset
191
da9720b4aa42 More stubs and refactoring to deserialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5689
diff changeset
192 func (s *STRTree) deserializeIndexV2(r *bufio.Reader) error {
5695
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
193 var numIndices uint32
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
194 if err := binary.Read(r, binary.LittleEndian, &numIndices); err != nil {
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
195 return err
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
196 }
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
197 index := make([]int32, numIndices)
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
198 s.index = index
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
199 invDelta := common.InvDelta()
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
200 for i := range index {
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
201 d, err := binary.ReadVarint(r)
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
202 if err != nil {
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
203 return err
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
204 }
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
205 index[i] = int32(invDelta(d))
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
206 }
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
207 return nil
5690
da9720b4aa42 More stubs and refactoring to deserialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5689
diff changeset
208 }
da9720b4aa42 More stubs and refactoring to deserialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5689
diff changeset
209
da9720b4aa42 More stubs and refactoring to deserialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5689
diff changeset
210 func (t *Tin) deserializeV2(r *bufio.Reader) error {
5692
d920f0fa2f04 User generic serializer for serialization, too.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5691
diff changeset
211 return serializer(r, t,
5691
9d2e74225104 Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5690
diff changeset
212 (*Tin).deserializeEPSG,
9d2e74225104 Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5690
diff changeset
213 (*Tin).deserializeExtent,
9d2e74225104 Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5690
diff changeset
214 (*Tin).deserializeVerticesV2,
9d2e74225104 Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5690
diff changeset
215 (*Tin).deserializeTrianglesV2,
9d2e74225104 Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5690
diff changeset
216 )
9d2e74225104 Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5690
diff changeset
217 }
9d2e74225104 Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5690
diff changeset
218
9d2e74225104 Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5690
diff changeset
219 func (t *Tin) deserializeVerticesV2(r *bufio.Reader) error {
5695
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
220 var numVertices uint32
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
221 if err := binary.Read(r, binary.LittleEndian, &numVertices); err != nil {
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
222 return err
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
223 }
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
224 vertices := make([]Vertex, numVertices)
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
225 t.Vertices = vertices
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
226 m := t.Min
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
227 for dim := range 3 {
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
228 invDelta := common.InvDelta()
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
229 for i := range vertices {
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
230 d, err := binary.ReadVarint(r)
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
231 if err != nil {
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
232 return err
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
233 }
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
234 v := unquant(invDelta(d))
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
235 switch dim {
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
236 case 0:
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
237 vertices[i].X = v + m.X
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
238 case 1:
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
239 vertices[i].Y = v + m.Y
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
240 case 2:
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
241 vertices[i].Z = v + m.Z
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
242 }
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
243 }
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
244 }
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
245 return nil
5691
9d2e74225104 Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5690
diff changeset
246 }
9d2e74225104 Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5690
diff changeset
247
9d2e74225104 Some refactoring to clean up deserialization.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5690
diff changeset
248 func (t *Tin) deserializeTrianglesV2(r *bufio.Reader) error {
5695
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
249 var numTriangles uint32
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
250 if err := binary.Read(r, binary.LittleEndian, &numTriangles); err != nil {
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
251 return err
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
252 }
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
253 indices := make([]int32, 3*numTriangles)
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
254 triangles := make([][]int32, numTriangles)
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
255 t.Triangles = triangles
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
256 invDelta := common.InvDelta()
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
257 for i := range triangles {
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
258 tri := indices[:3]
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
259 indices = indices[3:]
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
260 triangles[i] = tri
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
261 for j := range tri {
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
262 v, err := binary.ReadVarint(r)
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
263 if err != nil {
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
264 return err
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
265 }
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
266 tri[j] = int32(invDelta(v))
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
267 }
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
268 }
ef80748ae4f3 Finish deserializing v2 of the mesh index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5692
diff changeset
269 return nil
5686
c33a5354328d Add stubs for de/serialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5685
diff changeset
270 }
c33a5354328d Add stubs for de/serialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5685
diff changeset
271
c33a5354328d Add stubs for de/serialize v2 meshes.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5685
diff changeset
272 // optimizeForSerializationV2 prepares the mesh to be stored in V2.
5680
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
273 func (s *STRTree) optimizeForSerializationV2() {
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
274 s.removeUnusedTriangles()
5684
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
275 s.sortVertices()
5682
33499bd1b829 Sort indices in spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5680
diff changeset
276 s.sortIndices()
5680
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
277 }
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
278
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
279 // removeUnusedTriangles removes all triangles from the
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
280 // TIN that are not registered in the spatial index.
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
281 func (s *STRTree) removeUnusedTriangles() {
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
282 used := make([]bool, len(s.tin.Triangles))
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
283 unused := len(used)
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
284 s.allTriangleIndices(func(indices []int32) {
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
285 for _, idx := range indices {
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
286 used[idx] = true
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
287 unused-- // They only occur once in the spatial index.
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
288 }
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
289 })
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
290 if unused <= 0 {
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
291 return
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
292 }
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
293 newTris := make([][]int32, 0, len(s.tin.Triangles)-unused)
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
294 remap := map[int32]int32{}
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
295 for idx, tri := range s.tin.Triangles {
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
296 if used[idx] {
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
297 remap[int32(idx)] = int32(len(newTris))
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
298 newTris = append(newTris, tri)
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
299 }
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
300 }
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
301 s.tin.Triangles = newTris
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
302 // Update the spatial index as the gaps are now closed.
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
303 s.allTriangleIndices(func(indices []int32) {
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
304 for i, idx := range indices {
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
305 indices[i] = remap[idx]
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
306 }
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
307 })
a87900c0fd11 Remove triangles that are not registered in the spatial index.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
308 }
5684
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
309
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
310 // sortVertices so that the deltas between neighbors are minimized.
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
311 func (s *STRTree) sortVertices() {
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
312 vertices := s.tin.Vertices
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
313 indices := make([]int32, len(vertices))
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
314 for i := range len(indices) {
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
315 indices[i] = int32(i)
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
316 }
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
317
5685
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
318 // Take aspect ratio of bbox into account.
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
319 width := s.tin.Max.X - s.tin.Min.X
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
320 height := s.tin.Max.Y - s.tin.Min.Y
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
321 if width == 0 || height == 0 {
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
322 return
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
323 }
5684
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
324
5685
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
325 // v = len(vertices)
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
326 // r = max(w, h)/min(w, h)
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
327 // n * t = v <=> n = v/t
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
328 // n / t = r <=> n = r*t
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
329 // v/t = r*t
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
330 // v = r*t^2
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
331 // v/r = t^2
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
332 // t = sqrt(v/r)
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
333 r := float64(max(width, height)) / float64(min(width, height))
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
334 t := int(math.Ceil(math.Sqrt(float64(len(vertices)) / r)))
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
335
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
336 var d1, d2 func(int32, int32) int
5684
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
337
5685
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
338 if width > height {
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
339 // Sort in X first and slices alternating up and down
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
340 slices.SortFunc(indices, func(a, b int32) int {
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
341 return cmp.Compare(vertices[a].X, vertices[b].X)
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
342 })
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
343 d1 = func(a, b int32) int { return cmp.Compare(vertices[a].Y, vertices[b].Y) }
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
344 d2 = func(a, b int32) int { return cmp.Compare(vertices[b].Y, vertices[a].Y) }
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
345 } else {
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
346 // Sort in Y first and slices alternating left and right
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
347 slices.SortFunc(indices, func(a, b int32) int {
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
348 return cmp.Compare(vertices[a].Y, vertices[b].Y)
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
349 })
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
350 d1 = func(a, b int32) int { return cmp.Compare(vertices[a].X, vertices[b].X) }
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
351 d2 = func(a, b int32) int { return cmp.Compare(vertices[b].X, vertices[a].X) }
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
352 }
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
353
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
354 for p := indices; len(p) > 0; d1, d2 = d2, d1 {
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
355 l := min(len(p), t)
0ee8ace01b60 When sorting vertices by x/y take aspectio ratio of bbox into acount.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5684
diff changeset
356 slices.SortStableFunc(p[:l], d2)
5684
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
357 p = p[l:]
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
358 }
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
359
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
360 // We really need to to sort the vertices actually, too.
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
361 sort.Slice(vertices, func(i, j int) bool { return indices[i] < indices[j] })
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
362
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
363 reindices := make([]int32, len(indices))
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
364 for i, idx := range indices {
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
365 reindices[idx] = int32(i)
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
366 }
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
367
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
368 // Update the indices in the triangles.
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
369 for _, tri := range s.tin.Triangles {
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
370 for i, idx := range tri {
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
371 tri[i] = reindices[idx]
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
372 }
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
373 }
536e842d9bfa Reorder vertices in tins to minimize delta distances.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5682
diff changeset
374 }