2 * Copyright (C) 2021-2022 Mt.ZERO Software, Harry Godden - All Rights Reserved
11 vg_tex2d tex_terrain_noise
= { .path
= "textures/garbage.qoi",
12 .flags
= VG_TEXTURE_NEAREST
};
14 VG_STATIC
void world_render_init(void)
16 vg_info( "Loading default world textures\n" );
18 vg_acquire_thread_sync();
20 vg_tex2d_init( (vg_tex2d
*[]){ &tex_terrain_noise
}, 1 );
22 vg_release_thread_sync();
25 VG_STATIC
void render_world_depth( camera
*cam
);
31 VG_STATIC
void bind_terrain_noise(void)
33 vg_tex2d_bind( &tex_terrain_noise
, 0 );
36 VG_STATIC
void world_render_if( enum mdl_shader shader
,
37 enum geo_type geo_type
,
38 void (*bind_point
)(struct world_material
*mat
))
41 for( int i
=0; i
<world
.material_count
; i
++ )
43 struct world_material
*mat
= &world
.materials
[i
];
45 if( mat
->info
.shader
== shader
)
49 if( geo_type
== k_geo_type_solid
)
52 sm
= &mat
->sm_no_collide
;
54 if( !sm
->indice_count
)
58 mdl_draw_submesh( sm
);
63 VG_STATIC
void world_render_both_stages( enum mdl_shader shader
,
64 void (*bind_point
)(struct world_material
*mat
))
66 mesh_bind( &world
.mesh_geo
);
67 world_render_if( shader
, k_geo_type_solid
, bind_point
);
69 glDisable( GL_CULL_FACE
);
70 mesh_bind( &world
.mesh_no_collide
);
71 world_render_if( shader
, k_geo_type_nonsolid
, bind_point
);
72 glEnable( GL_CULL_FACE
);
75 VG_STATIC
void bindpoint_diffuse_texture1( struct world_material
*mat
)
77 glActiveTexture( GL_TEXTURE1
);
78 glBindTexture( GL_TEXTURE_2D
, world
.textures
[ mat
->info
.tex_diffuse
] );
81 VG_STATIC
void render_world_vb( camera
*cam
)
83 m4x3f identity_matrix
;
84 m4x3_identity( identity_matrix
);
87 shader_vblend_uTexGarbage(0);
88 shader_vblend_uTexGradients(1);
89 shader_link_standard_ub( _shader_vblend
.id
, 2 );
90 vg_tex2d_bind( &tex_terrain_noise
, 0 );
92 shader_vblend_uPv( cam
->mtx
.pv
);
93 shader_vblend_uPvmPrev( cam
->mtx_prev
.pv
);
94 shader_vblend_uMdl( identity_matrix
);
95 shader_vblend_uCamera( cam
->transform
[3] );
97 world_render_both_stages( k_shader_standard_vertex_blend
,
98 bindpoint_diffuse_texture1
);
101 VG_STATIC
void render_world_standard( camera
*cam
)
103 m4x3f identity_matrix
;
104 m4x3_identity( identity_matrix
);
106 shader_standard_use();
107 shader_standard_uTexGarbage(0);
108 shader_standard_uTexMain(1);
109 shader_standard_uPv( cam
->mtx
.pv
);
110 shader_standard_uPvmPrev( cam
->mtx_prev
.pv
);
111 shader_link_standard_ub( _shader_standard
.id
, 2 );
112 bind_terrain_noise();
114 shader_standard_uMdl( identity_matrix
);
115 shader_standard_uCamera( cam
->transform
[3] );
117 world_render_both_stages( k_shader_standard
,
118 bindpoint_diffuse_texture1
);
121 VG_STATIC
void render_world_alphatest( camera
*cam
)
123 m4x3f identity_matrix
;
124 m4x3_identity( identity_matrix
);
126 shader_alphatest_use();
127 shader_alphatest_uTexGarbage(0);
128 shader_alphatest_uTexMain(1);
129 shader_alphatest_uPv( cam
->mtx
.pv
);
130 shader_alphatest_uPvmPrev( cam
->mtx_prev
.pv
);
131 shader_link_standard_ub( _shader_alphatest
.id
, 2 );
132 bind_terrain_noise();
134 shader_alphatest_uMdl( identity_matrix
);
135 shader_alphatest_uCamera( cam
->transform
[3] );
137 glDisable(GL_CULL_FACE
);
139 world_render_both_stages( k_shader_standard_cutout
,
140 bindpoint_diffuse_texture1
);
142 glEnable(GL_CULL_FACE
);
145 VG_STATIC
void bindpoint_terrain( struct world_material
*mat
)
147 glActiveTexture( GL_TEXTURE1
);
148 glBindTexture( GL_TEXTURE_2D
, world
.textures
[ mat
->info
.tex_diffuse
] );
150 shader_terrain_uSandColour( mat
->info
.colour
);
151 shader_terrain_uBlendOffset( mat
->info
.colour1
);
154 VG_STATIC
void render_terrain( camera
*cam
)
156 m4x3f identity_matrix
;
157 m4x3_identity( identity_matrix
);
159 shader_terrain_use();
160 shader_terrain_uTexGarbage(0);
161 shader_terrain_uTexGradients(1);
162 shader_link_standard_ub( _shader_terrain
.id
, 2 );
164 vg_tex2d_bind( &tex_terrain_noise
, 0 );
166 shader_terrain_uPv( cam
->mtx
.pv
);
167 shader_terrain_uPvmPrev( cam
->mtx_prev
.pv
);
169 shader_terrain_uMdl( identity_matrix
);
170 shader_terrain_uCamera( cam
->transform
[3] );
172 world_render_both_stages( k_shader_terrain_blend
, bindpoint_terrain
);
175 VG_STATIC
void render_sky( camera
*cam
)
178 * Modify matrix to remove clipping and view translation
185 m4x4_copy( cam
->mtx
.v
, v
);
186 m4x4_copy( cam
->mtx_prev
.v
, v_prev
);
188 v3_zero( v_prev
[3] );
190 m4x4_copy( cam
->mtx
.p
, pv
);
191 m4x4_copy( cam
->mtx_prev
.p
, pv_prev
);
192 m4x4_reset_clipping( pv
, cam
->farz
, cam
->nearz
);
193 m4x4_reset_clipping( pv_prev
, cam
->farz
, cam
->nearz
);
195 m4x4_mul( pv
, v
, pv
);
196 m4x4_mul( pv_prev
, v_prev
, pv_prev
);
198 m4x3f identity_matrix
;
199 m4x3_identity( identity_matrix
);
205 shader_sky_uMdl( identity_matrix
);
206 shader_sky_uPv( pv
);
207 shader_sky_uPvmPrev( pv_prev
);
208 shader_sky_uTexGarbage(0);
209 shader_sky_uTime( world
.sky_time
);
211 vg_tex2d_bind( &tex_terrain_noise
, 0 );
213 glDepthMask( GL_FALSE
);
214 glDisable( GL_DEPTH_TEST
);
216 mesh_bind( &world
.skydome
);
217 mdl_draw_submesh( &world
.dome_upper
);
219 glEnable( GL_DEPTH_TEST
);
220 glDepthMask( GL_TRUE
);
223 VG_STATIC
void render_world_gates( camera
*cam
)
225 if( !world
.gate_count
)
228 float closest
= INFINITY
;
231 for( int i
=0; i
<world
.gate_count
; i
++ )
233 struct route_gate
*rg
= &world
.gates
[i
];
234 float dist
= v3_dist2( rg
->gate
.co
[0], cam
->transform
[3] );
243 render_gate( &world
.gates
[id
].gate
, cam
);
244 v3_lerp( world
.render_gate_pos
,
245 world
.gates
[id
].gate
.co
[0],
247 world
.render_gate_pos
);
250 VG_STATIC
void render_world( camera
*cam
)
254 render_world_routes( cam
);
255 render_world_standard( cam
);
256 render_world_vb( cam
);
257 render_world_alphatest( cam
);
258 render_terrain( cam
);
262 float min_dist
= INFINITY
;
264 if( !world
.route_count
)
267 for( int i
=0; i
<world
.route_count
; i
++ )
269 float dist
= v3_dist2(world
.routes
[i
].scoreboard_transform
[3], cam
->pos
);
271 if( dist
< min_dist
)
278 sfd_render( cam
, world
.routes
[closest
].scoreboard_transform
);
281 VG_STATIC
void render_world_depth( camera
*cam
)
283 m4x3f identity_matrix
;
284 m4x3_identity( identity_matrix
);
287 shader_gpos_uCamera( cam
->transform
[3] );
288 shader_gpos_uPv( cam
->mtx
.pv
);
289 shader_gpos_uPvmPrev( cam
->mtx_prev
.pv
);
290 shader_gpos_uMdl( identity_matrix
);
292 mesh_bind( &world
.mesh_geo
);
293 mesh_draw( &world
.mesh_geo
);
296 glDisable(GL_CULL_FACE
);
297 scene_bind( &world
.foliage
);
298 scene_draw( &world
.foliage
);
299 glEnable(GL_CULL_FACE
);
303 #endif /* WORLD_RENDER_H */