Sophie

Sophie

distrib > Mandriva > 10.0-com > i586 > by-pkgid > 9347541fe87a5ea3f3b8dbc50f660e8e > files > 98

libQGLViewer-devel-1.3.6-1mdk.i586.rpm

#include "drawLight.h"
#include <math.h>

using namespace std;

void Viewer::draw()
{
  const float nbSteps = 500.0;

  glBegin(GL_QUAD_STRIP);
  for (float i=0; i<nbSteps; ++i)
    {
      float ratio = i/nbSteps;
      float angle = 21.0*ratio;
      float c = cos(angle);
      float s = sin(angle);
      float r1 = 1.0 - 0.8*ratio;
      float r2 = 0.8 - 0.8*ratio;
      float alt = ratio - 0.5;
      const float nor = .5;
      const float up = sqrt(1.0-nor*nor);
      glColor3f(1-ratio, .2 , ratio);
      glNormal3f(nor*c, up, nor*s);
      glVertex3f(r1*c, alt, r1*s);
      glVertex3f(r2*c, alt+0.05, r2*s);
    }
  glEnd();

  drawLight(GL_LIGHT0);

  const GLfloat pos1[4]		  = {0.5,0.5,0.0,1.0};
  const GLfloat spot_dir1[3]  	  = {-1.0, -1.0, 0.0};
  glLightfv(GL_LIGHT1, GL_POSITION, pos1);
  glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, spot_dir1);
  drawLight(GL_LIGHT1, 2.0); // Draw this light twice bigger

  const GLfloat pos2[4]		  = {-0.5,0.5,0.0,1.0};
  const GLfloat spot_dir2[3]  	  = {1.0, 1.0, 1.0};
  glLightfv(GL_LIGHT2, GL_POSITION, pos2);
  glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION, spot_dir2);
  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.5, 0.5, 0.5, 1.0};
  const GLfloat light_specular[4] = {1.0, 1.0, 1.0, 1.0};
  const GLfloat light_diffuse[4]  = {3.0, 3.0, 1.0, 1.0};

  glLightf( GL_LIGHT1, GL_SPOT_EXPONENT,  3.0);
  glLightf( GL_LIGHT1, GL_SPOT_CUTOFF,    50.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.5, 0.5, 0.5, 1.0};
  const GLfloat light_specular2[4] = {1.0, 0.0, 0.0, 1.0};
  const GLfloat light_diffuse2[4]  = {0.0, 3.0, 0.0, 1.0};

  glLightfv(GL_LIGHT2, GL_AMBIENT,  light_ambient2);
  glLightfv(GL_LIGHT2, GL_SPECULAR, light_specular2);
  glLightfv(GL_LIGHT2, GL_DIFFUSE,  light_diffuse2);

  restoreFromFile();
  help();
}

QString Viewer::helpString() const
{
  QString text("<h2>D r a w L i g h t</h2>");
  text += "The <i>drawLight()</i> function displays a representation of the OpenGL lights ";
  text += "of your scene. This is convenient for debugging your light setup.";
  return text;
}