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