Mercurial > gemma
changeset 5690:da9720b4aa42 sr-v2
More stubs and refactoring to deserialize v2 meshes.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 12 Feb 2024 10:49:20 +0100 |
parents | 159291854063 |
children | 9d2e74225104 |
files | pkg/mesh/meshserialize.go pkg/mesh/meshserialize_v1.go pkg/mesh/meshserialize_v2.go |
diffstat | 3 files changed, 85 insertions(+), 43 deletions(-) [+] |
line wrap: on
line diff
--- a/pkg/mesh/meshserialize.go Mon Feb 12 03:02:14 2024 +0100 +++ b/pkg/mesh/meshserialize.go Mon Feb 12 10:49:20 2024 +0100 @@ -115,3 +115,23 @@ return fmt.Errorf("cannot deserialize mesh version %d", version) } } + +func (s *STRTree) serializeEntries(w io.Writer) error { + return binary.Write(w, binary.LittleEndian, uint8(s.Entries)) +} + +func (s *STRTree) deserializeEntries(r *bufio.Reader) error { + var numEntries uint8 + if err := binary.Read(r, binary.LittleEndian, &numEntries); err != nil { + return err + } + s.Entries = int(numEntries) + return nil +} + +func (t *Tin) serializeExtent(w io.Writer) error { + if err := t.Min.Write(w); err != nil { + return err + } + return t.Max.Write(w) +}
--- a/pkg/mesh/meshserialize_v1.go Mon Feb 12 03:02:14 2024 +0100 +++ b/pkg/mesh/meshserialize_v1.go Mon Feb 12 10:49:20 2024 +0100 @@ -26,7 +26,7 @@ if err := s.tin.serializeV1(w); err != nil { return err } - if err := binary.Write(w, binary.LittleEndian, uint8(s.Entries)); err != nil { + if err := s.serializeEntries(w); err != nil { return err } if err := s.serializeIndexV1(w); err != nil { @@ -93,18 +93,46 @@ } 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 { + if err := t.serializeExtent(w); err != nil { + return err + } + if err := t.serializeVerticesV1(w); err != nil { + return err + } + if err := binary.Write( + w, binary.LittleEndian, uint32(len(t.Triangles))); err != nil { return err } - if err := t.Max.Write(w); err != nil { - return err + return t.serializeTrianglesV1(w) +} + +func (t *Tin) serializeTrianglesV1(w io.Writer) error { + 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 +} +func (t *Tin) serializeVerticesV1(w io.Writer) error { if err := binary.Write( w, binary.LittleEndian, uint32(len(t.Vertices))); err != nil { return err @@ -127,32 +155,6 @@ 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 } @@ -211,16 +213,12 @@ if err := s.tin.deserializeV1(r); err != nil { return err } - var numEntries uint8 - if err := binary.Read(r, binary.LittleEndian, &numEntries); err != nil { + if err := s.deserializeEntries(r); err != nil { return err } - s.Entries = int(numEntries) - if err := s.deserializeIndexV1(r); err != nil { return err } - return s.deserializeBBoxesV1(r) }
--- a/pkg/mesh/meshserialize_v2.go Mon Feb 12 03:02:14 2024 +0100 +++ b/pkg/mesh/meshserialize_v2.go Mon Feb 12 10:49:20 2024 +0100 @@ -28,7 +28,8 @@ const quantScale = 1_000 -func quant(x float64) int64 { return int64(math.Round(x * quantScale)) } +func quant(x float64) int64 { return int64(math.Round(x * quantScale)) } +func unquant(x int64) float64 { return float64(x) / quantScale } func (s *STRTree) serializeV2(w io.Writer) error { // Write header @@ -39,11 +40,12 @@ if err := binary.Write(w, binary.LittleEndian, uint32(2)); err != nil { return err } + // Write the mesh itself if err := s.tin.serializeV2(w); err != nil { return err } - if err := binary.Write(w, binary.LittleEndian, uint8(s.Entries)); err != nil { + if err := s.serializeEntries(w); err != nil { return err } if err := s.serializeIndexV2(w); err != nil { @@ -56,10 +58,7 @@ 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 { + if err := t.serializeExtent(w); err != nil { return err } if err := t.serializeVerticesV2(w); err != nil { @@ -162,6 +161,31 @@ } func (s *STRTree) deserializeV2(r *bufio.Reader) error { + // The header is already skipped here. + s.tin = new(Tin) + if err := s.tin.deserializeV2(r); err != nil { + return err + } + if err := s.deserializeEntries(r); err != nil { + return err + } + if err := s.deserializeIndexV2(r); err != nil { + return err + } + return s.deserializeBBoxesV2(r) +} + +func (s *STRTree) deserializeBBoxesV2(r *bufio.Reader) error { + // TODO: implement me! + return errors.New("not implemented, yet") +} + +func (s *STRTree) deserializeIndexV2(r *bufio.Reader) error { + // TODO: implement me! + return errors.New("not implemented, yet") +} + +func (t *Tin) deserializeV2(r *bufio.Reader) error { // TODO: implement me! return errors.New("not implemented, yet") }