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

#include "stdafx.h"
#include "rlab4.h"

#include "rlab4Doc.h"
#include "rlab4View.h"

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

/////////////////////////////////////////////////////////////////////////////
// CRlab4View

IMPLEMENT_DYNCREATE(CRlab4View, CView)

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

/////////////////////////////////////////////////////////////////////////////
// CRlab4View construction/destruction

CRlab4View::CRlab4View()
{
	Point p[10];
	p[0] = Point(-0.7, 0.0, -0.7);
	p[1] = Point(-0.7, 0.3, -0.4);
	p[2] = Point(-0.7, -0.1, 0.2);
	p[3] = Point(-0.7, 0.0, 0.7);
	p[4] = Point(-0.2, 0.5, 0.7);
	p[5] = Point(0.2, -0.1, 0.7);
	p[6] = Point(0.7, 0.0, 0.7);
	p[7] = Point(-0.2, -0.2, -0.7);
	p[8] = Point(0.2, -0.2, -0.7);
	p[9] = Point(0.7, 0.0, -0.7);
	bc1.SetCurve(p[0], p[1], p[2], p[3]);
	bc2.SetCurve(p[3], p[4], p[5], p[6]);
	bc3.SetCurve(p[0], p[7], p[8], p[9]);
	bs.SetSurface(bc3, bc1, bc2);
}

CRlab4View::~CRlab4View()
{
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CRlab4View drawing

void CRlab4View::OnDraw(CDC* pDC)
{
	CRlab4Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	wglMakeCurrent(pDC->m_hDC, m_hrc);	

	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glFlush();

	double i, j;
	glBegin(GL_LINE_STRIP);
		for (i = 0; i <= 1; i += 0.05) {
			Point pt;
			pt = bc1.GetAt(i);
			glVertex3f(pt.x, pt.y + 0.05, pt.z);
		}
	glEnd();

	glBegin(GL_LINE_STRIP);
		for (i = 0; i <= 1; i += 0.05) {
			Point pt;
			pt = bc2.GetAt(i);
			glVertex3f(pt.x, pt.y + 0.05, pt.z);
		}
	glEnd();

	glBegin(GL_LINE_STRIP);
		for (i = 0; i <= 1; i += 0.05) {
			Point pt;
			pt = bc3.GetAt(i);
			glVertex3f(pt.x, pt.y - 0.05, pt.z);
		}
	glEnd();

	Point pts[4];
	glBegin(GL_QUADS);
		for (i = 0; i < 1; i += 0.05)
			for (j = 0; j < 1; j += 0.05) {
				pts[0] = bs.GetAt(i, j);
				pts[1] = bs.GetAt(i + 0.05, j);
				pts[2] = bs.GetAt(i + 0.05, j + 0.05);
				pts[3] = bs.GetAt(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);
}

/////////////////////////////////////////////////////////////////////////////
// CRlab4View diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CRlab4View message handlers

int CRlab4View::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 CRlab4View::OnInitialUpdate() 
{
	CView::OnInitialUpdate();
	
	CClientDC dc(this);
	wglMakeCurrent(dc.m_hDC, m_hrc);
	

	GLfloat light1_ambient[] = { 1.0f, 1.0f, 0.0f, 1.0f };
	GLfloat light1_diffuse[] = { 1.0f, 1.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.8f);
	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, 500, 500);
	glClearColor(0.0, 0.0, 0.0, 0.0);

	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	glRotatef(-45, 1, -0.4, 0);
	
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluPerspective(0, 1, 0, 100);
	glMatrixMode(GL_MODELVIEW);

	wglMakeCurrent(NULL, NULL);	
}

void CRlab4View::OnDestroy() 
{
	CView::OnDestroy();	
	
	wglDeleteContext(m_hrc);	
}

void CRlab4View::Draw()
{
}
Соседние файлы в папке Лабораторная работа2