3005c93e4ee9620ade79792299e323f7e8e81049
[carveJwlIkooP6JGAAIwe30JlM.git] / terrain.h
1 #ifndef TERRAIN_H
2 #define TERRAIN_H
3
4 #define VG_3D
5 #include "vg/vg.h"
6 #include "model.h"
7 #include "render.h"
8
9 #include "shaders/terrain.h"
10 #include "shaders/sky.h"
11
12 vg_tex2d tex_terrain_colours = { .path = "textures/gradients.qoi",
13 .flags = VG_TEXTURE_CLAMP | VG_TEXTURE_NEAREST
14 };
15 vg_tex2d tex_terrain_noise = { .path = "textures/garbage.qoi",
16 .flags = VG_TEXTURE_NEAREST };
17
18 static struct
19 {
20 glmesh skydome;
21 }
22 trender;
23
24 static void terrain_register(void)
25 {
26 shader_terrain_register();
27 shader_sky_register();
28 }
29
30 static void terrain_init(void)
31 {
32 vg_tex2d_init( (vg_tex2d *[]){ &tex_terrain_colours,
33 &tex_terrain_noise }, 2 );
34
35
36 model *msky = vg_asset_read("models/rs_skydome.mdl");
37 model_unpack( msky, &trender.skydome );
38 free(msky);
39 }
40
41 static void render_terrain(m4x4f projection, v3f camera)
42 {
43 shader_terrain_use();
44 shader_terrain_uTexGarbage(0);
45 shader_terrain_uTexGradients(1);
46
47 vg_tex2d_bind( &tex_terrain_noise, 0 );
48 vg_tex2d_bind( &tex_terrain_colours, 1 );
49
50 m4x3f identity_matrix;
51 m4x3_identity( identity_matrix );
52 shader_terrain_uPv( projection );
53 shader_terrain_uMdl( identity_matrix );
54 shader_terrain_uCamera( camera );
55 }
56
57 static void render_sky(m4x3f camera)
58 {
59 m4x4f projection, full;
60 pipeline_projection( projection, 0.4f, 1000.0f );
61
62 m4x3f inverse;
63 m3x3_transpose( camera, inverse );
64 v3_copy((v3f){0.0f,0.0f,0.0f}, inverse[3]);
65 m4x3_expand( inverse, full );
66 m4x4_mul( projection, full, full );
67
68 m4x3f identity_matrix;
69 m4x3_identity( identity_matrix );
70
71 shader_sky_use();
72 shader_sky_uMdl(identity_matrix);
73 shader_sky_uPv(full);
74 shader_sky_uTexGarbage(0);
75 shader_sky_uTime( vg_time );
76 vg_tex2d_bind( &tex_terrain_noise, 0 );
77
78 glDepthMask(GL_FALSE);
79 glDisable(GL_DEPTH_TEST);
80
81 mesh_bind( &trender.skydome );
82 mesh_draw( &trender.skydome );
83
84 glEnable(GL_DEPTH_TEST);
85 glDepthMask(GL_TRUE);
86 }
87
88 #endif