CHGICKEN
[carveJwlIkooP6JGAAIwe30JlM.git] / render.h
1 #ifndef RENDER_H
2 #define RENDER_H
3 #define VG_3D
4 #include "vg/vg.h"
5
6 static struct pipeline
7 {
8 float fov;
9 }
10 gpipeline;
11
12 static void render_water_texture( m4x3f camera );
13 static void render_water_surface( m4x4f pv );
14 static void render_world( m4x4f projection, m4x3f camera );
15
16 /*
17 * http://www.terathon.com/lengyel/Lengyel-Oblique.pdf
18 */
19 static void plane_clip_projection( m4x4f mat, v4f plane )
20 {
21 v4f c =
22 {
23 (vg_signf(plane[0]) + mat[2][0]) / mat[0][0],
24 (vg_signf(plane[1]) + mat[2][1]) / mat[1][1],
25 -1.0f,
26 (1.0f + mat[2][2]) / mat[3][2]
27 };
28
29 v4_muls( plane, 2.0f / v4_dot(plane,c), c );
30
31 mat[0][2] = c[0];
32 mat[1][2] = c[1];
33 mat[2][2] = c[2] + 1.0f;
34 mat[3][2] = c[3];
35 }
36
37 static void pipeline_projection( m4x4f mat, float nearz, float farz )
38 {
39 m4x4_projection( mat,
40 gpipeline.fov,
41 (float)vg_window_x / (float)vg_window_y,
42 nearz, farz );
43 }
44
45 static void create_renderbuffer_std( GLuint *fb, GLuint *rgb, GLuint *rb )
46 {
47 glGenFramebuffers( 1, fb );
48 glBindFramebuffer( GL_FRAMEBUFFER, *fb );
49
50 glGenTextures( 1, rgb );
51 glBindTexture( GL_TEXTURE_2D, *rgb );
52 glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, vg_window_x, vg_window_y,
53 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
54
55 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
56 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
57 glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
58 GL_TEXTURE_2D, *rgb, 0);
59
60 /* TODO: Check for DEPTH32f availiblity and use if possible */
61
62 glGenRenderbuffers( 1, rb );
63 glBindRenderbuffer( GL_RENDERBUFFER, *rb );
64 glRenderbufferStorage( GL_RENDERBUFFER, GL_DEPTH24_STENCIL8,
65 vg_window_x, vg_window_y );
66
67 glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
68 GL_RENDERBUFFER, *rb );
69 }
70
71 static void resize_renderbuffer_std( GLuint *fb, GLuint *rgb, GLuint *rb )
72 {
73 glBindTexture( GL_TEXTURE_2D, *rgb );
74 glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, vg_window_x, vg_window_y, 0,
75 GL_RGB, GL_UNSIGNED_BYTE, NULL );
76
77 glBindRenderbuffer( GL_RENDERBUFFER, *rb );
78 glRenderbufferStorage( GL_RENDERBUFFER, GL_DEPTH24_STENCIL8,
79 vg_window_x, vg_window_y );
80 }
81
82 #endif /* RENDER_H */