Blob Blame Raw

#include <GL/gl.h>

#include "tool.h"


void FlatTool::draw(const Vector3 &pos, const Vector3 &dir) const {
    const int segments = 16;
    const Real len = 10*radius;

    glPushMatrix();
    glEnable(GL_LIGHTING);
    glColor4d(1, 1, 0, 0.25);
    
    glTranslated(pos.x, pos.y, pos.z);
    Vector3 vx = dir.cross(Vector3(dir.y, dir.z, dir.x));
    vx = vx*(1/vx.len());
    Vector3 vy = vx.cross(dir);
    
    Real matrix[16] = {
        vx.x,  vx.y,  vx.z,  0,
        vy.x,  vy.y,  vy.z,  0,
        dir.x, dir.y, dir.z, 0,
        0, 0, 0, 1 };
    glMultMatrixd(matrix);

    glBegin(GL_TRIANGLE_STRIP);
    for(int i = 0; i <= segments; ++i) {
        Real a = 2*M_PI*i/segments;
        Real c = cos(a);
        Real s = sin(a);
        glNormal3b(c, s, 0);
        glVertex3d(c*radius, s*radius, 0);
        glVertex3d(c*radius, s*radius, -len);
    }
    glEnd();

    glBegin(GL_TRIANGLE_FAN);
    glNormal3b(0, 0, 1);
    for(int i = 0; i < segments; ++i) {
        Real a = 2*M_PI*i/segments;
        glVertex3d(cos(a)*radius, sin(a)*radius, 0);
    }
    glEnd();
    
    glBegin(GL_TRIANGLE_FAN);
    glNormal3b(0, 0, -1);
    for(int i = 0; i < segments; ++i) {
        Real a = 2*M_PI*i/segments;
        glVertex3d(cos(a)*radius, sin(a)*radius, -len);
    }
    glEnd();
    
    glDisable(GL_LIGHTING);
    glPopMatrix();
}