comparison pkg/mesh/meshserialize_v1.go @ 5691:9d2e74225104 sr-v2

Some refactoring to clean up deserialization.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 12 Feb 2024 12:48:07 +0100
parents da9720b4aa42
children d920f0fa2f04
comparison
equal deleted inserted replaced
5690:da9720b4aa42 5691:9d2e74225104
91 91
92 return nil 92 return nil
93 } 93 }
94 94
95 func (t *Tin) serializeV1(w io.Writer) error { 95 func (t *Tin) serializeV1(w io.Writer) error {
96 if err := binary.Write(w, binary.LittleEndian, t.EPSG); err != nil { 96 if err := t.serializeEPSG(w); err != nil {
97 return err 97 return err
98 } 98 }
99 if err := t.serializeExtent(w); err != nil { 99 if err := t.serializeExtent(w); err != nil {
100 return err 100 return err
101 } 101 }
102 if err := t.serializeVerticesV1(w); err != nil { 102 if err := t.serializeVerticesV1(w); err != nil {
103 return err 103 return err
104 } 104 }
105 return t.serializeTrianglesV1(w)
106 }
107
108 func (t *Tin) serializeTrianglesV1(w io.Writer) error {
105 if err := binary.Write( 109 if err := binary.Write(
106 w, binary.LittleEndian, uint32(len(t.Triangles))); err != nil { 110 w, binary.LittleEndian, uint32(len(t.Triangles))); err != nil {
107 return err 111 return err
108 } 112 }
109 return t.serializeTrianglesV1(w)
110 }
111
112 func (t *Tin) serializeTrianglesV1(w io.Writer) error {
113 var buf [binary.MaxVarintLen32]byte 113 var buf [binary.MaxVarintLen32]byte
114 var written int 114 var written int
115 var last int32 115 var last int32
116 for _, triangle := range t.Triangles { 116 for _, triangle := range t.Triangles {
117 for _, idx := range triangle { 117 for _, idx := range triangle {
135 func (t *Tin) serializeVerticesV1(w io.Writer) error { 135 func (t *Tin) serializeVerticesV1(w io.Writer) error {
136 if err := binary.Write( 136 if err := binary.Write(
137 w, binary.LittleEndian, uint32(len(t.Vertices))); err != nil { 137 w, binary.LittleEndian, uint32(len(t.Vertices))); err != nil {
138 return err 138 return err
139 } 139 }
140
141 var err error 140 var err error
142 vwrite := func(v float64) { 141 vwrite := func(v float64) {
143 if err == nil { 142 if err == nil {
144 err = binary.Write(w, binary.LittleEndian, math.Float64bits(v)) 143 err = binary.Write(w, binary.LittleEndian, math.Float64bits(v))
145 } 144 }
146 } 145 }
147
148 for _, v := range t.Vertices { 146 for _, v := range t.Vertices {
149 vwrite(v.X) 147 vwrite(v.X)
150 vwrite(v.Y) 148 vwrite(v.Y)
151 vwrite(v.Z) 149 vwrite(v.Z)
152 } 150 }
153
154 if err != nil { 151 if err != nil {
155 return err 152 return err
156 } 153 }
157 log.Infof("vertices %d (%d)\n", len(t.Vertices), len(t.Vertices)*3*8) 154 log.Infof("vertices %d (%d)\n", len(t.Vertices), len(t.Vertices)*3*8)
158 return nil 155 return nil
159 } 156 }
160 157
158 func (s *STRTree) deserializeV1(r *bufio.Reader) error {
159 return deserializer(r, s,
160 (*STRTree).deserializeTinV1,
161 (*STRTree).deserializeEntries,
162 (*STRTree).deserializeIndexV1,
163 (*STRTree).deserializeBBoxesV1,
164 )
165 }
166
161 func (s *STRTree) deserializeBBoxesV1(r *bufio.Reader) error { 167 func (s *STRTree) deserializeBBoxesV1(r *bufio.Reader) error {
162
163 var numBBoxes int32 168 var numBBoxes int32
164 if err := binary.Read(r, binary.LittleEndian, &numBBoxes); err != nil { 169 if err := binary.Read(r, binary.LittleEndian, &numBBoxes); err != nil {
165 return err 170 return err
166 } 171 }
167
168 bboxes := make([]Box2D, numBBoxes) 172 bboxes := make([]Box2D, numBBoxes)
169 s.bboxes = bboxes 173 s.bboxes = bboxes
170
171 var err error 174 var err error
172
173 read := func(v *float64) { 175 read := func(v *float64) {
174 if err == nil { 176 if err == nil {
175 err = binary.Read(r, binary.LittleEndian, v) 177 err = binary.Read(r, binary.LittleEndian, v)
176 } 178 }
177 } 179 }
178
179 for i := range bboxes { 180 for i := range bboxes {
180 read(&bboxes[i].X1) 181 read(&bboxes[i].X1)
181 read(&bboxes[i].Y1) 182 read(&bboxes[i].Y1)
182 read(&bboxes[i].X2) 183 read(&bboxes[i].X2)
183 read(&bboxes[i].Y2) 184 read(&bboxes[i].Y2)
184 } 185 }
185
186 return err 186 return err
187 } 187 }
188 188
189 func (s *STRTree) deserializeIndexV1(r *bufio.Reader) error { 189 func (s *STRTree) deserializeIndexV1(r *bufio.Reader) error {
190 var numIndex int32 190 var numIndex int32
191 if err := binary.Read(r, binary.LittleEndian, &numIndex); err != nil { 191 if err := binary.Read(r, binary.LittleEndian, &numIndex); err != nil {
192 return err 192 return err
193 } 193 }
194 index := make([]int32, numIndex) 194 index := make([]int32, numIndex)
195 s.index = index 195 s.index = index
196
197 var last int32 196 var last int32
198 for i := range index { 197 for i := range index {
199 v, err := binary.ReadVarint(r) 198 v, err := binary.ReadVarint(r)
200 if err != nil { 199 if err != nil {
201 return err 200 return err
202 } 201 }
203 value := int32(v) + last 202 value := int32(v) + last
204 index[i] = value 203 index[i] = value
205 last = value 204 last = value
206 } 205 }
207 206 return nil
208 return nil 207 }
209 } 208
210 209 func (s *STRTree) deserializeTinV1(r *bufio.Reader) error {
211 func (s *STRTree) deserializeV1(r *bufio.Reader) error {
212 s.tin = new(Tin) 210 s.tin = new(Tin)
213 if err := s.tin.deserializeV1(r); err != nil { 211 return s.tin.deserializeV1(r)
214 return err
215 }
216 if err := s.deserializeEntries(r); err != nil {
217 return err
218 }
219 if err := s.deserializeIndexV1(r); err != nil {
220 return err
221 }
222 return s.deserializeBBoxesV1(r)
223 } 212 }
224 213
225 // deserializeV1 restores a TIN from a binary representation. 214 // deserializeV1 restores a TIN from a binary representation.
226 func (t *Tin) deserializeV1(r *bufio.Reader) error { 215 func (t *Tin) deserializeV1(r *bufio.Reader) error {
227 216 return deserializer(r, t,
228 if err := binary.Read(r, binary.LittleEndian, &t.EPSG); err != nil { 217 (*Tin).deserializeEPSG,
229 return err 218 (*Tin).deserializeExtent,
230 } 219 (*Tin).deserializeVerticesV1,
231 220 (*Tin).deserializeTrianglesV1,
232 log.Infof("EPSG: %d\n", t.EPSG) 221 )
233 222 }
234 if err := t.Min.Read(r); err != nil { 223
235 return err 224 func (t *Tin) deserializeVerticesV1(r *bufio.Reader) error {
236 }
237
238 if err := t.Max.Read(r); err != nil {
239 return err
240 }
241
242 log.Infof("BBOX: [[%f, %f, %f], [%f, %f, %f]]\n",
243 t.Min.X, t.Min.Y, t.Min.Z,
244 t.Max.X, t.Max.Y, t.Max.Z)
245
246 var numVertices uint32 225 var numVertices uint32
247 if err := binary.Read(r, binary.LittleEndian, &numVertices); err != nil { 226 if err := binary.Read(r, binary.LittleEndian, &numVertices); err != nil {
248 return err 227 return err
249 } 228 }
250
251 log.Infof("vertices: %d\n", numVertices) 229 log.Infof("vertices: %d\n", numVertices)
252
253 vertices := make([]Vertex, numVertices) 230 vertices := make([]Vertex, numVertices)
254 t.Vertices = vertices 231 t.Vertices = vertices
255
256 for i := range vertices { 232 for i := range vertices {
257 if err := vertices[i].Read(r); err != nil { 233 if err := vertices[i].Read(r); err != nil {
258 return err 234 return err
259 } 235 }
260 } 236 }
261 237 return nil
238 }
239
240 func (t *Tin) deserializeTrianglesV1(r *bufio.Reader) error {
262 var numTriangles uint32 241 var numTriangles uint32
263 if err := binary.Read(r, binary.LittleEndian, &numTriangles); err != nil { 242 if err := binary.Read(r, binary.LittleEndian, &numTriangles); err != nil {
264 return err 243 return err
265 } 244 }
266
267 log.Infof("triangles: %d\n", numTriangles) 245 log.Infof("triangles: %d\n", numTriangles)
268
269 indices := make([]int32, 3*numTriangles) 246 indices := make([]int32, 3*numTriangles)
270 triangles := make([][]int32, numTriangles) 247 triangles := make([][]int32, numTriangles)
271 t.Triangles = triangles 248 t.Triangles = triangles
272 249 var last int32
273 var last int32
274
275 for i := range triangles { 250 for i := range triangles {
276 tri := indices[:3] 251 tri := indices[:3]
277 indices = indices[3:] 252 indices = indices[3:]
278 triangles[i] = tri 253 triangles[i] = tri
279 for j := range tri { 254 for j := range tri {
284 value := int32(v) + last 259 value := int32(v) + last
285 tri[j] = value 260 tri[j] = value
286 last = value 261 last = value
287 } 262 }
288 } 263 }
289 264 return nil
290 return nil 265 }
291 }