29e1e714b6453576dc9e510e5951fc6b0a227c83
12 #include "shaders/standard.h"
17 submodel sm_road
, sm_terrain
;
24 static void render_world( m4x4f projection
, m4x3f camera
)
28 m4x3f identity_matrix
;
29 m4x3_identity( identity_matrix
);
31 render_terrain( projection
, camera
[3] );
32 scene_bind( &world
.geo
);
33 scene_draw( &world
.geo
);
35 glDisable(GL_CULL_FACE
);
36 scene_bind( &world
.foliage
);
37 scene_draw( &world
.foliage
);
38 glEnable(GL_CULL_FACE
);
40 vg_line_boxf( world
.geo
.bbx
, 0xff00ffff );
43 static void ray_world_get_tri( ray_hit
*hit
, v3f tri
[3] )
45 for( int i
=0; i
<3; i
++ )
46 v3_copy( world
.geo
.verts
[ hit
->tri
[i
] ].co
, tri
[i
] );
49 static int ray_world( v3f pos
, v3f dir
, ray_hit
*hit
)
51 return bvh_raycast( &world
.geo
, pos
, dir
, hit
);
54 static int ray_hit_is_ramp( ray_hit
*hit
)
56 return hit
->tri
[0] < world
.sm_road
.vertex_count
;
59 static void world_load(void)
62 scene_init( &world
.geo
);
63 model
*mworld
= vg_asset_read( "models/mp_dev.mdl" );
65 for( int i
=0; i
<mworld
->layer_count
; i
++ )
67 submodel
*sm
= model_get_submodel( mworld
, i
);
68 if( !strcmp( sm
->material
, "surf" ) )
69 scene_add_model( &world
.geo
, mworld
, sm
, sm
->pivot
, 0.0f
, 1.0f
);
72 scene_copy_slice( &world
.geo
, &world
.sm_road
);
74 for( int i
=0; i
<mworld
->layer_count
; i
++ )
76 submodel
*sm
= model_get_submodel( mworld
, i
);
77 if( !strcmp( sm
->material
, "terrain" ) )
78 scene_add_model( &world
.geo
, mworld
, sm
, sm
->pivot
, 0.0f
, 1.0f
);
81 scene_copy_slice( &world
.geo
, &world
.sm_terrain
);
84 * TODO: Parametric marker import
86 v3_copy( model_marker_get( mworld
, "mp_dev_tutorial" )->co
, world
.tutorial
);
92 model_marker
*ga
= model_marker_get(mworld
,"gate_a"),
93 *gb
= model_marker_get(mworld
,"gate_a_recv");
95 v3_copy( ga
->co
, gate_a
.co
);
96 v3_copy( gb
->co
, gate_b
.co
);
97 v4_copy( ga
->q
, gate_a
.q
);
98 v4_copy( gb
->q
, gate_b
.q
);
99 v2_copy( ga
->s
, gate_a
.dims
);
100 v2_copy( gb
->s
, gate_b
.dims
);
102 gate_a
.other
= &gate_b
;
103 gate_b
.other
= &gate_a
;
105 gate_transform_update( &gate_a
);
106 gate_transform_update( &gate_b
);
111 * again, TODO: parametric import (material)
115 submodel
*sm
= submodel_get(mworld
,"mp_dev_water");
116 model_unpack_submodel( mworld
, &surf
, sm
);
119 water_set_surface( &surf
, sm
->pivot
[1] );
123 scene_upload( &world
.geo
);
124 bvh_create( &world
.geo
);
126 water_compute_depth( world
.geo
.bbx
);
128 scene_init( &world
.foliage
);
129 model
*mfoliage
= vg_asset_read("models/rs_foliage.mdl");
132 v3_sub( world
.geo
.bbx
[1], world
.geo
.bbx
[0], volume
);
137 submodel
*sm_blob
= submodel_get( mfoliage
, "blob" ),
138 *sm_tree
= submodel_get( mfoliage
, "tree" );
140 for( int i
=0;i
<100000;i
++ )
143 v3_mul( volume
, (v3f
){ vg_randf(), 1000.0f
, vg_randf() }, pos
);
144 v3_add( pos
, world
.geo
.bbx
[0], pos
);
149 if( ray_world( pos
, (v3f
){0.0f
,-1.0f
,0.0f
}, &hit
))
151 if( hit
.normal
[1] > 0.8f
&& !ray_hit_is_ramp(&hit
) &&
152 hit
.pos
[1] > wrender
.height
)
154 v4f qsurface
, qrandom
;
157 v3_cross( (v3f
){0.0f
,1.0f
,0.0f
}, hit
.normal
, axis
);
159 float angle
= v3_dot(hit
.normal
,(v3f
){0.0f
,1.0f
,0.0f
});
160 q_axis_angle( qsurface
, axis
, angle
);
161 q_axis_angle( qrandom
, (v3f
){0.0f
,1.0f
,0.0f
}, vg_randf()*VG_TAUf
);
162 q_mul( qsurface
, qrandom
, qsurface
);
163 q_m3x3( qsurface
, transform
);
165 v3_copy( hit
.pos
, transform
[3] );
167 if( vg_randf() < 0.00000006f
)
169 m3x3_identity( transform
);
170 scene_add_foliage( &world
.foliage
, mfoliage
, sm_tree
, transform
);
173 scene_add_foliage( &world
.foliage
, mfoliage
, sm_blob
, transform
);
179 scene_upload( &world
.foliage
);