cleanup+walgrid init
[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 static void render_water_texture( m4x3f camera );
18 static void render_water_surface( m4x4f pv );
19 static void render_world( m4x4f projection, m4x3f camera );
20
21 /*
22 * http://www.terathon.com/lengyel/Lengyel-Oblique.pdf
23 */
24 static void plane_clip_projection( m4x4f mat, v4f plane )
25 {
26 v4f c =
27 {
28 (vg_signf(plane[0]) + mat[2][0]) / mat[0][0],
29 (vg_signf(plane[1]) + mat[2][1]) / mat[1][1],
30 -1.0f,
31 (1.0f + mat[2][2]) / mat[3][2]
32 };
33
34 v4_muls( plane, 2.0f / v4_dot(plane,c), c );
35
36 mat[0][2] = c[0];
37 mat[1][2] = c[1];
38 mat[2][2] = c[2] + 1.0f;
39 mat[3][2] = c[3];
40 }
41
42 static void pipeline_projection( m4x4f mat, float nearz, float farz )
43 {
44 m4x4_projection( mat,
45 gpipeline.fov,
46 (float)vg_window_x / (float)vg_window_y,
47 nearz, farz );
48 }
49
50 static void create_renderbuffer_std( GLuint *fb, GLuint *rgb, GLuint *rb )
51 {
52 glGenFramebuffers( 1, fb );
53 glBindFramebuffer( GL_FRAMEBUFFER, *fb );
54
55 glGenTextures( 1, rgb );
56 glBindTexture( GL_TEXTURE_2D, *rgb );
57 glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, vg_window_x, vg_window_y,
58 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
59
60 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
61 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
62 glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
63 GL_TEXTURE_2D, *rgb, 0);
64
65 /* TODO: Check for DEPTH32f availiblity and use if possible */
66
67 glGenRenderbuffers( 1, rb );
68 glBindRenderbuffer( GL_RENDERBUFFER, *rb );
69 glRenderbufferStorage( GL_RENDERBUFFER, GL_DEPTH24_STENCIL8,
70 vg_window_x, vg_window_y );
71
72 glFramebufferRenderbuffer( GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT,
73 GL_RENDERBUFFER, *rb );
74 }
75
76 static void resize_renderbuffer_std( GLuint *fb, GLuint *rgb, GLuint *rb )
77 {
78 glBindTexture( GL_TEXTURE_2D, *rgb );
79 glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, vg_window_x, vg_window_y, 0,
80 GL_RGB, GL_UNSIGNED_BYTE, NULL );
81
82 glBindRenderbuffer( GL_RENDERBUFFER, *rb );
83 glRenderbufferStorage( GL_RENDERBUFFER, GL_DEPTH24_STENCIL8,
84 vg_window_x, vg_window_y );
85 }
86
87 static void render_fb_resize(void)
88 {
89 glBindTexture( GL_TEXTURE_2D, gpipeline.rgb_background );
90 glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, vg_window_x, vg_window_y, 0,
91 GL_RGB, GL_UNSIGNED_BYTE, NULL );
92 }
93
94 static void render_init(void)
95 {
96 glGenFramebuffers( 1, &gpipeline.fb_background );
97 glBindFramebuffer( GL_FRAMEBUFFER, gpipeline.fb_background );
98
99 glGenTextures( 1, &gpipeline.rgb_background );
100 glBindTexture( GL_TEXTURE_2D, gpipeline.rgb_background );
101 glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, vg_window_x, vg_window_y,
102 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
103
104 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
105 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
106 glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
107 GL_TEXTURE_2D,
108 gpipeline.rgb_background, 0);
109
110 float quad[] = { 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f,
111 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f };
112
113 glGenVertexArrays( 1, &gpipeline.fsquad.vao );
114 glGenBuffers( 1, &gpipeline.fsquad.vbo );
115 glBindVertexArray( gpipeline.fsquad.vao );
116 glBindBuffer( GL_ARRAY_BUFFER, gpipeline.fsquad.vbo );
117 glBufferData( GL_ARRAY_BUFFER, sizeof(quad), quad, GL_STATIC_DRAW );
118 glBindVertexArray( gpipeline.fsquad.vao );
119 glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE,
120 sizeof(float)*2, (void*)0 );
121 glEnableVertexAttribArray( 0 );
122 VG_CHECK_GL();
123 }
124
125 static void render_fsquad(void)
126 {
127 glBindVertexArray( gpipeline.fsquad.vao );
128 glDrawArrays( GL_TRIANGLES, 0, 6 );
129 }
130
131 #endif /* RENDER_H */