velage/test.cpp

432 lines
12 KiB
C++

#include "engine/camera.hpp"
#include "engine/largepos.hpp"
#include "engine/light.hpp"
#include "engine/object.hpp"
#include "engine/planet.hpp"
#include "engine/rendering.hpp"
#include "engine/shader.hpp"
#include "engine/simple-shapes.hpp"
#include "engine/texture.hpp"
#include "engine/multipass.hpp"
#include <SDL2/SDL_events.h>
#include <SDL2/SDL_keycode.h>
#include <SDL2/SDL_mouse.h>
#include <SDL2/SDL_timer.h>
#include <SDL2/SDL_video.h>
#include <SDL2/SDL_keyboard.h>
#include <cstddef>
#include <cstdlib>
#include <glm/detail/qualifier.hpp>
#include <glm/ext/matrix_transform.hpp>
#include <glm/ext/vector_float3.hpp>
#include <glm/fwd.hpp>
#include <glm/geometric.hpp>
#include <glm/gtx/quaternion.hpp>
#include <glm/trigonometric.hpp>
#include <iostream>
#include <iterator>
#include <string>
void cke(){
GLenum err = glGetError();
if (err != GL_NO_ERROR) {
std::cout<<"\n" << err << "frm\n";
exit(-1);
}
}
void printerror(GLenum source, GLenum type, GLuint id,
GLenum severity, GLsizei length, const GLchar* message, const void* userParam){
std::cout<<message;
}
int main(int argc, char *argv[]) {
auto t_start = std::chrono::high_resolution_clock::now();
rendering renderer;
renderer.SDLinit();
SDL_Window *window =
SDL_CreateWindow("aaa", 20, 20, 800, 600, SDL_WINDOW_OPENGL);
renderer.GLinit(window);
if(!renderer.Shaderinit()) return -1;
renderer.farClipPlane=100;
renderer.width=800;
renderer.height=600;
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glEnable(GL_DEBUG_OUTPUT);
glDebugMessageCallback((void (*)(unsigned int, unsigned int, unsigned int, unsigned int, int, const char *, const void *))printerror,NULL);
vertex vertices[] = {
vertex(-0.5f, 0.5f, -0.5f),
vertex(0.5f, 0.5f, -0.5f),
vertex(0.5f, -0.5f, -0.5f),
vertex(-0.5f, -0.5f, -0.5f),
vertex(-0.5f, 0.5f, -0.5f),
vertex(0.5f, 0.5f, -0.5f),
vertex(-0.5f, 0.5f, 0.5f),
vertex(0.5f, 0.5f, 0.5f),
vertex(-0.5f, -0.5f, -0.5f),
vertex(0.5f, -0.5f, -0.5f),
vertex(-0.5f, -0.5f, 0.5f),
vertex(0.5f, -0.5f, 0.5f),
vertex(-0.5f, 0.5f, 0.5f),
vertex(0.5f, 0.5f, 0.5f),
vertex(0.5f, -0.5f, 0.5f),
vertex(-0.5f, -0.5f, 0.5f),
};
vertex color[] = {
vertex(0.f, 0.5f, 0.f),
vertex(1.f, 0.5f, 0.f),
vertex(1.f, 0.5f, 0.f),
vertex(1.f, 0.5f, 0.f),
vertex(0.f, 0.5f, 0.5f),
vertex(1.f, 0.5f, 0.5f),
vertex(1.f, 0.5f, 0.5f),
vertex(1.f, 0.5f, 0.5f),
vertex(0.f, 1.f, 0.5f),
vertex(1.f, 1.f, 0.5f),
vertex(1.f, 1.f, 0.5f),
vertex(1.f, 1.f, 0.5f),
vertex(0.f, 0.5f, 0.f),
vertex(1.f, 0.5f, 0.f),
vertex(1.f, 0.5f, 0.f),
vertex(1.f, 0.5f, 0.f),
};
GLuint elements[] = {
0, 1, 2, 2, 3, 0,
5,4,6, 6,7,5,
8,9,10, 11,10,9,
1,7,2, 2,7,11,
0,3,10, 12,0,10,
13,12,14,12,15,14
};
gameobject test(&renderer.shaders.at(1));
renderer.objects.push_back(test);
test.genVbo(vertices, sizeof(vertices) / sizeof(vertices[1]));
test.setVertexAtribPointer("position", 0);
//std::cout<<"faa "<< renderer.shaders.at(1).getInputId("position")<<"ffauf\n";
test.genVboShadow();
test.setVertexAtribPointerShadow("position", &renderer.shaders.at(3), 0);
test.genEbo(elements, sizeof(elements) / sizeof(elements[1]));
test.genEboShadow();
test.setBuffer(color, sizeof(color) / sizeof(color[1]), test.COLOR_BUFFER);
test.setVertexAtribPointer("color", 0);
test.positionMatrix = glm::translate(test.positionMatrix, glm::vec3(0.f,-0.5f,-1.f));
test.distmult=1.0;
gameobject test2(&renderer.shaders.at(1));
renderer.objects.push_back(test2);
planet plt;
plt.generateSphere();
planetMesh pltm = plt.toPlanetMesh();
glm::vec3 *pltvrts=plt.chunks[0].vtx->vertices;
test2.genVbo(pltm.vertices, pltm.numverts);
test2.setVertexAtribPointer("position", 0);
test2.genEbo(pltm.indices, pltm.numindecies);
test2.setBuffer(color, sizeof(color) / sizeof(color[1]), test2.COLOR_BUFFER);
test2.setVertexAtribPointer("color", 0);
test2.scaleMatrix=glm::scale(glm::mat4(1.0), glm::vec3(1.0));
test2.positionMatrix = glm::translate(test2.positionMatrix, glm::vec3(0.f,-0.5f,-1.f));
test2.rotationMatrix=glm::rotate(glm::mat4(1.0f), (float)glm::radians(180.0), glm::vec3(0.0,1.0,0.0));
test2.distmult=1.0;
test.rend_shader->use();
camera mainCamera;
mainCamera.proj= glm::perspective(glm::radians(45.0f), 800.0f / 600.0f, 0.1f, renderer.farClipPlane);
mainCamera.view= glm::lookAt(glm::vec3(1.2f, 1.2f, 1.2f), glm::vec3(0.0f, 0.0f, 0.0f),
glm::vec3(0.0f, 0.0f, 1.0f));
test.shdViewId=test.rend_shader->getUniformId("view");
test.shdProjId=test.rend_shader->getUniformId("proj");
test.shdTrnsId=test.rend_shader->getUniformId("trans");
test2.shdViewId=test2.rend_shader->getUniformId("view");
test2.shdProjId=test2.rend_shader->getUniformId("proj");
test2.shdTrnsId=test2.rend_shader->getUniformId("trans");
test2.spacePos.fx=100.0;
test2.spaceAct=true;
renderer.shaders.at(2).use();
Gbuffer gbuf;
gbuf.init(800, 600);
gbuf.bind();
renderer.mkDepthBuffer();
mainCamera.pos=glm::vec3(1.2f,6.2f,1.2f);
renderer.lights.push_back(light(glm::vec3(0.f,0.f,5.f)));
// trans = glm::rotate(trans, glm::radians(10.0f), glm::vec3(0.0f,
// 0.0f, 1.0f));
/*texture tex;
tex.loadFromPath("sample.png",
VELAGE_generateTextureSettings(GL_CLAMP_TO_EDGE, GL_LINEAR),
GL_TEXTURE0);
tex.setTexUniformLocation("tex1", 0, test.rend_shader);*/
// std::cout<<renderer.objects.at(0).get().element_number;
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
std::cout << "Framebuffer not complete!" << std::endl;
SDL_Event windowEvent;
bool running = true;
bool keys[500];
for (int i=0; i<400; i++) {
keys[i]=false;
}
float lastframe;
float currentframe;
float deltaTime;
float camSpeed=10.f;
float pitch=0.f;
float yaw=-90.f;
float lastx;
float lasty;
bool firstMouse=true;
SDL_SetRelativeMouseMode(SDL_TRUE);
renderer.mkShadowCubemap();
while (running) {
while (SDL_PollEvent(&windowEvent)) {
switch (windowEvent.type) {
case SDL_QUIT:
running = false;
break;
case SDL_KEYDOWN:
//std::cout<<windowEvent.key.keysym.sym<<"wwa \n";
keys[windowEvent.key.keysym.sym&~(1<<30)]=true;
break;
case SDL_KEYUP:
if (windowEvent.key.keysym.sym == SDLK_ESCAPE)
running = false;
//std::cout<<windowEvent.key.keysym.sym<<"aww \n";
keys[windowEvent.key.keysym.sym&~(1<<30)]=false;
break;
}
}
if(keys[SDLK_w]){
mainCamera.pos+=mainCamera.forward*camSpeed*deltaTime;
mainCamera.spacePos+=mainCamera.forward*camSpeed*deltaTime;
}
if(keys[SDLK_s]){
mainCamera.pos-=mainCamera.forward*camSpeed*deltaTime;
mainCamera.spacePos-=mainCamera.forward*camSpeed*deltaTime;
}
if(keys[SDLK_a]){
mainCamera.pos+=glm::normalize(glm::cross(mainCamera.forward, mainCamera.up))*camSpeed*deltaTime;
mainCamera.spacePos+=glm::normalize(glm::cross(mainCamera.forward, mainCamera.up))*camSpeed*deltaTime;
}
if(keys[SDLK_d]){
mainCamera.pos-=glm::normalize(glm::cross(mainCamera.forward, mainCamera.up))*camSpeed*deltaTime;
mainCamera.spacePos-=glm::normalize(glm::cross(mainCamera.forward, mainCamera.up))*camSpeed*deltaTime;
}
if(keys[SDLK_q]){
mainCamera.rotateY(-3);
}
if(keys[SDLK_e]){
mainCamera.rotateY(3);
}
int mx;
int my;
SDL_GetRelativeMouseState(&mx, &my);
pitch+=(mx)*0.3f;
yaw+=(my)*0.3f;
mainCamera.rotateZ(-(mx)*0.3f);
mainCamera.rotateX((my)*0.3f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
//glClear(GL_COLOR_BUFFER_BIT);
auto t_now = std::chrono::high_resolution_clock::now();
float time = std::chrono::duration_cast<std::chrono::duration<float>>(
t_now - t_start)
.count();
currentframe=time;
deltaTime=currentframe-lastframe;
lastframe=currentframe;
test2.updateMatrix(mainCamera);
glm::mat4 trans = glm::mat4(1.0f);
trans = glm::rotate(trans, time * glm::radians(180.0f),
glm::vec3(0.0f, 0.0f, 1.0f));
test.rotationMatrix = trans;
mainCamera.update();
largePos a;
largePos b;
a.fx=20;
b.fx=10;
//std::cout<<(a-b).fx<<"ä\n";
renderer.render(mainCamera, &renderer.shaders.at(3), &renderer.shaders.at(4), &gbuf);
renderer.shaders.at(0).use();
//test.render(mainCamera);
SDL_GL_SwapWindow(window);
SDL_Delay(16);
}
SDL_GL_DeleteContext(renderer.context);
SDL_Quit();
return 0;
}
// renderer.shaders.at(3).use();
// glUniform3f(renderer.shaders.at(3).getUniformId("lights[0].Position"), 0.f,0.f,5.f);
// glUniform3f(renderer.shaders.at(3).getUniformId("lights[0].Color"), 1.f,1.f,1.f);
// test.renderShadows(light(glm::vec3(0.,0.,5.)), renderer.SHADOW_WIDTH, renderer.SHADOW_HEIGHT, renderer.depthCubemap, &renderer.shaders.at(3), renderer.depthFBO, renderer.farClipPlane, true);
// test2.renderShadows(light(glm::vec3(0.,0.,5.)), renderer.SHADOW_WIDTH, renderer.SHADOW_HEIGHT, renderer.depthCubemap, &renderer.shaders.at(3), renderer.depthFBO, renderer.farClipPlane);
// cke();// return -1;
// renderer.shaders.at(1).use();
// glActiveTexture(GL_TEXTURE0);
// glBindTexture(GL_TEXTURE_CUBE_MAP, renderer.depthCubemap);
// glUniform1i(renderer.shaders.at(1).getUniformId("depthMap"), 0);
// gbuf.bindW();
// gbuf.clear();
// glUniform3f(renderer.shaders.at(1).getUniformId("lights[0].Position"), 0.f,0.f,5.f);
// glUniform3f(renderer.shaders.at(1).getUniformId("lights[0].Color"), 1.f,1.f,1.f);
// glUniform1f(renderer.shaders.at(1).getUniformId("far_plane"), 100.f);
// test.render(mainCamera);
// test2.render(mainCamera);
// renderer.shaders.at(2).use();
// glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
// gbuf.bindR();
// // tex 0 position
// // tex 1 normals
// // tex 2 diffuse (albedo)
// // tex 3 texcoord
// // tex 4 shadow
// renderer.setupTextureDS(gbuf);
// glUniform1i(renderer.shaders.at(2).getUniformId("gPosition"),0);
// glUniform1i(renderer.shaders.at(2).getUniformId("gNormal"),1);
// glUniform1i(renderer.shaders.at(2).getUniformId("gAlbedoSpec"),2);
// glUniform1i(renderer.shaders.at(2).getUniformId("gShadow"),4);
// glUniform3f(renderer.shaders.at(2).getUniformId("lights[0].Position"), 0.f,0.f,0.f);
// glUniform3f(renderer.shaders.at(2).getUniformId("lights[0].Color"), 1.f,1.f,1.f);
// if(firstMouse){
// firstMouse=false;
// //std::cout<<"löoel "<< renderer.shaders.at(3).geometryShader<<" \n";
// }
// renderer.renderlighting(renderer.shaders.at(2).getInputId("position"),renderer.shaders.at(2).getInputId("TexCoord"));
// renderer.cpyDepthBuffer(gbuf.fbo);
//enderer.shaders.at(0).use();
// if(firstMouse){
// //firstMouse=false;
// // std::cout<<"\n"<<renderer.shaders.at(2).getInputId("position")<<" löl\n";
// GLint count;
// glGetProgramiv(renderer.shaders.at(3).shaderProgram, GL_ACTIVE_UNIFORMS, &count);
// // std::cout<<gbuf.textus[gbuf.GBUFER_TEXTURE_DIFFUSE]<< " fffa \n";
// // std::cout<<count<<" aaa\n";
// for (int i=0; i<count; i++) {
// GLsizei length, size;
// GLenum type;
// GLchar name[32];
// glGetActiveUniform(renderer.shaders.at(3).shaderProgram, (GLuint)i, 32, &length, &size, &type, name);
// std::cout<<name<<" "<< length<<" fff\n";
// }
//}
//glUniform1f(renderer.shaders.at(3).getUniformId("far_plane"), 100.f);
//cke(); return -1;
//std::cout<<"\n"<<renderer.shaders.at(3).getUniformId("far_plane");