Untitled

mail@pastecode.io avatar
unknown
plain_text
2 years ago
8.8 kB
5
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 = 2;
float kolor = 0.4;
float kat = 0.0f;

void drawKostka(glm::mat4 M, float a, float b, float c)
{
	glm::mat4 Mk = glm::scale (M, glm::vec3(a/2,b/2,c/2));
	glUniformMatrix4fv(spLambert->u("M"), 1, false, glm::value_ptr(Mk));
	Models::cube.drawSolid();
} 

void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
	if (action == GLFW_PRESS)
	{
		if (key == GLFW_KEY_LEFT)
		{
			kat= 30.0f;
		}
		if (key == GLFW_KEY_RIGHT)
		{
			kat = -30.0f;
		}
	}
	if (action == GLFW_RELEASE) {
		if (key == GLFW_KEY_LEFT or key == GLFW_KEY_RIGHT)
		{
			kat = 0.0f;
		}
	}

}

//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, 10.0f, -7.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 M2 = glm::mat4(1.0f);
	M2 = glm::translate(M2, glm::vec3(-1.045f, 0.0f, 0.0f));
	M2 = glm::rotate(M2, -angle, glm::vec3(0.0f, 0.0f, 1.0f));*/
	glm::mat4 M = glm::mat4(1.0f);
	glUniform4f(spLambert->u("color"), 1, 0.8, 0.7, 0.1);
	drawKostka(M, 1, 0.5, 1);
	spLambert->use();
	for (int i = 0; i < 4; i++)
	{
		glm::mat4 Mg = M;
		Mg = glm::rotate(Mg, glm::radians(90.0f*i), glm::vec3(0.0f, 1.0f, 0.0f));
		Mg = glm::translate(Mg, glm::vec3(0.5f, 0.0f, 0.0f));

		Mg = glm::rotate(Mg, angle, glm::vec3(0.0f, 0.0f, 1.0f));
		Mg = glm::translate(Mg, glm::vec3(1.0f, 0.0f, 0.0f));
		glUniform4f(spLambert->u("color"), 1, 0.4, 0.7, 0.1);
		drawKostka(Mg, 2, 0.5, 1);


		glm::mat4 Mgp = Mg;
		Mgp = glm::translate(Mgp, glm::vec3(1.0f, 0.0f, 0.0f));
		Mgp = glm::rotate(Mgp, angle, glm::vec3(0.0f, 0.0f, 1.0f));
		Mgp = glm::translate(Mgp, glm::vec3(1.0f, 0.0f, 0.0f));
		glUniform4f(spLambert->u("color"), 1, 0.0, 0.0, 0.1);
		drawKostka(Mgp, 2, 0.5, 1);
	}
	

	/*
	glm::mat4 M1 = glm::mat4(1.0f);
	M1 = glm::rotate(M1, angle, glm::vec3(0.0f, 1.0f, 0.0f));
	glm::mat4 Mkola = M1;
	M1 = glm::scale(M1, glm::vec3(1.5f, 0.125f, 1.0f));
	glUniformMatrix4fv(spLambert->u("M"), 1, false, glm::value_ptr(M1));
	glUniform4f(spLambert->u("color"), 1, 0.4, 0.7, 0.1);
	Models::cube.drawSolid();
	for (int i = 0; i < 4; i++)
	{
		int tyl = 1, bok = 1;
		if (i % 2 == 0)
			tyl *= -1;
		if (i < 2)
			bok *= -1;
		glm::mat4 Mk1 = Mkola;
		Mk1 = glm::translate(Mk1, glm::vec3(1.4f*tyl, 0.0f, 1.1f*bok));
		Mk1 = glm::rotate(Mk1, glm::radians(90.0f), glm::vec3(0.0f, 0.0f, 1.0f));
		if (i%2==0)
			Mk1 = glm::rotate(Mk1, glm::radians(kat), glm::vec3(1.0f, 0.0f, 0.0f));
		Mk1 = glm::rotate(Mk1, angle, glm::vec3(0.0f, 0.0f, 1.0f));
		Mk1 = glm::scale(Mk1, glm::vec3(0.4f, 0.4f, 0.4f));
		glUniformMatrix4fv(spLambert->u("M"), 1, false, glm::value_ptr(Mk1));
		glUniform4f(spLambert->u("color"), 1, 0.3, 0.4, 0.4);
		Models::torus.drawWire();
	}
	*/

	
	
	/*
	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 = M2;
	//	Mk = glm::rotate(Mk, glm::radians(30.0f * i)+15.0f, glm::vec3(0.0f, 0.0f, 1.0f));
	//	Mk = glm::translate(Mk, glm::vec3(1.0f, 0.0f, 0.0f));
	//	Mk = glm::scale(Mk, glm::vec3(0.1f, 0.1f, 0.1f));

	//	glUniformMatrix4fv(spLambert->u("M"), 1, false, glm::value_ptr(Mk));
	//	glUniform4f(spLambert->u("color"), 1, 0.4, 0.7, 0.1);
	//	Models::cube.drawSolid();

	//}


	//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(1000, 10000, "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
	int przel = 0;
	while (!glfwWindowShouldClose(window)) //Tak długo jak okno nie powinno zostać zamknięte
	{
		
		
		if (!przel and angle > glm::radians(50.0f))
		{
			przel = 1;
			
		}
		if (przel and angle<=0)
		{
			przel = 0;
		}

		if (przel)
		{
			angle -= speed * glfwGetTime();
		}
		else
		{
			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);
}