cloth

annotate src/plane.cc @ 3:28a31079dcdf

disc
author John Tsiombikas <nuclear@member.fsf.org>
date Mon, 04 Jan 2016 10:52:15 +0200
parents 2eac424f58b2
children
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 }