Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // MFCApplication1View.cpp : реализация класса CMFCApplication1View
- //
- #include "stdafx.h"
- // SHARED_HANDLERS можно определить в обработчиках фильтров просмотра реализации проекта ATL, эскизов
- // и поиска; позволяет совместно использовать код документа в данным проекте.
- #ifndef SHARED_HANDLERS
- #include "MFCApplication1.h"
- #endif
- #define _USE_MATH_DEFINES
- #include<cmath>
- #include<complex>
- #include "MFCApplication1Doc.h"
- #include "MFCApplication1View.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #endif
- using namespace std;
- // CMFCApplication1View
- IMPLEMENT_DYNCREATE(CMFCApplication1View, CView)
- BEGIN_MESSAGE_MAP(CMFCApplication1View, CView)
- // Стандартные команды печати
- ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
- ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
- ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CMFCApplication1View::OnFilePrintPreview)
- ON_WM_CONTEXTMENU()
- ON_WM_RBUTTONUP()
- ON_WM_CREATE()
- ON_WM_DESTROY()
- ON_WM_MOUSEMOVE()
- ON_WM_KEYDOWN()
- ON_COMMAND(ID_32771, &CMFCApplication1View::AroundX)
- ON_COMMAND(ID_32772, &CMFCApplication1View::AroundY)
- ON_COMMAND(ID_32791, &CMFCApplication1View::AroundZ)
- ON_COMMAND(ID_32775, &CMFCApplication1View::TranslationXAdd)
- ON_COMMAND(ID_32776, &CMFCApplication1View::TranslationYAdd)
- ON_COMMAND(ID_32777, &CMFCApplication1View::TranslationZAdd)
- ON_COMMAND(ID_32778, &CMFCApplication1View::TranslationXSub)
- ON_COMMAND(ID_32779, &CMFCApplication1View::TranslationYSub)
- ON_COMMAND(ID_32782, &CMFCApplication1View::ScaleXAdd)
- ON_COMMAND(ID_32788, &CMFCApplication1View::ProportionalScale)
- ON_COMMAND(ID_32789, &CMFCApplication1View::ProportionalScaleMin)
- ON_COMMAND(ID_32783, &CMFCApplication1View::ScaleXPlus)
- ON_COMMAND(ID_32784, &CMFCApplication1View::ScaleZPlus)
- ON_COMMAND(ID_32785, &CMFCApplication1View::ScaleXMin)
- ON_COMMAND(ID_32786, &CMFCApplication1View::ScaleYMin)
- ON_COMMAND(ID_32787, &CMFCApplication1View::ScaleZMin)
- ON_COMMAND(ID_32780, &CMFCApplication1View::TransZMin)
- END_MESSAGE_MAP()
- // создание/уничтожение CMFCApplication1View
- CMFCApplication1View::CMFCApplication1View()
- : windH(0)
- , windW(0)
- , transX(0)
- , transY(0)
- , transZ(0)
- , rotX(0)
- , rotY(0)
- , rotZ(0)
- , scaleX(0)
- , scaleY(0)
- , scaleZ(0)
- , scale_(0)
- , alpha_(0)
- , beta_(0)
- , mousex_(0)
- , mousey_(0)
- {
- // TODO: добавьте код создания
- }
- CMFCApplication1View::~CMFCApplication1View()
- {
- }
- BOOL CMFCApplication1View::PreCreateWindow(CREATESTRUCT& cs)
- {
- // TODO: изменить класс Window или стили посредством изменения
- // CREATESTRUCT cs
- cs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS);
- return CView::PreCreateWindow(cs);
- }
- //3D Drawings
- void setFog() {
- GLfloat FogColor[4] = { 0.3,0.3,0.3,1 };
- glEnable(GL_FOG);
- glFogi(GL_FOG_MODE, GL_LINEAR);
- glFogf(GL_FOG_START, 20.0);
- glFogf(GL_FOG_END, 70.0);
- glFogfv(GL_FOG_COLOR, FogColor);
- }
- void setLightning() {
- //GLfloat ambient[] = { 0.7, 0.7, 0.7, 1.0 }; // значения RGBA, определяющие интенсивность рассеянного света ис-точника
- //GLfloat diffuse[] = { 0.7, 0.7, 0.7, 1.0 }; // интенсивность диффуз-ного освещения
- //GLfloat specular[] = { 0.0, 0.0, 1.0, 1.0 }; // интенсивность осве-щения зеркального от-ражения
- //GLfloat position[] = { 10.0, 30.0, 10.0, 1.0 }; // местоположение 0-го источника света – про-жектора
- ////GLfloat direction[] = { -10.0, -10.0, -10.0 }; // направление действия про-жектора
- //GLfloat lmodel_ambient[] = { 0.5, 0.2, 0.7, 1.0 }; // полная фоновая интенсивность света
- //GLfloat local_view[] = { GL_TRUE }; // местоположение наблю-дателя в начале видовой системы координат
- // // Установка параметров источника света (прожектора GL_LIGHT0)
- //glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 10.0); // 0-128; по-казатель распределения интенсивности прожек-тора
- //glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 120.0); // 0-90, 180; угол разброса прожектора
- ////glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, direction); // направление действия прожектора
- //glLightfv(GL_LIGHT0, GL_AMBIENT, ambient); // фоновое осве-щение (рассеянный свет)
- //glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse); // диффузное осве-щение
- //glLightfv(GL_LIGHT0, GL_SPECULAR, specular); // зеркальное
- //glLightfv(GL_LIGHT0, GL_POSITION, position); // местоположение прожектора
- //glEnable(GL_LIGHTING); // включение режима анализа освещения
- //glEnable(GL_LIGHT0); // включаем прожектор
- //glEnable(GL_NORMALIZE); // режим нормализации нормалей
- ////glEnable(GL_DEPTH_TEST); // тест глубины
- //glEnable(GL_COLOR_MATERIAL); // учет цвета материала
- GLfloat amb_0[] = { 1.0, 1.0, 1.0, 1.0 }; // значения RGBA, определяющие интенсивность рассеянного света ис-точника krasniy
- GLfloat dif_0[] = { 1.0, 1.0, 1.0, 1.0 }; // интенсивность диффуз-ного освещения
- GLfloat spec_0[] = { 0.0, 0.0, 1.0, 1.0 }; // интенсивность осве-щения зеркального от-ражения
- GLfloat pos_0[] = { 40.0, -40.0, 45.0, 1.0 }; // местоположение 0-го источника света – про-жектора
- GLfloat direction[] = { -40.0, -40.0, 10 }; // направление действия про-жектора
- GLfloat pos_1[] = { -40.0, 40.0, 3.0, 1.0 };
- GLfloat amb_1[] = { 1.0, 0.0, 0.0, 1.0 };
- GLfloat dif_1[] = { 1.0, 0.0, 0, 1.0 };
- GLfloat spec_1[] = { 1.0, 1.0, 1.0, 1.0 };
- GLfloat pos_2[] = { 40.0, 40.0, 3.0, 1.0 };
- GLfloat amb_2[] = { 0.0, 0.0, 1.0, 1.0 };
- GLfloat dif_2[] = { 0.0, 0.0, 0.0, 1.0 };
- GLfloat spec_2[] = { 1.0, 1.0, 1.0, 1.0 };
- GLfloat pos_3[] = { -40.0, -40.0, 3.0, 1.0 };
- GLfloat amb_3[] = { 0.0, 0.0, 0.0, 1.0 };
- GLfloat dif_3[] = { 0.0, 0.0, 0.0, 1.0 };
- GLfloat spec_3[] = { 1.0, 1.0, 1.0, 1.0 };
- GLfloat lmodel_ambient[] = { 0.5, 0.2, 0.7, 1.0 }; // полная фоновая интенсивность света
- GLfloat local_view[] = { GL_TRUE }; // местоположение наблю-дателя в начале видовой системы координат
- // Установка параметров источника света (прожектора GL_LIGHT0)
- glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 10.0); // 0-128; по-казатель распределения интенсивности прожек-тора
- glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 120.0); // 0-90, 180; угол разброса прожектора
- glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, direction); // направление действия прожектора
- glLightfv(GL_LIGHT0, GL_AMBIENT, amb_0); // фоновое осве-щение (рассеянный свет)
- glLightfv(GL_LIGHT0, GL_DIFFUSE, dif_0); // диффузное осве-щение
- glLightfv(GL_LIGHT0, GL_SPECULAR, spec_0); // зеркальное
- glLightfv(GL_LIGHT0, GL_POSITION, pos_0); // местоположение прожектора
- glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 10.0); // 0-128; по-казатель распределения интенсивности прожек-тора
- glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 120.0); // 0-90, 180; угол разброса прожектора
- glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, direction); // направление действия прожектора
- glLightfv(GL_LIGHT1, GL_AMBIENT, amb_1); // фоновое осве-щение (рассеянный свет)
- glLightfv(GL_LIGHT1, GL_DIFFUSE, dif_1); // диффузное осве-щение
- glLightfv(GL_LIGHT1, GL_SPECULAR, spec_1); // зеркальное
- glLightfv(GL_LIGHT1, GL_POSITION, pos_1);
- glLightf(GL_LIGHT2, GL_SPOT_EXPONENT, 10.0); // 0-128; по-казатель распределения интенсивности прожек-тора
- glLightf(GL_LIGHT2, GL_SPOT_CUTOFF, 120.0); // 0-90, 180; угол разброса прожектора
- glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION, direction); // направление действия прожектора
- glLightfv(GL_LIGHT2, GL_AMBIENT, amb_2); // фоновое осве-щение (рассеянный свет)
- glLightfv(GL_LIGHT2, GL_DIFFUSE, dif_2); // диффузное осве-щение
- glLightfv(GL_LIGHT2, GL_SPECULAR, spec_2); // зеркальное
- glLightfv(GL_LIGHT2, GL_POSITION, pos_2);
- glLightf(GL_LIGHT3, GL_SPOT_EXPONENT, 10.0); // 0-128; по-казатель распределения интенсивности прожек-тора
- glLightf(GL_LIGHT3, GL_SPOT_CUTOFF, 120.0); // 0-90, 180; угол разброса прожектора
- glLightfv(GL_LIGHT3, GL_SPOT_DIRECTION, direction); // направление действия прожектора
- glLightfv(GL_LIGHT3, GL_AMBIENT, amb_3); // фоновое осве-щение (рассеянный свет)
- glLightfv(GL_LIGHT3, GL_DIFFUSE, dif_3); // диффузное осве-щение
- glLightfv(GL_LIGHT3, GL_SPECULAR, spec_3); // зеркальное
- glLightfv(GL_LIGHT3, GL_POSITION, pos_3);
- //glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 10.0); // 0-128; по-казатель распределения интенсивности прожек-тора
- //glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 120.0); // 0-90, 180; угол разброса прожектора
- //glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, direction1);
- //glLightfv(GL_LIGHT1, GL_AMBIENT, ambient1); // фоновое осве-щение (рассеянный свет)
- //glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse); // диффузное осве-щение
- //glLightfv(GL_LIGHT1, GL_SPECULAR, specular); // зеркальное
- //glLightfv(GL_LIGHT1, GL_POSITION, position1);
- //glLightf(GL_LIGHT2, GL_SPOT_EXPONENT, 10.0); // 0-128; по-казатель распределения интенсивности прожек-тора
- //glLightf(GL_LIGHT2, GL_SPOT_CUTOFF, 120.0); // 0-90, 180; угол разброса прожектора
- //glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION, direction2);
- //glLightfv(GL_LIGHT2, GL_AMBIENT, ambient2); // фоновое осве-щение (рассеянный свет)
- //glLightfv(GL_LIGHT2, GL_DIFFUSE, diffuse); // диффузное осве-щение
- //glLightfv(GL_LIGHT2, GL_SPECULAR, specular); // зеркальное
- //glLightfv(GL_LIGHT2, GL_POSITION, position2);
- //glLightf(GL_LIGHT3, GL_SPOT_EXPONENT, 10.0); // 0-128; по-казатель распределения интенсивности прожек-тора
- //glLightf(GL_LIGHT3, GL_SPOT_CUTOFF, 120.0); // 0-90, 180; угол разброса прожектора
- //glLightfv(GL_LIGHT3, GL_SPOT_DIRECTION, direction3);
- //glLightfv(GL_LIGHT3, GL_AMBIENT, ambient3); // фоновое осве-щение (рассеянный свет)
- //glLightfv(GL_LIGHT3, GL_DIFFUSE, diffuse); // диффузное осве-щение
- //glLightfv(GL_LIGHT3, GL_SPECULAR, specular); // зеркальное
- //glLightfv(GL_LIGHT3, GL_POSITION, position3);
- glEnable(GL_LIGHTING); // включение режима анализа освещения
- //glEnable(GL_LIGHT0); // включаем прожектор
- //glEnable(GL_LIGHT1);
- //glEnable(GL_LIGHT2);
- glEnable(GL_LIGHT3);
- glEnable(GL_NORMALIZE); // режим нормализации нормалей
- glEnable(GL_COLOR_MATERIAL); // учет цвета материала
- }
- void drawMountain3(float shade, float posX, float posY, float posZ) {
- glPushMatrix();
- glColor3f(0.396 * shade, 0.263 * shade, 0.12 * shade);
- glTranslated(posX, posY, posZ);
- auxSolidCone(25, 15);
- glPopMatrix();
- }
- void drawSun3() {
- glPushMatrix();
- glTranslated(15, 12, 45);
- glColor4d(1, 1, 0, 1.0);
- auxSolidSphere(7);
- glPopMatrix();
- }
- void drawTree3(float scale, float posX, float posY, float posZ) {
- glPushMatrix();
- glTranslated(posX, posY, posZ);
- //glRotated(90, 1, 0, 0);
- glColor3f(0.301, 0.149, 0);
- auxSolidCylinder(2 * scale, 10 * scale);
- glPopMatrix();
- glPushMatrix();
- glTranslated(posX, posY, posZ);
- glRotated(270, 1, 0, 0);
- glColor3d(0, 0.2, 0);
- auxSolidCone(5 * scale, 4 * scale);
- glPopMatrix();
- glPushMatrix();
- glTranslated(posX, posY + 4 * scale, posZ);
- glRotated(270, 1, 0, 0);
- glColor3d(0, 0.2, 0);
- auxSolidCone(5 * scale, 4 * scale);
- glPopMatrix();
- glPushMatrix();
- glTranslated(posX, posY + 8 * scale, posZ);
- glRotated(270, 1, 0, 0);
- glColor3d(0, 0.2, 0);
- auxSolidCone(5 * scale, 4 * scale);
- glPopMatrix();
- }
- void drawGround3(float posY) {
- glPushMatrix();
- glColor3f(0, 0, 0);
- glTranslated(0, posY, 0);
- auxSolidBox(90, 0, 90);
- glPopMatrix();
- }
- void drawHouse3() {
- glColor3f(0.8, 0.8, 0.8);
- auxSolidCube(10.0);
- glColor3f(0.2, 0.1019, 0);
- glBegin(GL_TRIANGLES);
- glVertex3f(0, 9, 0);
- glVertex3f(-6, 5, -6);
- glVertex3f(-6, 5, 6);
- glEnd();
- glBegin(GL_TRIANGLES);
- glVertex3f(0, 9, 0);
- glVertex3f(-6, 5, 6);
- glVertex3f(6, 5, 6);
- glEnd();
- glBegin(GL_TRIANGLES);
- glVertex3f(0, 9, 0);
- glVertex3f(6, 5, 6);
- glVertex3f(6, 5, -6);
- glEnd();
- glBegin(GL_TRIANGLES);
- glVertex3f(0, 9, 0);
- glVertex3f(-6, 5, -6);
- glVertex3f(6, 5, -6);
- glEnd();
- }
- void drawStars3(int numOfStars) {
- glColor3f(1, 1, 0);
- int starX, starY, starZ;
- for (int i = 0; i < numOfStars; i++) {
- starX = -100 + rand() % 200;
- starZ = -100 + rand() % 200;
- starY = 50 + rand() % 50;
- glPushMatrix();
- glTranslated(starX, starY, starZ);
- auxSolidTetrahedron(1.0);
- glPopMatrix();
- glPushMatrix();
- glTranslated(starX, starY, starZ);
- glRotated(90, 1, 0, 0);
- auxSolidTetrahedron(1.0);
- glPopMatrix();
- }
- }
- void drawMushroom3(float posX, float posY, float posZ, float scale) {
- glPushMatrix();
- glColor3f(0.6, 0.6, 0.6);
- glTranslated(posX, posY + 10 * scale, posZ);
- auxSolidCylinder(3.0 * scale, 10.0 * scale);
- glPopMatrix();
- glColor3f(0.2, 0.066, 0);
- glPushMatrix();
- glTranslated(posX, posY + 10 * scale + 1, posZ);
- glRotated(-90, 1, 0, 0);
- auxSolidCone(5 * scale, 3 * scale);
- glPopMatrix();
- /*GLUquadricObj *quadObj;
- quadObj = gluNewQuadric();
- gluQuadricDrawStyle(quadObj, GLU_FILL);
- glColor3f(0.2, 0.066, 0);
- for (int i = 0; i <= 100; i++) {
- glPushMatrix();
- glTranslated(posX, posY + 10 + 5 * i / 100, posZ);
- gluDisk(quadObj, 0, 5 - 5 * i / 100, 20, 20);
- glPopMatrix();
- }*/
- }
- //2D Drawings
- void drawSky2(float starSize, int starCount) {
- int starX, starY;
- for (int i = 0; i <= starCount; i++) {
- starX = -100 + rand() % 200;
- starY = rand() % 100;
- glBegin(GL_POLYGON);
- glColor3f(1, 1, 0);
- for (float k = 0; k < 3; k++) {
- //glVertex2f(starX + 2 * cos(2 * M_PI * k / M_PI), starY + 2 * sin(2 * M_PI * k / M_PI));
- glVertex2f(starX + starSize * cos(2.0 * M_PI * k / 3), starY + starSize * sin(2.0 * M_PI * k / 3));
- }
- //glVertex2f(starX + 2 * cos(0), starY + 3 * sin(0));
- glEnd();
- glBegin(GL_POLYGON);
- glColor3f(1, 1, 0);
- for (float k = 0; k < 3; k++) {
- //glVertex2f(starX + 2 * cos(2 * M_PI * k / M_PI), starY + 2 * sin(2 * M_PI * k / M_PI));
- glVertex2f(starX + starSize * cos(M_PI + 2.0 * M_PI * k / 3), starY + starSize * sin(M_PI + 2.0 * M_PI * k / 3));
- }
- //glVertex2f(starX + 2 * cos(0), starY + 3 * sin(0));
- glEnd();
- }
- }
- void drawGround2() {
- glBegin(GL_QUAD_STRIP);
- glColor3f(0, 0, 0);
- glVertex2f(-100, -10);
- glVertex2f(100, -10);
- glVertex2f(-100, -100);
- glVertex2f(100, -100);
- glEnd();
- }
- void drawHouse2() {
- glBegin(GL_QUADS);
- glColor3f(0.8, 0.8, 0.8);
- glVertex2f(10, -10);
- glVertex2f(10, 30);
- glVertex2f(40, 30);
- glVertex2f(40, -10);
- glEnd();
- glBegin(GL_TRIANGLES);
- glColor3f(0.2, 0.066, 0);
- glVertex2f(5, 30);
- glVertex2f(45, 30);
- glVertex2f(25, 50);
- glEnd();
- }
- void drawTree2(float posX, float posY) {
- glBegin(GL_QUADS);
- glColor3f(0.2, 0.1, 0);
- glVertex2f(posX - 5, posY);
- glVertex2f(posX - 5, posY + 25);
- glVertex2f(posX + 5, posY + 25);
- glVertex2f(posX + 5, posY);
- glEnd();
- for (int i = 0; i <= 2; i++) {
- glBegin(GL_TRIANGLES);
- glColor3f(0, 0.4, 0);
- glVertex2f(posX - 10, posY + 25 + 10 * i);
- glVertex2f(posX + 10, posY + 25 + 10 * i);
- glVertex2f(posX, posY + 25 + ((10 * i) + 10));
- glEnd();
- }
- }
- void CMFCApplication1View::OnDraw(CDC* pDC)
- {// TODO: add draw code for native data here
- CRect ClientRect; // описываем переменную типа прямоугольник
- GetClientRect(&ClientRect); // определяем длину и ширину окна
- windW = abs(ClientRect.right - ClientRect.left);
- windH = abs(ClientRect.top - ClientRect.bottom);
- glClearColor(0.6, 0.6, 0.3f, 1.0); // задаем цвет фона окна рисования
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // устанавливаем этот цвет фона glClear(GL_COLOR_BUFFER_BIT); // устанавливаем этот цвет фона
- InitViewport(0, 0, windW, windH); // устанавливаем параметры области вывода // далее следуют команды построения изображения, например:
- glTranslatef(transX, transY, transZ);
- glRotatef(rotX, 1.0f, 0.0f, 0.0f);
- glRotatef(rotY, 0.0f, 1.0f, 0.0f);
- glRotatef(rotZ, 0.0f, 0.0f, 1.0f);
- glScalef(scaleX, scaleY, scaleZ);
- glScalef(scale_, scale_, scale_);
- glRotatef(alpha_, 1.0f, 0.0f, 0.0f);
- glRotatef(beta_, 0.0f, 1.0f, 0.0f);
- glEnable(GL_DEPTH_TEST);
- setLightning();
- //drawGround3(-6);
- //drawHouse3();
- //drawTree3(1, 20, 3, 20);
- //drawTree3(1, -15, 3, 20);
- //drawTree3(1, -20, 3, -20);
- //drawStars3(20);
- glColor3d(0.2, 0.6, 0.4);
- glPushMatrix();
- glRotated(90, 1, 0, 0);
- auxSolidBox(40, 30, 5);
- glPopMatrix();
- for (int i = 0; i < 6; i++) {
- drawMushroom3(-20 + 40 * i / 6, 1.5, -15 + 30 * i / 6, 0.3);
- }
- glFlush();
- SwapBuffers(wglGetCurrentDC());
- }
- void CMFCApplication1View::OnFilePrintPreview()
- {
- #ifndef SHARED_HANDLERS
- AFXPrintPreview(this);
- #endif
- }
- BOOL CMFCApplication1View::OnPreparePrinting(CPrintInfo* pInfo)
- {
- // подготовка по умолчанию
- return DoPreparePrinting(pInfo);
- }
- void CMFCApplication1View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
- {
- // TODO: добавьте дополнительную инициализацию перед печатью
- }
- void CMFCApplication1View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
- {
- // TODO: добавьте очистку после печати
- }
- void CMFCApplication1View::OnRButtonUp(UINT /* nFlags */, CPoint point)
- {
- ClientToScreen(&point);
- OnContextMenu(this, point);
- }
- void CMFCApplication1View::OnContextMenu(CWnd* /* pWnd */, CPoint point)
- {
- #ifndef SHARED_HANDLERS
- theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE);
- #endif
- }
- // диагностика CMFCApplication1View
- #ifdef _DEBUG
- void CMFCApplication1View::AssertValid() const
- {
- CView::AssertValid();
- }
- void CMFCApplication1View::Dump(CDumpContext& dc) const
- {
- CView::Dump(dc);
- }
- CMFCApplication1Doc* CMFCApplication1View::GetDocument() const // встроена неотлаженная версия
- {
- ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFCApplication1Doc)));
- return (CMFCApplication1Doc*)m_pDocument;
- }
- #endif //_DEBUG
- // обработчики сообщений CMFCApplication1View
- int CMFCApplication1View::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (CView::OnCreate(lpCreateStruct) == -1)
- return -1;
- rotX = rotY = 30.0;
- rotZ = 0.0;
- scaleX = scaleY = scaleZ = 1.0;
- transX = transY = transZ = 0.0;
- alpha_ = 0;
- beta_ = 0;
- scale_ = 1;
- mousex_ = 0;
- mousey_ = 0;
- // TODO: Add your specialized creation code here
- // Настраиваем формат пикселей для работы с 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 | // поддержка OpenGL
- PFD_DOUBLEBUFFER; // двойная буферизация
- 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(LPCTSTR("Ошибка при выборе формата пикселей"));
- return FALSE;
- }
- BOOL bResult = SetPixelFormat(m_pdc->m_hDC, nPixelFormat, &pfd);
- // Устанавливаем полученный формат пикселей:
- if (!bResult)
- {
- MessageBox(LPCTSTR("Ошибка при установке формата пикселей"));
- 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 CMFCApplication1View::OnDestroy()
- // функция обработки сообщения “Уничтожение окна”
- { // TODO: Add your message handler code here
- // Убираем из текущего и удаляем контекст воспроизведения:
- if (hrc == ::wglGetCurrentContext()) // запрашиваем текущий контекст воспроизведения
- {
- wglMakeCurrent(NULL, NULL); // делаем его не текущим
- wglDeleteContext(hrc); // удаляем контекст воспроизведения
- hrc = NULL;
- }
- CView::OnDestroy(); // корректное завершение работы
- }
- void CMFCApplication1View::InitViewport(int x, int y, int width, int height)
- {
- glViewport(x, y, width, height);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrtho(-30, 30, -25, 25, -15, 15);
- //glFrustum(0.,0.,0.,0.,0.,0.);
- //gluPerspective (90.0, width/height, 1.0, 10.0);
- //gluLookAt(0., 0., 20., 0., 0., 0., 0., 1., 0.);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- }
- void CMFCApplication1View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
- {
- // TODO: добавьте свой код обработчика сообщений или вызов стандартного
- if ((nChar == 'Z') || (nChar == 'M'))
- {
- transY -= 1;
- OnDraw(m_pdc);
- }
- if ((nChar == 'W') || (nChar == 'T'))
- {
- transY += 1;
- OnDraw(m_pdc);
- }
- if ((nChar == 'A') || (nChar == 'J'))
- {
- transX -= 1;
- OnDraw(m_pdc);
- }
- if ((nChar == 'D') || (nChar == 'L'))
- {
- transX += 1;
- OnDraw(m_pdc);
- }
- if (nChar == 'S')
- {
- rotY += 10;
- OnDraw(m_pdc);
- }
- if (nChar == 'K')
- {
- rotY -= 10;
- OnDraw(m_pdc);
- }
- if (nChar == '6')
- {
- if ((scaleX<4.1) && (scaleY<4.1) && (scaleZ<4.1))
- {
- scaleX = scaleX + 4.1 / 10.;
- scaleY = scaleY + 4.1 / 10.;
- scaleZ = scaleZ + 4.1 / 10.;
- }
- OnDraw(m_pdc);
- }
- if (nChar == '7')
- {
- if ((scaleX>4.1 / 10.) && (scaleY>4.1 / 10.) && (scaleZ>4.1 / 10.))
- {
- scaleX = scaleX - 4.1 / 10.;
- scaleY = scaleY - 4.1 / 10.;
- scaleZ = scaleZ - 4.1 / 10.;
- }
- OnDraw(m_pdc);
- }
- CView::OnKeyDown(nChar, nRepCnt, nFlags);
- }
- void CMFCApplication1View::OnMouseMove(UINT nFlags, CPoint point)
- {
- // TODO: добавьте свой код обработчика сообщений или вызов стандартного
- // вращение сцены:
- if (nFlags&MK_LBUTTON)
- {
- // прибавить переменным alpha_ и beta_ разницу между новыми и старыми положениями мыши
- beta_ += point.x - mousex_;
- alpha_ += point.y - mousey_;
- Invalidate(false);
- }
- // масштабирование сцены
- if (nFlags&MK_RBUTTON)
- {
- scale_ += (point.x - mousex_)*0.02;
- if (scale_<0.1) scale_ = 0.1;
- Invalidate(false);
- }
- // сохраняем положение мыши
- mousex_ = point.x;
- mousey_ = point.y;
- CView::OnMouseMove(nFlags, point);
- }
- void CMFCApplication1View::AroundX()
- {
- // TODO: добавьте свой код обработчика команд
- rotX = rotX + 10;
- Invalidate();
- }
- void CMFCApplication1View::AroundY()
- {
- // TODO: добавьте свой код обработчика команд
- rotY = rotY + 10;
- Invalidate();
- }
- void CMFCApplication1View::AroundZ()
- {
- // TODO: добавьте свой код обработчика команд
- rotZ = rotZ + 10;
- Invalidate();
- }
- void CMFCApplication1View::TranslationXAdd()
- {
- // TODO: добавьте свой код обработчика команд
- transX = transX + 1;
- Invalidate();
- }
- void CMFCApplication1View::TranslationYAdd()
- {
- transY = transY + 1;
- Invalidate();
- // TODO: добавьте свой код обработчика команд
- }
- void CMFCApplication1View::TranslationZAdd()
- {
- transZ = transZ + 50.;
- Invalidate();
- // TODO: добавьте свой код обработчика команд
- }
- void CMFCApplication1View::TranslationXSub()
- {
- transX = transX-1;
- Invalidate();
- // TODO: добавьте свой код обработчика команд
- }
- void CMFCApplication1View::TranslationYSub()
- {
- // TODO: добавьте свой код обработчика команд
- transY = transY -1.;
- Invalidate();
- }
- void CMFCApplication1View::ScaleXAdd()
- {
- // TODO: добавьте свой код обработчика команд
- if (scaleX < 4.1)
- {
- scaleX = scaleX + 4.1 / 10. ;
- }
- Invalidate();
- }
- void CMFCApplication1View::ProportionalScale()
- {
- if ((scaleX<4.1) && (scaleY<4.1) &&
- (scaleZ<4.1))
- {
- scaleX = scaleX + 4.1 / 10.;
- scaleY = scaleY + 4.1 / 10.;
- scaleZ = scaleZ + 4.1 / 10.;
- }
- Invalidate();
- // TODO: добавьте свой код обработчика команд
- }
- void CMFCApplication1View::ProportionalScaleMin()
- {
- // TODO: добавьте свой код обработчика команд
- if ((scaleX > 4.1/ 10.) && (scaleY>4.1/ 10.) &&
- (scaleZ >4.1/ 10.))
- {
- scaleX = scaleX -4.1 / 10.;
- scaleY = scaleY -4.1 / 10.;
- scaleZ = scaleZ -4.1 / 10.;
- }
- Invalidate();
- }
- void CMFCApplication1View::ScaleXPlus()
- {
- // TODO: добавьте свой код обработчика команд
- if (scaleY < 4.1)
- scaleY = scaleY + 4.1 / 10.;
- Invalidate();
- }
- void CMFCApplication1View::ScaleZPlus()
- {
- // TODO: добавьте свой код обработчика команд
- if (scaleZ < 4.1)
- scaleZ = scaleZ + 4.1 / 10.;
- Invalidate();
- }
- void CMFCApplication1View::ScaleXMin()
- {
- // TODO: добавьте свой код обработчика команд
- if (scaleX < 4.1)
- scaleX = scaleX - 4.1 / 10.;
- Invalidate();
- }
- void CMFCApplication1View::ScaleYMin()
- {
- // TODO: добавьте свой код обработчика команд
- if (scaleX < 4.1)
- scaleX = scaleX - 4.1 / 10.;
- Invalidate();
- }
- void CMFCApplication1View::ScaleZMin()
- {
- // TODO: добавьте свой код обработчика команд
- if (scaleX < 4.1)
- scaleX = scaleX - 4.1 / 10.;
- Invalidate();
- }
- void CMFCApplication1View::TransZMin()
- {
- transZ = transZ - 50.;
- Invalidate();
- // TODO: добавьте свой код обработчика команд
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement