- free( mworld );
- scene_upload( &world.geo );
- bvh_create( &world.geo );
-
- water_compute_depth( world.geo.bbx );
-
- scene_init( &world.foliage );
- model *mfoliage = vg_asset_read("models/rs_foliage.mdl");
-
- v3f volume;
- v3_sub( world.geo.bbx[1], world.geo.bbx[0], volume );
- volume[1] = 1.0f;
-
- m4x3f transform;
-
- submodel *sm_blob = submodel_get( mfoliage, "blob" ),
- *sm_tree = submodel_get( mfoliage, "tree" );
-
- for( int i=0;i<100000;i++ )
- {
- v3f pos;
- v3_mul( volume, (v3f){ vg_randf(), 1000.0f, vg_randf() }, pos );
- v3_add( pos, world.geo.bbx[0], pos );
-
- ray_hit hit;
- hit.dist = INFINITY;
-
- if( ray_world( pos, (v3f){0.0f,-1.0f,0.0f}, &hit ))
- {
- if( hit.normal[1] > 0.8f && !ray_hit_is_ramp(&hit) &&
- hit.pos[1] > wrender.height )
- {
- v4f qsurface, qrandom;
- v3f axis;
-
- v3_cross( (v3f){0.0f,1.0f,0.0f}, hit.normal, axis );
-
- 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_randf()*VG_TAUf );
- q_mul( qsurface, qrandom, qsurface );
- q_m3x3( qsurface, transform );
-
- v3_copy( hit.pos, transform[3] );
-
- if( vg_randf() < 0.00000006f )
- {
- m3x3_identity( transform );
- scene_add_foliage( &world.foliage, mfoliage, sm_tree, transform );
- }
- else
- scene_add_foliage( &world.foliage, mfoliage, sm_blob, transform );
- }
- }