# HG changeset patch # User Sascha L. Teichmann # Date 1707738487 -3600 # Node ID 9d2e742251044d971898f680503fe22ad2e677f1 # Parent da9720b4aa42e571ebf135038edeedbafd3c4160 Some refactoring to clean up deserialization. diff -r da9720b4aa42 -r 9d2e74225104 pkg/mesh/meshserialize.go --- a/pkg/mesh/meshserialize.go Mon Feb 12 10:49:20 2024 +0100 +++ b/pkg/mesh/meshserialize.go Mon Feb 12 12:48:07 2024 +0100 @@ -20,6 +20,8 @@ "encoding/binary" "fmt" "io" + + "gemma.intevation.de/gemma/pkg/log" ) const Version = 1 @@ -116,6 +118,21 @@ } } +// deserializer is a generic function to apply a chain of +// deserializer function to an object given a reader. +func deserializer[T any]( + r *bufio.Reader, + t T, + fns ...func(T, *bufio.Reader) error, +) error { + for _, fn := range fns { + if err := fn(t, r); err != nil { + return err + } + } + return nil +} + func (s *STRTree) serializeEntries(w io.Writer) error { return binary.Write(w, binary.LittleEndian, uint8(s.Entries)) } @@ -135,3 +152,28 @@ } return t.Max.Write(w) } + +func (t *Tin) deserializeExtent(r *bufio.Reader) error { + if err := t.Min.Read(r); err != nil { + return err + } + if err := t.Max.Read(r); err != nil { + return err + } + log.Infof("BBOX: [[%f, %f, %f], [%f, %f, %f]]\n", + t.Min.X, t.Min.Y, t.Min.Z, + t.Max.X, t.Max.Y, t.Max.Z) + return nil +} + +func (t *Tin) serializeEPSG(w io.Writer) error { + return binary.Write(w, binary.LittleEndian, t.EPSG) +} + +func (t *Tin) deserializeEPSG(r *bufio.Reader) error { + if err := binary.Read(r, binary.LittleEndian, &t.EPSG); err != nil { + return err + } + log.Infof("EPSG: %d\n", t.EPSG) + return nil +} diff -r da9720b4aa42 -r 9d2e74225104 pkg/mesh/meshserialize_v1.go --- a/pkg/mesh/meshserialize_v1.go Mon Feb 12 10:49:20 2024 +0100 +++ b/pkg/mesh/meshserialize_v1.go Mon Feb 12 12:48:07 2024 +0100 @@ -93,7 +93,7 @@ } func (t *Tin) serializeV1(w io.Writer) error { - if err := binary.Write(w, binary.LittleEndian, t.EPSG); err != nil { + if err := t.serializeEPSG(w); err != nil { return err } if err := t.serializeExtent(w); err != nil { @@ -102,14 +102,14 @@ if err := t.serializeVerticesV1(w); err != nil { return err } + return t.serializeTrianglesV1(w) +} + +func (t *Tin) serializeTrianglesV1(w io.Writer) error { if err := binary.Write( w, binary.LittleEndian, uint32(len(t.Triangles))); 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 @@ -137,20 +137,17 @@ 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 } @@ -158,31 +155,34 @@ return nil } +func (s *STRTree) deserializeV1(r *bufio.Reader) error { + return deserializer(r, s, + (*STRTree).deserializeTinV1, + (*STRTree).deserializeEntries, + (*STRTree).deserializeIndexV1, + (*STRTree).deserializeBBoxesV1, + ) +} + func (s *STRTree) deserializeBBoxesV1(r *bufio.Reader) error { - var numBBoxes int32 if err := binary.Read(r, binary.LittleEndian, &numBBoxes); err != nil { return err } - bboxes := make([]Box2D, numBBoxes) s.bboxes = bboxes - var err error - read := func(v *float64) { if err == nil { err = binary.Read(r, binary.LittleEndian, v) } } - for i := range bboxes { read(&bboxes[i].X1) read(&bboxes[i].Y1) read(&bboxes[i].X2) read(&bboxes[i].Y2) } - return err } @@ -193,7 +193,6 @@ } index := make([]int32, numIndex) s.index = index - var last int32 for i := range index { v, err := binary.ReadVarint(r) @@ -204,74 +203,50 @@ index[i] = value last = value } - return nil } -func (s *STRTree) deserializeV1(r *bufio.Reader) error { +func (s *STRTree) deserializeTinV1(r *bufio.Reader) error { s.tin = new(Tin) - if err := s.tin.deserializeV1(r); err != nil { - return err - } - if err := s.deserializeEntries(r); err != nil { - return err - } - if err := s.deserializeIndexV1(r); err != nil { - return err - } - return s.deserializeBBoxesV1(r) + return s.tin.deserializeV1(r) } // deserializeV1 restores a TIN from a binary representation. func (t *Tin) deserializeV1(r *bufio.Reader) error { - - if err := binary.Read(r, binary.LittleEndian, &t.EPSG); err != nil { - return err - } - - log.Infof("EPSG: %d\n", t.EPSG) + return deserializer(r, t, + (*Tin).deserializeEPSG, + (*Tin).deserializeExtent, + (*Tin).deserializeVerticesV1, + (*Tin).deserializeTrianglesV1, + ) +} - if err := t.Min.Read(r); err != nil { - return err - } - - if err := t.Max.Read(r); err != nil { - return err - } - - log.Infof("BBOX: [[%f, %f, %f], [%f, %f, %f]]\n", - t.Min.X, t.Min.Y, t.Min.Z, - t.Max.X, t.Max.Y, t.Max.Z) - +func (t *Tin) deserializeVerticesV1(r *bufio.Reader) error { var numVertices uint32 if err := binary.Read(r, binary.LittleEndian, &numVertices); err != nil { return err } - log.Infof("vertices: %d\n", numVertices) - vertices := make([]Vertex, numVertices) t.Vertices = vertices - for i := range vertices { if err := vertices[i].Read(r); err != nil { return err } } + return nil +} +func (t *Tin) deserializeTrianglesV1(r *bufio.Reader) error { var numTriangles uint32 if err := binary.Read(r, binary.LittleEndian, &numTriangles); err != nil { return err } - log.Infof("triangles: %d\n", numTriangles) - indices := make([]int32, 3*numTriangles) triangles := make([][]int32, numTriangles) t.Triangles = triangles - var last int32 - for i := range triangles { tri := indices[:3] indices = indices[3:] @@ -286,6 +261,5 @@ last = value } } - return nil } diff -r da9720b4aa42 -r 9d2e74225104 pkg/mesh/meshserialize_v2.go --- a/pkg/mesh/meshserialize_v2.go Mon Feb 12 10:49:20 2024 +0100 +++ b/pkg/mesh/meshserialize_v2.go Mon Feb 12 12:48:07 2024 +0100 @@ -55,7 +55,7 @@ } func (t *Tin) serializeV2(w io.Writer) error { - if err := binary.Write(w, binary.LittleEndian, t.EPSG); err != nil { + if err := t.serializeEPSG(w); err != nil { return err } if err := t.serializeExtent(w); err != nil { @@ -162,17 +162,17 @@ func (s *STRTree) deserializeV2(r *bufio.Reader) error { // The header is already skipped here. + return deserializer(r, s, + (*STRTree).deserializeTinV2, + (*STRTree).deserializeEntries, + (*STRTree).deserializeIndexV2, + (*STRTree).deserializeBBoxesV2, + ) +} + +func (s *STRTree) deserializeTinV2(r *bufio.Reader) error { 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) + return s.tin.deserializeV2(r) } func (s *STRTree) deserializeBBoxesV2(r *bufio.Reader) error { @@ -186,6 +186,20 @@ } func (t *Tin) deserializeV2(r *bufio.Reader) error { + return deserializer(r, t, + (*Tin).deserializeEPSG, + (*Tin).deserializeExtent, + (*Tin).deserializeVerticesV2, + (*Tin).deserializeTrianglesV2, + ) +} + +func (t *Tin) deserializeVerticesV2(r *bufio.Reader) error { + // TODO: implement me! + return errors.New("not implemented, yet") +} + +func (t *Tin) deserializeTrianglesV2(r *bufio.Reader) error { // TODO: implement me! return errors.New("not implemented, yet") }