#include "shaders/terrain.h"
#include "shaders/sky.h"
+#include "shaders/planeinf.h"
vg_tex2d tex_terrain_colours = { .path = "textures/gradients.qoi",
.flags = VG_TEXTURE_CLAMP | VG_TEXTURE_NEAREST
static struct
{
glmesh skydome;
+ submodel dome_upper,
+ dome_lower;
}
trender;
{
shader_terrain_register();
shader_sky_register();
+ shader_planeinf_register();
}
static void terrain_init(void)
model *msky = vg_asset_read("models/rs_skydome.mdl");
model_unpack( msky, &trender.skydome );
+
+ trender.dome_lower = *submodel_get( msky, "dome_lower" );
+ trender.dome_upper = *submodel_get( msky, "dome_upper" );
+
free(msky);
}
shader_terrain_uPlane( (v4f){ 0.0f,1.0f,0.0f, wrender.height } );
}
+static void render_lowerdome( 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_planeinf_use();
+ shader_planeinf_uMdl(identity_matrix);
+ shader_planeinf_uPv(full);
+ shader_planeinf_uCamera(camera[3]);
+ shader_planeinf_uPlane( (v4f){0.0f,1.0f,0.0f, water_height()} );
+
+ submodel_draw( &trender.dome_lower );
+}
+
static void render_sky(m4x3f camera)
{
m4x4f projection, full;
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 );
-
+ submodel_draw( &trender.dome_upper );
+
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
}