twn_fog.c: fog added!
This commit is contained in:
parent
edc6fb1e5c
commit
ad0438849e
@ -105,6 +105,7 @@ set(TWN_SOURCE_FILES
|
||||
src/rendering/twn_triangles.c
|
||||
src/rendering/twn_circles.c
|
||||
src/rendering/twn_skybox.c
|
||||
src/rendering/twn_fog.c
|
||||
|
||||
# for dynamic load based solution main is compiled in a separate target
|
||||
$<$<NOT:$<BOOL:${TWN_FEATURE_DYNLIB_GAME}>>:src/twn_main.c
|
||||
|
@ -85,6 +85,7 @@ static void ingame_tick(State *state) {
|
||||
}
|
||||
|
||||
push_skybox("/assets/miramar/miramar_*.tga");
|
||||
push_fog(0.9, 1.0, 0.05, (Color){ 140, 147, 160, 255 });
|
||||
}
|
||||
|
||||
|
||||
|
@ -76,4 +76,6 @@ TWN_API void set_camera(const Camera *camera);
|
||||
/* expects '*' masks that will be expanded to 6 names: 'up', 'down', 'east', 'west', 'north' and 'south' */
|
||||
TWN_API void push_skybox(const char *paths);
|
||||
|
||||
TWN_API void push_fog(float start, float end, float density, Color color);
|
||||
|
||||
#endif
|
||||
|
34
src/rendering/twn_fog.c
Normal file
34
src/rendering/twn_fog.c
Normal file
@ -0,0 +1,34 @@
|
||||
#include "twn_rendering.h"
|
||||
#include "twn_rendering_c.h"
|
||||
#include "twn_util.h"
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
static float start_cache, end_cache, density_cache;
|
||||
static Color color_cache;
|
||||
static bool fog_used = false;
|
||||
|
||||
|
||||
void push_fog(float start, float end, float density, Color color) {
|
||||
start_cache = start;
|
||||
end_cache = end;
|
||||
density_cache = density;
|
||||
color_cache = color;
|
||||
fog_used = true;
|
||||
}
|
||||
|
||||
|
||||
void apply_fog(void) {
|
||||
if (!fog_used)
|
||||
return;
|
||||
|
||||
finally_apply_fog(start_cache, end_cache, density_cache, color_cache);
|
||||
}
|
||||
|
||||
|
||||
void pop_fog(void) {
|
||||
if (!fog_used)
|
||||
return;
|
||||
|
||||
finally_pop_fog();
|
||||
}
|
@ -666,3 +666,30 @@ void finally_render_skybox(char *paths) {
|
||||
|
||||
glCallList(list);
|
||||
}
|
||||
|
||||
|
||||
void finally_apply_fog(float start, float end, float density, Color color) {
|
||||
if (density < 0.0f || density > 1.0f)
|
||||
log_warn("Invalid fog density given, should be in range [0..1]");
|
||||
|
||||
/* TODO: cache it for constant parameters, which is a common case */
|
||||
|
||||
glEnable(GL_FOG);
|
||||
|
||||
glFogf(GL_FOG_DENSITY, density);
|
||||
glFogf(GL_FOG_START, start);
|
||||
glFogf(GL_FOG_END, end);
|
||||
|
||||
float color_conv[4];
|
||||
color_conv[0] = (float)color.r / UINT8_MAX;
|
||||
color_conv[1] = (float)color.g / UINT8_MAX;
|
||||
color_conv[2] = (float)color.b / UINT8_MAX;
|
||||
color_conv[3] = (float)color.a / UINT8_MAX;
|
||||
|
||||
glFogfv(GL_FOG_COLOR, color_conv);
|
||||
}
|
||||
|
||||
|
||||
void finally_pop_fog(void) {
|
||||
glDisable(GL_FOG);
|
||||
}
|
||||
|
@ -93,11 +93,14 @@ static void render_space(void) {
|
||||
return;
|
||||
|
||||
use_space_pipeline();
|
||||
apply_fog();
|
||||
|
||||
for (size_t i = 0; i < hmlenu(ctx.uncolored_mesh_batches); ++i) {
|
||||
draw_uncolored_space_traingle_batch(&ctx.uncolored_mesh_batches[i].value,
|
||||
ctx.uncolored_mesh_batches[i].key);
|
||||
}
|
||||
|
||||
pop_fog();
|
||||
}
|
||||
|
||||
|
||||
|
@ -225,4 +225,12 @@ void render_skybox(void);
|
||||
|
||||
void finally_render_skybox(char *paths_in_use);
|
||||
|
||||
void apply_fog(void);
|
||||
|
||||
void finally_apply_fog(float start, float end, float density, Color color);
|
||||
|
||||
void pop_fog(void);
|
||||
|
||||
void finally_pop_fog(void);
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user