#include "light.h" Light::Light() { printf("light not initialized\n"); } Light::Light(GLenum _num, Vec _pos, Material _mat) { init(_num, _pos, _mat); } void Light::init(GLenum _num, Vec _pos, Material _mat) { num = _num; pos = _pos.clone(); mat = _mat.clone(); rot = new Vec(0,0,0); showtrace = true; sphere = gluNewQuadric(); show(); } void Light::trace(bool _s) { showtrace = _s; } void Light::show() { enabled = true; glEnable(num); } void Light::hide() { enabled = false; glDisable(num); } void Light::setPosition(Vec newpos) { delete pos; pos = newpos.clone(); } void Light::translate(Vec d) { pos->add((Vec)d); } void Light::rotate(Vec a) { rot->add((Vec)a); } void Light::setColor(Color* c) { Color sp = *(mat->specular->clone()); delete mat; mat = new Material(*(c->clone()), sp); } void Light::draw() { if ( enabled ) { //save camera position glPushMatrix(); glTranslatef(pos->x(), pos->y(), pos->z()); float p[] = {0.0f, 0.0f, 0.0f, 1.0f}; glLightfv(num, GL_POSITION, p); if (showtrace) { //sphere float c[] = {1,1,1,1}; glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c); gluSphere(sphere, 1, 10, 10); } //glLightfv(num, GL_AMBIENT, mat->ambient->v()); glLightfv(num, GL_DIFFUSE, mat->ambient->v()); glLightfv(num, GL_SPECULAR, mat->specular->v()); //TODO //glLightf(num,GL_QUADRATIC_ATTENUATION,.001f); glTranslatef(pos->x(), pos->y(), pos->z()); glPopMatrix(); } } SpotLight::SpotLight(GLenum _num, Vec _pos, Material _mat, float _angle) { Light::init(_num, _pos, _mat); cutoff_angle = _angle; cone = gluNewQuadric(); show(); } void SpotLight::draw() { if ( enabled ) { //save camera position glPushMatrix(); glRotatef(rot->x(), 1.0f, 0.0f, 0.0f); glRotatef(rot->y(), 0.0f, 1.0f, 0.0f); glRotatef(rot->z(), 0.0f, 0.0f, 1.0f); glTranslatef(pos->x(), pos->y(), pos->z()); glLightf(num, GL_SPOT_CUTOFF, cutoff_angle); //last parameter: 1 for positional // 0 for directional float p[] = {0.0f, 0.0f, 0.0f, 1.0f}; glLightfv(num, GL_POSITION, p); GLfloat dir[] = {0.0f, -1.0f, 0.0f}; glLightfv(num, GL_SPOT_DIRECTION, dir); if (showtrace) { //line glBegin(GL_LINES); glVertex3fv(p); glVertex3fv(dir); glEnd(); //cone glTranslatef(0,5.5,0); glRotatef(90, 1, 0, 0); gluCylinder (cone, 0, 1, 5, 10, 20); } glPopMatrix(); } }