Mercurial > gemma
comparison cmd/tin2octree/builder.go @ 729:b0bd242ff821
Removed vertex duplicate.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Sat, 22 Sep 2018 22:14:31 +0200 |
parents | b17e3ce53285 |
children |
comparison
equal
deleted
inserted
replaced
728:e9d37300ce99 | 729:b0bd242ff821 |
---|---|
2 | 2 |
3 import ( | 3 import ( |
4 "encoding/binary" | 4 "encoding/binary" |
5 "io" | 5 "io" |
6 "log" | 6 "log" |
7 | |
8 "gemma.intevation.de/gemma/pkg/octree" | |
7 ) | 9 ) |
8 | 10 |
9 type treeBuilder struct { | 11 type treeBuilder struct { |
10 t *tin | 12 t *tin |
11 nodes int | 13 nodes int |
12 leaves int | 14 leaves int |
13 index []int32 | 15 index []int32 |
14 } | 16 } |
15 | 17 |
16 var cubes = [8][2]vertex{ | 18 var cubes = [8][2]octree.Vertex{ |
17 makeCube(0), | 19 makeCube(0), |
18 makeCube(1), | 20 makeCube(1), |
19 makeCube(2), | 21 makeCube(2), |
20 makeCube(3), | 22 makeCube(3), |
21 makeCube(4), | 23 makeCube(4), |
22 makeCube(5), | 24 makeCube(5), |
23 makeCube(6), | 25 makeCube(6), |
24 makeCube(7), | 26 makeCube(7), |
25 } | 27 } |
26 | 28 |
27 func makeCube(i int) [2]vertex { | 29 func makeCube(i int) [2]octree.Vertex { |
28 var d vertex | 30 var d octree.Vertex |
29 if i&1 == 1 { | 31 if i&1 == 1 { |
30 d.x = 0.5 | 32 d.X = 0.5 |
31 } | 33 } |
32 if i&2 == 2 { | 34 if i&2 == 2 { |
33 d.y = 0.5 | 35 d.Y = 0.5 |
34 } | 36 } |
35 if i&4 == 4 { | 37 if i&4 == 4 { |
36 d.z = 0.5 | 38 d.Z = 0.5 |
37 } | 39 } |
38 return [2]vertex{ | 40 return [2]octree.Vertex{ |
39 vertex{0.0, 0.0, 0.0}.add(d), | 41 octree.Vertex{0.0, 0.0, 0.0}.Add(d), |
40 vertex{0.5, 0.5, 0.5}.add(d), | 42 octree.Vertex{0.5, 0.5, 0.5}.Add(d), |
41 } | 43 } |
42 } | 44 } |
43 | 45 |
44 func (tb *treeBuilder) build() { | 46 func (tb *treeBuilder) build() { |
45 | 47 |
58 tb.nodes, tb.leaves, tb.index[0]) | 60 tb.nodes, tb.leaves, tb.index[0]) |
59 } | 61 } |
60 | 62 |
61 func (tb *treeBuilder) buildRecursive( | 63 func (tb *treeBuilder) buildRecursive( |
62 triangles []int32, | 64 triangles []int32, |
63 min, max vertex, | 65 min, max octree.Vertex, |
64 depth int, | 66 depth int, |
65 ) int32 { | 67 ) int32 { |
66 if len(triangles) <= 16 || depth > 8 { | 68 if len(triangles) <= 16 || depth > 8 { |
67 pos := len(tb.index) | 69 pos := len(tb.index) |
68 tb.index = append(tb.index, int32(len(triangles))) | 70 tb.index = append(tb.index, int32(len(triangles))) |
75 pos := len(tb.index) | 77 pos := len(tb.index) |
76 tb.index = append(tb.index, | 78 tb.index = append(tb.index, |
77 0, 0, 0, 0, | 79 0, 0, 0, 0, |
78 0, 0, 0, 0) | 80 0, 0, 0, 0) |
79 | 81 |
80 bbox := interpolate(min, max) | 82 bbox := octree.Interpolate(min, max) |
81 | 83 |
82 bboxes := make([][2]vertex, len(cubes)) | 84 bboxes := make([][2]octree.Vertex, len(cubes)) |
83 | 85 |
84 for i := range cubes { | 86 for i := range cubes { |
85 bboxes[i] = [2]vertex{ | 87 bboxes[i] = [2]octree.Vertex{ |
86 bbox(cubes[i][0]), | 88 bbox(cubes[i][0]), |
87 bbox(cubes[i][1]), | 89 bbox(cubes[i][1]), |
88 } | 90 } |
89 } | 91 } |
90 | 92 |
95 v0 := tb.t.vertices[triangle[0]] | 97 v0 := tb.t.vertices[triangle[0]] |
96 v1 := tb.t.vertices[triangle[1]] | 98 v1 := tb.t.vertices[triangle[1]] |
97 v2 := tb.t.vertices[triangle[2]] | 99 v2 := tb.t.vertices[triangle[2]] |
98 | 100 |
99 l := v0 | 101 l := v0 |
100 l.minimize(v1) | 102 l.Minimize(v1) |
101 l.minimize(v2) | 103 l.Minimize(v2) |
102 | 104 |
103 h := v0 | 105 h := v0 |
104 h.maximize(v1) | 106 h.Maximize(v1) |
105 h.maximize(v2) | 107 h.Maximize(v2) |
106 | 108 |
107 for i := range bboxes { | 109 for i := range bboxes { |
108 if !(h.less(bboxes[i][0]) || bboxes[i][1].less(l)) { | 110 if !(h.Less(bboxes[i][0]) || bboxes[i][1].Less(l)) { |
109 quandrants[i] = append(quandrants[i], tri) | 111 quandrants[i] = append(quandrants[i], tri) |
110 } | 112 } |
111 } | 113 } |
112 } | 114 } |
113 | 115 |