Subversion Repositories gelsvn

Rev

Rev 309 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 309 Rev 595
Line -... Line 1...
-
 
1
/* ----------------------------------------------------------------------- *
-
 
2
 * This file is part of GEL, http://www.imm.dtu.dk/GEL
-
 
3
 * Copyright (C) the authors and DTU Informatics
-
 
4
 * For license and list of authors, see ../../doc/intro.pdf
-
 
5
 * ----------------------------------------------------------------------- */
-
 
6
 
1
#include "build_bbtree.h"
7
#include "build_bbtree.h"
2
#include "HMesh/VertexCirculator.h"
-
 
3
#include "HMesh/FaceCirculator.h"
-
 
4
 
8
 
-
 
9
#include <HMesh/Manifold.h>
5
 
10
 
6
using namespace CGLA;
11
using namespace CGLA;
7
using namespace std;
12
using namespace std;
8
using namespace HMesh;
13
using namespace HMesh;
9
 
14
 
10
namespace
15
namespace
11
{
16
{
12
	const float EDGE_MIN_SQ_LENGTH = CGLA::MINUTE;
17
    const float EDGE_MIN_SQ_LENGTH = CGLA::MINUTE;
13
	
18
 
14
	inline bool degenerate_edge(HalfEdgeIter he)
19
    inline bool degenerate_edge(const Manifold& m, HalfEdgeID h)
15
	{
20
    {
-
 
21
		Walker w = m.walker(h);
16
		if(sqr_length(he->vert->pos-he->opp->vert->pos)<1e-8)
22
        if(sqr_length(m.pos(w.vertex()) - m.pos(w.opp().vertex())) < 1e-8)
17
			return true;
23
            return true;
18
		return false;
24
        return false;
19
	}
25
    }
20
 
26
 
21
}
27
}
Line 24... Line 30...
24
{
30
{
25
 
31
 
26
template<class BBTree>
32
    template<class BBTree>
27
void build_tree_robust(Manifold& m, BBTree& tree)
33
    void build_tree_robust(Manifold& m, BBTree& tree)
28
{
34
    {
29
#ifdef COMPUTE_SIGN
-
 
30
	vector<Vec3f> face_normals(m.no_faces());
-
 
31
	
-
 
32
	int i=0;
-
 
33
	for(FaceIter fi=m.faces_begin(); fi != m.faces_end();++fi,++i)
-
 
34
		{
-
 
35
			face_normals[i] = normal(fi);
-
 
36
			fi->touched = i;
-
 
37
		}
-
 
38
	
-
 
39
	for(HalfEdgeIter ei=m.halfedges_begin(); ei != m.halfedges_end();++ei)
-
 
40
		ei->touched = -1;
-
 
41
	
-
 
42
	i=0;
-
 
43
	vector<Vec3f> edge_normals(0);
-
 
44
	for(HalfEdgeIter ei=m.halfedges_begin(); ei != m.halfedges_end();++ei)
-
 
45
		{
-
 
46
			if(ei->touched == -1)
-
 
47
				{
-
 
48
					Vec3f n_a = face_normals[ei->face->touched];
-
 
49
					Vec3f n_b = n_a;
-
 
50
					if(ei->opp->face != NULL_FACE_ITER)
-
 
51
						n_b = face_normals[ei->opp->face->touched];
-
 
52
 
-
 
53
					edge_normals.push_back(normalize(n_a+n_b));
-
 
54
					ei->touched = i;
-
 
55
					ei->opp->touched = i;
-
 
56
					++i;
-
 
57
				}
-
 
58
		}
-
 
59
 
-
 
60
	for(VertexIter vi=m.vertices_begin(); vi != m.vertices_end(); ++vi)
-
 
61
		vi->touched = -1;
-
 
62
 
-
 
63
	int vertex_cluster_number=0;
-
 
64
	vector<Vec3f> vertex_normals(m.no_vertices());
-
 
65
	for(VertexIter vi=m.vertices_begin(); vi != m.vertices_end(); ++vi)
-
 
66
		{
-
 
67
			if(vi->touched == -1)
-
 
68
				{
-
 
69
					int cluster_size=0;
-
 
70
					Vec3f nsum(0);
-
 
71
					vector<VertexIter> cluster(1,vi);
-
 
72
					while(!cluster.empty())
-
 
73
						{
-
 
74
							cluster_size ++;
-
 
75
							VertexIter vert_iter = cluster.back();
-
 
76
							cluster.pop_back();
-
 
77
							vert_iter->touched = vertex_cluster_number;
-
 
78
 
-
 
79
							vector<VertexIter> nbrs;
-
 
80
							VertexCirculator vc(vert_iter);
-
 
81
							for(;!vc.end();++vc)
-
 
82
								nbrs.push_back(vc.get_vertex());
-
 
83
					
-
 
84
							int N = vc.no_steps();
-
 
85
							Vec3f p = vert_iter->pos;
-
 
86
							for(int j=0;j<N;++j)
-
 
87
								{
-
 
88
									Vec3f va = nbrs[(j+1)%N]->pos - p;
-
 
89
									Vec3f vb = nbrs[j]->pos - p;
-
 
90
									if(sqr_length(vb) > EDGE_MIN_SQ_LENGTH)
-
 
91
										{
-
 
92
											if(sqr_length(va) > EDGE_MIN_SQ_LENGTH)
-
 
93
												{
-
 
94
													va.normalize();
-
 
95
													vb.normalize();
-
 
96
													float a = acos(dot(va,vb));
-
 
97
													nsum += a*normalize(cross(va,vb));
-
 
98
												}
-
 
99
										}
-
 
100
 									else
-
 
101
 										{
-
 
102
 											if(nbrs[j]->touched != vertex_cluster_number)
-
 
103
 												{
-
 
104
 													assert(nbrs[j]->touched == -1);
-
 
105
 													cluster.push_back(nbrs[j]);
-
 
106
 												}
-
 
107
 										}
-
 
108
								}
-
 
109
						}
-
 
110
					vertex_normals[vertex_cluster_number] = normalize(nsum);
-
 
111
					++vertex_cluster_number;
-
 
112
 					if(cluster_size > 1) cout << "Cluster Size " 
-
 
113
 																		<< cluster_size << " normal " 
-
 
114
																		<< normalize(nsum) << endl;
-
 
115
				}
-
 
116
		}
-
 
117
	
-
 
118
	vector<Triangle> triangle_vec;
35
        vector<Triangle> triangle_vec;
119
 
36
 
120
	i=0;
-
 
121
	for(FaceIter fi=m.faces_begin(); fi != m.faces_end();++fi,++i)
37
        for(FaceIDIterator fi=m.faces_begin(); fi != m.faces_end();++fi)
122
		{
38
        {
123
			Vec3f fn = face_normals[fi->touched];
39
            Vec3d face_normal = normal(m, *fi);
124
 
40
            
125
			FaceCirculator fc(fi);
41
            Walker w = m.walker(*fi);
126
 
42
 
127
			Vec3f v0,v1,v2;
43
            Vec3f v0,v1,v2;
128
			Vec3f vn0,vn1,vn2;
44
            Vec3f vn0,vn1,vn2;
129
			Vec3f en0,en1,en2;
45
            Vec3f en0,en1,en2;
130
			
46
 
131
			v0  = fc.get_vertex()->pos;
47
            v0  = Vec3f(m.pos(w.vertex()));
132
			vn0 = vertex_normals[fc.get_vertex()->touched];
48
            vn0 = Vec3f(normal(m, w.vertex()));
133
			en0 = edge_normals[fc.get_halfedge()->touched];
49
            en0 = Vec3f(normalize(face_normal + normal(m, w.next().opp().face())));
-
 
50
            
-
 
51
            w = w.next();
134
			
52
 
135
			++fc;
53
            v1  = Vec3f(m.pos(w.vertex()));
-
 
54
            vn1 = Vec3f(normal(m, w.vertex()));
-
 
55
            en1 = Vec3f(normalize(face_normal + normal(m, w.next().opp().face())));
136
 
56
 
137
			v1  = fc.get_vertex()->pos;
-
 
138
			vn1 = vertex_normals[fc.get_vertex()->touched];
-
 
139
			en1 = edge_normals[fc.get_halfedge()->touched];
-
 
140
			
57
            
141
			++fc;
58
            w = w.next();
142
 
59
 
143
			v2  = fc.get_vertex()->pos;
60
            v2  = Vec3f(m.pos(w.vertex()));
144
			vn2 = vertex_normals[fc.get_vertex()->touched];
61
            vn2 = Vec3f(normal(m, w.vertex()));
145
			en2 = edge_normals[fc.get_halfedge()->touched];
62
            en2 = Vec3f(normalize(face_normal + normal(m, w.next().opp().face())));
146
			
63
            
147
			if(sqr_length(v0-v1)>EDGE_MIN_SQ_LENGTH &&
64
            if(sqr_length(v0-v1)>EDGE_MIN_SQ_LENGTH &&
148
				 sqr_length(v1-v2)>EDGE_MIN_SQ_LENGTH &&
65
                sqr_length(v1-v2)>EDGE_MIN_SQ_LENGTH &&
149
				 sqr_length(v2-v0)>EDGE_MIN_SQ_LENGTH)
66
                sqr_length(v2-v0)>EDGE_MIN_SQ_LENGTH)
150
					triangle_vec.push_back(Triangle(v0,v1,v2,vn0,vn1,vn2,en0,en1,en2));
67
                triangle_vec.push_back(Triangle(v0,v1,v2,vn0,vn1,vn2,en0,en1,en2));
151
			else
68
            else
152
					cout << "Killing degenerate triangle" << endl;
69
                cout << "Killing degenerate triangle" << endl;
153
		}
70
        }
154
#else
-
 
155
	vector<Triangle> triangle_vec;
-
 
156
	int i=0;
-
 
157
	for(FaceIter fi=m.faces_begin(); fi != m.faces_end();++fi,++i)
-
 
158
		{
-
 
159
			FaceCirculator fc(fi);
-
 
160
			Vec3f v0,v1,v2;
-
 
161
			Vec3f dmy(0);
-
 
162
			v0  = fc.get_vertex()->get_pos();
-
 
163
			++fc;
-
 
164
			v1  = fc.get_vertex()->get_pos();
-
 
165
			++fc;
-
 
166
			v2  = fc.get_vertex()->get_pos();
-
 
167
			if(sqr_length(v0-v1)>EDGE_MIN_SQ_LENGTH &&
-
 
168
				 sqr_length(v1-v2)>EDGE_MIN_SQ_LENGTH &&
-
 
169
				 sqr_length(v2-v0)>EDGE_MIN_SQ_LENGTH)
-
 
170
					triangle_vec.push_back(Triangle(v0,v1,v2,dmy,dmy,dmy,dmy,dmy,dmy));
-
 
171
		}
-
 
172
#endif
-
 
173
 
71
 
174
	tree.build(triangle_vec);
72
        tree.build(triangle_vec);
175
}
73
    }
176
 
74
 
177
void build_OBBTree(HMesh::Manifold& m, OBBTree& tree)
75
    void build_OBBTree(HMesh::Manifold& m, OBBTree& tree)