Mercurial > gemma
diff cmd/octree2contour/loader.go @ 674:120a82bd9953 octree
octree: Added loading frame for contour generation.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Wed, 19 Sep 2018 13:26:30 +0200 |
parents | |
children | 7bb961d750b6 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cmd/octree2contour/loader.go Wed Sep 19 13:26:30 2018 +0200 @@ -0,0 +1,139 @@ +package main + +import ( + "bufio" + "encoding/binary" + "io" + "log" + "math" + "os" + + "github.com/golang/snappy" +) + +type octree struct { + epsg uint32 + + vertices []vertex + triangles [][]int32 + index []int32 + + min vertex + max vertex +} + +func (v *vertex) read(r io.Reader) error { + var buf [8]byte + b := buf[:] + if _, err := io.ReadFull(r, b); err != nil { + return nil + } + v.x = math.Float64frombits(binary.LittleEndian.Uint64(b)) + if _, err := io.ReadFull(r, b); err != nil { + return nil + } + v.y = math.Float64frombits(binary.LittleEndian.Uint64(b)) + if _, err := io.ReadFull(r, b); err != nil { + return nil + } + v.z = math.Float64frombits(binary.LittleEndian.Uint64(b)) + return nil +} + +type byteReader interface { + io.ByteReader + io.Reader +} + +func loadOctreeReader(r byteReader) (*octree, error) { + tree := new(octree) + + if err := binary.Read(r, binary.LittleEndian, &tree.epsg); err != nil { + return nil, err + } + + if err := tree.min.read(r); err != nil { + return nil, err + } + + if err := tree.max.read(r); err != nil { + return nil, err + } + + 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 loadOctree(fname string) (*octree, error) { + + f, err := os.Open(fname) + if err != nil { + return nil, err + } + defer f.Close() + return loadOctreeReader(bufio.NewReader(snappy.NewReader(f))) +}