Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Тихомиров Ю. Программирование трёхмерной графики / Files / Faces / FacesView
.cpp// 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