#include "opengl.h"
#include "demo.h"
#include "part.h"
+#include "post.h"
+#include "sdr.h"
+#include "opt.h"
void reg_whitted(void);
float win_aspect;
long time_msec;
+static int reshape_pending;
+static unsigned int sdr_gamma;
int demo_init(void)
{
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
- glEnable(GL_FRAMEBUFFER_SRGB);
- glEnable(GL_MULTISAMPLE);
+ if(opt.srgb) {
+ glEnable(GL_FRAMEBUFFER_SRGB);
+ }
+ if(opt.msaa) {
+ glEnable(GL_MULTISAMPLE);
+ }
+
+ post_init();
+
+ if(!(sdr_gamma = create_program_load("sdr/gamma.v.glsl", "sdr/gamma.p.glsl"))) {
+ fprintf(stderr, "Warning: failed to load the gamma correction shader\n");
+ }
reg_whitted();
{
int i;
+ if(sdr_gamma) {
+ glDeleteProgram(sdr_gamma);
+ }
+ post_cleanup();
+
for(i=0; i<num_parts; i++) {
parts[i]->destroy();
}
{
long part_time;
+ if(reshape_pending) {
+ post_reshape(win_width, win_height);
+ reshape_pending = 0;
+ }
+
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
if(!cur_part) return;
prev_part = 0;
cur_part->draw(part_time);
}
+
+ /* no-srgb gamma correction fallback */
+ if(!opt.srgb) {
+ glBindTexture(GL_TEXTURE_2D, fbtex[0].id);
+ glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, win_width, win_height);
+
+ glUseProgram(sdr_gamma);
+ overlay_tex(fbtex, 1.0);
+ }
}
void demo_reshape(int x, int y)
{
+ reshape_pending = 1;
+
win_width = x;
win_height = y;
win_aspect = (float)x / (float)y;