/**************************************************************************** Copyright (C) 2002-2006 Gilles Debunne (Gilles.Debunne@imag.fr) This file is part of the QGLViewer library. Version 2.2.4-1, released on December 12, 2006. http://artis.imag.fr/Members/Gilles.Debunne/QGLViewer libQGLViewer is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. libQGLViewer is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with libQGLViewer; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *****************************************************************************/ #include "drawLight.h" #include using namespace std; using namespace qglviewer; void Viewer::draw() { float pos[4] = {1.0, 0.5, 1.0, 0.0}; // Directionnal light glLightfv(GL_LIGHT0, GL_POSITION, pos); pos[3] = 1.0; // Spot light light1->getPosition(pos[0], pos[1], pos[2]); glLightfv(GL_LIGHT1, GL_POSITION, pos); glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, light1->inverseTransformOf(Vec(0,0,1))); // Point light light2->getPosition(pos[0], pos[1], pos[2]); glLightfv(GL_LIGHT2, GL_POSITION, pos); // Draws the spiral const float nbSteps = 200.0; glBegin(GL_QUAD_STRIP); for (float i=0; igrabsMouse()) drawLight(GL_LIGHT1, 1.2); else drawLight(GL_LIGHT1); if (light2->grabsMouse()) drawLight(GL_LIGHT2, 1.2); else drawLight(GL_LIGHT2); } void Viewer::init() { glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // Light0 is the default ambient light glEnable(GL_LIGHT0); // Light1 is a spot light glEnable(GL_LIGHT1); const GLfloat light_ambient[4] = {0.8, 0.2, 0.2, 1.0}; const GLfloat light_diffuse[4] = {1.0, 0.4, 0.4, 1.0}; const GLfloat light_specular[4] = {1.0, 0.0, 0.0, 1.0}; glLightf( GL_LIGHT1, GL_SPOT_EXPONENT, 3.0); glLightf( GL_LIGHT1, GL_SPOT_CUTOFF, 20.0); glLightf( GL_LIGHT1, GL_CONSTANT_ATTENUATION, 0.5); glLightf( GL_LIGHT1, GL_LINEAR_ATTENUATION, 1.0); glLightf( GL_LIGHT1, GL_QUADRATIC_ATTENUATION, 1.5); glLightfv(GL_LIGHT1, GL_AMBIENT, light_ambient); glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular); glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse); // Light2 is a classical directionnal light glEnable(GL_LIGHT2); const GLfloat light_ambient2[4] = {0.2, 0.2, 2.0, 1.0}; const GLfloat light_diffuse2[4] = {0.8, 0.8, 1.0, 1.0}; const GLfloat light_specular2[4] = {0.0, 0.0, 1.0, 1.0}; glLightfv(GL_LIGHT2, GL_AMBIENT, light_ambient2); glLightfv(GL_LIGHT2, GL_SPECULAR, light_specular2); glLightfv(GL_LIGHT2, GL_DIFFUSE, light_diffuse2); light1 = new ManipulatedFrame(); light2 = new ManipulatedFrame(); setMouseTracking(true); light1->setPosition(0.5, 0.5, 0); // Align z axis with -position direction : look at scene center light1->setOrientation(Quaternion(Vec(0,0,1), -light1->position())); light2->setPosition(-0.5, 0.5, 0); restoreStateFromFile(); help(); } QString Viewer::helpString() const { QString text("

D r a w L i g h t

"); text += "The drawLight() function displays a representation of the OpenGL lights "; text += "of your scene. This is convenient for debugging your light setup.

"; text += "This scene features a directionnal ligth (arrow), a spot light (cone) and a point "; text += "light source (sphere). The representation color, position and shape matches the light setup.

"; text += "Hover over the point light or the spot light to manipulate it using the mouse (right "; text += "button translates and left button rotates)."; return text; }