comparison 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
comparison
equal deleted inserted replaced
726:5af9ab39e715 727:41c8dc61f38f
1 package octree
2
3 import (
4 "bufio"
5 "bytes"
6 "encoding/binary"
7 "log"
8 "os"
9
10 "github.com/golang/snappy"
11 )
12
13 func loadReader(r *bufio.Reader) (*Tree, error) {
14 tree := new(Tree)
15
16 if err := binary.Read(r, binary.LittleEndian, &tree.EPSG); err != nil {
17 return nil, err
18 }
19
20 log.Printf("EPSG: %d\n", tree.EPSG)
21
22 if err := tree.Min.read(r); err != nil {
23 return nil, err
24 }
25
26 if err := tree.Max.read(r); err != nil {
27 return nil, err
28 }
29
30 log.Printf("BBOX: [[%f, %f, %f], [%f, %f, %f]]\n",
31 tree.Min.X, tree.Min.Y, tree.Min.Z,
32 tree.Max.X, tree.Max.Y, tree.Max.Z)
33
34 var numVertices uint32
35 if err := binary.Read(r, binary.LittleEndian, &numVertices); err != nil {
36 return nil, err
37 }
38
39 log.Printf("vertices: %d\n", numVertices)
40
41 vertices := make([]Vertex, numVertices)
42 tree.vertices = vertices
43
44 for i := range vertices {
45 if err := vertices[i].read(r); err != nil {
46 return nil, err
47 }
48 }
49
50 var numTriangles uint32
51 if err := binary.Read(r, binary.LittleEndian, &numTriangles); err != nil {
52 return nil, err
53 }
54
55 log.Printf("triangles: %d\n", numTriangles)
56
57 indices := make([]int32, 3*numTriangles)
58 triangles := make([][]int32, numTriangles)
59 tree.triangles = triangles
60
61 var last int32
62
63 for i := range triangles {
64 tri := indices[:3]
65 indices = indices[3:]
66 triangles[i] = tri
67 for j := range tri {
68 v, err := binary.ReadVarint(r)
69 if err != nil {
70 return nil, err
71 }
72 value := int32(v) + last
73 tri[j] = value
74 last = value
75 }
76 }
77
78 var numNodes uint32
79 if err := binary.Read(r, binary.LittleEndian, &numNodes); err != nil {
80 return nil, err
81 }
82
83 log.Printf("num nodes: %d\n", numNodes)
84
85 tree.index = make([]int32, numNodes)
86 entries := tree.index[1:]
87
88 last = 0
89 for i := range entries {
90 v, err := binary.ReadVarint(r)
91 if err != nil {
92 return nil, err
93 }
94 value := int32(v) + last
95 entries[i] = value
96 last = value
97 }
98
99 return tree, nil
100 }
101
102 func LoadTree(fname string) (*Tree, error) {
103
104 f, err := os.Open(fname)
105 if err != nil {
106 return nil, err
107 }
108 defer f.Close()
109 return loadReader(
110 bufio.NewReader(
111 snappy.NewReader(f)))
112 }
113
114 func Deserialize(data []byte) (*Tree, error) {
115 return loadReader(
116 bufio.NewReader(
117 snappy.NewReader(
118 bytes.NewReader(data))))
119 }