stuff
[carveJwlIkooP6JGAAIwe30JlM.git] / render.h
1 #ifndef RENDER_H
2 #define RENDER_H
3
4 #include "common.h"
5 #include "model.h"
6
7 static struct pipeline
8 {
9 float fov;
10 glmesh fsquad;
11
12 GLuint fb_background,
13 rgb_background;
14 }
15 gpipeline;
16
17 struct framebuffer
18 {
19 GLuint fb, colour, rb;
20 int div;
21 GLuint format;
22 };
23
24 static void render_water_texture( m4x3f camera );
25 static void render_water_surface( m4x4f pv, m4x3f camera );
26 static void render_world( m4x4f projection, m4x3f camera );
27
28 /*
29 * http://www.terathon.com/lengyel/Lengyel-Oblique.pdf
30 */
31 static void plane_clip_projection( m4x4f mat, v4f plane )
32 {
33 v4f c =
34 {
35 (vg_signf(plane[0]) + mat[2][0]) / mat[0][0],
36 (vg_signf(plane[1]) + mat[2][1]) / mat[1][1],
37 -1.0f,
38 (1.0f + mat[2][2]) / mat[3][2]
39 };
40
41 v4_muls( plane, 2.0f / v4_dot(plane,c), c );
42
43 mat[0][2] = c[0];
44 mat[1][2] = c[1];
45 mat[2][2] = c[2] + 1.0f;
46 mat[3][2] = c[3];
47 }
48
49 static void pipeline_projection( m4x4f mat, float nearz, float farz )
50 {
51 m4x4_projection( mat,
52 gpipeline.fov,
53 (float)vg_window_x / (float)vg_window_y,
54 nearz, farz );
55 }
56
57 static void fb_use( struct framebuffer *fb )
58 {
59 if( !fb )
60 {
61 glBindFramebuffer( GL_FRAMEBUFFER, 0 );
62 glViewport( 0, 0, vg_window_x, vg_window_y );
63 }
64 else
65 {
66 glBindFramebuffer( GL_FRAMEBUFFER, fb->fb );
67 glViewport( 0, 0, vg_window_x / fb->div, vg_window_y / fb->div );
68 }
69 }
70
71 static void fb_init( struct framebuffer *fb )
72 {
73 i32 ix = vg_window_x / fb->div,
74 iy = vg_window_y / fb->div;
75
76 glGenFramebuffers( 1, &fb->fb );
77 glBindFramebuffer( GL_FRAMEBUFFER, fb->fb );
78
79 glGenTextures( 1, &fb->colour );
80 glBindTexture( GL_TEXTURE_2D, fb->colour );
81 glTexImage2D( GL_TEXTURE_2D, 0, fb->format, ix, iy,
82 0, fb->format, GL_UNSIGNED_BYTE, NULL);
83
84 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
85 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
86 glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
87 GL_TEXTURE_2D, fb->colour, 0);
88
89 glGenRenderbuffers( 1, &fb->rb );
90 glBindRenderbuffer( GL_RENDERBUFFER, fb->rb );
91 glRenderbufferStorage( GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, ix, iy );
92
93 glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
94 GL_RENDERBUFFER, fb->rb );
95 }
96
97 static void fb_bindtex( struct framebuffer *fb, int texture )
98 {
99 glActiveTexture( GL_TEXTURE0 + texture );
100 glBindTexture( GL_TEXTURE_2D, fb->colour );
101 }
102
103 static void fb_resize( struct framebuffer *fb )
104 {
105 i32 ix = vg_window_x / fb->div,
106 iy = vg_window_y / fb->div;
107
108 glBindTexture( GL_TEXTURE_2D, fb->colour );
109 glTexImage2D( GL_TEXTURE_2D, 0, fb->format, ix, iy, 0,
110 fb->format, GL_UNSIGNED_BYTE, NULL );
111
112 glBindRenderbuffer( GL_RENDERBUFFER, fb->rb );
113 glRenderbufferStorage( GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, ix, iy );
114 }
115
116 static void render_fb_resize(void)
117 {
118 glBindTexture( GL_TEXTURE_2D, gpipeline.rgb_background );
119 glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, vg_window_x, vg_window_y, 0,
120 GL_RGB, GL_UNSIGNED_BYTE, NULL );
121 }
122
123 static void render_init(void)
124 {
125 glGenFramebuffers( 1, &gpipeline.fb_background );
126 glBindFramebuffer( GL_FRAMEBUFFER, gpipeline.fb_background );
127
128 glGenTextures( 1, &gpipeline.rgb_background );
129 glBindTexture( GL_TEXTURE_2D, gpipeline.rgb_background );
130 glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, vg_window_x, vg_window_y,
131 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
132
133 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
134 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
135 glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
136 GL_TEXTURE_2D,
137 gpipeline.rgb_background, 0);
138
139 float quad[] = { 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f,
140 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f };
141
142 glGenVertexArrays( 1, &gpipeline.fsquad.vao );
143 glGenBuffers( 1, &gpipeline.fsquad.vbo );
144 glBindVertexArray( gpipeline.fsquad.vao );
145 glBindBuffer( GL_ARRAY_BUFFER, gpipeline.fsquad.vbo );
146 glBufferData( GL_ARRAY_BUFFER, sizeof(quad), quad, GL_STATIC_DRAW );
147 glBindVertexArray( gpipeline.fsquad.vao );
148 glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE,
149 sizeof(float)*2, (void*)0 );
150 glEnableVertexAttribArray( 0 );
151 VG_CHECK_GL();
152 }
153
154 static void render_fsquad(void)
155 {
156 glBindVertexArray( gpipeline.fsquad.vao );
157 glDrawArrays( GL_TRIANGLES, 0, 6 );
158 }
159
160 #endif /* RENDER_H */