b81a04a35f663a7994161404373e3dc8730b84e2
[vrfileman] / src / backdrop.cc
1 #include "opengl.h"
2 #include "gmath/gmath.h"
3 #include "sdr.h"
4 #include "texture.h"
5 #include "mesh.h"
6 #include "meshgen.h"
7 #include "backdrop.h"
8 #include "app.h"
9
10 static unsigned int sdr_grid;
11 static Texture *tex_grid;
12
13 static Mesh *mesh_skydome;
14 static unsigned int sdr_skydome;
15
16 static const Vec3 grid_color = Vec3(1.0, 0.07, 1.0);
17 static const Vec3 mid_color = Vec3(0.133, 0.006, 0.612);
18 static const Vec3 horiz_color = Vec3(0.612, 0.006, 1.0);
19 static const Vec3 zenith_color = Vec3(0.029, 0.029, 0.029);
20 static const Vec3 fog_color = Vec3(0.01, 0.01, 0.01);
21
22 bool init_backdrop()
23 {
24         if(!(sdr_grid = create_program_load("sdr/grid.v.glsl", "sdr/grid.p.glsl"))) {
25                 return false;
26         }
27         set_uniform_float3(sdr_grid, "grid_color", grid_color.x, grid_color.y, grid_color.z);
28         set_uniform_float3(sdr_grid, "fog_color", fog_color.x, fog_color.y, fog_color.z);
29
30         if(!(sdr_skydome = create_program_load("sdr/skydome.v.glsl", "sdr/skydome.p.glsl"))) {
31                 return false;
32         }
33         set_uniform_float3(sdr_skydome, "zenith_color", zenith_color.x, zenith_color.y, zenith_color.z);
34         set_uniform_float3(sdr_skydome, "mid_color", mid_color.x, mid_color.y, mid_color.z);
35         set_uniform_float3(sdr_skydome, "horiz_color", horiz_color.x, horiz_color.y, horiz_color.z);
36         set_uniform_float3(sdr_skydome, "fog_color", fog_color.x, fog_color.y, fog_color.z);
37
38         if(!(tex_grid = load_texture("data/grid2.png"))) {
39                 delete tex_grid;
40                 return false;
41         }
42         tex_grid->set_anisotropy(glcaps.max_aniso);
43
44         mesh_skydome = new Mesh;
45         gen_sphere(mesh_skydome, 500.0, 32, 16, 1, 0.5);
46         mesh_skydome->flip();
47
48         glClearColor(fog_color.x, fog_color.y, fog_color.z, 1.0);
49
50         return true;
51 }
52
53 void cleanup_backdrop()
54 {
55         delete mesh_skydome;
56         delete tex_grid;
57         free_program(sdr_grid);
58 }
59
60 void draw_backdrop()
61 {
62         // draw sky
63         Mat4 view_mat_inf = view_matrix.upper3x3();
64         glPushMatrix();
65         glLoadMatrixf(view_mat_inf[0]);
66
67         glDisable(GL_DEPTH_TEST);
68         glDepthMask(0);
69
70         bind_program(sdr_skydome);
71         mesh_skydome->draw();
72
73         glEnable(GL_DEPTH_TEST);
74         glDepthMask(1);
75
76         glPopMatrix();
77
78         // draw grid
79         Mat4 xform;
80         xform.scaling(500.0);
81         glPushMatrix();
82         glMultMatrixf(xform[0]);
83
84         bind_program(sdr_grid);
85         bind_texture(tex_grid);
86
87         glBegin(GL_QUADS);
88         glNormal3f(0, 1, 0);
89         glVertex3f(-1, 0, 1);
90         glVertex3f(1, 0, 1);
91         glVertex3f(1, 0, -1);
92         glVertex3f(-1, 0, -1);
93         glEnd();
94
95         glPopMatrix();
96 }