]> git.lizzy.rs Git - dragonblocks_alpha.git/blobdiff - src/client/terrain_gfx.c
You can now see other players
[dragonblocks_alpha.git] / src / client / terrain_gfx.c
index 38c7799e2c4a1d0a495b7e2f65e0b75c32d4f8f4..a8552215640e95afdf0d467eb7e479b4d7cbeb96 100644 (file)
@@ -2,15 +2,15 @@
 #include <linmath.h/linmath.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include "client/camera.h"
 #include "client/client_config.h"
 #include "client/client_node.h"
 #include "client/client_terrain.h"
 #include "client/cube.h"
 #include "client/frustum.h"
+#include "client/gl_debug.h"
+#include "client/light.h"
 #include "client/shader.h"
 #include "client/terrain_gfx.h"
-#include "day.h"
 
 typedef struct {
        bool visible;
@@ -51,14 +51,9 @@ static v3f32 center_offset = {
 };
 
 static GLuint shader_prog;
-static GLint loc_model;
 static GLint loc_VP;
-static GLint loc_daylight;
-static GLint loc_fogColor;
-static GLint loc_ambientLight;
-static GLint loc_lightDir;
-static GLint loc_cameraPos;
 
+static LightShader light_shader;
 static ModelShader model_shader;
 
 static inline bool cull_face(NodeType self, NodeType nbr)
@@ -202,7 +197,7 @@ static Model *create_chunk_model(TerrainChunk *chunk, bool animate)
 bool terrain_gfx_init()
 {
        GLint texture_units;
-       glGetIntegerv(GL_MAX_TEXTURE_UNITS, &texture_units);
+       glGetIntegerv(GL_MAX_TEXTURE_UNITS, &texture_units); GL_DEBUG
 
        char *shader_defs;
        asprintf(&shader_defs,
@@ -212,58 +207,39 @@ bool terrain_gfx_init()
                client_config.view_distance
        );
 
-       if (!shader_program_create(RESSOURCE_PATH "shaders/terrain", &shader_prog, shader_defs)) {
+       if (!shader_program_create(RESSOURCE_PATH "shaders/3d/terrain", &shader_prog, shader_defs)) {
                fprintf(stderr, "[error] failed to create terrain shader program\n");
                return false;
        }
 
        free(shader_defs);
 
-       loc_model = glGetUniformLocation(shader_prog, "model");
-       loc_VP = glGetUniformLocation(shader_prog, "VP");
-       loc_daylight = glGetUniformLocation(shader_prog, "daylight");
-       loc_fogColor = glGetUniformLocation(shader_prog, "fogColor");
-       loc_ambientLight = glGetUniformLocation(shader_prog, "ambientLight");
-       loc_lightDir = glGetUniformLocation(shader_prog, "lightDir");
-       loc_cameraPos = glGetUniformLocation(shader_prog, "cameraPos");
+       loc_VP = glGetUniformLocation(shader_prog, "VP"); GL_DEBUG
 
        GLint texture_indices[texture_units];
        for (GLint i = 0; i < texture_units; i++)
                texture_indices[i] = i;
 
-       glProgramUniform1iv(shader_prog, glGetUniformLocation(shader_prog, "textures"), texture_units, texture_indices);
+       glProgramUniform1iv(shader_prog, glGetUniformLocation(shader_prog, "textures"), texture_units, texture_indices); GL_DEBUG
 
        model_shader.prog = shader_prog;
-       model_shader.loc_transform = loc_model;
+       model_shader.loc_transform = glGetUniformLocation(shader_prog, "model"); GL_DEBUG
+
+       light_shader.prog = shader_prog;
+       light_shader_locate(&light_shader);
 
        return true;
 }
 
 void terrain_gfx_deinit()
 {
-       glDeleteProgram(shader_prog);
+       glDeleteProgram(shader_prog); GL_DEBUG
 }
 
 void terrain_gfx_update()
 {
-       vec4 base_sunlight_dir = {0.0f, 0.0f, -1.0f, 1.0f};
-       vec4 sunlight_dir;
-       mat4x4 sunlight_mat;
-       mat4x4_identity(sunlight_mat);
-
-       mat4x4_rotate(sunlight_mat, sunlight_mat, 1.0f, 0.0f, 0.0f, get_sun_angle() + M_PI / 2.0f);
-       mat4x4_mul_vec4(sunlight_dir, sunlight_mat, base_sunlight_dir);
-
-       f32 daylight = get_daylight();
-       f32 ambient_light = f32_mix(0.3f, 0.7f, daylight);
-       v3f32 fog_color = v3f32_mix((v3f32) {0x03, 0x0A, 0x1A}, (v3f32) {0x87, 0xCE, 0xEB}, daylight);
-
-       glProgramUniformMatrix4fv(shader_prog, loc_VP, 1, GL_FALSE, frustum[0]);
-       glProgramUniform3f(shader_prog, loc_lightDir, sunlight_dir[0], sunlight_dir[1], sunlight_dir[2]);
-       glProgramUniform3f(shader_prog, loc_cameraPos, camera.eye[0], camera.eye[1], camera.eye[2]);
-       glProgramUniform1f(shader_prog, loc_daylight, daylight);
-       glProgramUniform3f(shader_prog, loc_fogColor, fog_color.x / 0xFF * ambient_light, fog_color.y / 0xFF * ambient_light, fog_color.z / 0xFF * ambient_light);
-       glProgramUniform1f(shader_prog, loc_ambientLight, ambient_light);
+       glProgramUniformMatrix4fv(shader_prog, loc_VP, 1, GL_FALSE, frustum[0]); GL_DEBUG
+       light_shader_update(&light_shader);
 }
 
 void terrain_gfx_make_chunk_model(TerrainChunk *chunk)
@@ -288,13 +264,12 @@ void terrain_gfx_make_chunk_model(TerrainChunk *chunk)
                        model_node_transform(model->root);
                }
 
+               meta->model->replace = model;
                meta->model->flags.delete = 1;
+       } else if (model) {
+               model_scene_add(model);
        }
 
        meta->model = model;
-
-       if (model)
-               model_scene_add(model);
-
        pthread_mutex_unlock(&chunk->mtx);
 }