diff pkg/mesh/serialize_v1.go @ 5676:d56e043bbbca sr-v2

More code moving.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Sun, 11 Feb 2024 09:49:25 +0100
parents b8da63027b48
children
line wrap: on
line diff
--- a/pkg/mesh/serialize_v1.go	Sat Feb 10 22:22:03 2024 +0100
+++ b/pkg/mesh/serialize_v1.go	Sun Feb 11 09:49:25 2024 +0100
@@ -14,6 +14,7 @@
 package mesh
 
 import (
+	"bufio"
 	"encoding/binary"
 	"io"
 	"math"
@@ -161,3 +162,139 @@
 
 	return nil
 }
+
+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
+}
+
+func (s *STRTree) deserializeIndexV1(r *bufio.Reader) error {
+	var numIndex int32
+	if err := binary.Read(r, binary.LittleEndian, &numIndex); err != nil {
+		return err
+	}
+	index := make([]int32, numIndex)
+	s.index = index
+
+	var last int32
+	for i := range index {
+		v, err := binary.ReadVarint(r)
+		if err != nil {
+			return err
+		}
+		value := int32(v) + last
+		index[i] = value
+		last = value
+	}
+
+	return nil
+}
+
+func (s *STRTree) deserializeV1(r *bufio.Reader) error {
+	s.tin = new(Tin)
+	if err := s.tin.deserializeV1(r); err != nil {
+		return err
+	}
+	var numEntries uint8
+	if err := binary.Read(r, binary.LittleEndian, &numEntries); err != nil {
+		return err
+	}
+	s.Entries = int(numEntries)
+
+	if err := s.deserializeIndexV1(r); err != nil {
+		return err
+	}
+
+	return s.deserializeBBoxesV1(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)
+
+	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)
+
+	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
+		}
+	}
+
+	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:]
+		triangles[i] = tri
+		for j := range tri {
+			v, err := binary.ReadVarint(r)
+			if err != nil {
+				return err
+			}
+			value := int32(v) + last
+			tri[j] = value
+			last = value
+		}
+	}
+
+	return nil
+}