#include "common.h"
#include "model.h"
+#include "camera.h"
#include "shaders/blit.h"
#include "shaders/blitblur.h"
#include "shaders/standard.h"
#include "shaders/vblend.h"
-VG_STATIC void render_water_texture( m4x3f camera );
-VG_STATIC void render_water_surface( m4x4f pv, m4x3f camera );
-VG_STATIC void render_world( m4x4f projection, m4x3f camera );
+VG_STATIC void render_water_texture( camera *cam );
+VG_STATIC void render_water_surface( camera *cam );
+VG_STATIC void render_world( camera *cam );
VG_STATIC void shader_link_standard_ub( GLuint shader, int texture_id );
-VG_STATIC void render_world_depth( m4x4f projection, m4x3f camera );
+VG_STATIC void render_world_depth( camera *cam );
#ifndef RENDER_H
#define RENDER_H
int allocated;
};
+/*
+ * All standard buffers used in rendering
+ */
VG_STATIC struct pipeline
{
+#if 0
float fov;
+#endif
glmesh fsquad;
GLuint fb_background,
- rgb_background;
+ rgb_background,
+ mv_background,
+ rb_background;
/* STD140 */
struct ub_world_lighting
}
};
-/*
- * Matrix Projections
- */
-/*
- * http://www.terathon.com/lengyel/Lengyel-Oblique.pdf
- */
-VG_STATIC void plane_clip_projection( m4x4f mat, v4f plane )
-{
- v4f c =
- {
- (vg_signf(plane[0]) + mat[2][0]) / mat[0][0],
- (vg_signf(plane[1]) + mat[2][1]) / mat[1][1],
- -1.0f,
- (1.0f + mat[2][2]) / mat[3][2]
- };
-
- v4_muls( plane, 2.0f / v4_dot(plane,c), c );
-
- mat[0][2] = c[0];
- mat[1][2] = c[1];
- mat[2][2] = c[2] + 1.0f;
- mat[3][2] = c[3];
-}
-
-VG_STATIC void pipeline_projection( m4x4f mat, float nearz, float farz )
-{
- m4x4_projection( mat,
- gpipeline.fov,
- (float)vg.window_x / (float)vg.window_y,
- nearz, farz );
-}
-
/*
* Shaders
*/
{
if( !fb )
{
- glBindFramebuffer( GL_FRAMEBUFFER, 0 );
+ glBindFramebuffer( GL_FRAMEBUFFER, gpipeline.fb_background );
glViewport( 0, 0, vg.window_x, vg.window_y );
}
else
glBindTexture( GL_TEXTURE_2D, gpipeline.rgb_background );
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, vg.window_x, vg.window_y, 0,
GL_RGB, GL_UNSIGNED_BYTE, NULL );
+
+ /* FIXME: Resizeother textures and rb */
}
}
-/* used for drawing player onto */
VG_STATIC void render_init_temp_buffer(void)
{
- vg_info( "[render] Allocate temporary framebuffer\n" );
+ vg_info( "[render] Allocate framebuffer\n" );
glGenFramebuffers( 1, &gpipeline.fb_background );
glBindFramebuffer( GL_FRAMEBUFFER, gpipeline.fb_background );
glGenTextures( 1, &gpipeline.rgb_background );
glBindTexture( GL_TEXTURE_2D, gpipeline.rgb_background );
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, vg.window_x, vg.window_y,
- 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
-
+ 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D,
- gpipeline.rgb_background, 0);
+ gpipeline.rgb_background, 0 );
+ glGenTextures( 1, &gpipeline.mv_background );
+ glBindTexture( GL_TEXTURE_2D, gpipeline.mv_background );
+#if 0
+ glTexImage2D( GL_TEXTURE_2D, 0, GL_RG, vg.window_x, vg.window_y,
+ 0, GL_RG, GL_FLOAT, NULL);
+#endif
+ glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA16F, vg.window_x, vg.window_y,
+ 0, GL_RGBA, GL_FLOAT, NULL);
+
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
+ glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1,
+ GL_TEXTURE_2D,
+ gpipeline.mv_background, 0 );
+
+ /* render buffer */
+ glGenRenderbuffers( 1, &gpipeline.rb_background );
+ glBindRenderbuffer( GL_RENDERBUFFER, gpipeline.rb_background );
+ glRenderbufferStorage( GL_RENDERBUFFER, GL_DEPTH24_STENCIL8,
+ vg.window_x, vg.window_y );
+ glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
+ GL_RENDERBUFFER, gpipeline.rb_background );
+
+ GLuint attachments[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1 };
+ glDrawBuffers( 2, attachments );
+
+ GLenum result = glCheckFramebufferStatus( GL_FRAMEBUFFER );
+
+ if( result != GL_FRAMEBUFFER_COMPLETE )
+ {
+ if( result == GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT )
+ vg_fatal_exit_loop( "Main RT: Incomplete attachment" );
+ else if( result == GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT )
+ vg_fatal_exit_loop( "Main RT: Missing attachment" );
+ else if( result == GL_FRAMEBUFFER_UNSUPPORTED )
+ vg_fatal_exit_loop( "Main RT: Unsupported framebuffer format" );
+ else
+ vg_fatal_exit_loop( "Main RT: Generic Error" );
+ }
+
+ glBindFramebuffer( GL_FRAMEBUFFER, 0 );
VG_CHECK_GL_ERR();
}