Subversion Repositories gelsvn

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
667 khor 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
 
7
#include "build_bbtree.h"
8
 
9
#include "../HMesh/Manifold.h"
10
 
11
using namespace CGLA;
12
using namespace std;
13
using namespace HMesh;
14
 
15
namespace
16
{
17
    const float EDGE_MIN_SQ_LENGTH = CGLA::MINUTE;
18
 
19
    inline bool degenerate_edge(const Manifold& m, HalfEdgeID h)
20
    {
21
		Walker w = m.walker(h);
22
        if(sqr_length(m.pos(w.vertex()) - m.pos(w.opp().vertex())) < 1e-8)
23
            return true;
24
        return false;
25
    }
26
 
27
}
28
 
29
namespace Geometry
30
{
31
 
32
    template<class BBTree>
33
    void build_tree_robust(Manifold& m, BBTree& tree)
34
    {
35
        vector<Triangle> triangle_vec;
36
 
37
        for(FaceIDIterator fi=m.faces_begin(); fi != m.faces_end();++fi)
38
        {
39
            Vec3d face_normal = normal(m, *fi);
40
 
41
            Walker w = m.walker(*fi);
42
 
43
            Vec3f v0,v1,v2;
44
            Vec3f vn0,vn1,vn2;
45
            Vec3f en0,en1,en2;
46
 
47
            v0  = Vec3f(m.pos(w.vertex()));
48
            vn0 = Vec3f(normal(m, w.vertex()));
49
            FaceID adj_f =  w.next().opp().face();
50
            if(adj_f != InvalidFaceID)
51
                en0 = Vec3f(normalize(face_normal + normal(m, adj_f)));
52
            else
53
                en0 = Vec3f(face_normal);
54
 
55
            w = w.next();
56
 
57
            v1  = Vec3f(m.pos(w.vertex()));
58
            vn1 = Vec3f(normal(m, w.vertex()));
59
            adj_f =  w.next().opp().face();
60
            if(adj_f != InvalidFaceID)
61
                en1 = Vec3f(normalize(face_normal + normal(m, adj_f)));
62
            else
63
                en1 = Vec3f(face_normal);
64
 
65
 
66
            w = w.next();
67
 
68
            v2  = Vec3f(m.pos(w.vertex()));
69
            vn2 = Vec3f(normal(m, w.vertex()));
70
            adj_f =  w.next().opp().face();
71
            if(adj_f != InvalidFaceID)
72
                en2 = Vec3f(normalize(face_normal + normal(m, adj_f)));
73
            else
74
                en2 = Vec3f(face_normal);
75
 
76
            if(sqr_length(v0-v1)>EDGE_MIN_SQ_LENGTH &&
77
                sqr_length(v1-v2)>EDGE_MIN_SQ_LENGTH &&
78
                sqr_length(v2-v0)>EDGE_MIN_SQ_LENGTH)
79
                triangle_vec.push_back(Triangle(v0,v1,v2,vn0,vn1,vn2,en0,en1,en2));
80
            else
81
                cout << "Killing degenerate triangle" << endl;
82
        }
83
 
84
        tree.build(triangle_vec);
85
    }
86
 
87
    void build_OBBTree(HMesh::Manifold& m, OBBTree& tree)
88
    {
89
        build_tree_robust<OBBTree>(m, tree);
90
    }
91
 
92
    void build_AABBTree(HMesh::Manifold& m, AABBTree& tree)
93
    {
94
        build_tree_robust<AABBTree>(m, tree);
95
    }
96
 
97
}