point maps (wip)
[carveJwlIkooP6JGAAIwe30JlM.git] / world_render.h
index f61974e37e791f0b7384b17ef384416086c791b6..10e416325b306529daa4ec9d0f6f2faa369098b2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2021-2022 Mt.ZERO Software, Harry Godden - All Rights Reserved
+ * Copyright (C) 2021-2023 Mt.ZERO Software, Harry Godden - All Rights Reserved
  */
 
 #ifndef WORLD_RENDER_H
@@ -8,62 +8,60 @@
 #include "camera.h"
 #include "world.h"
 
-/* FIXME */
-VG_STATIC vg_tex2d tex_terrain_noise = { .path = "textures/garbage.qoi",
-                                         .flags = VG_TEXTURE_NEAREST };
+VG_STATIC GLuint tex_terrain_noise;
 
-VG_STATIC void world_render_init(void)
+VG_STATIC void async_world_render_init( void *payload, u32 size )
 {
-   vg_info( "Loading default world textures\n" );
-
-   vg_acquire_thread_sync();
-   {
-      vg_tex2d_init( (vg_tex2d *[]){ &tex_terrain_noise }, 1 );
-
+   vg_info( "Allocate uniform buffers\n" );
+   for( int i=0; i<4; i++ ){
+      world_instance *world = &world_global.worlds[i];
+      world->ubo_bind_point = i;
+
+      glGenBuffers( 1, &world->ubo_lighting );
+      glBindBuffer( GL_UNIFORM_BUFFER, world->ubo_lighting );
+      glBufferData( GL_UNIFORM_BUFFER, sizeof(struct ub_world_lighting), 
+                    NULL, GL_DYNAMIC_DRAW );
+
+      glBindBufferBase( GL_UNIFORM_BUFFER, i, world->ubo_lighting );
+      VG_CHECK_GL_ERR();
+   }
 
-      vg_info( "Allocate uniform buffers\n" );
-      for( int i=0; i<4; i++ )
-      {
-         world_instance *world = &world_global.worlds[i];
-         world->ubo_bind_point = i;
+   vg_info( "Allocate frame buffers\n" );
+   for( int i=0; i<4; i++ ){
+      world_instance *world = &world_global.worlds[i];
+      struct framebuffer *fb = &world->heightmap;
+
+      fb->display_name = NULL;
+      fb->link = NULL;
+      fb->fixed_w = 1024;
+      fb->fixed_h = 1024;
+      fb->resolution_div = 0;
+
+      fb->attachments[0].display_name     = NULL;
+      fb->attachments[0].purpose = k_framebuffer_attachment_type_texture;
+      fb->attachments[0].internalformat   = GL_RG16F;
+      fb->attachments[0].format           = GL_RG;
+      fb->attachments[0].type             = GL_FLOAT;
+      fb->attachments[0].attachment       = GL_COLOR_ATTACHMENT0;
+
+      fb->attachments[1].purpose = k_framebuffer_attachment_type_none;
+      fb->attachments[2].purpose = k_framebuffer_attachment_type_none;
+      fb->attachments[3].purpose = k_framebuffer_attachment_type_none;
+      fb->attachments[4].purpose = k_framebuffer_attachment_type_none;
+
+      render_fb_allocate( fb );
+   }
+}
 
-         glGenBuffers( 1, &world->ubo_lighting );
-         glBindBuffer( GL_UNIFORM_BUFFER, world->ubo_lighting );
-         glBufferData( GL_UNIFORM_BUFFER, sizeof(struct ub_world_lighting), 
-                       NULL, GL_DYNAMIC_DRAW );
+VG_STATIC void world_render_init(void)
+{
+   vg_info( "Loading default world textures\n" );
 
-         glBindBufferBase( GL_UNIFORM_BUFFER, i, world->ubo_lighting );
-         VG_CHECK_GL_ERR();
-      }
+   vg_tex2d_load_qoi_async_file( "textures/garbage.qoi", 
+                                 VG_TEX2D_NEAREST|VG_TEX2D_REPEAT, 
+                                 &tex_terrain_noise );
 
-      vg_info( "Allocate frame buffers\n" );
-      for( int i=0; i<4; i++ )
-      {
-         world_instance *world = &world_global.worlds[i];
-         struct framebuffer *fb = &world->heightmap;
-
-         fb->display_name = NULL;
-         fb->link = NULL;
-         fb->fixed_w = 1024;
-         fb->fixed_h = 1024;
-         fb->resolution_div = 0;
-
-         fb->attachments[0].display_name     = NULL;
-         fb->attachments[0].purpose = k_framebuffer_attachment_type_texture;
-         fb->attachments[0].internalformat   = GL_RG16F;
-         fb->attachments[0].format           = GL_RG;
-         fb->attachments[0].type             = GL_FLOAT;
-         fb->attachments[0].attachment       = GL_COLOR_ATTACHMENT0;
-
-         fb->attachments[1].purpose = k_framebuffer_attachment_type_none;
-         fb->attachments[2].purpose = k_framebuffer_attachment_type_none;
-         fb->attachments[3].purpose = k_framebuffer_attachment_type_none;
-         fb->attachments[4].purpose = k_framebuffer_attachment_type_none;
-
-         render_fb_allocate( fb );
-      }
-   }
-   vg_release_thread_sync();
+   vg_async_call( async_world_render_init, NULL, 0 );
 }
 
 VG_STATIC void world_link_lighting_ub( world_instance *world, GLuint shader )
@@ -106,7 +104,8 @@ VG_STATIC void render_world_depth( world_instance *world, camera *cam );
 
 VG_STATIC void bind_terrain_noise(void)
 {
-   vg_tex2d_bind( &tex_terrain_noise, 0 );
+   glActiveTexture( GL_TEXTURE0 );
+   glBindTexture( GL_TEXTURE_2D, tex_terrain_noise );
 }
 
 struct world_pass{
@@ -203,7 +202,8 @@ VG_STATIC void render_world_vb( world_instance *world, camera *cam )
    world_bind_light_index( world, _shader_scene_vertex_blend.id,
                                 _uniform_scene_vertex_blend_uLightsIndex, 4 );
 
-   vg_tex2d_bind( &tex_terrain_noise, 0 );
+   glActiveTexture( GL_TEXTURE0 );
+   glBindTexture( GL_TEXTURE_2D, tex_terrain_noise );
 
    shader_scene_vertex_blend_uPv( cam->mtx.pv );
    shader_scene_vertex_blend_uCamera( cam->transform[3] );
@@ -308,7 +308,8 @@ VG_STATIC void render_terrain( world_instance *world, camera *cam )
    world_bind_light_index( world, _shader_scene_terrain.id,
                            _uniform_scene_terrain_uLightsIndex, 4 );
 
-   vg_tex2d_bind( &tex_terrain_noise, 0 );
+   glActiveTexture( GL_TEXTURE0 );
+   glBindTexture( GL_TEXTURE_2D, tex_terrain_noise );
 
    shader_scene_terrain_uPv( cam->mtx.pv );
    shader_scene_terrain_uCamera( cam->transform[3] );
@@ -360,7 +361,8 @@ VG_STATIC void render_sky( world_instance *world, camera *cam )
    shader_model_sky_uTexGarbage(0);
    world_link_lighting_ub( world, _shader_model_sky.id );
 
-   vg_tex2d_bind( &tex_terrain_noise, 0 );
+   glActiveTexture( GL_TEXTURE0 );
+   glBindTexture( GL_TEXTURE_2D, tex_terrain_noise );
 
    glDepthMask( GL_FALSE );
    glDisable( GL_DEPTH_TEST );
@@ -376,7 +378,6 @@ VG_STATIC void render_world_gates( world_instance *world, camera *cam,
                                    int layer_depth )
 {
    float closest = INFINITY;
-
    struct ent_gate *gate = NULL;
 
    for( u32 i=0; i<mdl_arrcount(&world->ent_gate); i++ ){
@@ -404,8 +405,11 @@ VG_STATIC void render_world_gates( world_instance *world, camera *cam,
          render_gate( world, gate, cam, layer_depth );
       }
       else if( gate->type == k_gate_type_nonlocel ){
-         world_instance *dest_world = &world_global.worlds[ gate->target ];
-         render_gate( dest_world, gate, cam, layer_depth );
+         if( skaterift.async_op != k_async_op_world_loading &&
+             skaterift.async_op != k_async_op_world_preloading ){
+            world_instance *dest_world = &world_global.worlds[ gate->target ];
+            render_gate( dest_world, gate, cam, layer_depth );
+         }
       }
       else
          world->rendering_gate = NULL;
@@ -414,17 +418,16 @@ VG_STATIC void render_world_gates( world_instance *world, camera *cam,
 
 VG_STATIC void world_prerender( world_instance *world )
 {
-   static double g_time = 0.0;
-   g_time += vg.time_delta * (1.0/(k_day_length*60.0));
+   world->time += vg.time_delta * (1.0/(k_day_length*60.0));
 
    struct ub_world_lighting *state = &world->ub_lighting;
 
-   state->g_time = g_time;
+   state->g_time = world->time;
    state->g_realtime = vg.time;
    state->g_debug_indices = k_debug_light_indices;
    state->g_light_preview = k_light_preview;
    state->g_debug_complexity = k_debug_light_complexity;
-state->g_time_of_day = vg_fractf( g_time );
+   state->g_time_of_day = vg_fractf( world->time );
    state->g_day_phase   = cosf( state->g_time_of_day * VG_PIf * 2.0f );
    state->g_sunset_phase= cosf( state->g_time_of_day * VG_PIf * 4.0f + VG_PIf );
 
@@ -437,9 +440,7 @@ state->g_time_of_day = vg_fractf( g_time );
    state->g_sun_dir[2] = 0.2f;
    v3_normalize( state->g_sun_dir );
 
-
    world->probabilities[ k_probability_curve_constant ] = 1.0f;
-
    float dp = state->g_day_phase;
 
    world->probabilities[ k_probability_curve_wildlife_day ] =
@@ -447,12 +448,12 @@ state->g_time_of_day = vg_fractf( g_time );
    world->probabilities[ k_probability_curve_wildlife_night ] = 
       1.0f-powf(fabsf((state->g_time_of_day-0.5f)*5.0f),5.0f);
       
-
    glBindBuffer( GL_UNIFORM_BUFFER, world->ubo_lighting );
    glBufferSubData( GL_UNIFORM_BUFFER, 0, 
                     sizeof(struct ub_world_lighting), &world->ub_lighting );
 }
 
+VG_STATIC void skateshop_render(void);
 VG_STATIC void render_world( world_instance *world, camera *cam,
                              int layer_depth )
 {
@@ -464,25 +465,29 @@ VG_STATIC void render_world( world_instance *world, camera *cam,
    render_world_alphatest( world, cam );
    render_terrain( world, cam );
 
-   /* Render SFD's */
-   u32 closest = 0;
-   float min_dist = INFINITY;
+   if( layer_depth == 0 ){
+      skateshop_render();
+
+      /* Render SFD's */
+      u32 closest = 0;
+      float min_dist = INFINITY;
 
-   if( !mdl_arrcount( &world->ent_route ) )
-      return;
+      if( !mdl_arrcount( &world->ent_route ) )
+         return;
 
-   for( u32 i=0; i<mdl_arrcount( &world->ent_route ); i++ ){
-      ent_route *route = mdl_arritm( &world->ent_route, i );
-      float dist = v3_dist2( route->board_transform[3], cam->pos );
+      for( u32 i=0; i<mdl_arrcount( &world->ent_route ); i++ ){
+         ent_route *route = mdl_arritm( &world->ent_route, i );
+         float dist = v3_dist2( route->board_transform[3], cam->pos );
 
-      if( dist < min_dist ){
-         min_dist = dist;
-         closest = i;
+         if( dist < min_dist ){
+            min_dist = dist;
+            closest = i;
+         }
       }
-   }
 
-   ent_route *route = mdl_arritm( &world->ent_route, closest );
-   sfd_render( world, cam, route->board_transform );
+      ent_route *route = mdl_arritm( &world->ent_route, closest );
+      sfd_render( world, cam, route->board_transform );
+   }
 }
 
 VG_STATIC void render_world_depth( world_instance *world, camera *cam )