Скачиваний:
28
Добавлен:
02.05.2014
Размер:
5.06 Кб
Скачать
// FacesView.cpp : implementation of the COpenGLView class
//

#include "stdafx.h"
#include "Faces.h"

#include "FacesDoc.h"
#include "FacesView.h"

#include "Material.h"

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


/////////////////////////////////////////////////////////////////////////////
// CFacesView

IMPLEMENT_DYNCREATE(CFacesView, COpenGLView)

CFacesView::CFacesView()
{
  m_pDlg = NULL;
}

CFacesView::~CFacesView()
{
}

BEGIN_MESSAGE_MAP(CFacesView, COpenGLView)
	//{{AFX_MSG_MAP(CFacesView)
	ON_WM_SIZE()
	ON_COMMAND(IDC_CUSTOM, OnCustom)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFacesView diagnostics

#ifdef _DEBUG
void CFacesView::AssertValid() const
{
	CView::AssertValid();
}

void CFacesView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CFacesDoc* CFacesView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFacesDoc)));
	return (CFacesDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CFacesView drawing

void CFacesView::OnInitialUpdate() 
{
	COpenGLView::OnInitialUpdate();

  static float ambient[] = {0.0, 0.0, 0.0, 1.0};
  static float diffuse[] = {1.0, 1.0, 1.0, 1.0};
  static float specular[] = { 1.0, 1.0, 1.0, 1.0 };
  static float position[] = {90.0, 90.0, 150.0, 0.0};

  // Определяем свойства материала лицевой поверхности
  static float front_mat_shininess[] = {10.0};
  static float front_mat_specular[] = {0.5, 0.4, 0.4, 1.0};
  static float front_mat_diffuse[] = {0.7, 0.04, 0.04, 1.0};
  
  // Определяем свойства материала обратной поверхности
  static float back_mat_shininess[] = {3.2};
  static float back_mat_specular[] = {0.07568, 0.61424, 0.07568, 1.0};
  static float back_mat_diffuse[] = {0.633, 0.727811, 0.633, 1.0};
  static float lmodel_ambient[] = {1.0, 1.0, 0.0, 1.0};
  static float lmodel_twoside[] = {GL_TRUE};

  // Определяем цвет фона используемый по умолчанию
  glClearColor(1.0f, 0.96f, 0.866f, 1.0f);

  glDepthFunc(GL_LEQUAL);
  glEnable(GL_DEPTH_TEST);

  glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
  glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
  glLightfv(GL_LIGHT0, GL_POSITION, position);
  glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
  glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
  glEnable(GL_LIGHTING);
  glEnable(GL_LIGHT0);

  // Устанавливаем параметры материалов
  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);
  
  // Создаем объект, который будем изображать
  quadObj = gluNewQuadric();

  // и определяем его параметры
  orientation = GLU_OUTSIDE;
  radius1 = 10;
  radius2 = 5;
  angle1 = 90;
  angle2 = 180;
  slices = 16;
  stacks = 10;
  height = 20;
  whichQuadric = 0;

  // Выводим немодальный блок диалога
  if(m_pDlg == NULL){
    CMaterial *m_pDlg = new CMaterial;
    m_pDlg->Create(this);
  }
}

void CFacesView::OnDraw(CDC* pDC)
{
  CFacesDoc* pDoc = GetDocument();
  ASSERT_VALID(pDoc);
	
  static float xRotation =  30.0;
  static float yRotation =  60.0;

	glLoadIdentity();
  glRotatef(xRotation, 1, 0, 0);
  glRotatef(yRotation, 0, 1, 0);

  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

  // Рисуем объекты
  switch (whichQuadric) {
    case 0: glTranslatef(0, 0, -height/20.0);
            gluCylinder(quadObj,
                        radius1/10.0, radius2/10.0,
                        height/10.0, slices, stacks);
            break;
    case 1: gluSphere(quadObj, radius1/10.0, slices, stacks);
            break;
    case 2: gluPartialDisk(quadObj,
                           radius2/10.0, radius1/10.0, slices, 
                           stacks, angle1, angle2);
            break;
    case 3: gluDisk(quadObj,
                    radius2/10.0, radius1/10.0, slices, stacks);
            break;
  }

  // Стандартное завершение работы
  glFlush();

  SwapBuffers(wglGetCurrentDC());
}

/////////////////////////////////////////////////////////////////////////////
// CFacesView message handlers

void CFacesView::OnSize(UINT nType, int cx, int cy) 
{
	COpenGLView::OnSize(nType, cx, cy);

  // Установка параметров области вывода, проекции
  // и преобразования координат
  glViewport(0, 0, cx, cy);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glFrustum(-1, 1, -1, 1, 1, 10);
  gluLookAt(2, 2, 2, 0, 0, 0, 0, 0, 1);
  glMatrixMode(GL_MODELVIEW);
}


void CFacesView::OnCustom() 
{
  if(m_pDlg == NULL){
    CMaterial *m_pDlg = new CMaterial;
    m_pDlg->Create(this);
  }
}
Соседние файлы в папке Faces