Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
12
Добавлен:
01.05.2014
Размер:
5.08 Кб
Скачать
// SPlineView.cpp : implementation of the CSPlineView class
//

#include "stdafx.h"
#include "SPline.h"

#include "SPlineDoc.h"
#include "SPlineView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CSPlineView

IMPLEMENT_DYNCREATE(CSPlineView, CView)

BEGIN_MESSAGE_MAP(CSPlineView, CView)
	//{{AFX_MSG_MAP(CSPlineView)
	ON_WM_DESTROY()
	ON_WM_CREATE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSPlineView construction/destruction

CSPlineView::CSPlineView()
{
	// TODO: add construction code here

}

CSPlineView::~CSPlineView()
{
}

BOOL CSPlineView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CSPlineView drawing

void CSPlineView::OnDraw(CDC* pDC)
{
	Draw(pDC);
}

/////////////////////////////////////////////////////////////////////////////
// CSPlineView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CSPlineView message handlers
void CSPlineView::InitObjects()
{	
	Point p[10];
	p[0] = Point(-0.7, 0.0, -0.7);
	p[1] = Point(-0.7, 0.3, -0.3);
	p[2] = Point(-0.7, 0.3, 0.3);
	p[3] = Point(-0.7, 0.0, 0.7);
	p[4] = Point(-0.3, 0.5, 0.7);
	p[5] = Point(0.3, 0.5, 0.7);
	p[6] = Point(0.7, 0.0, 0.7);
	p[7] = Point(-0.3, 0.5, -0.7);
	p[8] = Point(0.3, 0.5, -0.7);
	p[9] = Point(0.7, 0.0, -0.7);
	curve[0].SetCurve(p[0], p[1], p[2], p[3]);
	curve[1].SetCurve(p[3], p[4], p[5], p[6]);
	curve[2].SetCurve(p[0], p[7], p[8], p[9]);
	surface.SetSurface(curve[2], curve[0], curve[1]);
}

void CSPlineView::InitView()
{	
	CView::OnInitialUpdate();
	
	CClientDC dc(this);
	wglMakeCurrent(dc.m_hDC, m_hrc);
	

	GLfloat light1_ambient[] = { 1.0f, 0.0f, 0.0f, 1.0f };
	GLfloat light1_diffuse[] = { 1.0f, 0.0f, 0.0f, 1.0f };
	GLfloat light1_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
	GLfloat light1_position[] = { 1.0f, 1.0f, 1.0f, 1.0f };
	GLfloat spot_direction[] = { 0.25f, 0.25f, 0.25f };

	glLightfv(GL_LIGHT1, GL_AMBIENT, light1_ambient);
	glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse);
	glLightfv(GL_LIGHT1, GL_SPECULAR, light1_specular);
	glLightfv(GL_LIGHT1, GL_POSITION, light1_position);
	glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 0.5f);
	glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.2f);
	glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, 0.2f);
	glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 100.0f);
	glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, spot_direction);
	glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 128.0f);
	glEnable(GL_LIGHTING);
	glEnable(GL_LIGHT1);

	
	glViewport(0, 0, 640, 480);
	glClearColor(0.0, 0.0, 0.0, 0.0);

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	glRotatef(-30.0, 1.0, -0.6, 0.0);
	
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(0, 1, 0, 100);
	glMatrixMode(GL_MODELVIEW);

	wglMakeCurrent(NULL, NULL);	
}

void CSPlineView::OnInitialUpdate() 
{
	CView::OnInitialUpdate();
	
	InitObjects();
	InitView();

	this->ShowWindow(SW_MAXIMIZE);
	
}

void CSPlineView::Draw(CDC* pDC)
{
	wglMakeCurrent(pDC->m_hDC, m_hrc);

	Point pts[4];
	glBegin(GL_QUADS);
		for (double i = 0; i < 1; i += 0.05)
			for (double j = 0; j < 1; j += 0.05) {
				pts[0] = surface.GetPoint(i, j);
				pts[1] = surface.GetPoint(i + 0.05, j);
				pts[2] = surface.GetPoint(i + 0.05, j + 0.05);
				pts[3] = surface.GetPoint(i, j + 0.05);
				for (int l = 0; l < 4; l++)
					glVertex3d(pts[l].x, pts[l].y, pts[l].z);
			}
	glEnd();
	
	wglMakeCurrent(NULL, NULL);
}

int CSPlineView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	CClientDC dc(this);
    
	PIXELFORMATDESCRIPTOR pfd;
	memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
	pfd.nSize		= sizeof(PIXELFORMATDESCRIPTOR);
	pfd.nVersion	= 1;
	pfd.dwFlags		= PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;
	pfd.iPixelType	= PFD_TYPE_RGBA;
	pfd.cColorBits	= 24;
	pfd.cDepthBits	= 32;
	pfd.iLayerType	= PFD_MAIN_PLANE ;

	int	nPixelFormat = ChoosePixelFormat(dc.m_hDC, &pfd);
	if (nPixelFormat == 0)
		return -1;

	BOOL bResult = SetPixelFormat(dc.m_hDC, nPixelFormat, &pfd);
	if (!bResult)
		return -1;
	
	m_hrc = wglCreateContext(dc.m_hDC);
	if (!m_hrc)
		return -1;
		
	return 0;
}

void CSPlineView::OnDestroy() 
{
	CView::OnDestroy();
	
	wglDeleteContext(m_hrc);
	
}
Соседние файлы в папке Лабораторная работа4