104 lines
3.4 KiB
C++
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();
|
|
}
|
|
}
|
|
//}
|