stuff
[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
16 vg_tex2d tex_terrain_colours = { .path = "textures/gradients.qoi",
17 .flags = VG_TEXTURE_CLAMP | VG_TEXTURE_NEAREST
18 };
19 vg_tex2d tex_terrain_noise = { .path = "textures/garbage.qoi",
20 .flags = VG_TEXTURE_NEAREST };
21
22 static struct
23 {
24 glmesh skydome;
25 }
26 trender;
27
28 static void terrain_register(void)
29 {
30 shader_terrain_register();
31 shader_sky_register();
32 }
33
34 static void terrain_init(void)
35 {
36 vg_tex2d_init( (vg_tex2d *[]){ &tex_terrain_colours,
37 &tex_terrain_noise }, 2 );
38
39
40 model *msky = vg_asset_read("models/rs_skydome.mdl");
41 model_unpack( msky, &trender.skydome );
42 free(msky);
43 }
44
45 static void render_terrain(m4x4f projection, v3f camera)
46 {
47 shader_terrain_use();
48 shader_terrain_uTexGarbage(0);
49 shader_terrain_uTexGradients(1);
50
51 vg_tex2d_bind( &tex_terrain_noise, 0 );
52 vg_tex2d_bind( &tex_terrain_colours, 1 );
53
54 m4x3f identity_matrix;
55 m4x3_identity( identity_matrix );
56 shader_terrain_uPv( projection );
57 shader_terrain_uMdl( identity_matrix );
58 shader_terrain_uCamera( camera );
59 shader_terrain_uPlane( (v4f){ 0.0f,1.0f,0.0f, wrender.height } );
60 }
61
62 static void render_sky(m4x3f camera)
63 {
64 m4x4f projection, full;
65 pipeline_projection( projection, 0.4f, 1000.0f );
66
67 m4x3f inverse;
68 m3x3_transpose( camera, inverse );
69 v3_copy((v3f){0.0f,0.0f,0.0f}, inverse[3]);
70 m4x3_expand( inverse, full );
71 m4x4_mul( projection, full, full );
72
73 m4x3f identity_matrix;
74 m4x3_identity( identity_matrix );
75
76 shader_sky_use();
77 shader_sky_uMdl(identity_matrix);
78 shader_sky_uPv(full);
79 shader_sky_uTexGarbage(0);
80 shader_sky_uTime( vg_time );
81 vg_tex2d_bind( &tex_terrain_noise, 0 );
82
83 glDepthMask(GL_FALSE);
84 glDisable(GL_DEPTH_TEST);
85
86 mesh_bind( &trender.skydome );
87 mesh_draw( &trender.skydome );
88
89 glEnable(GL_DEPTH_TEST);
90 glDepthMask(GL_TRUE);
91 }
92
93 #endif