velage/engine/object.cpp
miri e659cd35ed first planet gen test
one side of cube sphere done
2024-01-20 11:37:50 +01:00

368 lines
No EOL
10 KiB
C++

#include "object.hpp"
#include "camera.hpp"
#include "rendering.hpp"
#include "shader.hpp"
#include "vector.hpp"
#include <glm/detail/qualifier.hpp>
#include <glm/ext/matrix_float4x4.hpp>
#include <glm/ext/matrix_transform.hpp>
#include <glm/ext/quaternion_exponential.hpp>
#include <glm/ext/vector_float3.hpp>
#include <glm/fwd.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <iostream>
#include <string>
#include <vector>
void cke();
vertex::vertex(GLfloat x, GLfloat y, GLfloat z) { pos = vector3f(x, y, z); }
glm::mat4 scaleMatAroundPoint(glm::mat4 mat, glm::vec3 pivot, glm::vec3 scalar){
return glm::translate(glm::mat4(1.0),-pivot)
* glm::scale(mat, scalar)
* glm::translate(glm::mat4(1.0), pivot);
// return
// glm::translate(
// glm::scale(
// glm::translate(mat, pivot)
// , scalar)
// , -pivot)
// ;
}
glm::mat4 toCameraWorldSpace(glm::mat4 scaleMat, glm::mat4 rotMat, glm::mat4 posMat, glm::vec3 campos, GLfloat distmult){
return scaleMat * glm::scale(glm::mat4(1.0), glm::vec3(1.0/distmult))
* scaleMatAroundPoint(posMat, campos, glm::vec3(1.0/distmult))
* rotMat;
}
void gameobject::render(camera cam) {
GLint current;
// glBindBuffer(GL_ARRAY_BUFFER, vao);
rend_shader->use();
setUniform(cam.proj, shdProjId);
if(!spaceAct) setUniform(cam.view, shdViewId);
else{
glm::quat corrRot=cam.rotation*glm::angleAxis(glm::radians(90.f), glm::vec3(1.f, 0.f, 0.f) * cam.rotation);
setUniform(glm::toMat4(corrRot), shdViewId);
}
glBindVertexArray(vao);
setUniform(
toCameraWorldSpace(scaleMatrix, rotationMatrix, positionMatrix, cam.pos, distmult),
shdTrnsId);
// draw
glDrawElementsBaseVertex(GL_TRIANGLES, element_number, GL_UNSIGNED_INT, 0, 0);
glBindVertexArray(0);
}
/*
* render in world space
* shdProjId and shdViewId must be set
*/
void gameobject::render(camera cam, shader *shader) {
setUniform(cam.proj, shdProjId);
if(!spaceAct) setUniform(cam.view, shdViewId);
else{
glm::quat corrRot=cam.rotation*glm::angleAxis(glm::radians(90.f), glm::vec3(1.f, 0.f, 0.f) * cam.rotation);
setUniform(glm::toMat4(corrRot), shdViewId);
}
GLint current;
// glBindBuffer(GL_ARRAY_BUFFER, vao);
glBindVertexArray(vao);
shader->use();
setUniform(
toCameraWorldSpace(scaleMatrix, rotationMatrix, positionMatrix, cam.pos, distmult),
shdTrnsId);
// draw
glDrawElementsBaseVertex(GL_TRIANGLES, element_number, GL_UNSIGNED_INT, 0, 0);
glBindVertexArray(0);
}
gameobject::gameobject(shader *render_shader) {
rend_shader = render_shader;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glGenBuffers(NUM_BUFFERS, vbo); // Generate 1 buffer
glBindVertexArray(0);
scaleMatrix = positionMatrix = rotationMatrix = glm::mat4(1.0f);
glGenVertexArrays(1, &shadowVao);
//glBindVertexArray(shadowVao);
//glGenBuffers(1,shadowVbo); // Generate 1 buffer
//glBindVertexArray(0);
}
void gameobject::genEbo(GLuint elements[], GLuint size) {
this->elements = elements;
element_number = size;
glBindVertexArray(vao);
// glGenBuffers(1, &ebo); // Generate 1 buffer
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[INDEX_BUFFER]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * element_number,
elements, GL_STATIC_DRAW);
//glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[INDEX_BUFFER]);
glBindVertexArray(0);
}
void gameobject::genEboShadow() {
glBindVertexArray(shadowVao);
// glGenBuffers(1, &ebo); // Generate 1 buffer
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[INDEX_BUFFER]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint) * element_number,
elements, GL_STATIC_DRAW);
//glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[INDEX_BUFFER]);
glBindVertexArray(0);
}
void gameobject::genVbo(vertex vertices[], GLuint size) {
glBindVertexArray(vao);
this->vertices = vertices;
vertice_number = size;
glBindBuffer(GL_ARRAY_BUFFER, vbo[VERTEX_BUFFER]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices[0]) * size, vertices,
GL_STATIC_DRAW);
// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[VERTEX_BUFFER]);
glBindVertexArray(0);
}
void gameobject::genVbo(glm::vec3 vertices[], GLuint size) {
glBindVertexArray(vao);
//this->vertices = vertices;
vertice_number = size;
glBindBuffer(GL_ARRAY_BUFFER, vbo[VERTEX_BUFFER]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices[0]) * size, vertices,
GL_STATIC_DRAW);
// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[VERTEX_BUFFER]);
}
void gameobject::genVboShadow() {
glBindVertexArray(shadowVao);
glBindBuffer(GL_ARRAY_BUFFER, vbo[VERTEX_BUFFER]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices[0]) * vertice_number, vertices,
GL_STATIC_DRAW);
// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[VERTEX_BUFFER]);
glBindVertexArray(0);
}
void gameobject::setBuffer(vertex vertices[], GLuint size, buffers buffer) {
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo[buffer]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices[0]) * size, vertices,
GL_STATIC_DRAW);
// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[VERTEX_BUFFER]);
glBindVertexArray(0);
}
void gameobject::setUniform(glm::mat4 matrix, std::string name) {
//glBindVertexArray(vao);
glUniformMatrix4fv(rend_shader->getUniformId(name),1,GL_FALSE, glm::value_ptr(matrix));
//glBindVertexArray(0);
}
void gameobject::setUniform(glm::mat4 matrix, GLint name) {
//glBindVertexArray(vao);
glUniformMatrix4fv(name,1,GL_FALSE, glm::value_ptr(matrix));
//glBindVertexArray(0);
}
void gameobject::setUniform(float v, std::string name) {
//glBindVertexArray(vao);
glUniform1f(rend_shader->getUniformId(name), v);
//glBindVertexArray(0);
}
void gameobject::setUniform(float v, GLint name) {
//glBindVertexArray(vao);
glUniform1f(name,v);
//glBindVertexArray(0);
}
void gameobject::setUniform(glm::vec3 v, std::string name) {
//glBindVertexArray(vao);
glUniform3f(rend_shader->getUniformId(name),v.x,v.y,v.z);
//glBindVertexArray(0);
}
void gameobject::setUniform(glm::vec3 v, GLint name) {
//glBindVertexArray(vao);
glUniform3f(name,v.x,v.y,v.z);
//glBindVertexArray(0);
}
void gameobject::setVertexAtribPointer(std::string param, const void *pointer) {
glBindVertexArray(vao);
GLint posAttrib = rend_shader->getInputId(param);
glEnableVertexAttribArray(posAttrib);
std::cout << posAttrib;
glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE,
0 /*stride * sizeof(GL_FLOAT)*/, pointer);
glBindVertexArray(0);
}
void gameobject::setVertexAtribPointerShadow(std::string param, shader *depthshd, const void *pointer) {
glBindVertexArray(shadowVao);
GLint posAttrib = depthshd->getInputId(param);
glEnableVertexAttribArray(posAttrib);
std::cout << posAttrib;
glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE,
0 /*stride * sizeof(GL_FLOAT)*/, pointer);
glBindVertexArray(0);
}
gameobject::~gameobject(){
glDeleteBuffers(1, &vao);
glDeleteBuffers(NUM_BUFFERS, vbo);
}
void gameobject::renderShadows(light clight, GLuint SHADOW_WIDTH, GLuint SHADOW_HEIGHT, GLuint depthCubemap, shader *depthshd, GLuint dfbo, float farClipPlane, camera cam, bool first){
depthshd->use();
glBindVertexArray(vao);
float aspect = (float)SHADOW_WIDTH/(float)SHADOW_HEIGHT;
float near = 0.1f;
float far = farClipPlane;
glm::mat4 shadowProj = glm::perspective(glm::radians(90.0f), aspect, near, far);
glm::mat4 shadowTransfr[6];
shadowTransfr[0]=shadowProj*glm::lookAt(clight.position, clight.position + glm::vec3(1.,0.,0.), glm::vec3(0.,-1., 0.));
shadowTransfr[1]=shadowProj*glm::lookAt(clight.position, clight.position + glm::vec3(-1.,0.,0.), glm::vec3(0.,-1., 0.));
shadowTransfr[2]=shadowProj*glm::lookAt(clight.position, clight.position + glm::vec3(0.,1.,0.), glm::vec3(0.,0., 1.));
shadowTransfr[3]=shadowProj*glm::lookAt(clight.position, clight.position + glm::vec3(0.,-1.,0.), glm::vec3(0.,0., -1.));
shadowTransfr[4]=shadowProj*glm::lookAt(clight.position, clight.position + glm::vec3(0.,0.,1.), glm::vec3(0.,-1., 0.));
shadowTransfr[5]=shadowProj*glm::lookAt(clight.position, clight.position + glm::vec3(0.,0.,-1.), glm::vec3(0.,-1., 0.));
glViewport(0, 0, SHADOW_WIDTH,SHADOW_HEIGHT);
glBindFramebuffer(GL_FRAMEBUFFER, dfbo);
if(first){glClear(GL_DEPTH_BUFFER_BIT);}
for (int i=0; i<6; i++) {
setUniform(shadowTransfr[i], depthshd->getUniformId("shadowMatrices[" + std::to_string(i) + "]"));
}
setUniform(farClipPlane,depthshd->getUniformId("far_plane"));
setUniform(clight.position,depthshd->getUniformId("lightPos"));
setUniform(glm::mat4(1),depthshd->getUniformId("model"));
//glActiveTexture(GL_TEXTURE0);
//glBindTexture(GL_TEXTURE_CUBE_MAP, depthCubemap);
//glBindVertexArray(vao);
if(!spaceAct) setUniform(cam.view, shdViewId);
else{
glm::quat corrRot=cam.rotation*glm::angleAxis(glm::radians(90.f), glm::vec3(1.f, 0.f, 0.f) * cam.rotation);
setUniform(glm::toMat4(corrRot), shdViewId);
}
setUniform(
toCameraWorldSpace(scaleMatrix, rotationMatrix, -positionMatrix, clight.position, distmult),
shdTrnsId);
// draw
glDrawElementsBaseVertex(GL_TRIANGLES, element_number, GL_UNSIGNED_INT, 0, 0);
glBindVertexArray(0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glViewport(0, 0, 800,600);
//cke();
}
void gameobject::renderShadowCalc(camera cam, shader *shadowCalc){
shadowCalc->use();
setUniform(cam.proj, shdProjId);
if(!spaceAct) setUniform(cam.view, shdViewId);
else{
glm::quat corrRot=cam.rotation*glm::angleAxis(glm::radians(90.f), glm::vec3(1.f, 0.f, 0.f) * cam.rotation);
setUniform(glm::toMat4(corrRot), shdViewId);
}
glBindBuffer(GL_ARRAY_BUFFER, vao);
glBindVertexArray(vao);
setUniform(
toCameraWorldSpace(scaleMatrix, rotationMatrix, positionMatrix, cam.pos, distmult),
shdTrnsId);
// draw
glDrawElementsBaseVertex(GL_TRIANGLES, element_number, GL_UNSIGNED_INT, 0, 0);
glBindVertexArray(0);
}
void gameobject::updateMatrix(camera cam){
double clipPlane = 100; //temporary hack
// vector Raw
glm::vec4 vr = spacePos.toFloatSpace(clipPlane, cam.spacePos);
positionMatrix = glm::translate(glm::mat4(1.0),glm::vec3(vr));
scaleMatrix = glm::scale(glm::mat4(1.0), glm::vec3(glm::sqrt(vr.w)));
}