Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №5 / Lab5 / Light
.cpp// 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();
}