Advertisement
Guest User

Untitled

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