Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Тихомиров Ю. Программирование трёхмерной графики / Files / Faces / Material
.cpp// Material.cpp : implementation file
//
#include "stdafx.h"
#include "Faces.h"
#include "Material.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMaterial dialog
GLenum aFrontFace[] = {GL_CW, GL_CCW};
GLenum aCullFace[] = {GL_FRONT, GL_BACK};
GLfloat lmodel_twoside[] = {GL_FALSE, GL_TRUE};
CMaterial::CMaterial(CWnd* pParent /*=NULL*/)
: CDialog(CMaterial::IDD, pParent)
{
//{{AFX_DATA_INIT(CMaterial)
m_backDifBlue = 0.0f;
m_backDifGreen = 0.0f;
m_backDifRed = 0.0f;
m_backSpcBlue = 0.0f;
m_backSpcGreen = 0.0f;
m_backSpcRed = 0.0f;
m_frontDifBlue = 0.0f;
m_frontDifGreen = 0.0f;
m_frontDifRed = 0.0f;
m_frontSpcBlue = 0.0f;
m_frontSpcGreen = 0.0f;
m_frontSpcRed = 0.0f;
m_frontShin = 0.0f;
m_backShin = 0.0f;
m_cull = -1;
m_clock = -1;
//}}AFX_DATA_INIT
}
void CMaterial::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMaterial)
DDX_Text(pDX, IDC_BDB, m_backDifBlue);
DDX_Text(pDX, IDC_BDG, m_backDifGreen);
DDX_Text(pDX, IDC_BDR, m_backDifRed);
DDX_Text(pDX, IDC_BSB, m_backSpcBlue);
DDX_Text(pDX, IDC_BSG, m_backSpcGreen);
DDX_Text(pDX, IDC_BSR, m_backSpcRed);
DDX_Text(pDX, IDC_FDB, m_frontDifBlue);
DDX_Text(pDX, IDC_FDG, m_frontDifGreen);
DDX_Text(pDX, IDC_FDR, m_frontDifRed);
DDX_Text(pDX, IDC_FSB, m_frontSpcBlue);
DDX_Text(pDX, IDC_FSG, m_frontSpcGreen);
DDX_Text(pDX, IDC_FSR, m_frontSpcRed);
DDX_Text(pDX, IDC_FS, m_frontShin);
DDX_Text(pDX, IDC_BS, m_backShin);
DDX_Radio(pDX, IDC_CULL_FRONT, m_cull);
DDX_Radio(pDX, IDC_CW, m_clock);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMaterial, CDialog)
//{{AFX_MSG_MAP(CMaterial)
ON_BN_CLICKED(IDC_APPLY, OnApply)
ON_CONTROL_RANGE(BN_CLICKED, IDC_CW, IDC_CCW, OnClockwise)
ON_CONTROL_RANGE(BN_CLICKED, IDC_CULL_FRONT, IDC_CULL, OnCullFace)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMaterial message handlers
BOOL CMaterial::Create(CView * pView)
{
m_pView = (CView*)pView;
return CDialog::Create(CMaterial::IDD);
}
BOOL CMaterial::OnInitDialog()
{
CDialog::OnInitDialog();
// Диффузные составляющие цвета обратной поверхности
m_backDifRed = 0.633f;
m_backDifGreen = 0.727811f;
m_backDifBlue = 0.633f;
// Зеркальные составляющие цвета обратной поверхности
m_backSpcRed = 0.07568f;
m_backSpcGreen = 0.61424f;
m_backSpcBlue = 0.07568f;
// Диффузные составляющие цвета лицевой поверхности
m_frontDifRed = 0.7f;
m_frontDifGreen = 0.04f;
m_frontDifBlue = 0.04f;
// Зеркальные составляющие цвета лицевой поверхности
m_frontSpcRed = 0.5f;
m_frontSpcGreen = 0.4f;
m_frontSpcBlue = 0.4f;
// Углы отсечки
m_frontShin = 10.0f;
m_backShin = 3.2f;
m_cull = 2;
m_clock = 1;
// Задаем свойства материала
front_mat_shininess[0] = m_frontShin;
front_mat_specular[0] = m_frontSpcBlue;
front_mat_specular[1] = m_frontSpcGreen;
front_mat_specular[2] = m_frontSpcRed;
front_mat_specular[3] = 1.0f;
front_mat_diffuse[0] = m_frontDifRed;
front_mat_diffuse[1] = m_frontDifGreen;
front_mat_diffuse[2] = m_frontDifBlue;
front_mat_diffuse[3] = 1.0f;
back_mat_shininess[0] = m_backShin;
back_mat_specular[0] = m_backSpcRed;
back_mat_specular[1] = m_backSpcGreen;
back_mat_specular[2] = m_backSpcBlue;
back_mat_specular[3] = 1.0f;
back_mat_diffuse[0] = m_backDifRed;
back_mat_diffuse[1] = m_backDifGreen;
back_mat_diffuse[2] = m_backDifBlue;
back_mat_diffuse[3] = 1.0f;
UpdateData(FALSE);
return TRUE;
}
void CMaterial::OnApply()
{
UpdateData(TRUE);
front_mat_shininess[0] = m_frontShin;
front_mat_specular[0] = m_frontSpcBlue;
front_mat_specular[1] = m_frontSpcGreen;
front_mat_specular[2] = m_frontSpcRed;
front_mat_diffuse[0] = m_frontDifRed;
front_mat_diffuse[1] = m_frontDifGreen;
front_mat_diffuse[2] = m_frontDifBlue;
back_mat_shininess[0] = m_backShin;
back_mat_specular[0] = m_backSpcRed;
back_mat_specular[1] = m_backSpcGreen;
back_mat_specular[2] = m_backSpcBlue;
back_mat_diffuse[0] = m_backDifRed;
back_mat_diffuse[1] = m_backDifGreen;
back_mat_diffuse[2] = m_backDifBlue;
glMaterialfv(GL_FRONT, GL_SHININESS, front_mat_shininess);
glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);
glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
glMaterialfv(GL_BACK, GL_SHININESS, back_mat_shininess);
glMaterialfv(GL_BACK, GL_SPECULAR, back_mat_specular);
glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
m_pView->Invalidate(FALSE);
m_pView->UpdateWindow();
}
void CMaterial::OnClockwise(UINT nID)
{
CheckRadioButton(IDC_CW, IDC_CCW, nID);
// Определяем какая грань считается лицевой
glFrontFace(aFrontFace[nID - IDC_CW]);
// Устанавливаем одностороннюю или двухстороннюю
// модель освещения
if(nID == IDC_CW)
glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
else
glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
// Перерисовываем окно
m_pView->Invalidate(FALSE);
m_pView->UpdateWindow();
}
void CMaterial::OnCullFace(UINT nID)
{
CheckRadioButton(IDC_CULL_FRONT, IDC_CULL, nID);
// Если хотим увидеть обе поверхности - и лицевую, и обратную,
// то необходимо блокировать режим отбора
if(nID == IDC_CULL)
glDisable(GL_CULL_FACE);
else{
// В противном случае разрешаем отбор
// соответствующей поверхности
glCullFace(aCullFace[nID - IDC_CULL_FRONT]);
glEnable(GL_CULL_FACE);
}
m_pView->Invalidate(FALSE);
m_pView->UpdateWindow();
}
Соседние файлы в папке Faces