diff pkg/octree/loader.go @ 727:41c8dc61f38f

Moved octree loading stuff to octree package.
author Sascha L. Teichmann <teichmann@intevation.de>
date Sat, 22 Sep 2018 21:57:30 +0200
parents cmd/octree2contour/loader.go@5af9ab39e715
children b0bd242ff821
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pkg/octree/loader.go	Sat Sep 22 21:57:30 2018 +0200
@@ -0,0 +1,119 @@
+package octree
+
+import (
+	"bufio"
+	"bytes"
+	"encoding/binary"
+	"log"
+	"os"
+
+	"github.com/golang/snappy"
+)
+
+func loadReader(r *bufio.Reader) (*Tree, error) {
+	tree := new(Tree)
+
+	if err := binary.Read(r, binary.LittleEndian, &tree.EPSG); err != nil {
+		return nil, err
+	}
+
+	log.Printf("EPSG: %d\n", tree.EPSG)
+
+	if err := tree.Min.read(r); err != nil {
+		return nil, err
+	}
+
+	if err := tree.Max.read(r); err != nil {
+		return nil, err
+	}
+
+	log.Printf("BBOX: [[%f, %f, %f], [%f, %f, %f]]\n",
+		tree.Min.X, tree.Min.Y, tree.Min.Z,
+		tree.Max.X, tree.Max.Y, tree.Max.Z)
+
+	var numVertices uint32
+	if err := binary.Read(r, binary.LittleEndian, &numVertices); err != nil {
+		return nil, err
+	}
+
+	log.Printf("vertices: %d\n", numVertices)
+
+	vertices := make([]Vertex, numVertices)
+	tree.vertices = vertices
+
+	for i := range vertices {
+		if err := vertices[i].read(r); err != nil {
+			return nil, err
+		}
+	}
+
+	var numTriangles uint32
+	if err := binary.Read(r, binary.LittleEndian, &numTriangles); err != nil {
+		return nil, err
+	}
+
+	log.Printf("triangles: %d\n", numTriangles)
+
+	indices := make([]int32, 3*numTriangles)
+	triangles := make([][]int32, numTriangles)
+	tree.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 nil, err
+			}
+			value := int32(v) + last
+			tri[j] = value
+			last = value
+		}
+	}
+
+	var numNodes uint32
+	if err := binary.Read(r, binary.LittleEndian, &numNodes); err != nil {
+		return nil, err
+	}
+
+	log.Printf("num nodes: %d\n", numNodes)
+
+	tree.index = make([]int32, numNodes)
+	entries := tree.index[1:]
+
+	last = 0
+	for i := range entries {
+		v, err := binary.ReadVarint(r)
+		if err != nil {
+			return nil, err
+		}
+		value := int32(v) + last
+		entries[i] = value
+		last = value
+	}
+
+	return tree, nil
+}
+
+func LoadTree(fname string) (*Tree, error) {
+
+	f, err := os.Open(fname)
+	if err != nil {
+		return nil, err
+	}
+	defer f.Close()
+	return loadReader(
+		bufio.NewReader(
+			snappy.NewReader(f)))
+}
+
+func Deserialize(data []byte) (*Tree, error) {
+	return loadReader(
+		bufio.NewReader(
+			snappy.NewReader(
+				bytes.NewReader(data))))
+}