cloth

annotate src/plane.cc @ 0:92983e143a03

initial commit
author John Tsiombikas <nuclear@member.fsf.org>
date Mon, 11 Feb 2013 19:40:36 +0200
parents
children 2eac424f58b2
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 }