224 lines
8.6 KiB
C++
224 lines
8.6 KiB
C++
#include "glew.h"
|
|
#include <GLFW/glfw3.h>
|
|
#include "glm.hpp"
|
|
#include "ext.hpp"
|
|
#include <iostream>
|
|
#include <cmath>
|
|
#include <list>
|
|
|
|
#include "Shader_Loader.h"
|
|
#include "Render_Utils.h"
|
|
//#include "Texture.h"
|
|
|
|
#include "Box.cpp"
|
|
#include <assimp/Importer.hpp>
|
|
#include <assimp/scene.h>
|
|
#include <assimp/postprocess.h>
|
|
#include <string>
|
|
#include "../Sun.h"
|
|
#include "../Spaceship.h"
|
|
#include "../Planet.h"
|
|
#include "../GameObject.h"
|
|
#include "../GameUtils.h"
|
|
|
|
const unsigned int SHADOW_WIDTH = 1024, SHADOW_HEIGHT = 1024;
|
|
|
|
int WIDTH = 500, HEIGHT = 500;
|
|
|
|
namespace models {
|
|
Core::RenderContext marbleBustContext;
|
|
Core::RenderContext spaceshipContext;
|
|
Core::RenderContext sphereContext;
|
|
}
|
|
|
|
GLuint depthMapFBO;
|
|
GLuint depthMap;
|
|
|
|
GLuint program;
|
|
GLuint programSun;
|
|
GLuint programTest;
|
|
GLuint programTex;
|
|
|
|
Core::Shader_Loader shaderLoader;
|
|
|
|
Core::RenderContext shipContext;
|
|
Core::RenderContext sphereContext;
|
|
|
|
std::list<Planet*> planets;
|
|
Sun* sun;
|
|
GLuint VAO,VBO;
|
|
|
|
float exposition = 1.f;
|
|
|
|
glm::vec3 pointlightPos = glm::vec3(0, 2, 0);
|
|
glm::vec3 pointlightColor = glm::vec3(0.9, 0.6, 0.6);
|
|
|
|
float lastTime = -1.f;
|
|
float deltaTime = 0.f;
|
|
|
|
void updateDeltaTime(float time) {
|
|
if (lastTime < 0) {
|
|
lastTime = time;
|
|
return;
|
|
}
|
|
|
|
deltaTime = time - lastTime;
|
|
if (deltaTime > 0.1) deltaTime = 0.1;
|
|
lastTime = time;
|
|
}
|
|
|
|
void renderShadowapSun() {
|
|
float time = glfwGetTime();
|
|
glViewport(0, 0, SHADOW_WIDTH, SHADOW_HEIGHT);
|
|
//uzupelnij o renderowanie glebokosci do tekstury
|
|
|
|
glBindFramebuffer(GL_FRAMEBUFFER, 0);
|
|
glViewport(0, 0, WIDTH, HEIGHT);
|
|
}
|
|
|
|
void renderScene(GLFWwindow* window)
|
|
{
|
|
glClearColor(0.4f, 0.4f, 0.8f, 1.0f);
|
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
|
float time = glfwGetTime();
|
|
updateDeltaTime(time);
|
|
renderShadowapSun();
|
|
|
|
//space lamp
|
|
glUseProgram(programSun);
|
|
|
|
std::list<Sun*>* suns = GameUtils::getInstance()->getSuns();
|
|
for (Sun* sun : *suns) {
|
|
sun->draw();
|
|
}
|
|
|
|
glUseProgram(program);
|
|
|
|
for (Planet* p : planets) {
|
|
p->draw(time, program);
|
|
}
|
|
|
|
//drawObjectPBR(sphereContext, glm::translate(pointlightPos) * glm::scale(glm::vec3(1)) * glm::eulerAngleY(time / 3) * glm::translate(glm::vec3(10.f, 0, 0)) * glm::scale(glm::vec3(0.3f)), glm::vec3(0.2, 0.7, 0.3), 0.3, 0.0, program);
|
|
|
|
drawObjectPBR(sphereContext,
|
|
glm::translate(pointlightPos) * glm::scale(glm::vec3(0.1)) * glm::eulerAngleY(time / 3) * glm::translate(glm::vec3(4.f, 0, 0)) * glm::eulerAngleY(time) * glm::translate(glm::vec3(1.f, 0, 0)) * glm::scale(glm::vec3(0.1f)),
|
|
glm::vec3(0.5, 0.5, 0.5), 0.7, 0.0, program);
|
|
|
|
drawObjectPBR(models::marbleBustContext, glm::mat4(), glm::vec3(1.f, 1.f, 1.f), 0.5f, 1.0f, program);
|
|
|
|
drawObjectPBR(shipContext,
|
|
Spaceship::getInstance().calculateModelMatrix(),
|
|
glm::vec3(0.3, 0.3, 0.5),
|
|
0.2,1.0, program
|
|
);
|
|
|
|
glUseProgram(0);
|
|
glfwSwapBuffers(window);
|
|
}
|
|
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
|
|
{
|
|
GameUtils::getInstance()->setAspectRatio(width / float(height));
|
|
glViewport(0, 0, width, height);
|
|
WIDTH = width;
|
|
HEIGHT = height;
|
|
}
|
|
void loadModelToContext(std::string path, Core::RenderContext& context)
|
|
{
|
|
Assimp::Importer import;
|
|
const aiScene* scene = import.ReadFile(path, aiProcess_Triangulate | aiProcess_CalcTangentSpace);
|
|
|
|
if (!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode)
|
|
{
|
|
std::cout << "ERROR::ASSIMP::" << import.GetErrorString() << std::endl;
|
|
return;
|
|
}
|
|
context.initFromAssimpMesh(scene->mMeshes[0]);
|
|
}
|
|
|
|
void createSuns() {
|
|
GameUtils* gu = GameUtils::getInstance();
|
|
sun = new Sun(programSun, models::sphereContext, glm::vec3(0, 2, 0), glm::vec3(-0.93633f, 0.351106, 0.003226f), glm::vec3(0.9f, 0.9f, 0.7f) * 5, 1);
|
|
Planet* planet = new Planet(sun, 20.f, 0.25f, 1.f, sphereContext);
|
|
planets.push_back(planet);
|
|
Planet* moon = new Planet(planet, 5.f, 1.f, 0.2f, sphereContext);
|
|
planets.push_back(moon);
|
|
gu->getSuns()->push_back(sun);
|
|
Planet* planet2 = new Planet(sun, 50.f, 0.5f, 1.5f, sphereContext);
|
|
planets.push_back(planet2);
|
|
/*suns.push_back(&Sun(programSun, models::sphereContext, glm::vec3(-80, 20, 50), glm::vec3(-0.93633f, 0.351106, 0.003226f), glm::vec3(1.0f, 0.8f, 0.2f), 4.0));
|
|
suns.push_back(&Sun(programSun, models::sphereContext, glm::vec3(50, 40, -30), glm::vec3(-0.73633f, 0.451106, 0.023226f), glm::vec3(0.9f, 0.5f, 0.1f), 3.5));
|
|
suns.push_back(&Sun(programSun, models::sphereContext, glm::vec3(0, -60, 100), glm::vec3(-0.53633f, 0.551106, 0.043226f), glm::vec3(0.8f, 0.2f, 0.2f), 4.5));
|
|
suns.push_back(&Sun(programSun, models::sphereContext, glm::vec3(20, 80, -70), glm::vec3(0.33633f, 0.651106, 0.063226f), glm::vec3(0.5f, 0.7f, 0.9f), 3.8));
|
|
suns.push_back(&Sun(programSun, models::sphereContext, glm::vec3(-60, -20, 30), glm::vec3(-0.23633f, 0.751106, 0.083226f), glm::vec3(0.7f, 0.2f, 0.7f), 4.2));
|
|
suns.push_back(&Sun(programSun, models::sphereContext, glm::vec3(70, -50, -80), glm::vec3(-0.03633f, 0.851106, 0.103226f), glm::vec3(0.1f, 0.3f, 0.9f), 3.9));
|
|
suns.push_back(&Sun(programSun, models::sphereContext, glm::vec3(10, 30, 60), glm::vec3(0.13633f, -0.951106, -0.123226f), glm::vec3(0.6f, 0.9f, 0.4f), 4.3));
|
|
suns.push_back(&Sun(programSun, models::sphereContext, glm::vec3(-40, -80, -50), glm::vec3(0.33633f, -0.851106, -0.143226f), glm::vec3(0.7f, 0.5f, 0.2f), 3.7));
|
|
suns.push_back(&Sun(programSun, models::sphereContext, glm::vec3(90, 70, 20), glm::vec3(0.53633f, -0.751106, -0.163226f), glm::vec3(0.4f, 0.1f, 0.9f), 4.1));
|
|
suns.push_back(&Sun(programSun, models::sphereContext, glm::vec3(-30, 10, -40), glm::vec3(0.73633f, -0.651106, -0.183226f), glm::vec3(0.8f, 0.4f, 0.1f), 4.4));
|
|
suns.push_back(&Sun(programSun, models::sphereContext, glm::vec3(150, -100, 80), glm::vec3(0.33633f, -0.951106, -0.143226f), glm::vec3(0.2f, 0.8f, 0.5f), 3.9));
|
|
suns.push_back(&Sun(programSun, models::sphereContext, glm::vec3(-120, 50, -60), glm::vec3(0.73633f, 0.551106, 0.103226f), glm::vec3(0.9f, 0.2f, 0.7f), 3.6));
|
|
suns.push_back(&Sun(programSun, models::sphereContext, glm::vec3(0, 120, -150), glm::vec3(-0.23633f, -0.751106, 0.083226f), glm::vec3(0.5f, 0.6f, 0.9f), 3.4));
|
|
suns.push_back(&Sun(programSun, models::sphereContext, glm::vec3(-180, -50, 120), glm::vec3(0.13633f, 0.351106, -0.003226f), glm::vec3(0.7f, 0.9f, 0.2f), 4.2));
|
|
suns.push_back(&Sun(programSun, models::sphereContext, glm::vec3(60, -150, 180), glm::vec3(-0.93633f, -0.451106, -0.023226f), glm::vec3(0.3f, 0.7f, 0.8f), 3.8));
|
|
suns.push_back(&Sun(programSun, models::sphereContext, glm::vec3(100, 80, -120), glm::vec3(0.53633f, -0.651106, 0.163226f), glm::vec3(0.8f, 0.1f, 0.4f), 4.5));
|
|
suns.push_back(&Sun(programSun, models::sphereContext, glm::vec3(-50, -180, 150), glm::vec3(-0.33633f, 0.951106, -0.083226f), glm::vec3(0.4f, 0.8f, 0.6f), 3.5));
|
|
suns.push_back(&Sun(programSun, models::sphereContext, glm::vec3(200, 150, -100), glm::vec3(0.03633f, 0.151106, 0.103226f), glm::vec3(0.6f, 0.2f, 0.9f), 3.9));
|
|
suns.push_back(&Sun(programSun, models::sphereContext, glm::vec3(-150, -100, -50), glm::vec3(0.83633f, -0.251106, -0.123226f), glm::vec3(0.7f, 0.5f, 0.8f), 4.1));*/
|
|
}
|
|
|
|
void init(GLFWwindow* window)
|
|
{
|
|
glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);
|
|
|
|
glEnable(GL_DEPTH_TEST);
|
|
program = shaderLoader.CreateProgram("shaders/shader_9_1.vert", "shaders/shader_9_1.frag");
|
|
programTest = shaderLoader.CreateProgram("shaders/test.vert", "shaders/test.frag");
|
|
programSun = shaderLoader.CreateProgram("shaders/shader_8_sun.vert", "shaders/shader_8_sun.frag");
|
|
|
|
loadModelToContext("./models/sphere.obj", sphereContext);
|
|
loadModelToContext("./models/spaceship.obj", shipContext);
|
|
|
|
|
|
|
|
loadModelToContext("./models/marbleBust.obj", models::marbleBustContext);
|
|
loadModelToContext("./models/GameUtils::spaceship.obj", models::spaceshipContext);
|
|
loadModelToContext("./models/sphere.obj", models::sphereContext);
|
|
|
|
createSuns();
|
|
}
|
|
|
|
void shutdown(GLFWwindow* window)
|
|
{
|
|
shaderLoader.DeleteProgram(program);
|
|
}
|
|
|
|
//obsluga wejscia
|
|
void processInput(GLFWwindow* window)
|
|
{
|
|
Spaceship::getInstance().processInput(window, deltaTime);
|
|
|
|
/*if (glfwGetKey(window, GLFW_KEY_1) == GLFW_PRESS)
|
|
exposition -= 0.05;
|
|
if (glfwGetKey(window, GLFW_KEY_2) == GLFW_PRESS)
|
|
exposition += 0.05;*/
|
|
|
|
if (glfwGetKey(window, GLFW_KEY_3) == GLFW_PRESS) {
|
|
printf("GameUtils::spaceshipPos = glm::vec3(%ff, %ff, %ff);\n", Spaceship::getInstance().spaceshipPos.x, Spaceship::getInstance().spaceshipPos.y, Spaceship::getInstance().spaceshipPos.z);
|
|
printf("GameUtils::spaceshipDir = glm::vec3(%ff, %ff, %ff);\n", Spaceship::getInstance().spaceshipDir.x, Spaceship::getInstance().spaceshipDir.y, Spaceship::getInstance().spaceshipDir.z);
|
|
}
|
|
|
|
//cameraDir = glm::normalize(-cameraPos);
|
|
|
|
}
|
|
|
|
// funkcja jest glowna petla
|
|
void renderLoop(GLFWwindow* window) {
|
|
while (!glfwWindowShouldClose(window))
|
|
{
|
|
processInput(window);
|
|
|
|
renderScene(window);
|
|
glfwPollEvents();
|
|
}
|
|
}
|
|
//}
|