Untitled
unknown
plain_text
4 years ago
6.5 kB
9
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"
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);
}Editor is loading...