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

#include "stdafx.h"
#include "Projections.h"

#include "ProjectionsDoc.h"
#include "ProjectionsView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CProjectionsView

IMPLEMENT_DYNCREATE(CProjectionsView, COpenGLView)

CProjectionsView::CProjectionsView()
{
}

CProjectionsView::~CProjectionsView()
{
}

BEGIN_MESSAGE_MAP(CProjectionsView, COpenGLView)
	//{{AFX_MSG_MAP(CProjectionsView)
	ON_WM_SIZE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CProjectionsView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CProjectionsView drawing

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

void CProjectionsView::OnDraw(CDC* pDC)
{
	CProjectionsDoc* pDoc = GetDocument();
  ASSERT_VALID(pDoc);
	
  GLfloat x = 2.0f, y = 2.0f, z = 3.0f;
  
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  glColor3f(1.0f, 0.3f, 0.5f);
  glEnable(GL_DEPTH_TEST);
  glShadeModel(GL_FLAT);
  glPushMatrix();
    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
    //glTranslatef(-0.5f, 0.5f, 0.0f);
    //glRotatef( 20.0f, 1.0f, 0.0f, 0.0f);
    //glRotatef(-30.0f, 0.0f, 1.0f, 0.0f);
    //glRotatef(-45.0f, 0.0f, 0.0f, 1.0f);
    
    // Определяем координаты осей

    glLineWidth(2.0f);
    glBegin(GL_LINES);
			glColor3f(0.0f, 0.0f, 1.0f);
			glVertex3f(0.0f, 0.0f, 0.0f);
			glVertex3f(  x,  0.0f, 0.0f);
      glColor3f(1.0f, 0.0f, 0.0f);
      glVertex3f(0.0f, 0.0f, 0.0f);
      glVertex3f(0.0f,   y,  0.0f);
      glColor3f(0.0f, 0.8f, 0.0f);
      glVertex3f(0.0f, 0.0f, 0.0f);
      glVertex3f(0.0f, 0.0f,   z);
		glEnd();

    glLineStipple(2, 0x1C47);
    glEnable(GL_LINE_STIPPLE);

    glBegin(GL_LINES);
			glColor3f(0.0f, 0.0f, 1.0f);
			glVertex3f( 0.0f, 0.0f, 0.0f);
			glVertex3f(-x,    0.0f, 0.0f);
      glColor3f(1.0f, 0.0f, 0.0f);
      glVertex3f(0.0f,  0.0f, 0.0f);
      glVertex3f(0.0f, -y,    0.0f);
      glColor3f(0.0f, 0.8f, 0.0f);
      glVertex3f(0.0f, 0.0f,  0.0f);
      glVertex3f(0.0f, 0.0f, -z);
    glEnd();

    glDisable(GL_LINE_STIPPLE);

    glShadeModel(GL_SMOOTH);

    // Определяем координаты вершин для треугольников
		glBegin(GL_QUAD_STRIP);
			glColor3f(1.0f, 0.0f, 1.0f);
      glVertex3f(-0.5f,  0.5f,  1.5f);
      glVertex3f(-0.5f, -0.5f,  1.5f);
			glVertex3f( 0.5f,  0.5f,  1.5f);
      glVertex3f( 0.5f, -0.5f,  1.5f);
			glVertex3f( 0.5f,  0.5f, -2.5f);
      glVertex3f( 0.5f, -0.5f, -2.5f);
      glVertex3f(-0.5f,  0.5f, -2.5f);
      glVertex3f(-0.5f, -0.5f, -2.5f);
			glVertex3f(-0.5f,  0.5f,  1.5f);
      glVertex3f(-0.5f, -0.5f,  1.5f);
		glEnd();

    glBegin(GL_QUADS);
			glVertex3f(-0.5f, 0.5f,  1.5f);
			glVertex3f( 0.5f, 0.5f,  1.5f);
			glVertex3f( 0.5f, 0.5f, -2.5f);
      glVertex3f(-0.5f, 0.5f, -2.5f);
    glEnd();

    glBegin(GL_QUADS);
      glVertex3f(-0.5f, -0.5f,  1.5f);
      glVertex3f( 0.5f, -0.5f,  1.5f);
			glVertex3f( 0.5f, -0.5f, -2.5f);
      glVertex3f(-0.5f, -0.5f, -2.5f);
    glEnd();
  glPopMatrix();

  glFinish();
  
  SwapBuffers(::wglGetCurrentDC());
}

/////////////////////////////////////////////////////////////////////////////
// CProjectionsView message handlers

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

  m_width  = cx;
  m_height = cy;

  glViewport(5, 5, m_width - 10, m_height - 10);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();

  // Диметрическая поверхность
  GLfloat mDim[4][4] = {
    0.925820f,  0.133631f, -0.353553f, 0.0f,
    0.0f,       0.935414f,  0.353553f, 0.0f,
    0.377964f, -0.327321f,  0.866025f, 0.0f,
    0.0f,       0.0f,       0.0f,      3.0f
  };

  // Изометрическая проекция
  GLfloat mIso[4][4] = {
    0.707107f,  0.408248f, -0.577353f, 0.0f,
    0.0f,       0.816597f,  0.577345f, 0.0f,
    0.707107f, -0.408248f,  0.577353f, 0.0f,
    0.0f,       0.0f,       0.0f,      3.0f
  };

  // Произвольная проекция
  GLfloat mTwo[4][4] = {
     0.5f,   0.0f, 0.866f,-2.0f,
     0.0f,   1.0f, 0.0f,  -1.0f,
    -0.866f, 0.0f, 0.5f,   1.0f,
    -0.866f, 0.0f, 0.5f,   2.0f
  };

  GLfloat aspect = 1.0f;
  
  glLoadMatrixf(&mDim[0][0]);

  glOrtho(-2.0f, 3.0f,
          -3.0,  2.0f,
          -20.0, 20.0);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  gluLookAt(5.0f, 5.0f, 10.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f);
}

Соседние файлы в папке Projections