stuff
[carveJwlIkooP6JGAAIwe30JlM.git] / terrain.h
index e9cb162209f1194e30e9f3af6495f8c40d871c70..d35dc0ab0f39ffdaa3c57b53bb891d86b48ee124 100644 (file)
--- a/terrain.h
+++ b/terrain.h
@@ -1,5 +1,93 @@
-#include "vg/vg.h"
-#include "scene.h"
+#include "common.h"
 
+static void render_terrain(m4x4f projection, v3f camera);
+static void render_sky(m4x3f camera);
 
+#ifndef TERRAIN_H
+#define TERRAIN_H
 
+#include "model.h"
+#include "render.h"
+#include "water.h"
+
+#include "shaders/terrain.h"
+#include "shaders/sky.h"
+
+vg_tex2d tex_terrain_colours = { .path = "textures/gradients.qoi",
+                                 .flags = VG_TEXTURE_CLAMP | VG_TEXTURE_NEAREST
+};
+vg_tex2d tex_terrain_noise = { .path = "textures/garbage.qoi",
+                                 .flags = VG_TEXTURE_NEAREST };
+
+static struct
+{
+   glmesh skydome;
+}
+trender;
+
+static void terrain_register(void)
+{
+   shader_terrain_register();
+   shader_sky_register();
+}
+
+static void terrain_init(void)
+{
+   vg_tex2d_init( (vg_tex2d *[]){ &tex_terrain_colours, 
+                                  &tex_terrain_noise }, 2 );
+
+
+   model *msky = vg_asset_read("models/rs_skydome.mdl");
+   model_unpack( msky, &trender.skydome );
+   free(msky);
+}
+
+static void render_terrain(m4x4f projection, v3f camera)
+{
+   shader_terrain_use();
+   shader_terrain_uTexGarbage(0);
+   shader_terrain_uTexGradients(1);
+
+   vg_tex2d_bind( &tex_terrain_noise, 0 );
+   vg_tex2d_bind( &tex_terrain_colours, 1 );
+
+   m4x3f identity_matrix;
+   m4x3_identity( identity_matrix );
+   shader_terrain_uPv( projection );
+   shader_terrain_uMdl( identity_matrix );
+   shader_terrain_uCamera( camera );
+   shader_terrain_uPlane( (v4f){ 0.0f,1.0f,0.0f, wrender.height } );
+}
+
+static void render_sky(m4x3f camera)
+{
+   m4x4f projection, full;
+   pipeline_projection( projection, 0.4f, 1000.0f );
+
+   m4x3f inverse;
+   m3x3_transpose( camera, inverse );
+   v3_copy((v3f){0.0f,0.0f,0.0f}, inverse[3]);
+   m4x3_expand( inverse, full );
+   m4x4_mul( projection, full, full );
+
+   m4x3f identity_matrix;
+   m4x3_identity( identity_matrix );
+   
+   shader_sky_use();
+   shader_sky_uMdl(identity_matrix);
+   shader_sky_uPv(full);
+   shader_sky_uTexGarbage(0);
+   shader_sky_uTime( vg_time );
+   vg_tex2d_bind( &tex_terrain_noise, 0 );
+
+   glDepthMask(GL_FALSE);
+   glDisable(GL_DEPTH_TEST);
+
+   mesh_bind( &trender.skydome );
+   mesh_draw( &trender.skydome );
+
+   glEnable(GL_DEPTH_TEST);
+   glDepthMask(GL_TRUE);
+}
+
+#endif