minor performance stuff
[carveJwlIkooP6JGAAIwe30JlM.git] / world_gen.c
index 2650539a48679dbc8957779da68003c9d1b74a2f..7c0f7560d74d205fb8127626bfd72d4e413d7519 100644 (file)
@@ -136,7 +136,8 @@ VG_STATIC void world_apply_procedural_foliage( world_instance *world,
       ray_hit hit;
       hit.dist = INFINITY;
 
-      if( ray_world( world, pos, (v3f){0.0f,-1.0f,0.0f}, &hit )){
+      if( ray_world( world, pos, (v3f){0.0f,-1.0f,0.0f}, &hit, 
+                     k_material_flag_ghosts )){
          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 );
@@ -191,6 +192,10 @@ VG_STATIC void world_gen_generate_meshes( world_instance *world ){
                                     &world->meta, i );
 
       scene_copy_slice( &world->scene_geo, &surf->sm_geo );
+      scene_set_vertex_flags( &world->scene_geo, 
+                              surf->sm_geo.vertex_start,
+                              surf->sm_geo.vertex_count, 
+                              (u16)(surf->info.flags & 0xffff) );
    }
 
    /* compress that bad boy */
@@ -272,12 +277,12 @@ VG_STATIC void world_gen_generate_meshes( world_instance *world ){
    }
 
    /* unpack challenge models */
-   for( u32 i=0; i<mdl_arrcount( &world->ent_challenge ); i++ ){
-      ent_challenge *challenge = mdl_arritm( &world->ent_challenge, i );
+   for( u32 i=0; i<mdl_arrcount( &world->ent_objective ); i++ ){
+      ent_objective *objective = mdl_arritm( &world->ent_objective, i );
 
-      for( u32 j=0; j<challenge->submesh_count; j ++ ){
+      for( u32 j=0; j<objective->submesh_count; j ++ ){
          mdl_submesh *sm = mdl_arritm( &world->meta.submeshs, 
-                                       challenge->submesh_start+j );
+                                       objective->submesh_start+j );
          world_unpack_submesh_dynamic( world, &world->scene_no_collide, sm );
       }
    }
@@ -430,12 +435,14 @@ VG_STATIC void world_gen_compute_light_indices( world_instance *world ){
                v3f closest;
                closest_point_aabb( light->transform.co, bbx, closest );
 
-               float dist = v3_dist( closest, light->transform.co ),
-                     influence = 1.0f/(dist+1.0f);
+               f32 dist2 = v3_dist2( closest, light->transform.co );
 
-               if( dist > light->range )
+               if( dist2 > light->range*light->range )
                   continue;
 
+               f32 dist = sqrtf(dist2),
+                   influence = 1.0f/(dist+1.0f);
+
                if( light->type == k_light_type_spot){
                   v3f local;
                   m4x3_mulv( light->inverse_world, center, local );