add command for spawning glider
[carveJwlIkooP6JGAAIwe30JlM.git] / world_gen.c
index 3d705ab50156a0c5fa89c51bb03ab855147ad9e9..1bbc2ca21a7f52a6219e1cef80fdd36bad20480a 100644 (file)
@@ -46,7 +46,7 @@ static void world_add_all_if_material( m4x3f transform, scene_context *scene,
  * |        |
  * |________|
  */
-static void world_gen_add_blob( world_instance *world,
+static void world_gen_add_blob( vg_rand *rand, world_instance *world,
                                    scene_context *scene, ray_hit *hit )
 {
    m4x3f transform;
@@ -57,7 +57,7 @@ static void world_gen_add_blob( world_instance *world,
 
    float angle = v3_dot(hit->normal,(v3f){0.0f,1.0f,0.0f});
    q_axis_angle( qsurface, axis, angle );
-   q_axis_angle( qrandom, (v3f){0.0f,1.0f,0.0f}, vg_randf64()*VG_TAUf );
+   q_axis_angle( qrandom, (v3f){0.0f,1.0f,0.0f}, vg_randf64(rand)*VG_TAUf );
    q_mul( qsurface, qrandom, qsurface );
    q_m3x3( qsurface, transform );
    v3_copy( hit->pos, transform[3] );
@@ -109,7 +109,8 @@ static void world_apply_procedural_foliage( world_instance *world,
                                                scene_context *scene,
                                                struct world_surface *mat )
 {
-   if( vg.quality_profile == k_quality_profile_low )
+   if( (vg.quality_profile == k_quality_profile_low) ||
+       (vg.quality_profile == k_quality_profile_min) )
       return;
 
    vg_info( "Applying foliage (%u)\n", mat->info.pstr_name );
@@ -123,10 +124,8 @@ static void world_apply_procedural_foliage( world_instance *world,
    float area = volume[0]*volume[2];
    u32 particles = 0.08f * area;
 
-   /* TODO: Quasirandom? */
    vg_info( "Map area: %f. Max particles: %u\n", area, particles );
 
-
    u64 t0 = SDL_GetPerformanceCounter();
 #if 0
    for( u32 i=0; i<particles; i++ ){
@@ -148,6 +147,9 @@ static void world_apply_procedural_foliage( world_instance *world,
       }
    }
 #else
+
+   vg_rand rand;
+   vg_rand_seed( &rand, 3030 );
    
    const f32 tile_scale = 16.0f;
    v2i tiles = { volume[0]/tile_scale, volume[2]/tile_scale };
@@ -157,7 +159,7 @@ static void world_apply_procedural_foliage( world_instance *world,
    for( i32 x=0; x<tiles[0]; x ++ ){
       for( i32 z=0; z<tiles[1]; z ++ ){
          for( u32 i=0; i<per_tile; i ++ ){
-            v3f co = { (f32)x+vg_randf64(), 0.0f, (f32)z+vg_randf64() };
+            v3f co = { (f32)x+vg_randf64(&rand), 0, (f32)z+vg_randf64(&rand) };
             v3_muls( co, tile_scale, co );
             co[1] = 1000.0f;
             v3_add( co, world->scene_geo.bbx[0], co );
@@ -170,7 +172,7 @@ static void world_apply_procedural_foliage( world_instance *world,
                struct world_surface *m1 = ray_hit_surface( world, &hit );
                if((hit.normal[1] > 0.8f) && (m1 == mat) &&
                   (hit.pos[1] > 0.0f+10.0f)){
-                  world_gen_add_blob( world, scene, &hit );
+                  world_gen_add_blob( &rand, world, scene, &hit );
                   count ++;
                }
             }
@@ -265,19 +267,8 @@ static void world_gen_generate_meshes( world_instance *world ){
    /* need send off the memory to the gpu before we can create the bvh. */
    vg_async_stall();
    vg_info( "creating bvh\n" );
-
-   /* setup spacial mapping and rigidbody */
    world->geo_bh = scene_bh_create( world->heap, &world->scene_geo );
 
-   v3_zero( world->rb_geo.rb.co );
-   v3_zero( world->rb_geo.rb.v );
-   q_identity( world->rb_geo.rb.q );
-   v3_zero( world->rb_geo.rb.w );
-
-   world->rb_geo.type = k_rb_shape_scene;
-   world->rb_geo.inf.scene.bh_scene = world->geo_bh;
-   rb_init_object( &world->rb_geo );
-
    /*
     * Generate scene: non-collidable geometry
     * ----------------------------------------------------------------