# HG changeset patch # User Sascha L. Teichmann # Date 1707600123 -3600 # Node ID b8da63027b488673152239d1d3b3f2b25adfb091 # Parent e54635c20d43355e4193455c4e3f43e4ebad38d5 Started to separate mesh serialisation in different files. diff -r e54635c20d43 -r b8da63027b48 pkg/mesh/serialize_v1.go --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pkg/mesh/serialize_v1.go Sat Feb 10 22:22:03 2024 +0100 @@ -0,0 +1,163 @@ +// 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 + +package mesh + +import ( + "encoding/binary" + "io" + "math" + + "gemma.intevation.de/gemma/pkg/log" +) + +func (s *STRTree) serializeV1(w io.Writer) error { + if err := s.tin.serializeV1(w); err != nil { + return err + } + + if err := binary.Write(w, binary.LittleEndian, uint8(s.Entries)); err != nil { + return err + } + + if err := s.serializeIndexV1(w); err != nil { + return err + } + + if err := s.serializeBBoxesV1(w); err != nil { + return err + } + + return nil +} + +func (s *STRTree) serializeBBoxesV1(w io.Writer) error { + + if err := binary.Write(w, binary.LittleEndian, int32(len(s.bboxes))); err != nil { + return err + } + + var err error + + write := func(v float64) { + if err == nil { + err = binary.Write(w, binary.LittleEndian, math.Float64bits(v)) + } + } + for _, box := range s.bboxes { + write(box.X1) + write(box.Y1) + write(box.X2) + write(box.Y2) + } + + return err +} + +func (s *STRTree) serializeIndexV1(w io.Writer) error { + + if err := binary.Write(w, binary.LittleEndian, int32(len(s.index))); err != nil { + return err + } + + var buf [binary.MaxVarintLen32]byte + + var last int32 + var written int + + for _, x := range s.index { + delta := x - last + n := binary.PutVarint(buf[:], int64(delta)) + for p := buf[:n]; len(p) > 0; p = p[n:] { + var err error + if n, err = w.Write(p); err != nil { + return err + } + written += n + } + last = x + } + + log.Infof("compressed index in bytes: %d %.2f (%d %.2f)\n", + written, + float64(written)/(1024*1024), + 4*len(s.index), + float64(4*len(s.index))/(1024*1024), + ) + + return nil +} + +func (t *Tin) serializeV1(w io.Writer) error { + + if err := binary.Write(w, binary.LittleEndian, t.EPSG); err != nil { + return err + } + + if err := t.Min.Write(w); err != nil { + return err + } + if err := t.Max.Write(w); err != nil { + return err + } + + if err := binary.Write( + w, binary.LittleEndian, uint32(len(t.Vertices))); err != nil { + return err + } + + var err error + vwrite := func(v float64) { + if err == nil { + err = binary.Write(w, binary.LittleEndian, math.Float64bits(v)) + } + } + + for _, v := range t.Vertices { + vwrite(v.X) + vwrite(v.Y) + vwrite(v.Z) + } + + if err != nil { + return err + } + log.Infof("vertices %d (%d)\n", len(t.Vertices), len(t.Vertices)*3*8) + + if err := binary.Write( + w, binary.LittleEndian, uint32(len(t.Triangles))); err != nil { + return err + } + + var buf [binary.MaxVarintLen32]byte + var written int + var last int32 + for _, triangle := range t.Triangles { + for _, idx := range triangle { + value := idx - last + n := binary.PutVarint(buf[:], int64(value)) + for p := buf[:n]; len(p) > 0; p = p[n:] { + var err error + if n, err = w.Write(p); err != nil { + return err + } + written += n + } + last = idx + } + } + log.Infof("compressed tin indices in bytes: %d (%d)\n", + written, 3*4*len(t.Triangles)) + + return nil +} diff -r e54635c20d43 -r b8da63027b48 pkg/mesh/strtree.go --- a/pkg/mesh/strtree.go Sat Feb 10 17:03:58 2024 +0100 +++ b/pkg/mesh/strtree.go Sat Feb 10 22:22:03 2024 +0100 @@ -16,12 +16,8 @@ import ( "bytes" "compress/gzip" - "encoding/binary" - "io" "math" "sort" - - "gemma.intevation.de/gemma/pkg/log" ) // STRTreeDefaultEntries is the default number of children per node and leaf. @@ -252,63 +248,6 @@ return removed } -func (s *STRTree) serializeIndex(w io.Writer) error { - - if err := binary.Write(w, binary.LittleEndian, int32(len(s.index))); err != nil { - return err - } - - var buf [binary.MaxVarintLen32]byte - - var last int32 - var written int - - for _, x := range s.index { - delta := x - last - n := binary.PutVarint(buf[:], int64(delta)) - for p := buf[:n]; len(p) > 0; p = p[n:] { - var err error - if n, err = w.Write(p); err != nil { - return err - } - written += n - } - last = x - } - - log.Infof("compressed index in bytes: %d %.2f (%d %.2f)\n", - written, - float64(written)/(1024*1024), - 4*len(s.index), - float64(4*len(s.index))/(1024*1024), - ) - - return nil -} - -func (s *STRTree) serializeBBoxes(w io.Writer) (rr error) { - - if err := binary.Write(w, binary.LittleEndian, int32(len(s.bboxes))); err != nil { - return err - } - - var err error - - write := func(v float64) { - if err == nil { - err = binary.Write(w, binary.LittleEndian, math.Float64bits(v)) - } - } - for _, box := range s.bboxes { - write(box.X1) - write(box.Y1) - write(box.X2) - write(box.Y2) - } - - return err -} - // Bytes serializes this tree to a byte slice. func (s *STRTree) Bytes() ([]byte, error) { @@ -318,19 +257,7 @@ return nil, err } - if err := s.tin.serialize(w); err != nil { - return nil, err - } - - if err := binary.Write(w, binary.LittleEndian, uint8(s.Entries)); err != nil { - return nil, err - } - - if err := s.serializeIndex(w); err != nil { - return nil, err - } - - if err := s.serializeBBoxes(w); err != nil { + if err := s.serializeV1(w); err != nil { return nil, err } diff -r e54635c20d43 -r b8da63027b48 pkg/mesh/tin.go --- a/pkg/mesh/tin.go Sat Feb 10 17:03:58 2024 +0100 +++ b/pkg/mesh/tin.go Sat Feb 10 22:22:03 2024 +0100 @@ -18,7 +18,6 @@ "encoding/binary" "errors" "fmt" - "io" "math" "gemma.intevation.de/gemma/pkg/log" @@ -207,67 +206,3 @@ } return t.FromWKB(data) } - -func (t *Tin) serialize(w io.Writer) error { - - if err := binary.Write(w, binary.LittleEndian, t.EPSG); err != nil { - return err - } - - if err := t.Min.Write(w); err != nil { - return err - } - if err := t.Max.Write(w); err != nil { - return err - } - - if err := binary.Write( - w, binary.LittleEndian, uint32(len(t.Vertices))); err != nil { - return err - } - - var err error - vwrite := func(v float64) { - if err == nil { - err = binary.Write(w, binary.LittleEndian, math.Float64bits(v)) - } - } - - for _, v := range t.Vertices { - vwrite(v.X) - vwrite(v.Y) - vwrite(v.Z) - } - - if err != nil { - return err - } - log.Infof("vertices %d (%d)\n", len(t.Vertices), len(t.Vertices)*3*8) - - if err := binary.Write( - w, binary.LittleEndian, uint32(len(t.Triangles))); err != nil { - return err - } - - var buf [binary.MaxVarintLen32]byte - var written int - var last int32 - for _, triangle := range t.Triangles { - for _, idx := range triangle { - value := idx - last - n := binary.PutVarint(buf[:], int64(value)) - for p := buf[:n]; len(p) > 0; p = p[n:] { - var err error - if n, err = w.Write(p); err != nil { - return err - } - written += n - } - last = idx - } - } - log.Infof("compressed tin indices in bytes: %d (%d)\n", - written, 3*4*len(t.Triangles)) - - return nil -}