Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа4 / SPlineView
.cpp// 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