Subversion Repositories gelsvn

Rev

Rev 290 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 290 Rev 291
1
#ifndef __TRIANGLE_H
1
#ifndef __TRIANGLE_H
2
#define __TRIANGLE_H
2
#define __TRIANGLE_H
3
 
3
 
4
#include "CGLA/Vec2f.h"
4
#include "CGLA/Vec2f.h"
5
#include "CGLA/Vec3f.h"
5
#include "CGLA/Vec3f.h"
6
#include "CGLA/Mat3x3f.h"
6
#include "CGLA/Mat3x3f.h"
7
 
7
 
8
#define COMPUTE_SIGN
8
#define COMPUTE_SIGN
9
 
9
 
-
 
10
namespace Geometry
-
 
11
{
-
 
12
 
10
class Triangle
13
class Triangle
11
{
14
{
12
	CGLA::Vec3f vert[3];
15
	CGLA::Vec3f vert[3];
13
	CGLA::Vec3f edge[3];
16
	CGLA::Vec3f edge[3];
14
 
17
 
15
#ifdef COMPUTE_SIGN
18
#ifdef COMPUTE_SIGN
16
	CGLA::Vec3f vert_norm[3];
19
	CGLA::Vec3f vert_norm[3];
17
	CGLA::Vec3f edge_norm[3];
20
	CGLA::Vec3f edge_norm[3];
18
#endif
21
#endif
19
	CGLA::Vec3f face_norm;
22
	CGLA::Vec3f face_norm;
20
 
23
 
21
	CGLA::Vec3f tri_plane_edge_norm[3];
24
	CGLA::Vec3f tri_plane_edge_norm[3];
22
	float edge_len[3];
25
	float edge_len[3];
23
	
26
	
24
 public:
27
 public:
25
 
28
 
26
	Triangle() {}
29
	Triangle() {}
27
	
30
	
28
	Triangle(const CGLA::Vec3f& _v0, 
31
	Triangle(const CGLA::Vec3f& _v0, 
29
					 const CGLA::Vec3f& _v1, 
32
					 const CGLA::Vec3f& _v1, 
30
					 const CGLA::Vec3f& _v2,
33
					 const CGLA::Vec3f& _v2,
31
 
34
 
32
					 const CGLA::Vec3f& _vn0,
35
					 const CGLA::Vec3f& _vn0,
33
					 const CGLA::Vec3f& _vn1,
36
					 const CGLA::Vec3f& _vn1,
34
					 const CGLA::Vec3f& _vn2,
37
					 const CGLA::Vec3f& _vn2,
35
 
38
 
36
					 const CGLA::Vec3f& _en0,
39
					 const CGLA::Vec3f& _en0,
37
					 const CGLA::Vec3f& _en1,
40
					 const CGLA::Vec3f& _en1,
38
					 const CGLA::Vec3f& _en2);
41
					 const CGLA::Vec3f& _en2);
39
 
42
 
40
	bool intersect(const CGLA::Vec3f&, const CGLA::Vec3f&, float&) const;
43
	bool intersect(const CGLA::Vec3f&, const CGLA::Vec3f&, float&) const;
41
 
44
 
42
	const CGLA::Vec3f get_pmin() const 
45
	const CGLA::Vec3f get_pmin() const 
43
	{
46
	{
44
		return v_min(vert[0],v_min(vert[1],vert[2]));
47
		return v_min(vert[0],v_min(vert[1],vert[2]));
45
	}
48
	}
46
 
49
 
47
	const CGLA::Vec3f get_pmax() const 
50
	const CGLA::Vec3f get_pmax() const 
48
	{
51
	{
49
		return v_max(vert[0],v_max(vert[1],vert[2]));
52
		return v_max(vert[0],v_max(vert[1],vert[2]));
50
	}
53
	}
51
 
54
 
52
	const CGLA::Vec3f centre() const
55
	const CGLA::Vec3f centre() const
53
		{
56
		{
54
			return (vert[0]+vert[1]+vert[2])/3.0f;
57
			return (vert[0]+vert[1]+vert[2])/3.0f;
55
		}
58
		}
56
 
59
 
57
	const float area() const 
60
	const float area() const 
58
		{
61
		{
59
			return 0.5 * (cross(edge[0],-edge[2])).length();
62
			return 0.5 * (cross(edge[0],-edge[2])).length();
60
		}
63
		}
61
 
64
 
62
	const CGLA::Vec3f get_centre() const 
65
	const CGLA::Vec3f get_centre() const 
63
	{
66
	{
64
		CGLA::Vec3f pmin = get_pmin();
67
		CGLA::Vec3f pmin = get_pmin();
65
		CGLA::Vec3f pmax = get_pmax();
68
		CGLA::Vec3f pmax = get_pmax();
66
		return (pmax-pmin)/2.0f+pmin;
69
		return (pmax-pmin)/2.0f+pmin;
67
	}
70
	}
68
 
71
 
69
	bool signed_distance(const CGLA::Vec3f& p, float& sq_dist, float& sgn) const;
72
	bool signed_distance(const CGLA::Vec3f& p, float& sq_dist, float& sgn) const;
70
 
73
 
71
	CGLA::Vec3f get_v0() const {return vert[0];}
74
	CGLA::Vec3f get_v0() const {return vert[0];}
72
	CGLA::Vec3f get_v1() const {return vert[1];}
75
	CGLA::Vec3f get_v1() const {return vert[1];}
73
	CGLA::Vec3f get_v2() const {return vert[2];}
76
	CGLA::Vec3f get_v2() const {return vert[2];}
74
 
77
 
75
	const CGLA::Vec3f& get_edge(int i) const {return edge[i];}
78
	const CGLA::Vec3f& get_edge(int i) const {return edge[i];}
76
	
79
	
77
};	
80
};	
78
 
81
 
79
 
82
}
80
#endif
83
#endif
81
 
84