diff 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
line wrap: on
line diff
--- 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
 }