Mercurial > gemma
changeset 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 | a57be8bfb6ea |
files | pkg/mesh/loader.go pkg/mesh/serialize_v1.go pkg/mesh/strtree.go |
diffstat | 3 files changed, 157 insertions(+), 160 deletions(-) [+] |
line wrap: on
line diff
--- a/pkg/mesh/loader.go Sat Feb 10 22:22:03 2024 +0100 +++ b/pkg/mesh/loader.go Sun Feb 11 09:49:25 2024 +0100 @@ -20,60 +20,37 @@ "encoding/binary" "errors" "fmt" - - "gemma.intevation.de/gemma/pkg/log" ) const magicHeader = "SR3D" -func (s *STRTree) deserializeIndex(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 +// Bytes serializes this tree to a byte slice. +func (s *STRTree) Bytes() ([]byte, error) { - 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 + var buf bytes.Buffer + w, err := gzip.NewWriterLevel(&buf, gzip.BestSpeed) + if err != nil { + return nil, err } - return nil + if err := s.serializeV1(w); err != nil { + return nil, err + } + + if err := w.Close(); err != nil { + return nil, err + } + + return buf.Bytes(), nil } -func (s *STRTree) deserializeBBoxes(r *bufio.Reader) error { - - var numBBoxes int32 - if err := binary.Read(r, binary.LittleEndian, &numBBoxes); err != nil { +// FromBytes restores a STRTree from a binary representation. +func (s *STRTree) FromBytes(data []byte, version *int64) error { + r, err := gzip.NewReader(bytes.NewReader(data)) + if 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 + return s.deserialize(bufio.NewReader(r), version) } func (s *STRTree) deserialize(r *bufio.Reader, version *int64) error { @@ -102,98 +79,3 @@ // TODO: Implement me! return errors.New("not implemented, yet") } - -func (s *STRTree) deserializeV1(r *bufio.Reader) error { - s.tin = new(Tin) - if err := s.tin.Deserialize(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.deserializeIndex(r); err != nil { - return err - } - - return s.deserializeBBoxes(r) -} - -// FromBytes restores a STRTree from a binary representation. -func (s *STRTree) FromBytes(data []byte, version *int64) error { - r, err := gzip.NewReader(bytes.NewReader(data)) - if err != nil { - return err - } - return s.deserialize(bufio.NewReader(r), version) -} - -// Deserialize restores a TIN from a binary representation. -func (t *Tin) Deserialize(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 -}
--- 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 +}
--- a/pkg/mesh/strtree.go Sat Feb 10 22:22:03 2024 +0100 +++ b/pkg/mesh/strtree.go Sun Feb 11 09:49:25 2024 +0100 @@ -14,8 +14,6 @@ package mesh import ( - "bytes" - "compress/gzip" "math" "sort" ) @@ -248,26 +246,6 @@ return removed } -// Bytes serializes this tree to a byte slice. -func (s *STRTree) Bytes() ([]byte, error) { - - var buf bytes.Buffer - w, err := gzip.NewWriterLevel(&buf, gzip.BestSpeed) - if err != nil { - return nil, err - } - - if err := s.serializeV1(w); err != nil { - return nil, err - } - - if err := w.Close(); err != nil { - return nil, err - } - - return buf.Bytes(), nil -} - func (s *STRTree) allTriangles(pos int32, tris map[int32]struct{}) { stack := []int32{pos} for len(stack) > 0 {