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