Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include "open_gl_functions.h"
- //У каждого окна есть уникальный идентификатор HWND, дерево окон
- HWND hWnd = NULL;
- //device context
- HDC hDC = NULL;
- HGLRC hRC = NULL;
- GLfloat x, y, z;
- struct RGBQuad{
- GLubyte R;
- GLubyte G;
- GLubyte B;
- GLubyte A;
- };
- //Unsigned binary integer
- GLuint texRoof;
- GLuint texLand;
- GLuint texDoor;
- GLuint texLight;
- GLuint texDarkMramor;
- GLuint texBrightMramor;
- //функция подгрузки текстуры
- void LoadTexImage(System::String^ file)
- {
- try
- {
- System::Drawing::Bitmap^ data;
- data = gcnew System::Drawing::Bitmap(file);
- RGBQuad *image = new RGBQuad[data->Width*data->Height];
- for (int x = 0; x < data->Height; x++)
- {
- for (int y = 0; y < data->Width; y++)
- {
- System::Drawing::Color pixelColor = data->GetPixel(y, data->Height - 1 - x);
- image[data->Width*x + y].R = pixelColor.R;
- image[data->Width*x + y].G = pixelColor.G;
- image[data->Width*x + y].B = pixelColor.B;
- image[data->Width*x + y].A = pixelColor.A;
- }
- }
- //создание текстуры
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, data->Width, data->Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, &image[0]);
- delete [] image;
- delete data;
- }
- catch (System::ArgumentException^)
- {
- System::Windows::Forms::MessageBox::Show( "There was an error."
- "Check the path to the image file." );
- }
- }
- void CreateOpenGLWindow(HWND hwnd)
- {
- /* pointer to the main window */
- hWnd = hwnd;
- if(!hWnd)
- System::Windows::Forms::MessageBox::Show(L"Error: hWnd not created");
- /* get the device context (DC) */
- hDC = GetDC(hWnd);
- if(!hDC)
- System::Windows::Forms::MessageBox::Show(L"Error: hDC not created");
- /* set the pixel format for the DC */
- PIXELFORMATDESCRIPTOR pfd, *ppfd;
- int pixelformat;
- ppfd = &pfd;
- memset(ppfd, sizeof(PIXELFORMATDESCRIPTOR), 0);
- ppfd->nSize = sizeof(PIXELFORMATDESCRIPTOR);
- ppfd->dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
- ppfd->cColorBits = 32;
- ppfd->cAlphaBits = 32;
- ppfd->cDepthBits = 32;
- ppfd->cAccumBits = 32;
- ppfd->cStencilBits = 32;
- pixelformat = ChoosePixelFormat(hDC, ppfd);
- if(!pixelformat)
- System::Windows::Forms::MessageBox::Show(L"Error: pixel format not created");
- if(!SetPixelFormat(hDC, pixelformat, ppfd))
- System::Windows::Forms::MessageBox::Show(L"Error: pixelformat not set");
- /* create and enable the render context (RC) */
- hRC = wglCreateContext(hDC);
- SetPixelFormat(hDC, pixelformat, ppfd);
- hRC = wglCreateContext(hDC);
- if(!hRC)
- System::Windows::Forms::MessageBox::Show(L"Error: hRC not created");
- wglMakeCurrent(hDC, hRC);
- }
- void InitializeOpenGL()
- {
- //specify clear values for the color buffers
- glClearColor(0.9, 0.999, 1, 1);
- //проверка глубины(если она будет выключена объекты не будут закрывать друг друга)
- glEnable(GL_DEPTH_TEST);
- //освещение
- glEnable(GL_LIGHTING);
- //двухсторонний расчет освещения
- //set the lighting model parameters
- //glLightModel sets the lighting model parameter.
- //"pname" names a parameter and "params" gives the new value.
- glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE);
- //Вычисляется угол отражения
- glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);
- // Свойства распаковки [Режим выравнивания может принимать значения 1, 2, 4, 8, а по умолчанию имеет значение 4.]
- glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- glGenTextures(1, &texRoof);
- glGenTextures(1, &texLand);
- glGenTextures(1, &texDoor);
- glGenTextures(1, &texLight);
- glGenTextures(1, &texDarkMramor);
- glGenTextures(1, &texBrightMramor);
- //GL_TEXTURE_2D - таргет
- glBindTexture(GL_TEXTURE_2D, texRoof);
- //S-координата текстуры - это горизонтальная координата, T-координата - вертикальная
- //GL_REPEAT - Повторение текстуры
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- //Не использовать интерполяцию при выборе точки на текстуре(если больше)
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- //если полигон, на который наносим текстуру, меньше текстуры
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- LoadTexImage(L"roof.jpg");
- //определяет, как текстура будет взаимодействовать с материалом, из которого сделан объект
- //конечный цвет находится как произведение цвета точки на поверхности и цвета соответствующей ей точки на текстуре
- glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- glBindTexture(GL_TEXTURE_2D, texBrightMramor);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- LoadTexImage(L"bright.jpg");
- glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- glBindTexture(GL_TEXTURE_2D, texLand);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- LoadTexImage(L"land.jpg");
- glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- glBindTexture(GL_TEXTURE_2D, texDoor);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- LoadTexImage(L"door.jpg");
- glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- glBindTexture(GL_TEXTURE_2D, texLight);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- LoadTexImage(L"light.jpg");
- glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- glBindTexture(GL_TEXTURE_2D, texDarkMramor);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- LoadTexImage(L"dark.jpg");
- glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- }
- void InitializeScene()
- {
- x = y = z = 0.0;
- }
- void ResizeGraphics(float w, float h)
- {
- //Get new window size
- RECT rect;
- int width, height;
- GLfloat aspect;
- //получение размера окна
- GetClientRect(hWnd, &rect);
- //GetWindowRect(hWnd, &rect);
- width = rect.right;
- height = rect.bottom;
- aspect = (GLfloat)width / height; //перспектива
- // Adjust graphics to window size
- //Окно вывода
- glViewport(0, 0, w, h);
- glMatrixMode(GL_PROJECTION);
- //загружаем единичную матрицу
- glLoadIdentity();
- //Задание перспективной проекции
- gluPerspective(60.0, aspect, 0.1, 200.0);
- //Далее будет проводиться только преобразование объектов сцены
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- InvalidateRect(hWnd, NULL, FALSE);
- }
- //функция для параллелепипедов
- void prlpd(GLfloat a, GLfloat b, GLfloat c, GLfloat h, GLfloat x, GLfloat y, GLfloat z){
- glBindTexture(GL_TEXTURE_2D, texDarkMramor);
- glBegin(GL_QUADS);
- //правая
- glNormal3f(0.0f, 0.0f, 1.0f);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f( a + h + x, b + y, c + z);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(-a + h + x, b + y, c + z);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(-a + h + x,-b + y, c + z);
- glTexCoord2f(1.0f, 0.0f);
- glVertex3f( a + h + x,-b + y, c + z);
- //левая
- glNormal3f(0.0f, 0.0f, -1.0f);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f( a + h + x, b + y,-c + z);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f( a + h + x,-b + y,-c + z);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(-a + h + x,-b + y,-c + z);
- glTexCoord2f(1.0f, 0.0f);
- glVertex3f(-a + h + x, b + y,-c + z);
- //низ
- glNormal3f(-1.0f, 0.0f, 0.0f);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f(-a + h + x, b + y, c + z);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(-a + h + x, b + y,-c + z);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(-a + h + x,-b + y,-c + z);
- glTexCoord2f(1.0f, 0.0f);
- glVertex3f(-a + h + x,-b + y, c + z);
- //перед
- glNormal3f(0.0f, 1.0f, 0.0f);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f( a + h + x, b + y, c + z);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f( a + h + x, b + y,-c + z);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(-a + h + x, b + y,-c + z);
- glTexCoord2f(1.0f, 0.0f);
- glVertex3f(-a + h + x, b + y, c + z);
- //верх
- glNormal3f(1.0f, 0.0f, 0.0f);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f( a + h + x, b + y, c + z);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f( a + h + x,-b + y, c + z);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f( a + h + x,-b + y,-c + z);
- glTexCoord2f(1.0f, 0.0f);
- glVertex3f( a + h + x, b + y,-c + z);
- //зад
- glNormal3f(0.0f, -1.0f, 0.0f);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f( a + h + x,-b + y, c + z);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(-a + h + x,-b + y, c + z);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(-a + h + x,-b + y,-c + z);
- glTexCoord2f(1.0f, 0.0f);
- glVertex3f(a + h + x,-b + y,-c + z);
- glEnd();
- }
- //функция отрисовки колонн
- void Colonna(GLfloat x, GLfloat y, GLfloat z){
- const GLfloat R = 2;
- const GLfloat h = 20;
- const GLint N = 500;
- prlpd(1.5, 2.75, 2.75, 0, x, y, z);
- prlpd(1.5, 2.25, 2.25, 1, x, y, z);
- prlpd(1.5, 2.25, 2.25, h, x, y, z);
- prlpd(1.5, 2.75, 2.75, h + 1, x, y, z);
- glBindTexture(GL_TEXTURE_2D, texBrightMramor);
- //колонна
- glBegin(GL_QUADS);
- for(int i = 0; i < N; i++){
- float q = (float)i/N * 2 * M_PI;
- float w = (float)(i+1)/N * 2 * M_PI;
- glTexCoord2f(0.0f, 0.0f);
- glNormal3f(0, sin(q), cos(q));
- glVertex3f(x, R*sin(q) + y, R*cos(q) + z);
- glTexCoord2f(0.0f, 1.0f);
- glNormal3f(0, sin(w), cos(w));
- glVertex3f(x, R*sin(w) + y, R*cos(w) + z);
- glTexCoord2f(1.0f, 1.0f);
- glNormal3f(0, sin(w), cos(w));
- glVertex3f(x + h, R*sin(w) + y, R*cos(w) + z);
- glTexCoord2f(1.0f, 0.0f);
- glNormal3f(0, sin(q), cos(q));
- glVertex3f(x + h, R*sin(q) + y, R*cos(q) + z);
- }
- glEnd();
- }
- //мейн крыша (кольца)
- void Cylinder(GLfloat x, GLfloat R2, GLint helper){
- const GLfloat y2 = -13-R2;
- const GLfloat h2 = 40;
- const GLint N2 = 500;
- glBindTexture(GL_TEXTURE_2D, texDarkMramor);
- //колонна
- glBegin(GL_QUADS);
- for(int i = 0; i < N2; i++){
- float q = (float)i/N2 * 2 * M_PI;
- float w = (float)(i+1)/N2 * 2 * M_PI;
- glTexCoord2f(0.0f, 0.0f);
- glNormal3f(0, sin(q), cos(q));
- glVertex3f(x + h2, R2*sin(q) + y2 - helper, R2*cos(q) + 16.3);
- glTexCoord2f(0.0f, 1.0f);
- glNormal3f(0, sin(w), cos(w));
- glVertex3f(x + h2, R2*sin(w) + y2 - helper, R2*cos(w) + 16.3);
- glTexCoord2f(1.0f, 1.0f);
- glNormal3f(0, sin(w), cos(w));
- glVertex3f(x + h2 + 2, R2*sin(w) + y2 - helper, R2*cos(w) + 16.3);
- glTexCoord2f(1.0f, 0.0f);
- glNormal3f(0, sin(q), cos(q));
- glVertex3f(x + h2 + 2, R2*sin(q) + y2 - helper, R2*cos(q) + 16.3);
- }
- glEnd();
- //крышка
- glBindTexture(GL_TEXTURE_2D, texBrightMramor);
- glBegin(GL_TRIANGLE_FAN);
- glNormal3f(1, 0, 0);
- glVertex3f(x + h2 + 2, y2 - helper, 16.3);
- for(int i = 0; i <= N2; i++){
- float q = (float)i/N2 * 2 * M_PI;
- float w = (float)(i+1)/N2 * 2 * M_PI;
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f(x + h2 + 2, R2*sin(q) + y2 - helper, R2*cos(q) + 16.3);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(x + h2 + 2, R2*sin(w) + y2 - helper, R2*cos(w) + 16.3);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(x + h2 + 2, R2*sin(q) + y2 - helper, R2*cos(q) + 16.3);
- }
- glEnd();
- }
- //обода здания
- void Cylinder2(GLfloat x, GLfloat R2, GLfloat h2){
- const GLfloat y2 = -13-R2;
- const GLint N2 = 500;
- glBindTexture(GL_TEXTURE_2D, texDarkMramor);
- //колонна
- glBegin(GL_QUADS);
- for(int i = 0; i < N2; i++){
- float q = (float)i/N2 * 2 * M_PI;
- float w = (float)(i+1)/N2 * 2 * M_PI;
- glTexCoord2f(0.0f, 0.0f);
- glNormal3f(0, sin(q), cos(q));
- glVertex3f(x, R2*sin(q) + y2 + 0.5, R2*cos(q) + 16.3);
- glTexCoord2f(0.0f, 1.0f);
- glNormal3f(0, sin(w), cos(w));
- glVertex3f(x, R2*sin(w) + y2 + 0.5, R2*cos(w) + 16.3);
- glTexCoord2f(1.0f, 1.0f);
- glNormal3f(0, sin(w), cos(w));
- glVertex3f(x + h2, R2*sin(w) + y2 + 0.5, R2*cos(w) + 16.3);
- glTexCoord2f(1.0f, 0.0f);
- glNormal3f(0, sin(q), cos(q));
- glVertex3f(x + h2, R2*sin(q) + y2 + 0.5, R2*cos(q) + 16.3);
- }
- glEnd();
- //крышка(верх)
- glBindTexture(GL_TEXTURE_2D, texDarkMramor);
- glBegin(GL_TRIANGLE_FAN);
- glNormal3f(1, 0, 0);
- glVertex3f(x + h2, y2 + 0.5, 16.3);
- for(int i = 0; i <= N2; i++){
- float q = (float)i/N2 * 2 * M_PI;
- float w = (float)(i+1)/N2 * 2 * M_PI;
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f(x + h2, R2*sin(q) + y2 + 0.5, R2*cos(q) + 16.3);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(x + h2, R2*sin(w) + y2 + 0.5, R2*cos(w) + 16.3);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(x + h2, R2*sin(q) + y2 + 0.5, R2*cos(q) + 16.3);
- }
- glEnd();
- //крышка(низ)
- glBindTexture(GL_TEXTURE_2D, texDarkMramor);
- glBegin(GL_TRIANGLE_FAN);
- glNormal3f(-1, 0, 0);
- glVertex3f(x, y2 + 0.5, 16.3);
- for(int i = 0; i <= N2; i++){
- float q = (float)i/N2 * 2 * M_PI;
- float w = (float)(i+1)/N2 * 2 * M_PI;
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f(x, R2*sin(q) + y2 + 0.5, R2*cos(q) + 16.3);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(x, R2*sin(w) + y2 + 0.5, R2*cos(w) + 16.3);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(x, R2*sin(q) + y2 + 0.5, R2*cos(q) + 16.3);
- }
- glEnd();
- }
- /**
- * Находит нормаль к поверхности, заданной тремя точками (вектора должны быть неколинеарны)
- * x1, y1, z1 - первая точка
- * x2, y2, z2 - вторая точка
- * x3, y3, z3 - третья точка
- * возвращаемое значение - вектор с координатами нормали
- */
- std::vector<float> GetNormal(float x1, float y1, float z1, float x2, float y2, float z2, float x3, float y3, float z3)
- {
- // v1, v2 - координаты перемножаемых веторов, vm - векторное произведение, vn - нормаль
- std::vector<float> v1(3), v2(3), vm(3), vn(3);
- // вычисляем координаты вектором по точкам
- v1[0] = x1 - x2;
- v1[1] = y1 - y2;
- v1[2] = z1 - z2;
- v2[0] = x1 - x3;
- v2[1] = y1 - y3;
- v2[2] = z1 - z3;
- // находим векторное произведение
- vm[0] = v1[1] * v2[2] - v1[2] * v2[1];
- vm[1] = -(v1[0] * v2[2] - v1[2] * v2[0]);
- vm[2] = v1[0] * v2[1] - v1[1] * v2[0];
- // находим l - длину полученного вектора
- float l = sqrt(vm[0] * vm[0] + vm[1] * vm[1] + vm[2] * vm[2]);
- if (l == 0)
- {
- std::vector<float> error(3, 0);
- return error;
- }
- // находим нормаль
- vn[0] = vm[0] / l;
- vn[1] = vm[1] / l;
- vn[2] = vm[2] / l;
- return vn;
- }
- //фонарики
- void Lamp(GLfloat x, GLfloat y, GLfloat z){
- const GLfloat R = 0.4;
- const GLfloat h = 18;
- const GLint N = 100;
- prlpd(0.45, 1.05, 1.05, 0, x, y, z);
- prlpd(1.6, 0.6, 0.6, 1, x, y, z);
- glBindTexture(GL_TEXTURE_2D, texBrightMramor);
- //столб
- glBegin(GL_QUADS);
- for(int i = 0; i < N; i++){
- float q = (float)i/N * 2 * M_PI;
- float w = (float)(i+1)/N * 2 * M_PI;
- glTexCoord2f(0.0f, 0.0f);
- glNormal3f(0, sin(q), cos(q));
- glVertex3f(x, R*sin(q) + y, R*cos(q) + z);
- glTexCoord2f(0.0f, 1.0f);
- glNormal3f(0, sin(w), cos(w));
- glVertex3f(x, R*sin(w) + y, R*cos(w) + z);
- glTexCoord2f(1.0f, 1.0f);
- glNormal3f(0, sin(w), cos(w));
- glVertex3f(x + h, R*sin(w) + y, R*cos(w) + z);
- glTexCoord2f(1.0f, 0.0f);
- glNormal3f(0, sin(q), cos(q));
- glVertex3f(x + h, R*sin(q) + y, R*cos(q) + z);
- }
- glEnd();
- //фонарь
- glBindTexture(GL_TEXTURE_2D, texLight);
- glBegin(GL_QUADS);
- int m = 15; float r = 1.5; int n = 15; const GLfloat y3 = -12- r;
- for( int i = 0; i < m; i++ )
- {
- float fi = (float)i/(m)*2*M_PI;
- float psi = (float)(i + 1)/(m)*2*M_PI;
- for( int j = 0; j < n; j++ )
- {
- float u = -M_PI/2 + (float)j/n*M_PI;
- float v = -M_PI/2 + (float)(j+1)/n*M_PI;
- glTexCoord2f(0.0f, 0.0f);
- glNormal3f( cos(u)*sin(fi), sin(u), cos(u)*cos(fi));
- glVertex3f( r*cos(u)*sin(fi) + x + h, r*sin(u) + y, r*cos(u)*cos(fi) + z);
- glTexCoord2f(0.0f, 1.0f);
- glNormal3f( cos(u)*sin(psi), sin(u), cos(u)*cos(psi));
- glVertex3f( r*cos(u)*sin(psi) + x + h, r*sin(u) + y, r*cos(u)*cos(psi) + z);
- glTexCoord2f(1.0f, 1.0f);
- glNormal3f( cos(v)*sin(psi), sin(v), cos(v)*cos(psi));
- glVertex3f( r*cos(v)*sin(psi) + x + h, r*sin(v) + y, r*cos(v)*cos(psi) + z);
- glTexCoord2f(1.0f, 0.0f);
- glNormal3f( cos(v)*sin(fi), sin(v), cos(v)*cos(fi));
- glVertex3f( r*cos(v)*sin(fi) + x + h, r*sin(v) + y, r*cos(v)*cos(fi) + z);
- }
- }
- glEnd();
- }
- void DrawGraphics() {
- //Проводится только преобразование объектов сцены
- glMatrixMode(GL_MODELVIEW);
- //загружаем единичную матрицу
- glLoadIdentity();
- //Инициализация (очистка) текущего буфера кадра и глубины
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glEnable(GL_COLOR_MATERIAL);
- glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
- glEnable(GL_LIGHT0);
- //Определяем точку наблюдения
- gluLookAt(50 + (float)x, 50 + (float)y,-50 + (float)z, 10, -40, 30, 1, 0, 0);
- //Определение свойств освещения
- GLfloat light1_position1[] = {50, 15, 16, 1};
- float white [] = {1, 1, 1, 1};
- glLightfv(GL_LIGHT0, GL_DIFFUSE, white);
- glLightfv(GL_LIGHT0, GL_POSITION, light1_position1);
- glEnable(GL_TEXTURE_2D);
- // Зeмля
- glBindTexture(GL_TEXTURE_2D, texLand);
- glBegin(GL_QUADS);
- glTexCoord2f(0.0f, 0.0f);
- glNormal3f(1, 0, 0);
- glVertex3f(-2.5, 45, -42);
- glTexCoord2f(0.0f, 1.0f);
- glNormal3f(1, 0, 0);
- glVertex3f(-2.5, -100, -42);
- glTexCoord2f(1.0f, 1.0f);
- glNormal3f(1, 0, 0);
- glVertex3f(-2.5, -100, 80);
- glTexCoord2f(1.0f, 0.0f);
- glNormal3f(1, 0, 0);
- glVertex3f(-2.5, 45, 80);
- glEnd();
- // Kолонны
- for(int i = 0, z = 0; i < 2; i++){
- Colonna(0,0,z);
- z+=33;
- }
- //Портик
- glBindTexture(GL_TEXTURE_2D, texDarkMramor);
- glBegin(GL_QUADS);
- //правая стена
- glNormal3f(0.0f, 0.0f, 1.0f);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f( 21.5, -11, 36);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(-0.5, -11, 36);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(-0.5, -75, 36);
- glTexCoord2f(1.0f, 0.0f);
- glVertex3f(21.5, -75, 36);
- //левая стена
- glNormal3f(0.0f, 0.0f, -1.0f);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f( 21.5, -11, -3);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(-0.5, -11, -3);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(-0.5, -75, -3);
- glTexCoord2f(1.0f, 0.0f);
- glVertex3f(21.5, -75, -3);
- //низ стен
- glNormal3f(-1.0f, 0.0f, 0.0f);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f(-0.5, -11, -3);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(-0.5, -11, 36);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(-0.5, -75, 36);
- glTexCoord2f(1.0f, 0.0f);
- glVertex3f(-0.5, -75, -3);
- //передняя стена
- glNormal3f(0.0f, 1.0f, 0.0f);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f(-0.5, -11, -3);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(21.5, -11, -3);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(21.5, -11, 36);
- glTexCoord2f(1.0f, 0.0f);
- glVertex3f(-0.5, -11, 36);
- //верхняя стена
- glNormal3f(1.0f, 0.0f, 0.0f);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f(21.5, -11, -3);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(21.5, -11, 36);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(21.5, -75, 36);
- glTexCoord2f(1.0f, 0.0f);
- glVertex3f(21.5, -75, -3);
- //зад
- glNormal3f(0.0f, -1.0f, 0.0f);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f( -0.5, -75, -3);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(21.5, -75, -3);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(21.5, -75, 36);
- glTexCoord2f(1.0f, 0.0f);
- glVertex3f(-0.5, -75, 36);
- glEnd();
- glBindTexture(GL_TEXTURE_2D, texDoor);
- //Дверь
- glBegin(GL_QUADS);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f(-0.5, -10.5, 12.3);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(12, -10.5, 12.3);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(12, -10.5, 20.3);
- glTexCoord2f(1.0f, 0.0f);
- glVertex3f(-0.5, -10.5, 20.3);
- glEnd();
- //Пирамидка
- glBindTexture(GL_TEXTURE_2D, texDarkMramor);
- glBegin(GL_QUADS);
- std::vector<float> normal;
- //правая
- normal = GetNormal(-0.5, 3, 36, -2.5, -75, 38, -0.5, -75, 36);
- glNormal3f(normal[0], normal[1], normal[2]);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f(-0.5, 3, 36);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(-0.5, -75, 36);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(-2.5, -75, 38);
- glTexCoord2f(1.0f, 0.0f);
- glVertex3f(-2.5, 5, 38);
- //левая
- normal = GetNormal(-0.5, -75, -3, -2.5, -75, -5, -2.5, 5, -5);
- glNormal3f(normal[0], normal[1], normal[2]);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f( -0.5, -75, -3);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(-2.5, -75, -5);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(-2.5, 5, -5);
- glTexCoord2f(1.0f, 0.0f);
- glVertex3f(-0.5, 3, -3);
- //низ
- glNormal3f(1, 0, 0);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f(-2.5, 5, -5);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(-2.5, -75, -5);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(-2.5, -75, 38);
- glTexCoord2f(1.0f, 0.0f);
- glVertex3f(-2.5, 5, 38);
- //перед
- normal = GetNormal(-0.5, 3, -3, -2.5, 5, -5, -2.5, 5, 38);
- glNormal3f(normal[0], normal[1], normal[2]);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f(-0.5, 3, -3);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(-2.5, 5, -5);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(-2.5, 5, 38);
- glTexCoord2f(1.0f, 0.0f);
- glVertex3f(-0.5, 3, 36);
- //верх
- glNormal3f(1, 0, 0);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f(-0.5, 3, -3);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(-0.5, -75, -3);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(-0.5, -75, 36);
- glTexCoord2f(1.0f, 0.0f);
- glVertex3f(-0.5, 3, 36);
- glEnd();
- //Параллелепипед(под крышей)
- glBindTexture(GL_TEXTURE_2D, texDarkMramor);
- glBegin(GL_QUADS);
- //правая
- glNormal3f(0.0f, 0.0f, 1.0f);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f(21.5, 3, 36);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(23.5, 3, 36);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(23.5, -75, 36);
- glTexCoord2f(1.0f, 0.0f);
- glVertex3f(21.5, -75, 36);
- //левая
- glNormal3f(0.0f, 0.0f, -1.0f);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f( 21.5, 3, -3);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(23.5, 3, -3);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(23.5, -75, -3);
- glTexCoord2f(1.0f, 0.0f);
- glVertex3f(21.5, -75, -3);
- //низ
- glNormal3f(-1.0f, 0.0f, 0.0f);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f(21.5, 3, -3);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(21.5, 3, 36);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(21.5, -75, 36);
- glTexCoord2f(1.0f, 0.0f);
- glVertex3f(21.5, -75, -3);
- //перед
- glNormal3f(0.0f, 1.0f, 0.0f);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f(21.5, 3, -3);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(21.5, 3, 36);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(23.5, 3, 36);
- glTexCoord2f(1.0f, 0.0f);
- glVertex3f(23.5, 3, -3);
- //верх
- glNormal3f(1.0f, 0.0f, 0.0f);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f(23.5, 3, -3);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(23.5, 3, 36);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(23.5, -75, 36);
- glTexCoord2f(1.0f, 0.0f);
- glVertex3f(23.5, -75, -3);
- //зад
- glNormal3f(0.0f, -1.0f, 0.0f);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f(21.5, -75, -3);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(21.5, -75, 36);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(23.5, -75, 36);
- glTexCoord2f(1.0f, 0.0f);
- glVertex3f(23.5, -75, -3);
- glEnd();
- glBindTexture(GL_TEXTURE_2D, texBrightMramor);
- //перед (мелкий треугольник)
- glBegin(GL_TRIANGLES);
- glNormal3f(0.0f, 1.0f, 0.0f);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f(23.5, 3.05, -1);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(29.5, 3.05, 16.3);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(23.5, 3.05, 34);
- glEnd();
- //Крыша(портика)
- glBindTexture(GL_TEXTURE_2D, texDarkMramor);
- //перед
- glBegin(GL_TRIANGLES);
- glNormal3f(0.0f, 1.0f, 0.0f);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f(23.5, 3, -3);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(30.5, 3, 16.3);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(23.5, 3, 36);
- //зад
- glNormal3f(0.0f, -1.0f, 0.0f);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f(23.5, -75, -3);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(30.5, -75, 16.3);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(23.5, -75, 36);
- glEnd();
- //крыша лево-право
- glBindTexture(GL_TEXTURE_2D, texRoof);
- glBegin(GL_QUADS);
- std::vector<float> normal2;
- //правая
- normal2 = GetNormal(23.5, 3, 36, 30.5, -75, 16.3, 30.5, 3, 16.3);
- glNormal3f(normal2[0], normal2[1], normal2[2]);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f(23.5, 3, 36);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(30.5, 3, 16.3);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(30.5, -75, 16.3);
- glTexCoord2f(1.0f, 0.0f);
- glVertex3f(23.5, -75, 36);
- //левая
- normal2 = GetNormal(23.5, 3, -3, 30.5, 3, 16.3, 30.5, -75, 16.3);
- glNormal3f(normal2[0], normal2[1], normal2[2]);
- glTexCoord2f(0.0f, 0.0f);
- glVertex3f(23.5, 3, -3);
- glTexCoord2f(0.0f, 1.0f);
- glVertex3f(30.5, 3, 16.3);
- glTexCoord2f(1.0f, 1.0f);
- glVertex3f(30.5, -75, 16.3);
- glTexCoord2f(1.0f, 0.0f);
- glVertex3f(23.5, -75, -3);
- glEnd();
- //Перестановка буферов кадра
- SwapBuffers(hDC);
- }
- void press(wchar_t key)
- {
- switch(key)
- {
- case 'a':
- z += 5.0f;
- break;
- case 'd':
- z -= 5.0f;
- break;
- case 'w':
- x += 5.0f;
- break;
- case 's':
- x -= 5.0f;
- break;
- case 'e':
- y += 5.0f;
- break;
- case 'q':
- y -= 5.0f;
- break;
- case '0':
- x = 0;
- y = 0;
- z = 0;
- break;
- default:;
- }
- InvalidateRect(hWnd, NULL, FALSE);
- }
- void close()
- {
- wglMakeCurrent(NULL, NULL);
- wglDeleteContext(hRC);
- ReleaseDC(hWnd, hDC);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement