Untitled
unknown
plain_text
a year ago
5.3 kB
5
Indexable
/* Niniejszy program jest wolnym oprogramowaniem; możesz go rozprowadzać dalej i / lub modyfikować na warunkach Powszechnej Licencji Publicznej GNU, wydanej przez Fundację Wolnego Oprogramowania - według wersji 2 tej Licencji lub(według twojego wyboru) którejś z późniejszych wersji. Niniejszy program rozpowszechniany jest z nadzieją, iż będzie on użyteczny - jednak BEZ JAKIEJKOLWIEK GWARANCJI, nawet domyślnej gwarancji PRZYDATNOŚCI HANDLOWEJ albo PRZYDATNOŚCI DO OKREŚLONYCH ZASTOSOWAŃ.W celu uzyskania bliższych informacji sięgnij do Powszechnej Licencji Publicznej GNU. Z pewnością wraz z niniejszym programem otrzymałeś też egzemplarz Powszechnej Licencji Publicznej GNU(GNU General Public License); jeśli nie - napisz do Free Software Foundation, Inc., 59 Temple Place, Fifth Floor, Boston, MA 02110 - 1301 USA */ #define GLM_FORCE_RADIANS #include <GL/glew.h> #include <GLFW/glfw3.h> #include <glm/glm.hpp> #include <glm/gtc/type_ptr.hpp> #include <glm/gtc/matrix_transform.hpp> #include <stdlib.h> #include <stdio.h> #include "constants.h" #include "allmodels.h" #include "lodepng.h" #include "shaderprogram.h" using namespace glm; //Procedura obsługi błędów void error_callback(int error, const char* description) { fputs(description, stderr); } float speed = 0; void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) { if (action == GLFW_PRESS) { if (key == GLFW_KEY_RIGHT) speed = 3.14; if (key == GLFW_KEY_LEFT) speed = -3.14; if (key == GLFW_KEY_RIGHT_SHIFT) speed *= 4; } if (action == GLFW_REPEAT) { if (key == GLFW_KEY_RIGHT) speed = 3.14; if (key == GLFW_KEY_LEFT) speed = -3.14; } if (action == GLFW_RELEASE) { if (key == GLFW_KEY_RIGHT) speed = 0; if (key == GLFW_KEY_LEFT) speed = 0; if (key == GLFW_KEY_RIGHT_SHIFT) speed /= 4; } } //Procedura inicjująca void initOpenGLProgram(GLFWwindow* window) { initShaders(); //************Tutaj umieszczaj kod, który należy wykonać raz, na początku programu************ } //Zwolnienie zasobów zajętych przez program void freeOpenGLProgram(GLFWwindow* window) { freeShaders(); //************Tutaj umieszczaj kod, który należy wykonać po zakończeniu pętli głównej************ } //Procedura rysująca zawartość sceny void drawScene(GLFWwindow* window, float angle) { glEnable(GL_DEPTH_TEST); //************Tutaj umieszczaj kod rysujący obraz******************l glClearColor(0.25, 0.9, 0, 1); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); mat4 V = lookAt( vec3(0.0f, 0.0f, -5.0f), vec3(0.0f, 0.0f, 0.0f), vec3(0.0f, 1.0f, 0.0f)); mat4 P = perspective(radians(50.0f), 1.0f, 1.0f, 50.0f); mat4 M1 = mat4(1.0f); mat4 M2 = mat4(1.0f); mat4 Mk = mat4(1.0f); //transformacje M M1 = translate(M1, vec3(-1.0f, 0.0f, 0.0f)); M1 = rotate(M1, angle, vec3(0.0f, 0.0f, -1.0f)); M2 = translate(M2, vec3(1.0f, 0.0f, 0.0f)); M2 = rotate(M2, angle, vec3(0.0f, 0.0f, 1.0f)); Mk = M2* rotate(Mk, angle, vec3(0.0f, 0.0f, 1.0f))* translate(Mk, vec3(1.0f, 0.0f, 0.0f)) * scale(Mk, vec3(0.1f, 0.1f, 0.1f)); spLambert->use();//Aktywacja programu cieniującego glUniformMatrix4fv(spLambert->u("P"), 1, false, value_ptr(P)); glUniformMatrix4fv(spLambert->u("V"), 1, false, value_ptr(V)); glUniformMatrix4fv(spLambert->u("M"), 1, false, value_ptr(M2)); Models::torus.drawSolid(); glUniformMatrix4fv(spLambert->u("M"), 1, false, value_ptr(M1)); glUniform4f(spLambert->u("color"), 0.9f, 0.2f, 0.15f, 0.9f); Models::torus.drawSolid(); glUniformMatrix4fv(spLambert->u("M"), 1, false, value_ptr(Mk)); glUniform4f(spLambert->u("color"), 0.5f, 0.5f, 0.5f, 1.0f); Models::cube.drawSolid(); glfwSwapBuffers(window); //zawsze na końcu } int main(void) { GLFWwindow* window; //Wskaźnik na obiekt reprezentujący okno glfwSetErrorCallback(error_callback);//Zarejestruj procedurę obsługi błędów if (!glfwInit()) { //Zainicjuj bibliotekę GLFW fprintf(stderr, "Nie można zainicjować GLFW.\n"); exit(EXIT_FAILURE); } window = glfwCreateWindow(500, 500, "OpenGL", NULL, NULL); //Utwórz okno 500x500 o tytule "OpenGL" i kontekst OpenGL. if (!window) //Jeżeli okna nie udało się utworzyć, to zamknij program { fprintf(stderr, "Nie można utworzyć okna.\n"); glfwTerminate(); exit(EXIT_FAILURE); } glfwMakeContextCurrent(window); //Od tego momentu kontekst okna staje się aktywny i polecenia OpenGL będą dotyczyć właśnie jego. glfwSwapInterval(1); //Czekaj na 1 powrót plamki przed pokazaniem ukrytego bufora if (glewInit() != GLEW_OK) { //Zainicjuj bibliotekę GLEW fprintf(stderr, "Nie można zainicjować GLEW.\n"); exit(EXIT_FAILURE); } initOpenGLProgram(window); //Operacje inicjujące //Główna pętla float angle = 0; glfwSetTime(0); glfwSetKeyCallback(window, key_callback); while (!glfwWindowShouldClose(window)) //Tak długo jak okno nie powinno zostać zamknięte { angle += speed * glfwGetTime(); glfwSetTime(0); drawScene(window, angle); //Wykonaj procedurę rysującą glfwPollEvents(); //Wykonaj procedury callback w zalezności od zdarzeń jakie zaszły. } freeOpenGLProgram(window); glfwDestroyWindow(window); //Usuń kontekst OpenGL i okno glfwTerminate(); //Zwolnij zasoby zajęte przez GLFW exit(EXIT_SUCCESS); }
Editor is loading...
Leave a Comment