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