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@0
|
11 this->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@0
|
37 col->pos = ray.origin + ray.dir * t;
|
nuclear@0
|
38 col->normal = normal;
|
nuclear@0
|
39 col->elast = 1.0;
|
nuclear@0
|
40 return true;
|
nuclear@0
|
41 }
|
nuclear@0
|
42
|
nuclear@0
|
43 void Plane::draw(float sz) const
|
nuclear@0
|
44 {
|
nuclear@0
|
45 Vector3 up = Vector3(0, 1, 0);
|
nuclear@0
|
46 if(fabs(dot_product(up, normal)) < 1e-6) {
|
nuclear@0
|
47 up = Vector3(0, 0, 1);
|
nuclear@0
|
48 }
|
nuclear@0
|
49
|
nuclear@0
|
50 Vector3 right = cross_product(up, normal);
|
nuclear@0
|
51 up = cross_product(normal, right);
|
nuclear@0
|
52
|
nuclear@0
|
53 Matrix4x4 rot_matrix;
|
nuclear@0
|
54 rot_matrix.set_column_vector(right, 0);
|
nuclear@0
|
55 rot_matrix.set_column_vector(up, 1);
|
nuclear@0
|
56 rot_matrix.set_column_vector(normal, 2);
|
nuclear@0
|
57 rot_matrix.set_row_vector(Vector4(0, 0, 0, 1), 3);
|
nuclear@0
|
58
|
nuclear@0
|
59 glMatrixMode(GL_MODELVIEW);
|
nuclear@0
|
60 glPushMatrix();
|
nuclear@0
|
61 glMultTransposeMatrixf((float*)rot_matrix.m);
|
nuclear@0
|
62
|
nuclear@0
|
63 glBegin(GL_QUADS);
|
nuclear@0
|
64 glNormal3f(normal.x, normal.y, normal.z);
|
nuclear@0
|
65 glVertex2f(-sz, -sz);
|
nuclear@0
|
66 glVertex2f(sz, -sz);
|
nuclear@0
|
67 glVertex2f(sz, sz);
|
nuclear@0
|
68 glVertex2f(-sz, sz);
|
nuclear@0
|
69 glEnd();
|
nuclear@0
|
70
|
nuclear@0
|
71 glPopMatrix();
|
nuclear@0
|
72 }
|