void *data = vg_linear_alloc( vg_mem.scratch, tex0->file.pack_size );
mdl_fread_pack_file( &font->mdl, &tex0->file, data );
- mdl_async_load_glmesh( &font->mdl, &font->mesh );
+ mdl_async_load_glmesh( &font->mdl, &font->mesh, NULL );
vg_tex2d_load_qoi_async( data, tex0->file.pack_size,
VG_TEX2D_LINEAR|VG_TEX2D_CLAMP,
&font->texture );
VG_TEX2D_LINEAR|VG_TEX2D_CLAMP,
&gui.icons_texture );
- mdl_async_load_glmesh( &gui.model_icons, &gui.icons_mesh );
+ mdl_async_load_glmesh( &gui.model_icons, &gui.icons_mesh, NULL );
mdl_close( &gui.model_icons );
}
void *data = vg_linear_alloc( vg_mem.scratch, tex0->file.pack_size );
mdl_fread_pack_file( &menu.model, &tex0->file, data );
- mdl_async_load_glmesh( &menu.model, &menu.mesh );
+ mdl_async_load_glmesh( &menu.model, &menu.mesh, NULL );
vg_tex2d_load_qoi_async( data, tex0->file.pack_size,
VG_TEX2D_LINEAR|VG_TEX2D_CLAMP,
&menu.texture );
job->indices, job->indice_count );
}
-static void mdl_async_load_glmesh( mdl_context *mdl, glmesh *mesh )
-{
+static void mdl_async_load_glmesh( mdl_context *mdl, glmesh *mesh,
+ u32 *fixup_table ){
mdl_array *arr_vertices = mdl_find_array( mdl, "mdl_vert" );
mdl_array *arr_indices = mdl_find_array( mdl, "mdl_indice" );
mdl_load_array_file_buffer( mdl, arr_indices, job->indices,
sizeof(mdl_indice) );
+ if( fixup_table ){
+ for( u32 i=0; i<job->vertex_count; i ++ ){
+ mdl_vert *vert = &job->verts[i];
+
+ for( u32 j=0; j<4; j++ ){
+ vert->groups[j] = fixup_table[vert->groups[j]];
+ }
+ }
+ }
+
/*
* Unpack the indices (if there are meshes)
* ---------------------------------------------------------
/* uploads the glmesh, and textures. everything is saved into the mdl_context */
static void mdl_async_full_load_std( mdl_context *mdl ){
- mdl_async_load_glmesh( mdl, &mdl->mesh );
+ mdl_async_load_glmesh( mdl, &mdl->mesh, NULL );
for( u32 i=0; i<mdl_arrcount( &mdl->textures ); i ++ ){
vg_linear_clear( vg_mem.scratch );
id_ik_knee_r,
id_wheel_l,
id_wheel_r,
- id_board;
+ id_board,
+ id_eyes;
}
static localplayer = {
.rb = {
localplayer.id_wheel_r = skeleton_bone_id( sk, "wheel.R" );
localplayer.id_ik_knee_l = skeleton_bone_id( sk, "knee.L" );
localplayer.id_ik_knee_r = skeleton_bone_id( sk, "knee.R" );
+ localplayer.id_eyes = skeleton_bone_id( sk, "eyes" );
setup_ragdoll_from_skeleton( sk, &localplayer.ragdoll );
/* TODO: Standard model load */
static void dynamic_model_load( mdl_context *ctx,
- struct dynamic_model_1texture *mdl,
- const char *path ){
+ struct dynamic_model_1texture *mdl,
+ const char *path, u32 *fixup_table ){
if( !mdl_arrcount( &ctx->textures ) )
vg_fatal_error( "No texture in model" );
VG_TEX2D_NEAREST|VG_TEX2D_CLAMP,
&mdl->texture );
- mdl_async_load_glmesh( ctx, &mdl->mesh );
+ mdl_async_load_glmesh( ctx, &mdl->mesh, fixup_table );
}
static void dynamic_model_unload( struct dynamic_model_1texture *mdl ){
mdl_open( &ctx, path, vg_mem.scratch );
mdl_load_metadata_block( &ctx, vg_mem.scratch );
- dynamic_model_load( &ctx, &board->mdl, path );
+ dynamic_model_load( &ctx, &board->mdl, path, NULL );
mdl_array_ptr markers;
MDL_LOAD_ARRAY( &ctx, &markers, ent_marker, vg_mem.scratch );
mdl_open( &ctx, path, vg_mem.scratch );
mdl_load_metadata_block( &ctx, vg_mem.scratch );
- dynamic_model_load( &ctx, &board->mdl, path );
+ if( !ctx.armatures.count )
+ vg_fatal_error( "No armature in playermodel\n" );
+ mdl_armature *armature = mdl_arritm( &ctx.armatures, 0 );
+
+ u32 fixup_table[ armature->bone_count+1 ];
+ for( u32 i=0; i<armature->bone_count+1; i ++ )
+ fixup_table[i] = 0;
+
+ for( u32 i=1; i<localplayer.skeleton.bone_count; i ++ ){
+ struct skeleton_bone *sb = &localplayer.skeleton.bones[i];
+ u32 hash = vg_strdjb2( sb->name );
+
+ for( u32 j=1; j<armature->bone_count; j ++ ){
+ mdl_bone *bone = mdl_arritm( &ctx.bones, armature->bone_start+j );
+
+ if( mdl_pstreq( &ctx, bone->pstr_name, sb->name, hash ) ){
+ fixup_table[j+1] = i;
+ break;
+ }
+ }
+ }
+
+ dynamic_model_load( &ctx, &board->mdl, path, fixup_table );
mdl_close( &ctx );
}
localplayer.holdout_time -= vg.time_frame_delta * 2.0f;
}
+ v3_fill( pose->keyframes[ localplayer.id_eyes-1 ].co, sinf(vg.time) );
+
apply_full_skeleton_pose( sk, &localplayer.pose, localplayer.final_mtx );
skeleton_debug( sk, localplayer.final_mtx );
static void dynamic_model_load( mdl_context *ctx,
struct dynamic_model_1texture *mdl,
- const char *path );
+ const char *path, u32 *fixup_table );
static void dynamic_model_unload( struct dynamic_model_1texture *mdl );
static void player_board_load( struct player_board *mdl, const char *path );
"\n"
"vec3 character_clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n"
"{\n"
-" float fresnel = 0.0*step(0.5,1.0 - abs(dot(normal,halfview)));\n"
+" float fresnel = 1.0 - abs(dot(normal,halfview));\n"
"\n"
" vec3 reflect_colour = mix( g_daysky_colour.rgb, g_sunset_colour.rgb, \n"
" g_sunset_phase );\n"
"\n"
"vec3 character_clearskies_lighting( vec3 normal, float shadow, vec3 halfview )\n"
"{\n"
-" float fresnel = 0.0*step(0.5,1.0 - abs(dot(normal,halfview)));\n"
+" float fresnel = 1.0 - abs(dot(normal,halfview));\n"
"\n"
" vec3 reflect_colour = mix( g_daysky_colour.rgb, g_sunset_colour.rgb, \n"
" g_sunset_phase );\n"
world_gates.sm_marker[i] = *sm;
}
- mdl_async_load_glmesh( &mgate, &world_gates.mesh );
+ mdl_async_load_glmesh( &mgate, &world_gates.mesh, NULL );
mdl_close( &mgate );
}
mdl_context msky;
mdl_open( &msky, "models/rs_skydome.mdl", vg_mem.scratch );
mdl_load_metadata_block( &msky, vg_mem.scratch );
- mdl_async_load_glmesh( &msky, &world_render.skydome );
+ mdl_async_load_glmesh( &msky, &world_render.skydome, NULL );
mdl_close( &msky );
vg_info( "Loading default world textures\n" );
mdl_context mscoreboard;
mdl_open( &mscoreboard, "models/rs_scoretext.mdl", vg_mem.scratch );
mdl_load_metadata_block( &mscoreboard, vg_mem.scratch );
- mdl_async_load_glmesh( &mscoreboard, &world_sfd.mesh_base );
+ mdl_async_load_glmesh( &mscoreboard, &world_sfd.mesh_base, NULL );
mdl_load_mesh_block( &mscoreboard, vg_mem.scratch );