Mercurial > gemma
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)))) +}