Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
24
Добавлен:
02.05.2014
Размер:
9.75 Кб
Скачать
// 1KGView.cpp : implementation of the CMy1KGView class
//

#include "stdafx.h"
#include "1KG.h"

#include "1KGDoc.h"
#include "1KGView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CMy1KGView

IMPLEMENT_DYNCREATE(CMy1KGView, CView)

BEGIN_MESSAGE_MAP(CMy1KGView, CView)
//{{AFX_MSG_MAP(CMy1KGView)
ON_WM_CREATE()
	ON_WM_DESTROY()
	//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMy1KGView construction/destruction

CMy1KGView::CMy1KGView()
{
	// TODO: add construction code here
	
}

CMy1KGView::~CMy1KGView()
{
}

BOOL CMy1KGView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
    cs.style|=(WS_CLIPCHILDREN|WS_CLIPSIBLINGS); //устанавливаем  стили окна, необходимые для работы с OpenGL
	cs.cx=500;
	cs.cy=300;
	
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMy1KGView drawing

void CMy1KGView::OnDraw(CDC* pDC)
{
	CMy1KGDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	CRect ClientRect;                              //описываем переменную типа прямоугольник
GetClientRect(&ClientRect);						   //определяем длину и ширину окна на основе его координат
windW=abs(ClientRect.right-ClientRect.left);
windH=abs(ClientRect.top-ClientRect.bottom);
glClearColor(0.0,0.8,1.5,1.0);                     //задаем цвет фона окна, например, светло-серый
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);  //устанавливаем цвет фона
InitViewport(0, 0, windW, windH);                  //устанавливаем параметры видового окна
//glGenTextures(n,tex);                   
//image = auxDIBImageLoad("texture1.bmp");  
//glTranslatef(-1.f,0.4f,1.f); 
kapelka();
sdvig();
 
glFlush();                                  //или       glFinish();
SwapBuffers(wglGetCurrentDC());             //обеспечиваем перезапись содержимого внеэкранного буфера на экранный (основной)

	
}

/////////////////////////////////////////////////////////////////////////////
// CMy1KGView printing

BOOL CMy1KGView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CMy1KGView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CMy1KGView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CMy1KGView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CMy1KGView message handlers


int CMy1KGView::OnCreate(LPCREATESTRUCT lpCreateStruct) //функция обработки сообщения "Создание окна"
	{if (CView::OnCreate(lpCreateStruct) == -1)
	return -1;

//Настраиваем формат пикселей для работы с OpenGL

PIXELFORMATDESCRIPTOR pfd;                   //структура для описания формата пикселей
memset(&pfd,0,sizeof(PIXELFORMATDESCRIPTOR));//для начала заполняем все значения структуры нулями

//Начинаем заполнение нужных нам значений структуры:

pfd.nSize=sizeof(PIXELFORMATDESCRIPTOR);     //размер структуры, устанавливаем равным размеру типа PIXELFORMATDESCRIPTOR
pfd.nVersion=1;                              //номер версии, для работы с OpenGL ставим 1
pfd.dwFlags = PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER;           
                                             //рисовать в окне
                                             //поддержка OpenGL
                                             //двойная буферизация
pfd.iPixelType=PFD_TYPE_RGBA;                //режим для отображения цветов - цветовая  модель RGBA
pfd.cColorBits=32;                           //32-битовая глубина цвета
pfd.cAlphaBits=8;                            //компонента альфа цвета
pfd.cAccumBits=32;                           //буфер аккумулятора
pfd.cDepthBits=32;                           //буфер глубины (z- буфер)
pfd.cStencilBits=8;                          //трафарет
pfd.iLayerType=PFD_MAIN_PLANE;               //тип плоскости - основная
m_pdc=GetDC();                               //создаем контекст устройства

//Исходя из настройки пикселей и созданного контекста устройства, получаем оптимальный, наиболее совпадающий с требуемым, формат пикселей:

int nPixelFormat=ChoosePixelFormat(m_pdc->m_hDC,&pfd);
	if (nPixelFormat==0)
		{MessageBox("Ошибка при выборе формата пикселей");
		return FALSE;} 	
	BOOL bResult=SetPixelFormat(m_pdc->m_hDC,nPixelFormat,&pfd);

	//Устанавливаем полученный формат пикселей:
	if (!bResult){MessageBox("Ошибка при установке формата пикселей");
	return FALSE;}

	if ((hrc=wglCreateContext(m_pdc->m_hDC))==NULL) //на основе контекста устройства создаем контекст воспроизведения
	return FALSE;

	if (wglMakeCurrent(m_pdc->m_hDC,hrc)==FALSE)    //делаем его текущим
	return FALSE;    
return 0;
}

void CMy1KGView::OnDestroy() 
{
	CView::OnDestroy();
	
	// TODO: Add your message handler code here

	//Убираем из текущего и удаляем контекст воспроизведения

if (hrc==::wglGetCurrentContext())          //запрашиваем текущий контекст воспроизведения
   {wglMakeCurrent(NULL,NULL);              //делаем его не текущим
   wglDeleteContext(hrc);                   //удаляем контекст воспроизведения
   hrc=NULL;
   }
CView::OnDestroy();                         //для корректного завершения работы передаем управление вверх по иерархии

}

void CMy1KGView::InitViewport(int x, int y, int width, int height)
{
glViewport(x, y, width, height);             //задаем видовое окно
glMatrixMode(GL_PROJECTION);                 //определяем матрицу проецирования
glLoadIdentity();                            //делаем ее единичной
glOrtho(-10., 10., -7., 7.,2.,12.);         //задаем матрицу 2-х мерной ортографической проекции (окно отсечения),  коэффициенты в знаменателе масштабируют изображение
glMatrixMode(GL_MODELVIEW);                  //режим работы с матрицей вида
gluLookAt(0.,0.,5.,0.,0.,0.,0.,1.,0.);       //устанавливаем положение камеры просмотра

}




void CMy1KGView::kapelka()
{
//тело-шар
 glTranslatef(0.0f,2.3f,0.0f);	//сдвиг(расположение)
 glScalef(1.5,1.5,1.5);			//ссужение растяжение
 glRotatef(-25.1,5.0,-70.0,1.5);//поворот
 glColor3f(0.15, 0.5, 2.0);     //цвет 
 auxSolidSphere(1.02);          //тело-шар
 /*
// glTranslatef(0.0f,-2.3f,0.0f);	//сдвиг(расположение)
//глаз левый
 glTranslatef(0.0,2.9,0.3);     //сдвиг(расположение)
 glColor3f(1.0, 1.0, 1.0);      //цвет
 glScalef(1.5f,1.5f,3.0f);      //ссужение растяжение
 auxSolidSphere(0.06);          //глаз правый
// glTranslatef(-0.0,-2.9,-0.3);  //сдвиг(расположение)
//глаз правый
 glTranslatef(0.9,3.3,0.32);    //сдвиг(расположение)
 glColor3f(1.0, 1.0, 1.0);      //цвет
 glScalef(1.5f,2.2f,2.0f);      //ссужение растяжение
 auxSolidSphere(0.04);          //глаз левый
// glTranslatef(-0.9,-3.3,-0.32);     //сдвиг(расположение)
/*
 //зрачок левый
 glTranslatef(-3.01,2.0,-0.01); //сдвиг(расположение)
 glColor3f(0.0, 0.0, 0.0);      //цвет
 glScalef(1.5f,1.5f,1.0f);      //ссужение растяжение
 auxSolidSphere(0.015);         //зрачок левый
 glTranslatef(3.01,2.0,0.01);   //сдвиг(расположение)
//зрачок правый
 glTranslatef(0.02,-0.1,-0.01); //сдвиг(расположение)
 glColor3f(0.0, 0.0, 0.0);      //цвет
 glScalef(1.5f,1.5f,1.5f);      //ссужение растяжение
 auxSolidSphere(0.01);          //зрачок правый
 glTranslatef(-0.02,0.1,0.01);  //сдвиг(расположение)
//нос
 glTranslatef(-0.07,0.0,-0.02); //сдвиг(расположение)
 glColor3f(0.0, 0.0, 0.0);      //цвет
 glScalef(1.5,3.0,1.5);         //ссужение растяжение
 glRotatef(-25.1,5.,-70.0,1.5); //поворот
 auxSolidSphere(0.005);         //нос
 glTranslatef(0.07,0.0,0.02);   //сдвиг(расположение)
//рот1
 glTranslatef(0.01,-0.003,-0.03);//сдвиг(расположение)
 glColor3f(2.0, 0.0, 0.0);      //цвет
 glScalef(3.0f,1.5f,1.5f);      //ссужение растяжение
 glRotatef(-25.1,5.,-70.0,1.5); //поворот
 auxSolidSphere(0.005);         //рот1
 glTranslatef(-0.01,0.003,0.03);//сдвиг(расположение)

 //рот2
 glMatrixMode(GL_MODELVIEW);
 glLoadIdentity();
 glTranslatef(-0.6,0.0,0.0);    //сдвиг(расположение)
 glColor3f(0.15, 0.5, 2.0);     //цвет
 glScalef(3.0,1.5,1.5);         //ссужение растяжение
 glRotatef(-25.1,5.,-70.0,1.5); //поворот
 auxSolidSphere(0.02);
 glPushMatrix();
*/
}




void CMy1KGView::sdvig()
{
glTranslatef(-5.0,  -1.0,  0.0);
for (int i=0;i<400;i++)      // цикл по кадрам
{                   

	  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//Стираем старое изображение в BACK - буфере,
      kapelka();
	  //Создаем в BACK - буфере новое изображение
	  glRotatef(5.0, 0.0, 1.0, 0.0);
	  glTranslatef(0.5, 0.0, 0.0);
	  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	  kapelka();
	  glFlush();
      SwapBuffers(wglGetCurrentDC());    // переключаем буферы
}
}
Соседние файлы в папке Kapelka KG