11#include "map_overlay.h"
17#include "nlua_canvas.h"
23#include "nlua_shader.h"
30typedef struct PPShader_s {
37 GLint ClipSpaceFromLocal;
41 GLint love_ScreenSize;
49static unsigned int pp_shaders_id = 0;
50static PPShader *pp_shaders_list[PP_LAYER_MAX];
53static int pp_gamma_correction = 0;
58static void render_fbo(
double dt, GLuint fbo, GLuint tex,
PPShader *shader )
61 glBlendFuncSeparate( GL_ONE, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA );
63 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
65 glUseProgram( shader->program );
68 if (shader->love_ScreenSize >= 0)
70 glUniform4f( shader->love_ScreenSize, SCREEN_W, SCREEN_H, 1., 0. );
73 if (shader->u_time >= 0) {
75 glUniform1f( shader->u_time, shader->dt );
79 glEnableVertexAttribArray( shader->VertexPosition );
81 if (shader->VertexTexCoord >= 0) {
82 glEnableVertexAttribArray( shader->VertexTexCoord );
87 glBindTexture( GL_TEXTURE_2D, tex );
88 glUniform1i( shader->MainTex, 0 );
89 for (
int i=0; i<
array_size(shader->tex); i++) {
91 glActiveTexture( t->active );
92 glBindTexture( GL_TEXTURE_2D, t->texid );
93 glUniform1i( t->uniform, t->value );
95 glActiveTexture( GL_TEXTURE0 );
99 gl_uniformMat4(shader->ClipSpaceFromLocal, &ortho);
102 glDrawArrays( GL_TRIANGLE_STRIP, 0, 4 );
105 glDisableVertexAttribArray( shader->VertexPosition );
106 if (shader->VertexTexCoord >= 0)
107 glDisableVertexAttribArray( shader->VertexTexCoord );
111 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
117static void render_fbo_list(
double dt,
PPShader *list,
int *current,
int done )
177 int pp_core, pp_final, pp_gui, pp_game;
181 pp_game = (
array_size(pp_shaders_list[PP_LAYER_GAME]) > 0);
182 pp_gui = (
array_size(pp_shaders_list[PP_LAYER_GUI]) > 0);
183 pp_final = (
array_size(pp_shaders_list[PP_LAYER_FINAL]) > 0);
184 pp_core = (
array_size(pp_shaders_list[PP_LAYER_CORE]) > 0);
187 if (pp_game || pp_gui || pp_final || pp_core) {
189 glBindFramebuffer(GL_FRAMEBUFFER, 0);
190 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
194 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
204 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
236 render_fbo_list( dt, pp_shaders_list[PP_LAYER_GAME], &cur, !(pp_core || pp_final || pp_gui) );
243 render_fbo_list( dt, pp_shaders_list[PP_LAYER_GUI], &cur, !(pp_core || pp_final) );
258 render_fbo_list( dt, pp_shaders_list[PP_LAYER_FINAL], &cur, !(pp_core) );
265 render_fbo_list( dt, pp_shaders_list[PP_LAYER_CORE], &cur, 1 );
274static int ppshader_compare(
const void *a,
const void *b )
295unsigned int render_postprocessAdd(
LuaShader_t *shader,
int layer,
int priority,
unsigned int flags )
301 if (layer < 0 || layer >= PP_LAYER_MAX) {
302 WARN(_(
"Unknown post-processing shader layer '%d'!"), layer);
305 pp_shaders = &pp_shaders_list[layer];
307 if (*pp_shaders==NULL)
310 id = ++pp_shaders_id;
315 pp->ClipSpaceFromLocal = shader->ClipSpaceFromLocal;
316 pp->MainTex = shader->MainTex;
317 pp->VertexPosition = shader->VertexPosition;
318 pp->VertexTexCoord = shader->VertexTexCoord;
319 if (shader->tex != NULL)
325 pp->love_ScreenSize = glGetUniformLocation( pp->
program,
"love_ScreenSize" );
342int render_postprocessRm(
unsigned int id )
346 for (j=0; j<PP_LAYER_MAX; j++) {
347 PPShader *pp_shaders = pp_shaders_list[j];
348 for (
int i=0; i<
array_size(pp_shaders); i++) {
349 const PPShader *pp = &pp_shaders[i];
365 array_erase( &pp_shaders_list[j], &pp_shaders_list[j][found], &pp_shaders_list[j][found+1] );
372void render_postprocessCleanup (
void)
374 for (
int j=0; j<PP_LAYER_MAX; j++) {
375 PPShader *pp_shaders = pp_shaders_list[j];
376 for (
int i=
array_size(pp_shaders)-1; i>=0; i--) {
377 const PPShader *pp = &pp_shaders[i];
378 if (pp->
flags & PP_SHADER_PERMANENT)
380 array_erase( &pp_shaders_list[j], &pp_shaders_list[j][i], &pp_shaders_list[j][i+1] );
389void render_init (
void)
393 s->program = shaders.gamma_correction.program;
394 s->VertexPosition = shaders.gamma_correction.VertexPosition;
395 s->ClipSpaceFromLocal = shaders.gamma_correction.ClipSpaceFromLocal;
396 s->MainTex = shaders.gamma_correction.MainTex;
405void render_exit (
void)
407 for (
int i=0; i<PP_LAYER_MAX; i++) {
409 pp_shaders_list[i] = NULL;
416void render_setGamma(
double gamma )
418 if (pp_gamma_correction > 0) {
419 render_postprocessRm( pp_gamma_correction );
420 pp_gamma_correction = 0;
424 if (fabs(gamma-1.) < 1e-3)
428 glUseProgram( shaders.gamma_correction.program );
429 glUniform1f( shaders.gamma_correction.gamma, gamma );
431 pp_gamma_correction = render_postprocessAdd( &gamma_correction_shader, PP_LAYER_CORE, 98, PP_SHADER_PERMANENT );
434static int needsReset = 0;
438void render_reset (
void)
444 glBlendEquation( GL_FUNC_ADD );
445 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
453void render_needsReset (
void)
Provides macros to work with dynamic arrays.
#define array_free(ptr_array)
Frees memory allocated and sets array to NULL.
#define array_copy(basic_type, ptr_array)
Returns a shallow copy of the input array.
#define array_erase(ptr_array, first, last)
Erases elements in interval [first, last).
static ALWAYS_INLINE int array_size(const void *array)
Returns number of elements in the array.
#define array_grow(ptr_array)
Increases the number of elements by one and returns the last element.
#define array_create(basic_type)
Creates a new dynamic array of ‘basic_type’.
void gui_renderReticles(double dt)
Renders the gui targeting reticles.
void gui_render(double dt)
Renders the player's GUI.
int hooks_run(const char *stack)
Runs all the hooks of stack.
mat4 mat4_ortho(double left, double right, double bottom, double top, double nearVal, double farVal)
Creates an orthographic projection matrix.
void fps_display(double dt)
Displays FPS on the screen.
Header file with generic functions and naev-specifics.
void gl_defViewport(void)
Resets viewport to default.
void gl_viewport(int x, int y, int w, int h)
Sets the opengl viewport.
void gl_unclipRect(void)
Clears the 2d clipping planes.
void gl_vboActivateAttribOffset(gl_vbo *vbo, GLuint index, GLuint offset, GLint size, GLenum type, GLsizei stride)
Activates a VBO's offset.
void pilots_renderOverlay(void)
Renders all the pilots overlays.
void pilots_render(void)
Renders all the pilots.
void player_render(double dt)
Renders the player.
void player_renderUnderlay(double dt)
Renders the player underlay.
void space_render(const double dt)
Renders the system.
void space_renderOverlay(const double dt)
Renders the system overlay.
void spobs_render(void)
Renders the current systems' spobs.
void spfx_render(int layer, double dt)
Renders the entire spfx layer.
GLuint fbo_tex[OPENGL_NUM_FBOS]
GLuint fbo[OPENGL_NUM_FBOS]
void weapons_render(const WeaponLayer layer, double dt)
Renders all the weapons in a layer.