better water
[carveJwlIkooP6JGAAIwe30JlM.git] / terrain.h
1 #include "common.h"
2
3 static void render_terrain(m4x4f projection, v3f camera);
4 static void render_sky(m4x3f camera);
5
6 #ifndef TERRAIN_H
7 #define TERRAIN_H
8
9 #include "model.h"
10 #include "render.h"
11 #include "water.h"
12
13 #include "shaders/terrain.h"
14 #include "shaders/sky.h"
15 #include "shaders/planeinf.h"
16
17 vg_tex2d tex_terrain_colours = { .path = "textures/gradients.qoi",
18 .flags = VG_TEXTURE_CLAMP | VG_TEXTURE_NEAREST
19 };
20 vg_tex2d tex_terrain_noise = { .path = "textures/garbage.qoi",
21 .flags = VG_TEXTURE_NEAREST };
22
23 static struct
24 {
25 glmesh skydome;
26 submodel dome_upper,
27 dome_lower;
28 }
29 trender;
30
31 static void terrain_register(void)
32 {
33 shader_terrain_register();
34 shader_sky_register();
35 shader_planeinf_register();
36 }
37
38 static void terrain_init(void)
39 {
40 vg_tex2d_init( (vg_tex2d *[]){ &tex_terrain_colours,
41 &tex_terrain_noise }, 2 );
42
43
44 model *msky = vg_asset_read("models/rs_skydome.mdl");
45 model_unpack( msky, &trender.skydome );
46
47 trender.dome_lower = *submodel_get( msky, "dome_lower" );
48 trender.dome_upper = *submodel_get( msky, "dome_upper" );
49
50 free(msky);
51 }
52
53 static void render_terrain(m4x4f projection, v3f camera)
54 {
55 shader_terrain_use();
56 shader_terrain_uTexGarbage(0);
57 shader_terrain_uTexGradients(1);
58
59 vg_tex2d_bind( &tex_terrain_noise, 0 );
60 vg_tex2d_bind( &tex_terrain_colours, 1 );
61
62 m4x3f identity_matrix;
63 m4x3_identity( identity_matrix );
64 shader_terrain_uPv( projection );
65 shader_terrain_uMdl( identity_matrix );
66 shader_terrain_uCamera( camera );
67 shader_terrain_uPlane( (v4f){ 0.0f,1.0f,0.0f, wrender.height } );
68 }
69
70 static void render_lowerdome( m4x3f camera )
71 {
72 m4x4f projection, full;
73 pipeline_projection( projection, 0.4f, 1000.0f );
74
75 m4x3f inverse;
76 m3x3_transpose( camera, inverse );
77 v3_copy((v3f){0.0f,0.0f,0.0f}, inverse[3]);
78 m4x3_expand( inverse, full );
79 m4x4_mul( projection, full, full );
80
81 m4x3f identity_matrix;
82 m4x3_identity( identity_matrix );
83
84 shader_planeinf_use();
85 shader_planeinf_uMdl(identity_matrix);
86 shader_planeinf_uPv(full);
87 shader_planeinf_uCamera(camera[3]);
88 shader_planeinf_uPlane( (v4f){0.0f,1.0f,0.0f, water_height()} );
89
90 submodel_draw( &trender.dome_lower );
91 }
92
93 static void render_sky(m4x3f camera)
94 {
95 m4x4f projection, full;
96 pipeline_projection( projection, 0.4f, 1000.0f );
97
98 m4x3f inverse;
99 m3x3_transpose( camera, inverse );
100 v3_copy((v3f){0.0f,0.0f,0.0f}, inverse[3]);
101 m4x3_expand( inverse, full );
102 m4x4_mul( projection, full, full );
103
104 m4x3f identity_matrix;
105 m4x3_identity( identity_matrix );
106
107 shader_sky_use();
108 shader_sky_uMdl(identity_matrix);
109 shader_sky_uPv(full);
110 shader_sky_uTexGarbage(0);
111 shader_sky_uTime( vg_time );
112
113
114 vg_tex2d_bind( &tex_terrain_noise, 0 );
115
116 glDepthMask(GL_FALSE);
117 glDisable(GL_DEPTH_TEST);
118
119 mesh_bind( &trender.skydome );
120 submodel_draw( &trender.dome_upper );
121
122 glEnable(GL_DEPTH_TEST);
123 glDepthMask(GL_TRUE);
124 }
125
126 #endif