#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;
};
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)
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,
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)
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);
}