Скачиваний:
18
Добавлен:
01.05.2014
Размер:
3.61 Кб
Скачать
// Light.cpp: implementation of the CLight class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Lighting.h"
#include "Light.h"

#include "LightingDoc.h"
#include "LightingView.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

extern float M_2PI;

extern int listSquare;
extern int listsShadows;
extern int listsRefraction;
extern int listSphere;
extern int listsLights;
extern int listLightsOn;
extern int listLightsOff;
extern int listLightDraw;
extern int listSpheredisk;

extern double degrees(double a);

inline double radians(double a)
{
  return (a * M_PI / 180.0);
}

inline double radians_clamp(double a)
{
  while (a < 0.0) a += M_2PI;
  while (a > M_2PI) a -= M_2PI;
  return a;
}

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CLight::CLight()
{
}

CLight::~CLight()
{
}

void CLight::Init(int nNum, GLboolean on, char *name, 
                  GLboolean *mask, Point pos, GLfloat *dif){
  m_Number = nNum;
  m_On = on;
  strcpy(m_Name, name);
  for(int i = 0; i < 4; i++){
    m_Diffuse[i]    = dif[i];
    m_ShadowMask[i] = mask[i];
  }
  m_Pos = pos;
}

void CLight::InitPosition()
{
  Point l, d;

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  
  l = m_Pos;

  // Вычисляем и устанавливаем расположение источника света
  l.pt[0] =
    (GLfloat)(m_Pos.pt[0]*cos((double)radians(m_LightRotation)));
  l.pt[1] = 
    (GLfloat)(m_Pos.pt[0]*-sin((double)radians(m_LightRotation)));

  // В зависимости от положения объекта задаем
  // направление действия источника света
  d = (m_pOwner->m_SpherePosition - l).unit();
  glLightfv(GL_LIGHT0 + m_Number, GL_POSITION, l.pt);
  glLightfv(GL_LIGHT0 + m_Number, GL_SPOT_DIRECTION, d.pt);
}

void CLight::listInit()
{
  Color c;

  // Инициализация списков изображений
  glNewList(listsLights + m_Number, GL_COMPILE);

  // Если источник "включен", то задаем его параметры
  if (m_On) {
    glLoadName(nameLights + m_Number);
    
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHTING);
    glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 1);

    // "Включаем" источник
    glCallList(listLightsOn);

    c = m_Diffuse;
    glMaterialfv(GL_BACK, GL_AMBIENT, c.c);
    glMaterialfv(GL_BACK, GL_DIFFUSE, m_pOwner->black.c);
    glMaterialfv(GL_BACK, GL_SPECULAR, m_pOwner->black.c);

    glMaterialfv(GL_FRONT, GL_AMBIENT, (c * .75).c);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, m_pOwner->white.c);
    glMaterialfv(GL_FRONT, GL_SPECULAR, m_pOwner->white.c);

    glMatrixMode(GL_MODELVIEW);
    glPushMatrix();
    glRotatef(-m_LightRotation, 0, 0, 1);
    glTranslatef(m_Pos.pt[0], m_Pos.pt[1], m_Pos.pt[2]);
    glRotatef((GLfloat)-degrees(atan2((double)(m_Pos.pt[2] - 
                                      m_pOwner->m_SpherePosition.pt[2]),
			     (double)(m_Pos.pt[0]))), 0, 1, 0);
    
    // Задаем параметры материала корпуса и положения
    // источника света
    // Затем рисуем источник
    glCallList(listLightDraw);
    glPopMatrix();

    glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 0);
    glDisable(GL_LIGHTING);

    // "Выключаем" источник
    glCallList(listLightsOff);
    glDisable(GL_DEPTH_TEST);
  }

  // В противном случае считаем, что он излучает черный свет
  else
    glColor3f(0, 0, 0);

  glEndList();

}

Соседние файлы в папке Lab5