Subversion Repositories gelsvn

Rev

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

Rev 136 Rev 178
Line 8... Line 8...
8
namespace HMesh
8
namespace HMesh
9
{
9
{
10
	using namespace std;
10
	using namespace std;
11
	using namespace CGLA;
11
	using namespace CGLA;
12
 
12
 
-
 
13
	void Manifold::remove_unused()
-
 
14
	{
-
 
15
    for(size_t i=0;i<unused_vertices.size(); ++i)
-
 
16
			vertex_db.erase(unused_vertices[i]);
-
 
17
 
-
 
18
    std::vector<VertexIter> vdummy(0);
-
 
19
    unused_vertices = vdummy;
-
 
20
 
-
 
21
    for(size_t i=0;i<unused_faces.size(); ++i)
-
 
22
			face_db.erase(unused_faces[i]);
-
 
23
 
-
 
24
    std::vector<FaceIter> fdummy(0);
-
 
25
    unused_faces = fdummy;
-
 
26
 
-
 
27
    for(size_t i=0;i<unused_halfedges.size(); ++i)
-
 
28
			halfedge_db.erase(unused_halfedges[i]);
-
 
29
 
-
 
30
    std::vector<HalfEdgeIter> hdummy(0);
-
 
31
    unused_halfedges = hdummy;
-
 
32
	}
-
 
33
	
-
 
34
	void Manifold::clear()
-
 
35
	{
-
 
36
		vertex_db.clear();
-
 
37
		face_db.clear();
-
 
38
		halfedge_db.clear();
-
 
39
 
-
 
40
		std::vector<VertexIter> vdummy(0);
-
 
41
		unused_vertices = vdummy;
-
 
42
					
-
 
43
		std::vector<FaceIter> fdummy(0);
-
 
44
		unused_faces = fdummy;
-
 
45
 
-
 
46
		std::vector<HalfEdgeIter> hdummy(0);
-
 
47
		unused_halfedges = hdummy;
-
 
48
	}
-
 
49
 
-
 
50
 
-
 
51
	void Manifold::erase_halfedge(HalfEdgeIter h)
-
 
52
	{
-
 
53
		if(erase_immediately)
-
 
54
			halfedge_db.erase(h);
-
 
55
		else
-
 
56
			{
-
 
57
				unused_halfedges.push_back(h);
-
 
58
				HalfEdge h_dummy;
-
 
59
				(*h) = h_dummy;
-
 
60
			}
-
 
61
	}
-
 
62
 
-
 
63
	void Manifold::erase_vertex(VertexIter v)
-
 
64
	{
-
 
65
		if(erase_immediately)
-
 
66
			vertex_db.erase(v);
-
 
67
		else
-
 
68
			{
-
 
69
				unused_vertices.push_back(v);
-
 
70
				Vertex v_dummy(v->pos);
-
 
71
				(*v) = v_dummy;
-
 
72
			}
-
 
73
	}
-
 
74
 
-
 
75
	void Manifold::erase_face(FaceIter f)
-
 
76
	{
-
 
77
		if(erase_immediately)
-
 
78
			face_db.erase(f);
-
 
79
		else
-
 
80
			{
-
 
81
				unused_faces.push_back(f);
-
 
82
				Face f_dummy;
-
 
83
				(*f) = f_dummy;
-
 
84
			}
-
 
85
	}
-
 
86
 
-
 
87
 
-
 
88
 
-
 
89
 
13
	void Manifold::get_bbox(Vec3f& pmin, Vec3f& pmax) 
90
	void Manifold::get_bbox(Vec3f& pmin, Vec3f& pmax)
14
	{
91
	{
15
		VertexIter vi = vertices_begin();
92
    VertexIter vi = vertices_begin();
16
		pmin = pmax = vi->pos;
93
    pmin = pmax = vi->pos;
17
		for(++vi;vi != vertices_end(); ++vi)
94
    for(++vi;vi != vertices_end(); ++vi)
Line 97... Line 174...
97
				check_boundary_consistency(v1);
174
        check_boundary_consistency(v1);
98
 
175
 
99
			}
176
			}
100
	}
177
	}
101
 
178
 
102
	bool Manifold::collapse_precond(VertexIter v1, HalfEdgeIter h)
179
	bool Manifold::collapse_precond(HalfEdgeIter h)
103
	{			
180
	{
-
 
181
    VertexIter v1 = h->opp->vert;
104
		VertexIter v2 = h->vert;
182
    VertexIter v2 = h->vert;
105
 
183
 
106
		std::vector<Vertex*> link1;
184
    std::vector<Vertex*> link1;
107
		VertexCirculator vc1(v1);
185
    VertexCirculator vc1(v1);
108
		for(;!vc1.end();++vc1)
186
    for(;!vc1.end();++vc1)
Line 171... Line 249...
171
		
249
 
172
		return true;
250
    return true;
173
	}
251
	}
174
 
252
 
175
 
253
 
176
 	void Manifold::collapse_halfedge(VertexIter v, HalfEdgeIter h, 
254
	void Manifold::collapse_halfedge(HalfEdgeIter h, bool avg_vertices)
177
																	 bool avg_vertices)
-
 
178
	{
255
	{
-
 
256
    VertexIter v = h->opp->vert;
179
		HalfEdgeIter ho = h->opp;
257
    HalfEdgeIter ho = h->opp;
180
		VertexIter n = h->vert;
258
    VertexIter n = h->vert;
181
 
259
 
182
		if(avg_vertices)
260
    if(avg_vertices)
183
			n->pos = ((v->pos + n->pos) / 2.0f);
261
			n->pos = ((v->pos + n->pos) / 2.0f);
Line 267... Line 345...
267
								return false;
345
                return false;
268
							}
346
							}
269
					}
347
					}
270
				if(link.size()==2)
348
        if(link.size()==2)
271
					{
349
					{
-
 
350
						if(!is_boundary(vi))
272
						cout << "Warning: A vertex with only two incident edges" << endl;
351
							cout << "Warning: A vertex with only two incident edges" << endl;
-
 
352
						else
-
 
353
							cout << "Comment: A boundary vertex with only two incident edges" << endl;
273
					}
354
					}
274
				assert(link.size()>=2);
355
        assert(link.size()>=2);
275
				++vi;
356
        ++vi;
276
			}
357
			}
277
 
358
 
Line 432... Line 513...
432
	}
513
	}
433
 
514
 
434
 
515
 
435
	VertexIter Manifold::safe_triangulate(FaceIter f)
516
	VertexIter Manifold::safe_triangulate(FaceIter f)
436
	{
517
	{
437
		Vec3f p;
518
    Vec3f p(0.0f);
438
		FaceCirculator fc(f);
519
    FaceCirculator fc(f);
439
		for(;!fc.end(); ++fc)
520
    for(;!fc.end(); ++fc)
440
			p += fc.get_vertex()->pos;
521
			p += fc.get_vertex()->pos;
441
		int n = fc.no_steps();
522
    int n = fc.no_steps();
442
		p /= n;
523
    p /= n;