Untitled
unknown
plain_text
3 years ago
6.5 kB
1
Indexable
Never
/* 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" float speed = 3.14; float kolor = 0.4; Models::Sphere mySphere(0.2, 36, 36); Models::Sphere mySphere2(0.5, 36, 36); Models::Sphere mySphere3(0.1, 36, 36); void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) { if (action == GLFW_PRESS) { if (key == GLFW_KEY_LEFT) { speed = -4; kolor = 0.4; } if (key == GLFW_KEY_RIGHT) { speed = 4; kolor = 0.8; } } } //Procedura obsługi błędów void error_callback(int error, const char* description) { fputs(description, stderr); } //Procedura inicjująca void initOpenGLProgram(GLFWwindow* window) { initShaders(); //************Tutaj umieszczaj kod, który należy wykonać raz, na początku programu************ glClearColor(0.1, 0.2, 0.123, 1); glEnable(GL_DEPTH_TEST); } //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) { //************Tutaj umieszczaj kod rysujący obraz****************** glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glm::mat4 V = glm::lookAt( glm::vec3(0.0f, 0.0f, -5.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f)); glm::mat4 P = glm::perspective(50.0f * PI / 180.0f, 1.0f, 1.0f, 50.0f); glUniformMatrix4fv(spLambert->u("P"), 1, false, glm::value_ptr(P)); glUniformMatrix4fv(spLambert->u("V"), 1, false, glm::value_ptr(V)); glm::mat4 M1 = glm::mat4(1.0f); M1 = glm::translate(M1, glm::vec3(1.0f, 0.0f, 0.0f)); M1 = glm::rotate(M1, angle, glm::vec3(0.0f, 0.0f, 1.0f)); glm::mat4 M2 = glm::mat4(1.0f); M2 = glm::translate(M2, glm::vec3(-1.0f, 0.0f, 0.0f)); M2 = glm::rotate(M2, -angle, glm::vec3(0.0f, 0.0f, 1.0f)); spLambert->use(); glUniformMatrix4fv(spLambert->u("M"), 1, false, glm::value_ptr(M1)); glUniform4f(spLambert->u("color"), 1, 0.4, 0.7, 0.1); Models::torus.drawSolid(); glUniformMatrix4fv(spLambert->u("M"), 1, false, glm::value_ptr(M2)); glUniform4f(spLambert->u("color"), 0.1, 0.1, 0.1, 0.1); Models::torus.drawSolid(); for (int i = 0; i < 12; i++) { glm::mat4 Mk = glm::mat4(1.0f); Mk = glm::translate(Mk, glm::vec3(-1.0f, 0.0f, 0.0f)); Mk = glm::rotate(Mk, -angle, glm::vec3(0.0f, 0.0f, 1.0f)); } //M = glm::rotate(M, angle, glm::vec3(0.0f, 1.0f, 0.0f)); /* Planety kreca sie wokol siebie glm::mat4 M = glm::mat4(1.0f); glm::mat4 V = glm::lookAt( glm::vec3(0.0f, 0.0f, -5.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f)); glm::mat4 P = glm::perspective(50.0f * PI / 180.0f, 1.0f, 1.0f, 50.0f); spLambert->use(); glUniform4f(spLambert->u("color"), 1, 0.4, 0.7, 0.1); glUniformMatrix4fv(spLambert->u("P"), 1, false, glm::value_ptr(P)); glUniformMatrix4fv(spLambert->u("V"), 1, false, glm::value_ptr(V)); glUniformMatrix4fv(spLambert->u("M"), 1, false, glm::value_ptr(M)); mySphere2.drawSolid(); glm::mat4 Mz = M; Mz = glm::rotate(Mz, angle, glm::vec3(0.0f, 1.0f, 0.0f)); Mz = glm::translate(Mz, glm::vec3(1.0f, 0.0f, 0.0f)); glUniformMatrix4fv(spLambert->u("M"), 1, false, glm::value_ptr(Mz)); glUniform4f(spLambert->u("color"), 1, 0.1, 0.1, 0.1); mySphere.drawSolid(); glm::mat4 Ms = Mz; Ms = glm::rotate(Ms, angle, glm::vec3(0.0f, 1.0f, 0.0f)); Ms = glm::translate(Ms, glm::vec3(0.3f, 0.0f, 0.0f)); glUniformMatrix4fv(spLambert->u("M"), 1, false, glm::value_ptr(Ms)); glUniform4f(spLambert->u("color"), 1, 0.8, 0.8, 0.8); mySphere3.drawSolid(); */ glfwSwapBuffers(window); } 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. glfwSetKeyCallback(window, key_callback); 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 float angle = 0; glfwSetTime(0); //Główna pętla 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); }