grk464933/cw 1/src/ex_1_7.hpp

140 lines
4.8 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>
#include <ext.hpp>
#include <vector>
GLuint program; // Shader ID
GLuint quadVAO;
Core::Shader_Loader shaderLoader;
glm::vec3 quadPos = glm::vec3(0.0f, 0.0f, 0.0f);
std::vector<glm::vec3> quadsPositions;
float rotationAngle = 0.0f;
float centerX;
float centerY;
float centerZ;
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);
// ZADANIE: Wyswietl czworokat, ktory jednoczesnie przesuwa sie i obraca.
//
// Uzyj kodu do translacji i rotacji czworokatu z poprzednich zadan
//
// Stworz taka macierz transformacji, ktora powoduje ze czworokat przesuwa sie w gore i w dol ekranu, jednoczesnie obracajac sie.
// Wyslij stworzona macierz do GPU za pomoca funkcji glUniformMatrix4fv zamiast macierzy "translation" i "rotation" z poprzednich zadan
//glm::mat4 transform = glm::mat4(1.0f);
//transform = glm::translate(transform, quadPos);
//transform = glm::translate(transform, glm::vec3(0.0f, 0.5f * sin(glfwGetTime()), 0.0f));
//transform = glm::translate(transform, glm::vec3(centerX, centerY, centerZ));
//glm::mat4 rotationMatrix = glm::rotate(glm::mat4(1.0f), rotationAngle,glm::vec3(0.f, 0.0f, -0.1f));
// transform = transform * rotationMatrix;
// transform = glm::translate(transform, -glm::vec3(centerX, centerY, centerZ));
//glUniformMatrix4fv(glGetUniformLocation(program, "transformation"), 1, GL_FALSE, (float*)&transform);
for (const auto& quadPos : quadsPositions) {
glm::mat4 transform = glm::mat4(1.0f);
transform = glm::translate(transform, quadPos);
glUniformMatrix4fv(glGetUniformLocation(program, "transformation"), 1, GL_FALSE, (float*)&transform);
Core::drawVAOIndexed(quadVAO, 6);
}
Core::drawVAOIndexed(quadVAO, 6);
glUseProgram(0);
glfwSwapBuffers(window);
}
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{
glViewport(0, 0, width, height);
}
void mouseCallback(GLFWwindow* window, double xpos, double ypos) {
float ndcX = (2.0f * xpos) / 500.0f - 1.0f;
float ndcY = 1.0f - (2.0f * ypos) / 500.0f;
glm::vec3 quadPos = glm::vec3(ndcX, ndcY, 0.0f);
quadsPositions.push_back(quadPos);
}
void mouse_button_callback(GLFWwindow* window, int button, int action, int mods) {
if (button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS) {
double xpos, ypos;
glfwGetCursorPos(window, &xpos, &ypos);
mouseCallback(window, xpos, ypos);
}
}
void init(GLFWwindow* window) {
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
program = shaderLoader.CreateProgram("shaders/shader_1_2.vert", "shaders/shader_1_2.frag");
glfwSetMouseButtonCallback(window, mouse_button_callback);
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 };
int numVertices = sizeof(points) / sizeof(float) / 4;
float sumX = 0.0f, sumY = 0.0f, sumZ = 0.0f;
for (int i = 0; i < numVertices; ++i) {
int baseIndex = i * 4;
sumX += points[baseIndex];
sumY += points[baseIndex + 1];
sumZ += points[baseIndex + 2];
}
centerX = sumX / numVertices;
centerY = sumY / numVertices;
centerZ = sumZ / numVertices;
quadVAO = Core::initVAOIndexed(points, index, 4, 3, 6);
}
void shutdown(GLFWwindow* window)
{
shaderLoader.DeleteProgram(program);
}
//obsluga wejscia
void processInput(GLFWwindow* window)
{
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
glfwSetWindowShouldClose(window, true);
if (glfwGetKey(window, GLFW_KEY_UP) == GLFW_PRESS)
quadPos = quadPos + glm::vec3(0.0f, 0.001f, 0.0f);
if (glfwGetKey(window, GLFW_KEY_DOWN) == GLFW_PRESS)
quadPos = quadPos + glm::vec3(0.0f, -0.001f, 0.0f);
if (glfwGetKey(window, GLFW_KEY_RIGHT) == GLFW_PRESS)
quadPos = quadPos + glm::vec3(0.001f, 0.0f, 0.0f);
if (glfwGetKey(window, GLFW_KEY_LEFT) == GLFW_PRESS)
quadPos = quadPos + glm::vec3(-0.001f, 0.0f, 0.0f);
if (glfwGetKey(window, GLFW_KEY_O) == GLFW_PRESS)
rotationAngle = rotationAngle + 0.002f;
if (glfwGetKey(window, GLFW_KEY_P) == GLFW_PRESS)
rotationAngle = rotationAngle - 0.002f;
}
// funkcja jest glowna petla
void renderLoop(GLFWwindow* window) {
while (!glfwWindowShouldClose(window))
{
processInput(window);
renderScene(window);
glfwPollEvents();
}
}
//}