-Subproject commit c4d3a0bff0c158ad0efee031a531eb920d904d14
+Subproject commit b3c245ba9b111462f2fff6178b08b486cd553f1b
out vec4 outColor;
-uniform float daylight;
-uniform vec3 lightDir;
+uniform vec3 fogColor;
uniform vec3 cameraPos;
uniform sampler2D textures[MAX_TEXTURE_UNITS];
void main()
{
- vec3 lightColor = vec3(1.0);
- vec3 fogColor = mix(vec3(0x03, 0x0A, 0x1A), vec3(0x87, 0xCE, 0xEB), daylight) / vec3(0xFF);
-
- float ambientStrength = mix(0.3, 0.7, daylight);
-
- vec3 ambient = ambientStrength * lightColor;
- vec3 diffuse = 0.3 * daylight * clamp(dot(normalize(fragmentNormal), normalize(lightDir)), 0.0, 1.0) * lightColor;
-
- vec3 light = ambient + diffuse;
-
- outColor = texture(textures[int(fragmentTextureIndex + 0.5)], fragmentTextureCoords) * vec4(fragmentColor, 1.0) * vec4(light, 1.0);
- outColor.rgb = mix(outColor.rgb, ambientStrength * fogColor, clamp(length(fragmentPosition - cameraPos) / 255.0, 0.0, 1.0));
+ outColor = texture(textures[int(fragmentTextureIndex + 0.5)], fragmentTextureCoords) * vec4(fragmentColor, 1.0);
+ outColor.rgb = mix(outColor.rgb, fogColor, clamp(length(fragmentPosition - cameraPos) / 255.0, 0.0, 1.0));
if (outColor.a == 0.0)
discard;
uniform mat4 model;
uniform mat4 VP;
+uniform float daylight;
+uniform float ambientLight;
+uniform vec3 lightDir;
void main()
{
fragmentTextureIndex = vertexTextureIndex;
fragmentTextureCoords = vertexTextureCoords;
fragmentColor = vertexColor;
+
+ float diffuseLight = 0.3 * daylight * clamp(dot(normalize(fragmentNormal), normalize(lightDir)), 0.0, 1.0);
+ float light = ambientLight + diffuseLight;
+
+ fragmentColor *= light;
}
scene.loc_model = glGetUniformLocation(scene.prog, "model");
scene.loc_VP = glGetUniformLocation(scene.prog, "VP");
scene.loc_daylight = glGetUniformLocation(scene.prog, "daylight");
+ scene.loc_fogColor = glGetUniformLocation(scene.prog, "fogColor");
+ scene.loc_ambientLight = glGetUniformLocation(scene.prog, "ambientLight");
scene.loc_lightDir = glGetUniformLocation(scene.prog, "lightDir");
scene.loc_cameraPos = glGetUniformLocation(scene.prog, "cameraPos");
frustum_update(scene.VP);
+ 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);
+
glUseProgram(scene.prog);
glUniformMatrix4fv(scene.loc_VP, 1, GL_FALSE, scene.VP[0]);
glUniform3f(scene.loc_lightDir, sunlight_dir[0], sunlight_dir[1], sunlight_dir[2]);
glUniform3f(scene.loc_cameraPos, camera.eye[0], camera.eye[1], camera.eye[2]);
- glUniform1f(scene.loc_daylight, get_daylight());
+ glUniform1f(scene.loc_daylight, daylight);
+ glUniform3f(scene.loc_fogColor, fog_color.x / 0xFF * ambient_light, fog_color.y / 0xFF * ambient_light, fog_color.z / 0xFF * ambient_light);
+ glUniform1f(scene.loc_ambientLight, ambient_light);
for (ListPair **pairptr = &scene.objects.first; *pairptr != NULL; ) {
ListPair *pair = *pairptr;
GLint loc_model;
GLint loc_VP;
GLint loc_daylight;
+ GLint loc_fogColor;
+ GLint loc_ambientLight;
GLint loc_lightDir;
GLint loc_cameraPos;
GLint max_texture_units;
return false;
}
-static f64 mix(f64 a, f64 b, f64 f)
-{
- return (a * (1.0 - f) + b * f);
-}
-
static inline f64 min(f64 a, f64 b)
{
return a < b ? a : b;
{
switch (get_ocean_level(factor)) {
case OL_BEACH_EDGE:
- return mix(height + 1, 0, pow(get_ocean_level_factor(factor, OL_BEACH_EDGE), 0.8));
+ return f64_mix(height + 1, 0, pow(get_ocean_level_factor(factor, OL_BEACH_EDGE), 0.8));
case OL_BEACH:
return 0;
case OL_OCEAN:
- return mix(0, -10, pow(get_ocean_level_factor(factor, OL_OCEAN), 0.5));
+ return f64_mix(0, -10, pow(get_ocean_level_factor(factor, OL_OCEAN), 0.5));
case OL_DEEP_OCEAN:
- return mix(-10, -50, pow(get_ocean_level_factor(factor, OL_DEEP_OCEAN), 0.5));
+ return f64_mix(-10, -50, pow(get_ocean_level_factor(factor, OL_DEEP_OCEAN), 0.5));
default:
break;
free(ctx);
}
-static inline f32 mix(f32 x, f32 y, f32 t)
-{
- return (1.0 - t) * x + t * y;
-}
-
static void move_value(f32 *x, f32 v, f32 range)
{
f32 dst = v >= 0 ? range : 0;
v = fabs(v);
- *x = mix(*x, dst, v);
+ *x = f32_mix(*x, dst, v);
}
void voxelctx_hue(Voxelctx *ctx, f32 value)
for (int i = 0; i < 3; i++) {
f32 f = trunc(
- + mix(corners[0][i], corners[4][i], (f32) x / (f32) max_len / 2.0f)
- + mix(corners[0][i], corners[2][i], (f32) y / (f32) max_len / 2.0f)
- + mix(corners[0][i], corners[1][i], (f32) z / (f32) max_len / 2.0f));
+ + f32_mix(corners[0][i], corners[4][i], (f32) x / (f32) max_len / 2.0f)
+ + f32_mix(corners[0][i], corners[2][i], (f32) y / (f32) max_len / 2.0f)
+ + f32_mix(corners[0][i], corners[1][i], (f32) z / (f32) max_len / 2.0f));
v[i] = floor(VOXELCTXSTATE(ctx).pos[i] + f + 0.5f);
}