rev |
line source |
nuclear@0
|
1 #include "opengl.h"
|
nuclear@0
|
2 #include "plane.h"
|
nuclear@0
|
3 #include "simworld.h"
|
nuclear@0
|
4
|
nuclear@0
|
5 Plane::Plane()
|
nuclear@0
|
6 : pt(0, 0, 0), normal(0, 1, 0)
|
nuclear@0
|
7 {
|
nuclear@0
|
8 }
|
nuclear@0
|
9
|
nuclear@0
|
10 Plane::Plane(const Vector3 &pt, const Vector3 &norm)
|
nuclear@2
|
11 : pt(pt), normal(pt)
|
nuclear@0
|
12 {
|
nuclear@0
|
13 }
|
nuclear@0
|
14
|
nuclear@0
|
15 Plane::Plane(const Vector3 &norm, float dist)
|
nuclear@0
|
16 : normal(norm)
|
nuclear@0
|
17 {
|
nuclear@0
|
18 pt = Vector3(0, 0, 0) - norm * dist;
|
nuclear@0
|
19 }
|
nuclear@0
|
20
|
nuclear@0
|
21 bool Plane::collision(const Ray &ray, float rad, Collision *col) const
|
nuclear@0
|
22 {
|
nuclear@0
|
23 Vector3 pt = this->pt - normal * rad;
|
nuclear@0
|
24
|
nuclear@0
|
25 float ndotdir = dot_product(ray.dir, normal);
|
nuclear@0
|
26 if(fabs(ndotdir) < 1e-6) {
|
nuclear@0
|
27 return false;
|
nuclear@0
|
28 }
|
nuclear@0
|
29
|
nuclear@0
|
30 float ndotptdir = dot_product((pt - ray.origin), normal);
|
nuclear@0
|
31
|
nuclear@0
|
32 float t = ndotptdir / ndotdir;
|
nuclear@0
|
33 if(t < 1e-6 || t > (1.0 - 1e-6)) {
|
nuclear@0
|
34 return false;
|
nuclear@0
|
35 }
|
nuclear@0
|
36
|
nuclear@2
|
37 col->dist = t;
|
nuclear@0
|
38 col->pos = ray.origin + ray.dir * t;
|
nuclear@0
|
39 col->normal = normal;
|
nuclear@0
|
40 col->elast = 1.0;
|
nuclear@0
|
41 return true;
|
nuclear@0
|
42 }
|
nuclear@0
|
43
|
nuclear@3
|
44 Matrix4x4 Plane::calc_rot_matrix() const
|
nuclear@0
|
45 {
|
nuclear@0
|
46 Vector3 up = Vector3(0, 1, 0);
|
nuclear@3
|
47 if(fabs(dot_product(up, normal)) - 1.0 <= 1e-5) {
|
nuclear@0
|
48 up = Vector3(0, 0, 1);
|
nuclear@0
|
49 }
|
nuclear@0
|
50
|
nuclear@3
|
51 Vector3 right = cross_product(up, normal).normalized();
|
nuclear@3
|
52 up = cross_product(normal, right).normalized();
|
nuclear@0
|
53
|
nuclear@0
|
54 Matrix4x4 rot_matrix;
|
nuclear@0
|
55 rot_matrix.set_column_vector(right, 0);
|
nuclear@0
|
56 rot_matrix.set_column_vector(up, 1);
|
nuclear@0
|
57 rot_matrix.set_column_vector(normal, 2);
|
nuclear@0
|
58 rot_matrix.set_row_vector(Vector4(0, 0, 0, 1), 3);
|
nuclear@3
|
59 return rot_matrix;
|
nuclear@3
|
60 }
|
nuclear@3
|
61
|
nuclear@3
|
62 void Plane::draw() const
|
nuclear@3
|
63 {
|
nuclear@3
|
64 const float sz = 10.0f;
|
nuclear@3
|
65
|
nuclear@3
|
66 Matrix4x4 rot_matrix = calc_rot_matrix();
|
nuclear@0
|
67
|
nuclear@0
|
68 glMatrixMode(GL_MODELVIEW);
|
nuclear@0
|
69 glPushMatrix();
|
nuclear@3
|
70 glMultTransposeMatrixf(rot_matrix[0]);
|
nuclear@0
|
71
|
nuclear@0
|
72 glBegin(GL_QUADS);
|
nuclear@0
|
73 glNormal3f(normal.x, normal.y, normal.z);
|
nuclear@0
|
74 glVertex2f(-sz, -sz);
|
nuclear@0
|
75 glVertex2f(sz, -sz);
|
nuclear@0
|
76 glVertex2f(sz, sz);
|
nuclear@0
|
77 glVertex2f(-sz, sz);
|
nuclear@0
|
78 glEnd();
|
nuclear@0
|
79
|
nuclear@0
|
80 glPopMatrix();
|
nuclear@0
|
81 }
|