aboutsummaryrefslogtreecommitdiff
path: root/07-july/src/renderer/renderer.c
diff options
context:
space:
mode:
authorThomas Guillermo Albers Raviola <thomas@thomaslabs.org>2026-01-16 23:02:32 +0100
committerThomas Guillermo Albers Raviola <thomas@thomaslabs.org>2026-01-16 23:02:32 +0100
commit6b8af9cf83851c075c6c9514b1deaa931c2b19a4 (patch)
tree428986b49c32e21d3f7a3c2dfa41858ae0153209 /07-july/src/renderer/renderer.c
Initial commit
Diffstat (limited to '07-july/src/renderer/renderer.c')
-rw-r--r--07-july/src/renderer/renderer.c98
1 files changed, 98 insertions, 0 deletions
diff --git a/07-july/src/renderer/renderer.c b/07-july/src/renderer/renderer.c
new file mode 100644
index 0000000..5b8638c
--- /dev/null
+++ b/07-july/src/renderer/renderer.c
@@ -0,0 +1,98 @@
+#include "renderer.h"
+#include <string.h>
+
+static const int MAX_LIGHTS = 4;
+
+void Render_Init()
+{
+
+}
+
+void Render_LoadLights(Shader_Layout *layout, light_t *lights, int n)
+{
+ vec3_t light_positions[MAX_LIGHTS];
+ color_t light_colors[MAX_LIGHTS];
+ vec3_t attenuation[MAX_LIGHTS];
+
+ light_t defaultLight = { {0.0f, 0.0f, 0.0f}, {0.0f, 0.0f, 0.0f, 0.0f}, {1.0f, 0.0f, 0.0f} };
+
+ int i;
+ for(i = 0; i < MAX_LIGHTS; i++)
+ {
+ if(i < MAX_LIGHTS)
+ {
+ light_positions[i] = lights[i].position;
+ light_colors[i] = lights[i].color;
+ attenuation[i] = lights[i].attenuation;
+ }
+ else
+ {
+ light_positions[i] = defaultLight.position;
+ light_colors[i] = defaultLight.color;
+ attenuation[i] = defaultLight.attenuation;
+ }
+
+ }
+
+ glUniform3fv(layout->lightPosition, MAX_LIGHTS, (float*)light_positions);
+ glUniform4fv(layout->lightColor, MAX_LIGHTS, (float*)light_colors);
+ glUniform3fv(layout->lightAttenuation, MAX_LIGHTS, (float*)attenuation);
+
+}
+
+void Render_DrawEntity(Shader_Layout *layout, mat4_t *projectedViewMatrix, entity_t *entity)
+{
+ glBindVertexArray(entity->shape->vao);
+
+ /*We need the model to world matrix in our shader in order to rotate the normals*/
+ mat4_t modelTransform = Entity_GetModelTransform(entity);
+ glUniformMatrix4fv(layout->modelToWorld, 1, GL_FALSE, modelTransform.data);
+
+ mat4_t totalMatrix = mat4_mul(projectedViewMatrix, &modelTransform);
+ glUniformMatrix4fv(layout->totalTransform, 1, GL_FALSE, totalMatrix.data);
+
+ glActiveTexture(GL_TEXTURE0);
+ glUniform1i(layout->Texture, 0);
+ Texture_Bind(entity->texture);
+
+ glDrawElements(GL_TRIANGLES, entity->shape->num_indices, GL_UNSIGNED_SHORT, NULL);
+ glBindVertexArray(0);
+}
+
+void Render_DrawTerrain(Shader_Layout *layout, mat4_t *projectedViewMatrix, terrain_t *terrain)
+{
+ glBindVertexArray(terrain->shape->vao);
+
+ /* We need the model to world matrix in our shader in order to rotate the normals */
+ mat4_t modelTransform = mat4_translate(&terrain->position);
+ glUniformMatrix4fv(layout->modelToWorld, 1, GL_FALSE, modelTransform.data);
+
+ mat4_t totalMatrix = mat4_mul(projectedViewMatrix, &modelTransform);
+ glUniformMatrix4fv(layout->totalTransform, 1, GL_FALSE, totalMatrix.data);
+
+ glUniform1i(layout->Texture_Background, 0);
+ glUniform1i(layout->Texture_R, 1);
+ glUniform1i(layout->Texture_G, 2);
+ glUniform1i(layout->Texture_B, 3);
+ glUniform1i(layout->Texture_BlendMap, 4);
+
+ glActiveTexture(GL_TEXTURE0);
+ Texture_Bind(terrain->textures.texture[0]);
+ glActiveTexture(GL_TEXTURE1);
+ Texture_Bind(terrain->textures.texture[1]);
+ glActiveTexture(GL_TEXTURE2);
+ Texture_Bind(terrain->textures.texture[2]);
+ glActiveTexture(GL_TEXTURE3);
+ Texture_Bind(terrain->textures.texture[3]);
+ glActiveTexture(GL_TEXTURE4);
+ Texture_Bind(terrain->blendmap);
+
+ glDrawElements(GL_TRIANGLES, terrain->shape->num_indices, GL_UNSIGNED_SHORT, NULL);
+
+ glBindVertexArray(0);
+}
+
+void Render_Quit()
+{
+
+}