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")
 }