17 #include <GameObject.h> 18 #include <ShaderProgram.h> 19 #include <SFML/System/Clock.hpp> 20 #include "StandardRenderer.h" 22 #include "ShaderProgram.h" 23 #include "objects/Chunk.h" 25 #define NORMAL_TEXTURE_LOCATION 3 26 #define DIFFUSE_TEXTURE_LOCATION 0 28 StandardRenderer::StandardRenderer(){
33 mesh(mesh), gameObject(gameObject)
35 this->shaderProgram = shaderProgram;
39 void StandardRenderer::update(
float dt){
43 void StandardRenderer::render() {
47 chag::float4x4 modelMatrix = gameObject->getModelMatrix();
49 chag::float4x4 normalMatrix = chag::inverse(chag::transpose(modelMatrix));
50 shaderProgram->setUniformMatrix4fv(
"modelMatrix", modelMatrix);
51 shaderProgram->setUniformMatrix4fv(
"normalMatrix", normalMatrix);
53 for (
size_t i = 0; i < mesh->getChunks()->size(); i++) {
56 Chunk &chunk = (*mesh->getChunks())[i];
57 Material &material = (*mesh->getMaterials())[chunk.materialIndex];
59 if (material.diffuseTexture != NULL) {
60 shaderProgram->setUniform1i(
"diffuse_texture", DIFFUSE_TEXTURE_LOCATION);
61 material.diffuseTexture->bind(GL_TEXTURE0);
63 if (material.bumpMapTexture != NULL) {
64 shaderProgram->setUniform1i(
"normal_texture", NORMAL_TEXTURE_LOCATION);
65 material.bumpMapTexture->bind(GL_TEXTURE3);
68 if(mesh->hasAnimations()) {
69 float currentTimeInSeconds = clock.getElapsedTime().asSeconds();
70 std::vector<chag::float4x4> boneTransforms = mesh->getBoneTransforms(currentTimeInSeconds);
71 shaderProgram->setUniform1i(
"has_animations", 1);
73 for (
unsigned int j = 0; j < boneTransforms.size(); j++) {
74 shaderProgram->setUniformMatrix4fv(
"bones[" + std::to_string(j) +
"]", boneTransforms[j]);
77 shaderProgram->setUniform1i(
"has_animations", 0);
80 shaderProgram->setUniform1i(
"has_diffuse_texture", material.diffuseTexture != NULL);
81 shaderProgram->setUniform3f(
"material_diffuse_color", material.diffuseColor);
82 shaderProgram->setUniform3f(
"material_diffuse_color", chag::make_vector(0.5f, 0.5f, 0.5f));
83 shaderProgram->setUniform3f(
"material_specular_color", material.specularColor);
84 shaderProgram->setUniform3f(
"material_ambient_color", material.ambientColor);
85 shaderProgram->setUniform3f(
"material_emissive_color", material.emissiveColor);
86 shaderProgram->setUniform1i(
"has_normal_texture", material.bumpMapTexture != NULL);
87 shaderProgram->setUniform1f(
"material_shininess", material.specularExponent);
90 glBindVertexArray(chunk.m_vaob);
91 glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, chunk.m_ind_bo);
93 glDrawElements(GL_TRIANGLES, chunk.m_indices.size(), GL_UNSIGNED_INT, 0);
99 void StandardRenderer::renderShadow(
ShaderProgram *shaderProgram) {
101 chag::float4x4 modelMatrix = gameObject->getModelMatrix();
102 shaderProgram->setUniformMatrix4fv(
"modelMatrix", modelMatrix);
104 for (
size_t i = 0; i < mesh->getChunks()->size(); i++) {
107 Chunk &chunk = (*mesh->getChunks())[i];
109 glBindVertexArray(chunk.m_vaob);
110 glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, chunk.m_ind_bo);
112 glDrawElements(GL_TRIANGLES, chunk.m_indices.size(), GL_UNSIGNED_INT, 0);
Class for maintaining OpenGL shader programs.
A class for containing all information about a object in the game world.