ec2e0ef37eb9ed1518a20f79c25e95425e8f7f90
[carveJwlIkooP6JGAAIwe30JlM.git] / render.c
1 #include "render.h"
2 #include "vg/vg_engine.h"
3 #include "vg/vg_platform.h"
4 #include "vg/vg_framebuffer.h"
5
6 static void async_render_init( void *payload, u32 size )
7 {
8 f32 rh = 0x1p-4f, ih = 0.3f;
9
10 float quad[] = {
11 0.00f,0.00f, 1.00f,1.00f, 0.00f,1.00f, /* fsquad */
12 0.00f,0.00f, 1.00f,0.00f, 1.00f,1.00f,
13
14 0.00f,0.00f, 1.00f,rh, 0.00f,rh, /* fsquad1 */
15 0.00f,0.00f, 1.00f,0.00f, 1.00f,rh,
16 0.00f,1.00f, 0.00f,1.0f-rh,1.00f,1.0f-rh,
17 0.00f,1.00f, 1.00f,1.0f-rh,1.00f,1.0f,
18
19 /* 9x9 debug grid */
20 /* row0 */
21 0.00f,0.00f, 0.30f,0.30f, 0.00f,0.30f,
22 0.00f,0.00f, 0.30f,0.00f, 0.30f,0.30f,
23 0.30f,0.00f, 0.60f,0.30f, 0.30f,0.30f,
24 0.30f,0.00f, 0.60f,0.00f, 0.60f,0.30f,
25 0.60f,0.00f, 0.90f,0.30f, 0.60f,0.30f,
26 0.60f,0.00f, 0.90f,0.00f, 0.90f,0.30f,
27 /* row1 */
28 0.00f,0.30f, 0.30f,0.60f, 0.00f,0.60f,
29 0.00f,0.30f, 0.30f,0.30f, 0.30f,0.60f,
30 0.30f,0.30f, 0.60f,0.60f, 0.30f,0.60f,
31 0.30f,0.30f, 0.60f,0.30f, 0.60f,0.60f,
32 0.60f,0.30f, 0.90f,0.60f, 0.60f,0.60f,
33 0.60f,0.30f, 0.90f,0.30f, 0.90f,0.60f,
34 /* row2 */
35 0.00f,0.60f, 0.30f,0.90f, 0.00f,0.90f,
36 0.00f,0.60f, 0.30f,0.60f, 0.30f,0.90f,
37 0.30f,0.60f, 0.60f,0.90f, 0.30f,0.90f,
38 0.30f,0.60f, 0.60f,0.60f, 0.60f,0.90f,
39 0.60f,0.60f, 0.90f,0.90f, 0.60f,0.90f,
40 0.60f,0.60f, 0.90f,0.60f, 0.90f,0.90f,
41
42 0.00f,ih, 1.00f,ih+rh, 0.00f,ih+rh, /* fsquad2 */
43 0.00f,ih, 1.00f,ih, 1.00f,ih+rh,
44 };
45
46 glGenVertexArrays( 1, &gpipeline.fsquad.vao );
47 glGenBuffers( 1, &gpipeline.fsquad.vbo );
48 glBindVertexArray( gpipeline.fsquad.vao );
49 glBindBuffer( GL_ARRAY_BUFFER, gpipeline.fsquad.vbo );
50 glBufferData( GL_ARRAY_BUFFER, sizeof(quad), quad, GL_STATIC_DRAW );
51 glBindVertexArray( gpipeline.fsquad.vao );
52 glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE,
53 sizeof(float)*2, (void*)0 );
54 glEnableVertexAttribArray( 0 );
55
56 VG_CHECK_GL_ERR();
57
58 glBindFramebuffer( GL_FRAMEBUFFER, 0 );
59 gpipeline.ready = 1;
60 }
61
62 void render_init(void)
63 {
64 vg_console_reg_var( "blur_strength", &k_blur_strength, k_var_dtype_f32, 0 );
65 vg_console_reg_var( "render_scale", &k_render_scale,
66 k_var_dtype_f32, VG_VAR_PERSISTENT );
67 vg_console_reg_var( "fov", &k_fov, k_var_dtype_f32, VG_VAR_PERSISTENT );
68 vg_console_reg_var( "cam_height", &k_cam_height,
69 k_var_dtype_f32, VG_VAR_PERSISTENT );
70 vg_console_reg_var( "blur_effect", &k_blur_effect,
71 k_var_dtype_i32, VG_VAR_PERSISTENT );
72
73 void *alloc = vg_mem.rtmemory;
74
75 /*
76 * Main framebuffer
77 */
78 gpipeline.fb_main = vg_framebuffer_allocate( alloc, 3, 1 );
79 gpipeline.fb_main->display_name = "main";
80 gpipeline.fb_main->resolution_div = 1;
81 gpipeline.fb_main->attachments[0] = (vg_framebuffer_attachment)
82 {
83 "colour", k_framebuffer_attachment_type_texture,
84
85 .internalformat = GL_RGB,
86 .format = GL_RGB,
87 .type = GL_UNSIGNED_BYTE,
88 .attachment = GL_COLOR_ATTACHMENT0
89 };
90 gpipeline.fb_main->attachments[1] = (vg_framebuffer_attachment)
91 {
92 "motion", k_framebuffer_attachment_type_texture,
93
94 .quality = k_framebuffer_quality_high_only,
95 .internalformat = GL_RG16F,
96 .format = GL_RG,
97 .type = GL_FLOAT,
98 .attachment = GL_COLOR_ATTACHMENT1
99 };
100 gpipeline.fb_main->attachments[2] = (vg_framebuffer_attachment)
101 {
102 "depth_stencil", k_framebuffer_attachment_type_texture_depth,
103 .internalformat = GL_DEPTH24_STENCIL8,
104 .format = GL_DEPTH_STENCIL,
105 .type = GL_UNSIGNED_INT_24_8,
106 .attachment = GL_DEPTH_STENCIL_ATTACHMENT
107 };
108 vg_framebuffer_create( gpipeline.fb_main );
109
110 /*
111 * Water reflection
112 */
113 gpipeline.fb_water_reflection = vg_framebuffer_allocate( alloc, 2, 1 );
114 gpipeline.fb_water_reflection->display_name = "water_reflection";
115 gpipeline.fb_water_reflection->resolution_div = 2;
116 gpipeline.fb_water_reflection->attachments[0] = (vg_framebuffer_attachment)
117 {
118 "colour", k_framebuffer_attachment_type_texture,
119 .internalformat = GL_RGB,
120 .format = GL_RGB,
121 .type = GL_UNSIGNED_BYTE,
122 .attachment = GL_COLOR_ATTACHMENT0
123 };
124 gpipeline.fb_water_reflection->attachments[1] = (vg_framebuffer_attachment)
125 {
126 "depth_stencil", k_framebuffer_attachment_type_renderbuffer,
127 .internalformat = GL_DEPTH24_STENCIL8,
128 .attachment = GL_DEPTH_STENCIL_ATTACHMENT
129 };
130 vg_framebuffer_create( gpipeline.fb_water_reflection );
131
132 /*
133 * Thid rendered view from the perspective of the camera, but just
134 * captures stuff thats under the water
135 */
136 gpipeline.fb_water_beneath = vg_framebuffer_allocate( alloc, 2, 1 );
137 gpipeline.fb_water_beneath->display_name = "water_beneath";
138 gpipeline.fb_water_beneath->resolution_div = 2;
139 gpipeline.fb_water_beneath->attachments[0] = (vg_framebuffer_attachment)
140 {
141 "colour", k_framebuffer_attachment_type_texture,
142 .internalformat = GL_RED,
143 .format = GL_RED,
144 .type = GL_UNSIGNED_BYTE,
145 .attachment = GL_COLOR_ATTACHMENT0
146 };
147 gpipeline.fb_water_beneath->attachments[1] = (vg_framebuffer_attachment)
148 {
149 "depth_stencil", k_framebuffer_attachment_type_renderbuffer,
150 .internalformat = GL_DEPTH24_STENCIL8,
151 .attachment = GL_DEPTH_STENCIL_ATTACHMENT
152 };
153 vg_framebuffer_create( gpipeline.fb_water_beneath );
154
155 /*
156 * Workshop preview
157 */
158 gpipeline.fb_workshop_preview = vg_framebuffer_allocate( alloc, 2, 1 );
159 gpipeline.fb_workshop_preview->display_name = "workshop_preview";
160 gpipeline.fb_workshop_preview->resolution_div = 0;
161 gpipeline.fb_workshop_preview->fixed_w = WORKSHOP_PREVIEW_WIDTH;
162 gpipeline.fb_workshop_preview->fixed_h = WORKSHOP_PREVIEW_HEIGHT;
163 gpipeline.fb_workshop_preview->attachments[0] = (vg_framebuffer_attachment)
164 {
165 "colour", k_framebuffer_attachment_type_texture,
166 .internalformat = GL_RGB,
167 .format = GL_RGB,
168 .type = GL_UNSIGNED_BYTE,
169 .attachment = GL_COLOR_ATTACHMENT0
170 };
171 gpipeline.fb_workshop_preview->attachments[1] = (vg_framebuffer_attachment)
172 {
173 "depth_stencil", k_framebuffer_attachment_type_renderbuffer,
174 .internalformat = GL_DEPTH24_STENCIL8,
175 .attachment = GL_DEPTH_STENCIL_ATTACHMENT
176 };
177 vg_framebuffer_create( gpipeline.fb_workshop_preview );
178
179 /*
180 * Network status
181 */
182 gpipeline.fb_network_status = vg_framebuffer_allocate( alloc, 1, 1 );
183 gpipeline.fb_network_status->display_name = "network_status_ui";
184 gpipeline.fb_network_status->resolution_div = 0;
185 gpipeline.fb_network_status->fixed_w = 128;
186 gpipeline.fb_network_status->fixed_h = 48;
187 gpipeline.fb_network_status->attachments[0] = (vg_framebuffer_attachment)
188 {
189 "colour", k_framebuffer_attachment_type_texture,
190 .internalformat = GL_RGB,
191 .format = GL_RGB,
192 .type = GL_UNSIGNED_BYTE,
193 .attachment = GL_COLOR_ATTACHMENT0
194 };
195 vg_framebuffer_create( gpipeline.fb_network_status );
196
197 vg_async_call( async_render_init, NULL, 0 );
198 }
199
200 /*
201 * Utility
202 */
203 void render_fsquad(void)
204 {
205 glBindVertexArray( gpipeline.fsquad.vao );
206 glDrawArrays( GL_TRIANGLES, 0, 6 );
207 }
208
209 void render_fsquad1(void)
210 {
211 glBindVertexArray( gpipeline.fsquad.vao );
212 glDrawArrays( GL_TRIANGLES, 6, 6+6 );
213 }
214
215 void render_fsquad2(void)
216 {
217 glBindVertexArray( gpipeline.fsquad.vao );
218 glDrawArrays( GL_TRIANGLES, 66+6,6 );
219 }
220
221 void postprocess_to_screen( vg_framebuffer *fb )
222 {
223 glBindFramebuffer( GL_FRAMEBUFFER, 0 );
224 glViewport( 0,0, vg.window_x, vg.window_y );
225
226 glEnable(GL_BLEND);
227 glDisable(GL_DEPTH_TEST);
228 glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA);
229 glBlendEquation(GL_FUNC_ADD);
230
231 v2f inverse;
232 vg_framebuffer_inverse_ratio( fb, inverse );
233
234 if( k_blur_effect )
235 {
236 shader_blitblur_use();
237 shader_blitblur_uTexMain( 0 );
238 shader_blitblur_uTexMotion( 1 );
239 shader_blitblur_uBlurStrength( k_blur_strength /
240 (vg.time_frame_delta*60.0) );
241 shader_blitblur_uInverseRatio( inverse );
242
243 inverse[0] -= 0.0001f;
244 inverse[1] -= 0.0001f;
245 shader_blitblur_uClampUv( inverse );
246 shader_blitblur_uOverrideDir( gpipeline.blur_override );
247
248 vg_framebuffer_bind_texture( fb, 0, 0 );
249 vg_framebuffer_bind_texture( fb, 1, 1 );
250 }
251 else{
252 shader_blit_use();
253 shader_blit_uTexMain( 0 );
254 shader_blit_uInverseRatio( inverse );
255 vg_framebuffer_bind_texture( fb, 0, 0 );
256 }
257
258 render_fsquad();
259 }