Mercurial > gemma
view pkg/octree/loader.go @ 844:c2cba785ca4d
WIP Fairwayprofile
author | Thomas Junk <thomas.junk@intevation.de> |
---|---|
date | Fri, 28 Sep 2018 11:40:28 +0200 |
parents | b0bd242ff821 |
children | a244b18cb916 |
line wrap: on
line source
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)))) }