Скачиваний:
28
Добавлен:
02.05.2014
Размер:
5.9 Кб
Скачать
// 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