semantics and world reloading
[carveJwlIkooP6JGAAIwe30JlM.git] / world_routes.h
index f5add0bb6ba162d336509e66935debc6b2dd288d..9308daa3b6a9e74cc660cbf3afcb97dedab47cae 100644 (file)
@@ -228,8 +228,9 @@ VG_STATIC void world_routes_debug( world_instance *world )
    }
 }
 
-VG_STATIC void world_routes_place_curve( world_instance *world,
-                                         v4f h[3], v3f n0, v3f n2 )
+VG_STATIC 
+void world_routes_place_curve( world_instance *world,
+                               v4f h[3], v3f n0, v3f n2, scene_context *scene )
 {
    float t;
    v3f p, pd;
@@ -294,8 +295,8 @@ VG_STATIC void world_routes_place_curve( world_instance *world,
          struct world_surface *surfa = ray_hit_surface( world, &ha ),
                               *surfb = ray_hit_surface( world, &hb );
 
-         if( (surfa->info.flags & k_material_flag_skate_surface) &&
-             (surfb->info.flags & k_material_flag_skate_surface) )
+         if( (surfa->info.flags & k_material_flag_skate_target) &&
+             (surfb->info.flags & k_material_flag_skate_target) )
          {
             scene_vert va, vb;
 
@@ -313,18 +314,18 @@ VG_STATIC void world_routes_place_curve( world_instance *world,
             vb.uv[0] = t1;
             vb.uv[1] = 1.0f;
 
-            scene_push_vert( world->scene_lines, &va );
-            scene_push_vert( world->scene_lines, &vb );
+            scene_push_vert( scene, &va );
+            scene_push_vert( scene, &vb );
 
             if( last_valid ){
                /* Connect them with triangles */
-               scene_push_tri( world->scene_lines, (u32[3]){ 
+               scene_push_tri( scene, (u32[3]){ 
                      last_valid+0-2, last_valid+1-2, last_valid+2-2} );
-               scene_push_tri( world->scene_lines, (u32[3]){ 
+               scene_push_tri( scene, (u32[3]){ 
                      last_valid+1-2, last_valid+3-2, last_valid+2-2} );
             }
             
-            last_valid = world->scene_lines->vertex_count;
+            last_valid = scene->vertex_count;
          }
          else
             last_valid = 0;
@@ -343,7 +344,9 @@ VG_STATIC void world_routes_place_curve( world_instance *world,
    }
 }
 
-VG_STATIC void world_routes_create_mesh( world_instance *world, u32 route_id )
+VG_STATIC 
+void world_routes_create_mesh( world_instance *world, u32 route_id, 
+                               scene_context *sc )
 {
    ent_route *route = mdl_arritm( &world->ent_route, route_id );
    u32 last_valid = 0;
@@ -448,14 +451,14 @@ VG_STATIC void world_routes_create_mesh( world_instance *world, u32 route_id )
          v3_normalize( n0 );
          v3_normalize( n2 );
 
-         world_routes_place_curve( world, p, n0, n2 );
+         world_routes_place_curve( world, p, n0, n2, sc );
 
          /* --- */
          v4_copy( p[2], p[0] );
       }
    }
 
-   scene_copy_slice( world->scene_lines, &route->sm );
+   scene_copy_slice( sc, &route->sm );
 }
 
 /* 
@@ -464,7 +467,9 @@ VG_STATIC void world_routes_create_mesh( world_instance *world, u32 route_id )
 VG_STATIC void world_routes_generate( world_instance *world )
 {
    vg_info( "Generating route meshes\n" );
-   world->scene_lines = scene_init( world->heap, 200000, 300000 );
+   vg_async_item *call = scene_alloc_async( &world->scene_lines, 
+                                            &world->mesh_route_lines,
+                                            200000, 300000 );
 
    for( u32 i=0; i<mdl_arrcount(&world->ent_gate); i++ ){
       ent_gate *gate = mdl_arritm( &world->ent_gate, i );
@@ -506,15 +511,9 @@ VG_STATIC void world_routes_generate( world_instance *world )
    }
 
    for( u32 i=0; i<mdl_arrcount(&world->ent_route); i++ )
-      world_routes_create_mesh( world, i );
-
-   vg_acquire_thread_sync();
-   {
-      scene_upload( world->scene_lines, &world->mesh_route_lines );
-   }
-   vg_release_thread_sync();
-   vg_linear_del( world->heap, world->scene_lines );
+      world_routes_create_mesh( world, i, &world->scene_lines );
 
+   vg_async_dispatch( call, async_scene_upload );
    world_routes_clear( world );
 }
 
@@ -638,7 +637,7 @@ VG_STATIC void world_routes_fixedupdate( world_instance *world )
    rb_presolve_contacts( rb_contact_buffer, rb_contact_count );
 
    for( int i=0; i<rb_contact_count; i++ ){
-      rb_contact_restitution( rb_contact_buffer+i, vg_randf() );
+      rb_contact_restitution( rb_contact_buffer+i, vg_randf64() );
    }
 
    for( int i=0; i<6; i++ ){
@@ -820,13 +819,13 @@ VG_STATIC void world_routes_fracture( world_instance *world, ent_gate *gate,
             v3_muls( origin, -1.0f, particle->mlocal[3] );
 
             v3_copy( world_co, particle->obj.rb.co );
-            v3_muls( imp_v, 1.0f+vg_randf(), particle->obj.rb.v );
+            v3_muls( imp_v, 1.0f+vg_randf64(), particle->obj.rb.v );
             particle->obj.rb.v[1] += 2.0f;
 
             v4_copy( q, particle->obj.rb.q );
-            particle->obj.rb.w[0] = vg_randf()*2.0f-1.0f;
-            particle->obj.rb.w[1] = vg_randf()*2.0f-1.0f;
-            particle->obj.rb.w[2] = vg_randf()*2.0f-1.0f;
+            particle->obj.rb.w[0] = vg_randf64()*2.0f-1.0f;
+            particle->obj.rb.w[1] = vg_randf64()*2.0f-1.0f;
+            particle->obj.rb.w[2] = vg_randf64()*2.0f-1.0f;
 
             particle->obj.type = k_rb_shape_sphere;
             particle->obj.inf.sphere.radius = r*0.6f;
@@ -891,7 +890,7 @@ VG_STATIC void render_world_routes( world_instance *world, camera *cam,
                              cam, text->transform );
       }
 
-      shader_model_font_uOffset( (v3f){0.0f,0.0f,0.0f} );
+      shader_model_font_uOffset( (v4f){0.0f,0.0f,0.0f,1.0f} );
 
       for( u32 i=0; i<world_global.text_particle_count; i++ ){
          struct text_particle *particle = &world_global.text_particles[i];