model fmt & heisenbug
[carveJwlIkooP6JGAAIwe30JlM.git] / world_render.h
index 3662bb19f1447f0333ea23e52a1bee56040f7d57..d2e615d2b754d9813b7d97e3846a8e8bd4e1e457 100644 (file)
@@ -1,3 +1,7 @@
+/*
+ * Copyright (C) 2021-2022 Mt.ZERO Software, Harry Godden - All Rights Reserved
+ */
+
 #ifndef WORLD_RENDER_H
 #define WORLD_RENDER_H
 
@@ -15,32 +19,33 @@ vg_tex2d tex_alphatest = { .path = "textures/alphatest.qoi",
 vg_tex2d tex_graffiti = { .path = "textures/graffitibox.qoi",
                                  .flags = VG_TEXTURE_NEAREST };
 
-static void world_render_init(void)
+VG_STATIC void world_render_init(void)
 {
-   vg_tex2d_init( (vg_tex2d *[]){ &tex_terrain_colours, 
-                                  &tex_terrain_noise,
-                                  &tex_alphatest,
-                                  &tex_graffiti }, 4 );
-}
-
-
-
-static void render_world_depth( m4x4f projection, m4x3f camera );
-
+   vg_info( "Loading default world textures\n" );
 
+   vg_acquire_thread_sync();
+   {
+      vg_tex2d_init( (vg_tex2d *[]){ &tex_terrain_colours, 
+                                     &tex_terrain_noise,
+                                     &tex_alphatest,
+                                     &tex_graffiti }, 4 );
+   }
+   vg_release_thread_sync();
+}
 
+VG_STATIC void render_world_depth( m4x4f projection, m4x3f camera );
 
 /*
  * Rendering
  */
 
-static void bind_terrain_textures(void)
+VG_STATIC void bind_terrain_textures(void)
 {
    vg_tex2d_bind( &tex_terrain_noise, 0 );
    vg_tex2d_bind( &tex_terrain_colours, 1 );
 }
 
-static void render_world_vb( m4x4f projection, v3f camera )
+VG_STATIC void render_world_vb( m4x4f projection, v3f camera )
 {
    m4x3f identity_matrix;
    m4x3_identity( identity_matrix );
@@ -55,21 +60,11 @@ static void render_world_vb( m4x4f projection, v3f camera )
    shader_vblend_uMdl( identity_matrix );
    shader_vblend_uCamera( camera );
 
-   scene_bind( &world.geo );
+   mesh_bind( &world.mesh_geo );
    mdl_draw_submesh( &world.sm_geo_vb );
-
-   mesh_bind( &world.cars );
-
-#if 0
-   for( int i=0; i<vg_list_size(world.van_man); i++ )
-   {
-      shader_vblend_uMdl( world.van_man[i].transform );
-      mdl_draw_submesh( &world.car_holden );
-   }
-#endif
 }
 
-static void render_world_alphatest( m4x4f projection, v3f camera )
+VG_STATIC void render_world_alphatest( m4x4f projection, v3f camera )
 {
    m4x3f identity_matrix;
    m4x3_identity( identity_matrix );
@@ -87,7 +82,7 @@ static void render_world_alphatest( m4x4f projection, v3f camera )
    shader_alphatest_uCamera( camera );
 
    glDisable(GL_CULL_FACE);
-   scene_bind( &world.foliage );
+   mesh_bind( &world.mesh_no_collide );
    mdl_draw_submesh( &world.sm_foliage_alphatest );
 
    vg_tex2d_bind( &tex_graffiti, 1 );
@@ -96,7 +91,7 @@ static void render_world_alphatest( m4x4f projection, v3f camera )
    glEnable(GL_CULL_FACE);
 }
 
-static void render_terrain( m4x4f projection, v3f camera )
+VG_STATIC void render_terrain( m4x4f projection, v3f camera )
 {
    m4x3f identity_matrix;
    m4x3_identity( identity_matrix );
@@ -111,20 +106,20 @@ static void render_terrain( m4x4f projection, v3f camera )
    shader_terrain_uMdl( identity_matrix );
    shader_terrain_uCamera( camera );
 
-   scene_bind( &world.geo );
+   mesh_bind( &world.mesh_geo );
    mdl_draw_submesh( &world.sm_terrain );
    mdl_draw_submesh( &world.sm_geo_std_oob );
    mdl_draw_submesh( &world.sm_geo_std );
    mdl_draw_submesh( &world.sm_subworld );
 
    /* TODO: Dont draw in reflection */
-   glDisable(GL_CULL_FACE);
-   scene_bind( &world.foliage );
+   glDisable( GL_CULL_FACE );
+   mesh_bind( &world.mesh_no_collide );
    mdl_draw_submesh( &world.sm_foliage_main );
-   glEnable(GL_CULL_FACE);
+   glEnable( GL_CULL_FACE );
 }
 
-static void render_lowerdome( m4x3f camera )
+VG_STATIC void render_lowerdome( m4x3f camera )
 {
    m4x4f projection, full;
    pipeline_projection( projection, 0.4f, 1000.0f );
@@ -147,7 +142,7 @@ static void render_lowerdome( m4x3f camera )
    mdl_draw_submesh( &world.dome_lower );
 }
 
-static void render_sky(m4x3f camera)
+VG_STATIC void render_sky(m4x3f camera)
 {
    m4x4f projection, full;
    pipeline_projection( projection, 0.4f, 1000.0f );
@@ -165,7 +160,7 @@ static void render_sky(m4x3f camera)
    shader_sky_uMdl(identity_matrix);
    shader_sky_uPv(full);
    shader_sky_uTexGarbage(0);
-   shader_sky_uTime( vg_time );
+   shader_sky_uTime( world.sky_time );
 
    vg_tex2d_bind( &tex_terrain_noise, 0 );
 
@@ -179,14 +174,17 @@ static void render_sky(m4x3f camera)
    glDepthMask( GL_TRUE );
 }
 
-static void render_world_gates( m4x4f projection, v3f playerco, m4x3f camera )
+VG_STATIC void render_world_gates( m4x4f projection, v3f playerco, m4x3f camera )
 {
+   if( !world.gate_count )
+      return;
+
    float closest = INFINITY;
    int   id = 0;
 
-   for( int i=0; i<world.routes.gate_count; i++ )
+   for( int i=0; i<world.gate_count; i++ )
    {
-      struct route_gate *rg = &world.routes.gates[i];
+      struct route_gate *rg = &world.gates[i];
       float dist = v3_dist2( rg->gate.co[0], camera[3] );
 
       if( dist < closest )
@@ -196,14 +194,14 @@ static void render_world_gates( m4x4f projection, v3f playerco, m4x3f camera )
       }
    }
 
-   render_gate( &world.routes.gates[id].gate, playerco, camera );
+   render_gate( &world.gates[id].gate, playerco, camera );
    v3_lerp( world.render_gate_pos, 
-            world.routes.gates[id].gate.co[0],
+            world.gates[id].gate.co[0],
             1.0f,
             world.render_gate_pos );
 }
 
-static void render_world( m4x4f projection, m4x3f camera )
+VG_STATIC void render_world( m4x4f projection, m4x3f camera )
 {
    render_sky( camera );
    render_world_routes( projection, camera[3] );
@@ -214,9 +212,12 @@ static void render_world( m4x4f projection, m4x3f camera )
    int closest = 0;
    float min_dist = INFINITY;
 
-   for( int i=0; i<world.routes.route_count; i++ )
+   if( !world.route_count )
+      return;
+
+   for( int i=0; i<world.route_count; i++ )
    {
-      float dist = v3_dist2( world.routes.routes[i].scoreboard_transform[3],
+      float dist = v3_dist2( world.routes[i].scoreboard_transform[3],
                               camera[3] );
 
       if( dist < min_dist )
@@ -226,11 +227,11 @@ static void render_world( m4x4f projection, m4x3f camera )
       }
    }
 
-   sfd_render( &world.sfd.tester, projection, camera[3], 
-         world.routes.routes[closest].scoreboard_transform );
+   sfd_render( projection, camera[3], 
+               world.routes[closest].scoreboard_transform );
 }
 
-static void render_world_depth( m4x4f projection, m4x3f camera )
+VG_STATIC void render_world_depth( m4x4f projection, m4x3f camera )
 {
    m4x3f identity_matrix;
    m4x3_identity( identity_matrix );
@@ -240,8 +241,8 @@ static void render_world_depth( m4x4f projection, m4x3f camera )
    shader_gpos_uPv( projection );
    shader_gpos_uMdl( identity_matrix );
    
-   scene_bind( &world.geo );
-   scene_draw( &world.geo );
+   mesh_bind( &world.mesh_geo );
+   mesh_draw( &world.mesh_geo );
 
 #if 0
    glDisable(GL_CULL_FACE);