Advertisement
Guest User

Untitled

a guest
Dec 11th, 2019
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 29.54 KB | None | 0 0
  1.  
  2. // MFCApplication1View.cpp : реализация класса CMFCApplication1View
  3. //
  4.  
  5. #include "stdafx.h"
  6. // SHARED_HANDLERS можно определить в обработчиках фильтров просмотра реализации проекта ATL, эскизов
  7. // и поиска; позволяет совместно использовать код документа в данным проекте.
  8. #ifndef SHARED_HANDLERS
  9. #include "MFCApplication1.h"
  10. #endif
  11.  
  12. #define _USE_MATH_DEFINES
  13.  
  14. #include<cmath>
  15. #include<complex>
  16.  
  17. #include "MFCApplication1Doc.h"
  18. #include "MFCApplication1View.h"
  19.  
  20. #ifdef _DEBUG
  21. #define new DEBUG_NEW
  22. #endif
  23.  
  24. using namespace std;
  25.  
  26. // CMFCApplication1View
  27.  
  28. IMPLEMENT_DYNCREATE(CMFCApplication1View, CView)
  29.  
  30. BEGIN_MESSAGE_MAP(CMFCApplication1View, CView)
  31.     // Стандартные команды печати
  32.     ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
  33.     ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
  34.     ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CMFCApplication1View::OnFilePrintPreview)
  35.     ON_WM_CONTEXTMENU()
  36.     ON_WM_RBUTTONUP()
  37.     ON_WM_CREATE()
  38.     ON_WM_DESTROY()
  39.     ON_WM_MOUSEMOVE()
  40.     ON_WM_KEYDOWN()
  41.     ON_COMMAND(ID_32771, &CMFCApplication1View::AroundX)
  42.     ON_COMMAND(ID_32772, &CMFCApplication1View::AroundY)
  43.     ON_COMMAND(ID_32791, &CMFCApplication1View::AroundZ)
  44.     ON_COMMAND(ID_32775, &CMFCApplication1View::TranslationXAdd)
  45.     ON_COMMAND(ID_32776, &CMFCApplication1View::TranslationYAdd)
  46.     ON_COMMAND(ID_32777, &CMFCApplication1View::TranslationZAdd)
  47.     ON_COMMAND(ID_32778, &CMFCApplication1View::TranslationXSub)
  48.     ON_COMMAND(ID_32779, &CMFCApplication1View::TranslationYSub)
  49.     ON_COMMAND(ID_32782, &CMFCApplication1View::ScaleXAdd)
  50.     ON_COMMAND(ID_32788, &CMFCApplication1View::ProportionalScale)
  51.     ON_COMMAND(ID_32789, &CMFCApplication1View::ProportionalScaleMin)
  52.     ON_COMMAND(ID_32783, &CMFCApplication1View::ScaleXPlus)
  53.     ON_COMMAND(ID_32784, &CMFCApplication1View::ScaleZPlus)
  54.     ON_COMMAND(ID_32785, &CMFCApplication1View::ScaleXMin)
  55.     ON_COMMAND(ID_32786, &CMFCApplication1View::ScaleYMin)
  56.     ON_COMMAND(ID_32787, &CMFCApplication1View::ScaleZMin)
  57.     ON_COMMAND(ID_32780, &CMFCApplication1View::TransZMin)
  58. END_MESSAGE_MAP()
  59.  
  60. // создание/уничтожение CMFCApplication1View
  61.  
  62. CMFCApplication1View::CMFCApplication1View()
  63.     : windH(0)
  64.     , windW(0)
  65.     , transX(0)
  66.     , transY(0)
  67.     , transZ(0)
  68.     , rotX(0)
  69.     , rotY(0)
  70.     , rotZ(0)
  71.     , scaleX(0)
  72.     , scaleY(0)
  73.     , scaleZ(0)
  74.     , scale_(0)
  75.     , alpha_(0)
  76.     , beta_(0)
  77.     , mousex_(0)
  78.     , mousey_(0)
  79. {
  80.     // TODO: добавьте код создания
  81.  
  82. }
  83.  
  84. CMFCApplication1View::~CMFCApplication1View()
  85. {
  86. }
  87.  
  88. BOOL CMFCApplication1View::PreCreateWindow(CREATESTRUCT& cs)
  89. {
  90.     // TODO: изменить класс Window или стили посредством изменения
  91.     //  CREATESTRUCT cs
  92.     cs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS);
  93.     return CView::PreCreateWindow(cs);
  94. }
  95.  
  96.  
  97. //3D Drawings
  98. void setFog() {
  99.     GLfloat FogColor[4] = { 0.3,0.3,0.3,1 };
  100.     glEnable(GL_FOG);
  101.     glFogi(GL_FOG_MODE, GL_LINEAR);
  102.     glFogf(GL_FOG_START, 20.0);
  103.     glFogf(GL_FOG_END, 70.0);
  104.     glFogfv(GL_FOG_COLOR, FogColor);
  105.  
  106. }
  107.  
  108. void setLightning() {
  109.     //GLfloat ambient[] = { 0.7, 0.7, 0.7, 1.0 };  // значения RGBA, определяющие интенсивность рассеянного света ис-точника
  110.     //GLfloat diffuse[] = { 0.7, 0.7, 0.7, 1.0 };  // интенсивность диффуз-ного освещения
  111.     //GLfloat specular[] = { 0.0, 0.0, 1.0, 1.0 };  // интенсивность осве-щения зеркального от-ражения
  112.     //GLfloat position[] = { 10.0, 30.0, 10.0, 1.0 }; // местоположение 0-го источника света – про-жектора
  113.     ////GLfloat direction[] = { -10.0, -10.0, -10.0 };  // направление действия про-жектора
  114.     //GLfloat lmodel_ambient[] = { 0.5, 0.2, 0.7, 1.0 };  // полная фоновая интенсивность света
  115.     //GLfloat local_view[] = { GL_TRUE };  // местоположение наблю-дателя в начале видовой системы координат
  116.     //                                   // Установка параметров источника света (прожектора GL_LIGHT0)
  117.     //glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 10.0);  // 0-128; по-казатель распределения интенсивности прожек-тора
  118.     //glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 120.0);  // 0-90, 180; угол разброса прожектора
  119.     ////glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, direction);  // направление  действия прожектора
  120.     //glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);  // фоновое осве-щение (рассеянный свет)
  121.     //glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);  // диффузное осве-щение
  122.     //glLightfv(GL_LIGHT0, GL_SPECULAR, specular);     //  зеркальное
  123.     //glLightfv(GL_LIGHT0, GL_POSITION, position);  // местоположение прожектора
  124.  
  125.     //glEnable(GL_LIGHTING);  // включение режима анализа освещения
  126.     //glEnable(GL_LIGHT0);                             // включаем прожектор
  127.     //glEnable(GL_NORMALIZE);         // режим нормализации нормалей
  128.     ////glEnable(GL_DEPTH_TEST);                  // тест глубины   
  129.     //glEnable(GL_COLOR_MATERIAL);        // учет цвета материала
  130.     GLfloat amb_0[] = { 1.0, 1.0, 1.0, 1.0 };  // значения RGBA, определяющие интенсивность рассеянного света ис-точника krasniy
  131.  
  132.     GLfloat dif_0[] = { 1.0, 1.0, 1.0, 1.0 };  // интенсивность диффуз-ного освещения
  133.     GLfloat spec_0[] = { 0.0, 0.0, 1.0, 1.0 };  // интенсивность осве-щения зеркального от-ражения
  134.  
  135.     GLfloat pos_0[] = { 40.0, -40.0, 45.0, 1.0 }; // местоположение 0-го источника света – про-жектора
  136.  
  137.  
  138.  
  139.     GLfloat direction[] = { -40.0, -40.0, 10 };  // направление действия про-жектора
  140.  
  141.     GLfloat   pos_1[] = { -40.0, 40.0, 3.0, 1.0 };
  142.     GLfloat   amb_1[] = { 1.0, 0.0, 0.0, 1.0 };
  143.     GLfloat   dif_1[] = { 1.0, 0.0, 0, 1.0 };
  144.     GLfloat   spec_1[] = { 1.0, 1.0, 1.0, 1.0 };
  145.  
  146.     GLfloat   pos_2[] = { 40.0, 40.0, 3.0, 1.0 };
  147.     GLfloat   amb_2[] = { 0.0, 0.0, 1.0, 1.0 };
  148.     GLfloat   dif_2[] = { 0.0, 0.0, 0.0, 1.0 };
  149.     GLfloat   spec_2[] = { 1.0, 1.0, 1.0, 1.0 };
  150.  
  151.     GLfloat   pos_3[] = { -40.0, -40.0, 3.0, 1.0 };
  152.     GLfloat   amb_3[] = { 0.0, 0.0, 0.0, 1.0 };
  153.     GLfloat   dif_3[] = { 0.0, 0.0, 0.0, 1.0 };
  154.     GLfloat   spec_3[] = { 1.0, 1.0, 1.0, 1.0 };
  155.  
  156.     GLfloat lmodel_ambient[] = { 0.5, 0.2, 0.7, 1.0 };  // полная фоновая интенсивность света
  157.     GLfloat local_view[] = { GL_TRUE };  // местоположение наблю-дателя в начале видовой системы координат
  158.                                          // Установка параметров источника света (прожектора GL_LIGHT0)
  159.     glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 10.0);  // 0-128; по-казатель распределения интенсивности прожек-тора
  160.     glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 120.0);  // 0-90, 180; угол разброса прожектора
  161.     glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, direction);  // направление  действия прожектора
  162.     glLightfv(GL_LIGHT0, GL_AMBIENT, amb_0);  // фоновое осве-щение (рассеянный свет)
  163.     glLightfv(GL_LIGHT0, GL_DIFFUSE, dif_0);  // диффузное осве-щение
  164.     glLightfv(GL_LIGHT0, GL_SPECULAR, spec_0);     //  зеркальное
  165.     glLightfv(GL_LIGHT0, GL_POSITION, pos_0);  // местоположение прожектора
  166.  
  167.     glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 10.0);  // 0-128; по-казатель распределения интенсивности прожек-тора
  168.     glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 120.0);  // 0-90, 180; угол разброса прожектора
  169.     glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, direction);  // направление  действия прожектора
  170.     glLightfv(GL_LIGHT1, GL_AMBIENT, amb_1);  // фоновое осве-щение (рассеянный свет)
  171.     glLightfv(GL_LIGHT1, GL_DIFFUSE, dif_1);  // диффузное осве-щение
  172.     glLightfv(GL_LIGHT1, GL_SPECULAR, spec_1);     //  зеркальное
  173.     glLightfv(GL_LIGHT1, GL_POSITION, pos_1);
  174.  
  175.     glLightf(GL_LIGHT2, GL_SPOT_EXPONENT, 10.0);  // 0-128; по-казатель распределения интенсивности прожек-тора
  176.     glLightf(GL_LIGHT2, GL_SPOT_CUTOFF, 120.0);  // 0-90, 180; угол разброса прожектора
  177.     glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION, direction);  // направление  действия прожектора
  178.     glLightfv(GL_LIGHT2, GL_AMBIENT, amb_2);  // фоновое осве-щение (рассеянный свет)
  179.     glLightfv(GL_LIGHT2, GL_DIFFUSE, dif_2);  // диффузное осве-щение
  180.     glLightfv(GL_LIGHT2, GL_SPECULAR, spec_2);     //  зеркальное
  181.     glLightfv(GL_LIGHT2, GL_POSITION, pos_2);
  182.  
  183.     glLightf(GL_LIGHT3, GL_SPOT_EXPONENT, 10.0);  // 0-128; по-казатель распределения интенсивности прожек-тора
  184.     glLightf(GL_LIGHT3, GL_SPOT_CUTOFF, 120.0);  // 0-90, 180; угол разброса прожектора
  185.     glLightfv(GL_LIGHT3, GL_SPOT_DIRECTION, direction);  // направление  действия прожектора
  186.     glLightfv(GL_LIGHT3, GL_AMBIENT, amb_3);  // фоновое осве-щение (рассеянный свет)
  187.     glLightfv(GL_LIGHT3, GL_DIFFUSE, dif_3);  // диффузное осве-щение
  188.     glLightfv(GL_LIGHT3, GL_SPECULAR, spec_3);     //  зеркальное
  189.     glLightfv(GL_LIGHT3, GL_POSITION, pos_3);
  190.  
  191.     //glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 10.0);  // 0-128; по-казатель распределения интенсивности прожек-тора
  192.     //glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 120.0);  // 0-90, 180; угол разброса прожектора
  193.     //glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, direction1);
  194.     //glLightfv(GL_LIGHT1, GL_AMBIENT, ambient1);  // фоновое осве-щение (рассеянный свет)
  195.     //glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);  // диффузное осве-щение
  196.     //glLightfv(GL_LIGHT1, GL_SPECULAR, specular);     //  зеркальное
  197.     //glLightfv(GL_LIGHT1, GL_POSITION, position1);
  198.  
  199.  
  200.     //glLightf(GL_LIGHT2, GL_SPOT_EXPONENT, 10.0);  // 0-128; по-казатель распределения интенсивности прожек-тора
  201.     //glLightf(GL_LIGHT2, GL_SPOT_CUTOFF, 120.0);  // 0-90, 180; угол разброса прожектора
  202.     //glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION, direction2);
  203.     //glLightfv(GL_LIGHT2, GL_AMBIENT, ambient2);  // фоновое осве-щение (рассеянный свет)
  204.     //glLightfv(GL_LIGHT2, GL_DIFFUSE, diffuse);  // диффузное осве-щение
  205.     //glLightfv(GL_LIGHT2, GL_SPECULAR, specular);     //  зеркальное
  206.     //glLightfv(GL_LIGHT2, GL_POSITION, position2);
  207.  
  208.  
  209.  
  210.  
  211.  
  212.     //glLightf(GL_LIGHT3, GL_SPOT_EXPONENT, 10.0);  // 0-128; по-казатель распределения интенсивности прожек-тора
  213.     //glLightf(GL_LIGHT3, GL_SPOT_CUTOFF, 120.0);  // 0-90, 180; угол разброса прожектора
  214.     //glLightfv(GL_LIGHT3, GL_SPOT_DIRECTION, direction3);
  215.     //glLightfv(GL_LIGHT3, GL_AMBIENT, ambient3);  // фоновое осве-щение (рассеянный свет)
  216.     //glLightfv(GL_LIGHT3, GL_DIFFUSE, diffuse);  // диффузное осве-щение
  217.     //glLightfv(GL_LIGHT3, GL_SPECULAR, specular);     //  зеркальное
  218.     //glLightfv(GL_LIGHT3, GL_POSITION, position3);
  219.  
  220.  
  221.  
  222.  
  223.     glEnable(GL_LIGHTING);  // включение режима анализа освещения
  224.     //glEnable(GL_LIGHT0);                             // включаем прожектор
  225.     //glEnable(GL_LIGHT1);
  226.     //glEnable(GL_LIGHT2);
  227.     glEnable(GL_LIGHT3);
  228.  
  229.     glEnable(GL_NORMALIZE);         // режим нормализации нормалей
  230.     glEnable(GL_COLOR_MATERIAL);        // учет цвета материала
  231. }
  232.  
  233. void drawMountain3(float shade, float posX, float posY, float posZ) {
  234.     glPushMatrix();
  235.     glColor3f(0.396 * shade, 0.263 * shade, 0.12 * shade);
  236.     glTranslated(posX, posY, posZ);
  237.     auxSolidCone(25, 15);
  238.     glPopMatrix();
  239. }
  240.  
  241. void drawSun3() {
  242.     glPushMatrix();
  243.     glTranslated(15, 12, 45);
  244.     glColor4d(1, 1, 0, 1.0);
  245.     auxSolidSphere(7);
  246.     glPopMatrix();
  247. }
  248.  
  249. void drawTree3(float scale, float posX, float posY, float posZ) {
  250.     glPushMatrix();
  251.     glTranslated(posX, posY, posZ);
  252.     //glRotated(90, 1, 0, 0);
  253.     glColor3f(0.301, 0.149, 0);
  254.     auxSolidCylinder(2 * scale, 10 * scale);
  255.     glPopMatrix();
  256.  
  257.     glPushMatrix();
  258.     glTranslated(posX, posY, posZ);
  259.     glRotated(270, 1, 0, 0);
  260.     glColor3d(0, 0.2, 0);
  261.     auxSolidCone(5 * scale, 4 * scale);
  262.     glPopMatrix();
  263.  
  264.     glPushMatrix();
  265.     glTranslated(posX, posY + 4 * scale, posZ);
  266.     glRotated(270, 1, 0, 0);
  267.     glColor3d(0, 0.2, 0);
  268.     auxSolidCone(5 * scale, 4 * scale);
  269.     glPopMatrix();
  270.  
  271.     glPushMatrix();
  272.     glTranslated(posX, posY + 8 * scale, posZ);
  273.     glRotated(270, 1, 0, 0);
  274.     glColor3d(0, 0.2, 0);
  275.     auxSolidCone(5 * scale, 4 * scale);
  276.     glPopMatrix();
  277. }
  278.  
  279. void drawGround3(float posY) {
  280.     glPushMatrix();
  281.     glColor3f(0, 0, 0);
  282.     glTranslated(0, posY, 0);
  283.     auxSolidBox(90, 0, 90);
  284.     glPopMatrix();
  285. }
  286.  
  287. void drawHouse3() {
  288.     glColor3f(0.8, 0.8, 0.8);
  289.     auxSolidCube(10.0);
  290.  
  291.     glColor3f(0.2, 0.1019, 0);
  292.     glBegin(GL_TRIANGLES);
  293.     glVertex3f(0, 9, 0);
  294.     glVertex3f(-6, 5, -6);
  295.     glVertex3f(-6, 5, 6);
  296.     glEnd();
  297.     glBegin(GL_TRIANGLES);
  298.     glVertex3f(0, 9, 0);
  299.     glVertex3f(-6, 5, 6);
  300.     glVertex3f(6, 5, 6);
  301.     glEnd();
  302.     glBegin(GL_TRIANGLES);
  303.     glVertex3f(0, 9, 0);
  304.     glVertex3f(6, 5, 6);
  305.     glVertex3f(6, 5, -6);
  306.     glEnd();
  307.     glBegin(GL_TRIANGLES);
  308.     glVertex3f(0, 9, 0);
  309.     glVertex3f(-6, 5, -6);
  310.     glVertex3f(6, 5, -6);
  311.     glEnd();
  312. }
  313.  
  314. void drawStars3(int numOfStars) {
  315.     glColor3f(1, 1, 0);
  316.     int starX, starY, starZ;
  317.     for (int i = 0; i < numOfStars; i++) {
  318.         starX = -100 + rand() % 200;
  319.         starZ = -100 + rand() % 200;
  320.         starY = 50 + rand() % 50;
  321.         glPushMatrix();
  322.         glTranslated(starX, starY, starZ);
  323.         auxSolidTetrahedron(1.0);
  324.         glPopMatrix();
  325.         glPushMatrix();
  326.         glTranslated(starX, starY, starZ);
  327.         glRotated(90, 1, 0, 0);
  328.         auxSolidTetrahedron(1.0);
  329.         glPopMatrix();
  330.     }
  331. }
  332.  
  333. void drawMushroom3(float posX, float posY, float posZ, float scale) {
  334.     glPushMatrix();
  335.     glColor3f(0.6, 0.6, 0.6);
  336.     glTranslated(posX, posY + 10 * scale, posZ);
  337.     auxSolidCylinder(3.0 * scale, 10.0 * scale);
  338.     glPopMatrix();
  339.     glColor3f(0.2, 0.066, 0);
  340.     glPushMatrix();
  341.     glTranslated(posX, posY + 10 * scale + 1, posZ);
  342.     glRotated(-90, 1, 0, 0);
  343.     auxSolidCone(5 * scale, 3 * scale);
  344.     glPopMatrix();
  345.     /*GLUquadricObj *quadObj;
  346.     quadObj = gluNewQuadric();
  347.     gluQuadricDrawStyle(quadObj, GLU_FILL);
  348.     glColor3f(0.2, 0.066, 0);
  349.     for (int i = 0; i <= 100; i++) {
  350.         glPushMatrix();
  351.         glTranslated(posX, posY + 10 + 5 * i / 100, posZ);
  352.         gluDisk(quadObj, 0, 5 - 5 * i / 100, 20, 20);
  353.         glPopMatrix();
  354.     }*/
  355. }
  356.  
  357. //2D Drawings
  358. void drawSky2(float starSize, int starCount) {
  359.     int starX, starY;
  360.     for (int i = 0; i <= starCount; i++) {
  361.         starX = -100 + rand() % 200;
  362.         starY = rand() % 100;
  363.         glBegin(GL_POLYGON);
  364.         glColor3f(1, 1, 0);
  365.         for (float k = 0; k < 3; k++) {
  366.             //glVertex2f(starX + 2 * cos(2 * M_PI * k / M_PI), starY + 2 * sin(2 * M_PI * k / M_PI));
  367.             glVertex2f(starX + starSize * cos(2.0 * M_PI * k / 3), starY + starSize * sin(2.0 * M_PI * k / 3));
  368.         }
  369.         //glVertex2f(starX + 2 * cos(0), starY + 3 * sin(0));
  370.         glEnd();
  371.         glBegin(GL_POLYGON);
  372.         glColor3f(1, 1, 0);
  373.         for (float k = 0; k < 3; k++) {
  374.             //glVertex2f(starX + 2 * cos(2 * M_PI * k / M_PI), starY + 2 * sin(2 * M_PI * k / M_PI));
  375.             glVertex2f(starX + starSize * cos(M_PI + 2.0 * M_PI * k / 3), starY + starSize * sin(M_PI + 2.0 * M_PI * k / 3));
  376.         }
  377.         //glVertex2f(starX + 2 * cos(0), starY + 3 * sin(0));
  378.         glEnd();
  379.     }
  380. }
  381. void drawGround2() {
  382.     glBegin(GL_QUAD_STRIP);
  383.     glColor3f(0, 0, 0);
  384.     glVertex2f(-100, -10);
  385.     glVertex2f(100, -10);
  386.     glVertex2f(-100, -100);
  387.     glVertex2f(100, -100);
  388.     glEnd();
  389. }
  390. void drawHouse2() {
  391.     glBegin(GL_QUADS);
  392.     glColor3f(0.8, 0.8, 0.8);
  393.     glVertex2f(10, -10);
  394.     glVertex2f(10, 30);
  395.     glVertex2f(40, 30);
  396.     glVertex2f(40, -10);
  397.     glEnd();
  398.  
  399.     glBegin(GL_TRIANGLES);
  400.     glColor3f(0.2, 0.066, 0);
  401.     glVertex2f(5, 30);
  402.     glVertex2f(45, 30);
  403.     glVertex2f(25, 50);
  404.     glEnd();
  405. }
  406. void drawTree2(float posX, float posY) {
  407.     glBegin(GL_QUADS);
  408.     glColor3f(0.2, 0.1, 0);
  409.     glVertex2f(posX - 5, posY);
  410.     glVertex2f(posX - 5, posY + 25);
  411.     glVertex2f(posX + 5, posY + 25);
  412.     glVertex2f(posX + 5, posY);
  413.     glEnd();
  414.     for (int i = 0; i <= 2; i++) {
  415.         glBegin(GL_TRIANGLES);
  416.         glColor3f(0, 0.4, 0);
  417.         glVertex2f(posX - 10, posY + 25 + 10 * i);
  418.         glVertex2f(posX + 10, posY + 25 + 10 * i);
  419.         glVertex2f(posX, posY + 25 + ((10 * i) + 10));
  420.         glEnd();
  421.     }
  422. }
  423. void CMFCApplication1View::OnDraw(CDC* pDC)
  424. {// TODO: add draw code for native data here
  425. CRect ClientRect;   // описываем переменную типа прямоугольник
  426. GetClientRect(&ClientRect);       // определяем длину и ширину окна
  427. windW = abs(ClientRect.right - ClientRect.left);
  428. windH = abs(ClientRect.top - ClientRect.bottom);
  429. glClearColor(0.6, 0.6, 0.3f, 1.0);    // задаем цвет фона окна рисования
  430. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);   // устанавливаем этот цвет фона  glClear(GL_COLOR_BUFFER_BIT);   // устанавливаем этот цвет фона
  431. InitViewport(0, 0, windW, windH);        // устанавливаем параметры области вывода                                           // далее следуют команды построения изображения, например:
  432. glTranslatef(transX, transY, transZ);
  433. glRotatef(rotX, 1.0f, 0.0f, 0.0f);
  434. glRotatef(rotY, 0.0f, 1.0f, 0.0f);
  435. glRotatef(rotZ, 0.0f, 0.0f, 1.0f);
  436. glScalef(scaleX, scaleY, scaleZ);
  437. glScalef(scale_, scale_, scale_);
  438. glRotatef(alpha_, 1.0f, 0.0f, 0.0f);
  439. glRotatef(beta_, 0.0f, 1.0f, 0.0f);
  440. glEnable(GL_DEPTH_TEST);
  441.  
  442. setLightning();
  443.  
  444. //drawGround3(-6);
  445. //drawHouse3();
  446. //drawTree3(1, 20, 3, 20);
  447. //drawTree3(1, -15, 3, 20);
  448. //drawTree3(1, -20, 3, -20);
  449. //drawStars3(20);
  450.  
  451. glColor3d(0.2, 0.6, 0.4);
  452. glPushMatrix();
  453. glRotated(90, 1, 0, 0);
  454. auxSolidBox(40, 30, 5);
  455. glPopMatrix();
  456.  
  457. for (int i = 0; i < 6; i++) {
  458.     drawMushroom3(-20 + 40 * i / 6, 1.5, -15 + 30 * i / 6, 0.3);
  459. }
  460.  
  461. glFlush();
  462. SwapBuffers(wglGetCurrentDC());
  463. }
  464.  
  465. void CMFCApplication1View::OnFilePrintPreview()
  466. {
  467. #ifndef SHARED_HANDLERS
  468.     AFXPrintPreview(this);
  469. #endif
  470. }
  471.  
  472. BOOL CMFCApplication1View::OnPreparePrinting(CPrintInfo* pInfo)
  473. {
  474.     // подготовка по умолчанию
  475.     return DoPreparePrinting(pInfo);
  476. }
  477.  
  478. void CMFCApplication1View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  479. {
  480.     // TODO: добавьте дополнительную инициализацию перед печатью
  481. }
  482.  
  483. void CMFCApplication1View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
  484. {
  485.     // TODO: добавьте очистку после печати
  486. }
  487.  
  488. void CMFCApplication1View::OnRButtonUp(UINT /* nFlags */, CPoint point)
  489. {
  490.     ClientToScreen(&point);
  491.     OnContextMenu(this, point);
  492. }
  493.  
  494. void CMFCApplication1View::OnContextMenu(CWnd* /* pWnd */, CPoint point)
  495. {
  496. #ifndef SHARED_HANDLERS
  497.     theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE);
  498. #endif
  499. }
  500.  
  501.  
  502. // диагностика CMFCApplication1View
  503.  
  504. #ifdef _DEBUG
  505. void CMFCApplication1View::AssertValid() const
  506. {
  507.     CView::AssertValid();
  508. }
  509.  
  510. void CMFCApplication1View::Dump(CDumpContext& dc) const
  511. {
  512.     CView::Dump(dc);
  513. }
  514.  
  515. CMFCApplication1Doc* CMFCApplication1View::GetDocument() const // встроена неотлаженная версия
  516. {
  517.     ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFCApplication1Doc)));
  518.     return (CMFCApplication1Doc*)m_pDocument;
  519. }
  520. #endif //_DEBUG
  521.  
  522.  
  523. // обработчики сообщений CMFCApplication1View
  524.  
  525.  
  526. int CMFCApplication1View::OnCreate(LPCREATESTRUCT lpCreateStruct)
  527. {
  528.  
  529.     if (CView::OnCreate(lpCreateStruct) == -1)
  530.         return -1;
  531.     rotX = rotY = 30.0;
  532.     rotZ = 0.0;
  533.     scaleX = scaleY = scaleZ = 1.0;
  534.     transX = transY = transZ = 0.0;
  535.     alpha_ = 0;
  536.     beta_ = 0;
  537.     scale_ = 1;
  538.     mousex_ = 0;
  539.     mousey_ = 0;
  540.  
  541.     // TODO: Add your specialized creation code here
  542.  
  543.     // Настраиваем формат пикселей для работы с OpenGL:
  544.     PIXELFORMATDESCRIPTOR pfd;      // структура для описания формата пикселей
  545.     memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR)); // для начала заполняем все значения структуры нулями
  546.                                                     // Начинаем заполнение нужных нам значений структуры:
  547.     pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); // размер структуры, устанавливаем равным размеру типа PIXELFORMATDESCRIPTOR
  548.     pfd.nVersion = 1;                       // номер версии, для работы с OpenGL ставим 1
  549.     pfd.dwFlags = PFD_DRAW_TO_WINDOW |       // рисовать в окне
  550.         PFD_SUPPORT_OPENGL |                 // поддержка OpenGL
  551.         PFD_DOUBLEBUFFER;                      // двойная буферизация
  552.     pfd.iPixelType = PFD_TYPE_RGBA;     // цветовая  модель RGBA
  553.     pfd.cColorBits = 32;                                // 32-битовая глубина цвета
  554.     pfd.cAlphaBits = 8;                                 // компонента альфа цвета
  555.     pfd.cAccumBits = 32;                             // буфер аккумулятора
  556.     pfd.cDepthBits = 32;                              // буфер глубины (z-буфер)
  557.     pfd.cStencilBits = 8;                              // трафарет
  558.     pfd.iLayerType = PFD_MAIN_PLANE;   // тип плоскости – основная
  559.     m_pdc = GetDC();                           // создаем контекст устройства
  560.                                                // Исходя из настройки пикселей и созданного контекста устройства, получаем оптимальный, наиболее совпадающий с требуемым, формат пикселей:
  561.     int nPixelFormat = ChoosePixelFormat(m_pdc->m_hDC, &pfd);
  562.     if (nPixelFormat == 0)
  563.     {
  564.         MessageBox(LPCTSTR("Ошибка при выборе формата пикселей"));
  565.         return FALSE;
  566.     }
  567.     BOOL bResult = SetPixelFormat(m_pdc->m_hDC, nPixelFormat, &pfd);
  568.     // Устанавливаем полученный формат пикселей:
  569.     if (!bResult)
  570.     {
  571.         MessageBox(LPCTSTR("Ошибка при установке формата пикселей"));
  572.         return FALSE;
  573.     }
  574.     if ((hrc = wglCreateContext(m_pdc->m_hDC)) == NULL)  // на основе контекста устройства создаем контекст воспроизведения
  575.         return FALSE;
  576.     if (wglMakeCurrent(m_pdc->m_hDC, hrc) == FALSE) // делаем его текущим
  577.         return FALSE;
  578.     return 0;
  579. }
  580.  
  581.  
  582.  
  583. void CMFCApplication1View::OnDestroy()
  584. // функция обработки сообщения “Уничтожение окна”
  585. {     // TODO: Add your message handler code here
  586.       // Убираем из текущего и удаляем контекст воспроизведения:
  587.     if (hrc == ::wglGetCurrentContext())     // запрашиваем текущий контекст воспроизведения
  588.     {
  589.         wglMakeCurrent(NULL, NULL);         // делаем его не текущим
  590.         wglDeleteContext(hrc);        // удаляем контекст воспроизведения
  591.         hrc = NULL;
  592.     }
  593.     CView::OnDestroy();                   // корректное завершение работы
  594. }
  595.  
  596.  
  597.  
  598. void CMFCApplication1View::InitViewport(int x, int y, int width, int height)
  599. {
  600.     glViewport(x, y, width, height);
  601.     glMatrixMode(GL_PROJECTION);
  602.     glLoadIdentity();
  603.     glOrtho(-30, 30, -25, 25, -15, 15);
  604.     //glFrustum(0.,0.,0.,0.,0.,0.);
  605.     //gluPerspective (90.0,  width/height,  1.0, 10.0);
  606.     //gluLookAt(0., 0., 20., 0., 0., 0., 0., 1., 0.);
  607.     glMatrixMode(GL_MODELVIEW);
  608.     glLoadIdentity();
  609. }
  610.  
  611.  
  612.  
  613. void CMFCApplication1View::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
  614. {
  615.     // TODO: добавьте свой код обработчика сообщений или вызов стандартного
  616.     if ((nChar == 'Z') || (nChar == 'M'))
  617.     {
  618.         transY -= 1;
  619.         OnDraw(m_pdc);
  620.     }
  621.     if ((nChar == 'W') || (nChar == 'T'))
  622.     {
  623.         transY += 1;
  624.         OnDraw(m_pdc);
  625.     }
  626.     if ((nChar == 'A') || (nChar == 'J'))
  627.     {
  628.         transX -= 1;
  629.         OnDraw(m_pdc);
  630.     }
  631.     if ((nChar == 'D') || (nChar == 'L'))
  632.     {
  633.         transX += 1;
  634.         OnDraw(m_pdc);
  635.     }
  636.     if (nChar == 'S')
  637.     {
  638.         rotY += 10;
  639.         OnDraw(m_pdc);
  640.     }
  641.     if (nChar == 'K')
  642.     {
  643.         rotY -= 10;
  644.         OnDraw(m_pdc);
  645.     }
  646.     if (nChar == '6')
  647.     {
  648.         if ((scaleX<4.1) && (scaleY<4.1) && (scaleZ<4.1))
  649.         {
  650.             scaleX = scaleX + 4.1 / 10.;
  651.             scaleY = scaleY + 4.1 / 10.;
  652.             scaleZ = scaleZ + 4.1 / 10.;
  653.         }
  654.         OnDraw(m_pdc);
  655.     }
  656.     if (nChar == '7')
  657.     {
  658.         if ((scaleX>4.1 / 10.) && (scaleY>4.1 / 10.) && (scaleZ>4.1 / 10.))
  659.         {
  660.             scaleX = scaleX - 4.1 / 10.;
  661.             scaleY = scaleY - 4.1 / 10.;
  662.             scaleZ = scaleZ - 4.1 / 10.;
  663.         }
  664.         OnDraw(m_pdc);
  665.     }
  666.  
  667.     CView::OnKeyDown(nChar, nRepCnt, nFlags);
  668. }
  669.  
  670.  
  671. void CMFCApplication1View::OnMouseMove(UINT nFlags, CPoint point)
  672. {
  673.     // TODO: добавьте свой код обработчика сообщений или вызов стандартного
  674.     // вращение сцены:
  675.     if (nFlags&MK_LBUTTON)
  676.     {
  677.         // прибавить переменным alpha_  и  beta_  разницу между новыми и старыми положениями мыши
  678.         beta_ += point.x - mousex_;
  679.         alpha_ += point.y - mousey_;
  680.         Invalidate(false);
  681.     }
  682.     // масштабирование сцены
  683.     if (nFlags&MK_RBUTTON)
  684.     {
  685.         scale_ += (point.x - mousex_)*0.02;
  686.         if (scale_<0.1) scale_ = 0.1;
  687.         Invalidate(false);
  688.     }
  689.     // сохраняем положение мыши
  690.     mousex_ = point.x;
  691.     mousey_ = point.y;
  692.  
  693.     CView::OnMouseMove(nFlags, point);
  694. }
  695.  
  696.  
  697.  
  698.  
  699. void CMFCApplication1View::AroundX()
  700. {
  701.     // TODO: добавьте свой код обработчика команд
  702.     rotX = rotX + 10;
  703.     Invalidate();
  704.  
  705. }
  706.  
  707.  
  708. void CMFCApplication1View::AroundY()
  709. {
  710.     // TODO: добавьте свой код обработчика команд
  711.     rotY = rotY + 10;
  712.     Invalidate();
  713. }
  714.  
  715.  
  716. void CMFCApplication1View::AroundZ()
  717. {
  718.     // TODO: добавьте свой код обработчика команд
  719.     rotZ = rotZ + 10;
  720.     Invalidate();
  721. }
  722.  
  723.  
  724. void CMFCApplication1View::TranslationXAdd()
  725. {
  726.     // TODO: добавьте свой код обработчика команд
  727.     transX = transX + 1;
  728.     Invalidate();
  729. }
  730.  
  731.  
  732. void CMFCApplication1View::TranslationYAdd()
  733. {
  734.     transY = transY + 1;
  735.     Invalidate();
  736.  
  737.     // TODO: добавьте свой код обработчика команд
  738. }
  739.  
  740.  
  741. void CMFCApplication1View::TranslationZAdd()
  742. {
  743.  
  744.     transZ = transZ + 50.;
  745.     Invalidate();
  746.  
  747.     // TODO: добавьте свой код обработчика команд
  748. }
  749.  
  750.  
  751. void CMFCApplication1View::TranslationXSub()
  752. {
  753.     transX = transX-1;
  754.     Invalidate();
  755.  
  756.     // TODO: добавьте свой код обработчика команд
  757. }
  758.  
  759.  
  760. void CMFCApplication1View::TranslationYSub()
  761. {
  762.     // TODO: добавьте свой код обработчика команд
  763.     transY = transY -1.;
  764.     Invalidate();
  765.  
  766. }
  767.  
  768.  
  769.  
  770.  
  771. void CMFCApplication1View::ScaleXAdd()
  772. {
  773.     // TODO: добавьте свой код обработчика команд
  774.     if (scaleX < 4.1)
  775.     {
  776.         scaleX = scaleX + 4.1 / 10. ;
  777.     }
  778.     Invalidate();
  779. }
  780.  
  781.  
  782. void CMFCApplication1View::ProportionalScale()
  783. {
  784.     if ((scaleX<4.1) && (scaleY<4.1) &&
  785.         (scaleZ<4.1))
  786.     {
  787.         scaleX = scaleX + 4.1 / 10.;
  788.         scaleY = scaleY + 4.1 / 10.;
  789.         scaleZ = scaleZ + 4.1 / 10.;
  790.     }
  791.     Invalidate();
  792.  
  793.     // TODO: добавьте свой код обработчика команд
  794. }
  795.  
  796.  
  797. void CMFCApplication1View::ProportionalScaleMin()
  798. {
  799.     // TODO: добавьте свой код обработчика команд
  800.     if ((scaleX > 4.1/ 10.) && (scaleY>4.1/ 10.) &&
  801.         (scaleZ >4.1/ 10.))
  802.     {
  803.         scaleX = scaleX -4.1 / 10.;
  804.         scaleY = scaleY -4.1 / 10.;
  805.         scaleZ = scaleZ -4.1 / 10.;
  806.     }
  807.     Invalidate();
  808.  
  809. }
  810.  
  811.  
  812. void CMFCApplication1View::ScaleXPlus()
  813. {
  814.     // TODO: добавьте свой код обработчика команд
  815.  
  816.     if (scaleY < 4.1)
  817.         scaleY = scaleY + 4.1 / 10.;
  818.     Invalidate();
  819.  
  820. }
  821.  
  822.  
  823. void CMFCApplication1View::ScaleZPlus()
  824. {
  825.     // TODO: добавьте свой код обработчика команд
  826.     if (scaleZ < 4.1)
  827.         scaleZ = scaleZ + 4.1 / 10.;
  828.     Invalidate();
  829. }
  830.  
  831.  
  832. void CMFCApplication1View::ScaleXMin()
  833. {
  834.     // TODO: добавьте свой код обработчика команд
  835.     if (scaleX < 4.1)
  836.         scaleX = scaleX - 4.1 / 10.;
  837.     Invalidate();
  838. }
  839.  
  840.  
  841. void CMFCApplication1View::ScaleYMin()
  842. {
  843.     // TODO: добавьте свой код обработчика команд
  844.     if (scaleX < 4.1)
  845.         scaleX = scaleX - 4.1 / 10.;
  846.     Invalidate();
  847. }
  848.  
  849.  
  850. void CMFCApplication1View::ScaleZMin()
  851. {
  852.     // TODO: добавьте свой код обработчика команд
  853.     if (scaleX < 4.1)
  854.         scaleX = scaleX - 4.1 / 10.;
  855.     Invalidate();
  856. }
  857.  
  858.  
  859. void CMFCApplication1View::TransZMin()
  860. {
  861.     transZ = transZ - 50.;
  862.     Invalidate();
  863.     // TODO: добавьте свой код обработчика команд
  864. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement