grk464933/cw 1/src/ex_1_5.hpp

104 lines
3.4 KiB
C++

#pragma once
#include "glew.h"
#include <GLFW/glfw3.h>
#include "glm.hpp"
#include "Shader_Loader.h"
#include "Render_Utils.h"
#include <gtc/matrix_transform.hpp>
GLuint program; // Shader ID
GLuint quadVAO;
Core::Shader_Loader shaderLoader;
void renderScene(GLFWwindow* window)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.0f, 0.3f, 0.3f, 1.0f);
// Zmienna "time" przechowuje czas ktory uplynal od uruchomienia aplikacji
float time = glfwGetTime();
glUseProgram(program);
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// ! Macierz translation jest definiowana wierszowo dla poprawy czytelnosci. OpenGL i GLM domyslnie stosuje macierze kolumnowe, dlatego musimy ja transponowac !
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
float translateY = 0.5f * sin(time);
glm::mat4 translationMatrixData({
1.0f, 0.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f, translateY,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
});
glm::mat4 translationMatrix = glm::transpose(translationMatrixData);
glUniformMatrix4fv(glGetUniformLocation(program, "transformation"), 1, GL_FALSE, (float*)&translationMatrix);
Core::drawVAOIndexed(quadVAO, 6);
float rotationAngle = glm::radians(time*10); // Kąt obrotu w stopniach, tutaj 45 stopni
float cosTheta = cos(rotationAngle);
float sinTheta = sin(rotationAngle);
glm::mat4 rotationMatrix = glm::mat4(
cosTheta, -sinTheta, 0.0f, -0.5f,
sinTheta, cosTheta, 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f
);
glm::mat4 rotation = glm::transpose(rotationMatrix);
glUniformMatrix4fv(glGetUniformLocation(program, "transformation"), 1, GL_FALSE, (float*)&rotation);
Core::drawVAOIndexed(quadVAO, 6);
// ZADANIE: Narysuj dwa czworokaty, jeden ruszajacy sie, drugi obracajacy sie
// Do rysowania ruszajacego sie czworokatu mozesz uzyc kodu z poprzedniego zadania, zmodyfikuj tylko macierz translacji, zeby byly obok siebie, nie jeden na drugim
// Uzyj zmiennej "time" do zdefiniowania takiej macierzy rotacji, aby czworokat obracal sie wokol srodka (znajdz odpowiednia macierz 4x4 w internecie)
// Kat obrotu podajemy w radianach
glUseProgram(0);
glfwSwapBuffers(window);
}
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}
void init(GLFWwindow* window) {
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
program = shaderLoader.CreateProgram("shaders/shader_1_2.vert", "shaders/shader_1_2.frag");
float points[] = { 0.2f, 0.8f, 0, 1,
0.2f, 0.6f, 0, 1,
0.3f, 0.3f, 0, 1,
0.4f, 0.9f, 0, 1 };
const unsigned int index[] = { 4, 2, 3,
1, 2, 3 };
quadVAO = Core::initVAOIndexed(points, index, 4, 3, 6);
//Przekopiuj kod do ladowania z poprzedniego zadania
}
void shutdown(GLFWwindow* window)
{
shaderLoader.DeleteProgram(program);
}
//obsluga wejscia
void processInput(GLFWwindow* window)
{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
}
// funkcja jest glowna petla
void renderLoop(GLFWwindow* window) {
while (!glfwWindowShouldClose(window))
{
processInput(window);
renderScene(window);
glfwPollEvents();
}
}
//}