From 2f83f15bbd26ebc277a02f7fc3de197a2b89b1bd Mon Sep 17 00:00:00 2001 From: hgn Date: Sun, 22 Sep 2024 14:40:18 +0100 Subject: [PATCH] basic cutscene player (armatures only) --- content_skaterift/maps/mp_hq/main.mdl | Bin 0 -> 115488 bytes content_skaterift/metascenes/test_scene.ms | Bin 0 -> 47272 bytes .../playermodels/skaterift_john/ch_john.mdl | Bin 123520 -> 130208 bytes playermodels/skaterift_john/ch_john.mdl | Bin 0 -> 125264 bytes skaterift_blender/sr_main.py | 7 +- skaterift_blender/sr_metascene.py | 25 +- src/array_file.c | 4 +- src/ent_npc.c | 2 +- src/entity.h | 4 +- src/metascene.c | 566 ++++++++++++++++++ src/metascene.h | 7 +- src/model.c | 1 + src/player_render.c | 2 +- src/skaterift.c | 4 + src/skeleton.h | 34 +- src/world_render.c | 2 + 16 files changed, 622 insertions(+), 36 deletions(-) create mode 100644 content_skaterift/maps/mp_hq/main.mdl create mode 100644 content_skaterift/metascenes/test_scene.ms create mode 100644 playermodels/skaterift_john/ch_john.mdl diff --git a/content_skaterift/maps/mp_hq/main.mdl b/content_skaterift/maps/mp_hq/main.mdl new file mode 100644 index 0000000000000000000000000000000000000000..e64efab46a4fe2b3e9df445bf6177abe9d83bdce GIT binary patch literal 115488 zcmcG12e=(o74@Z~Qi61W5Q_8?NT~AeJZk6!>4=a(LJ}Y$CZQ_i(iA}{f=W@EG?Cs^ z$h-3>53-G^S3QGGWrVshvM+bkE;t;D3#6fQe&{Ic(zCspC6; z_$&Lf4eZaR9(Q>E9}ilfyxt0(zc+f?*eMf6AH%=9j{Vsn`?G0dPn>q#l(GDy#+LZA z&JX{+(NiXl?)+i(&kjF!Qu&wc?@|92Fm}?k!;YCSZu~Ti`SUCL_oyfTZ0h9ECrm2- zq|tcI{_GO_v*V9F=D3M=)z*ULJwOzH?}#HNj`^@bB@@VDAY>*foFki}@NOmoKk7dGrxScdkdd=tJ{0mVzw&Fn;uyu~QBk zGkV(Sf^rjnx<_CBtx3lnb4&x{AAav2i;p~JGz@UlP1An8+Y@_q?2A9^z51N{ri?!P z@Cnlnn|vbv{Cl@t_4|D$j~@#Y-}KBbqX$i$HX6#_bkim~E%J*aj+-|1h_RE#4w*Q1 z+UR05b>nGcr@~15?M4%)f>$U|{-*^CX9MW}6Z?Is`(pjSZZz(_?1kQQK0jagj9Ke< zk6n4Weh8)byS!&&OZfv1N7?^hv6K(k|E1j4#@q7mjRLx1bMkuOm$&<-=g_mjCw(*7&>cECexotl@u7E<{9Cs@ zzQW%Ue)IgNFW9n4eLnnfT)^*j*Qc{Kd2!$DPg^aKFaKdz*SPPD&W>E+oi_DvG)4yZ zJK!(n*ZE8BseG(LaD8vjTR;AD7xl?b{X#__@*{m34eE}+lW)G&9bJv7Z?~U*V^m(o z!&Slk4*09ekNly)G-0y(Ds{HvI-d}3ZlpovE^v|h(l|K)CGRDu=(EpmZR?D91*MDf; z{TBYJ@*{t#JyU*cPrKiY@#FcCKI4Z|_gRR!#g3WYHRZG&^Xm{l%*XfovcUcW{!)IK z@7`Z(&y-L7J>TLjXa0JAcc4#^k4@H3%dh4@{tgN3U&K%0uPPrqMaNfrrhMw}`IhfZ z)=$rm^eO6L&iSkLeplD1?~KmRME#`wQCfrh9q?C`ANfn|sr<5jdV5;E%{hNn`3r{n zG#Z#+nlc|XJM&kgG054|=DWgQHsAI0=WlrXs6A6Y?eFcjOwF6)7u z>j%d3?7rz;efa4tNJ=^2FI#UE{5pTBJ(W-UNA|S!MlS0O(`U;J`{h8Nj&`kl%SUH+ z4FeAQ{waBxkBz|o1OD=SZy&X1%8%{ISfECgYWDtpkM>ai zXgyZmZMgHexM9ooJ{0q2c>L>Ld<*u*sP~}JaDfMs4kNx|l50-6m|MlL2_q410 zNFSSDiv7-|JD=Aaf&JHOXB}ns?{)d5{_=cpAGK%7r~N(u-39L{_FpHResJ#jULReb zA9np>&9T^jeec;<&Hf{u{ncNd@BO9rO!?H`^B=$GpeFYhBad7l_k6F9uFofJaYpmY z*nfRA;=scG(SAq$Rpm$fDYa+Hr~clay{}(W?7w!sVTZiRkMz;?`G~ZkQyZqx>vQv0F7e~+um19UZy&X1%8%`7@s=}xJ-^%OWBFL@cg7=sSDX5F^ApS8 zXnn5xDbM%zQG2HR*q)Z}P1aA(AL8Oc*XLHR@=pDX*5~T4Dj)IS?4$Nf`9=IVzSY~D z^H-H0>7(m&n=hIJ^VcAEzv?f~_x4eHrhMw}`8MAb@!23bLyY+slVqRx9AmI|Kzxjw�& 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 A3IG5A literal 0 HcmV?d00001 diff --git a/content_skaterift/metascenes/test_scene.ms b/content_skaterift/metascenes/test_scene.ms new file mode 100644 index 0000000000000000000000000000000000000000..a112cfadd3f981cfcb9e368b81115cb737e01e34 GIT binary patch literal 47272 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 literal 0 HcmV?d00001 diff --git a/content_skaterift/playermodels/skaterift_john/ch_john.mdl b/content_skaterift/playermodels/skaterift_john/ch_john.mdl index f5f3239df3bc5eb9568769f099f43dede3dca778..717ce52790341f33d32a0848132702c2d5d2fd82 100644 GIT binary patch delta 15371 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°BSe;d09SV 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 %u] x %u\n", - buffer, arr->item_size, stride, arr->item_count ); + vg_warn( "Applying alignment fixup to array '%s' [%u -> %u] x %u\n", + arr->name, arr->item_size, stride, arr->item_count ); if( stride > arr->item_size ) memset( buffer, 0, stride*arr->item_count ); diff --git a/src/ent_npc.c b/src/ent_npc.c index ce0ac3d..dac28f6 100644 --- a/src/ent_npc.c +++ b/src/ent_npc.c @@ -21,7 +21,7 @@ void npc_load_model( struct npc *npc, const char *path ) mdl_load_metadata_block( meta, vg_mem.rtmemory ); struct skeleton *sk = &npc->skeleton; - skeleton_setup( sk, vg_mem.rtmemory, meta ); + skeleton_setup( sk, meta, 0, vg_mem.rtmemory ); u32 mtx_size = sizeof(m4x3f)*sk->bone_count; npc->final_mtx = vg_linear_alloc( vg_mem.rtmemory, mtx_size ); diff --git a/src/entity.h b/src/entity.h index 5120052..d7d7360 100644 --- a/src/entity.h +++ b/src/entity.h @@ -66,7 +66,9 @@ enum entity_alias{ k_ent_list = 24, k_ent_region = 25, k_ent_glider = 26, - k_ent_npc = 27 + k_ent_npc = 27, + k_ent_armature = 28, + k_ent_max }; typedef struct ent_call ent_call; diff --git a/src/metascene.c b/src/metascene.c index 4bb0ca1..7c7c92c 100644 --- a/src/metascene.c +++ b/src/metascene.c @@ -43,3 +43,569 @@ void metascene_load( ms_context *ms, const char *path, void *alloc ) alloc, sizeof(ms_curve_keyframe) ); fclose( fp ); } + +struct +{ + ms_context meta; + void *arena; + + bool ready; + + struct model_ref + { + const char *name; + u32 name_hash; + + mdl_context mdl; + + struct cs_skeleton + { + struct skeleton sk; + u32 skinning_offset; + } + *skeletons; + u32 total_skinning_bones; + } + * refs; + u32 unique_refs; + + struct cs_instance + { + u32 ref_id; + m4x3f *skinning_data; + } + * instances; + u32 instance_count; + + struct cs_sampler + { + ms_strip *strip; + ms_override *override; + union + { + struct + { + ms_track *track; + f32 *target; + } + curves; + + struct + { + struct skeleton *ref_sk; + m4x3f *skinning_data; + } + skeleton; + }; + } + samplers[32]; + u32 active_samplers; + + u32 strip; + f32 time; +} +_cutscene; + +void cutscene_debug_ui( ui_context *ctx ) +{ + ms_strip *usage[8]; + for( u32 i=0; ioffset + usage[k]->length < strip->offset ) + { + usage[k] = NULL; + } + } + + if( !usage[k] ) + { + usage[k] = strip; + layer = k; + break; + } + } + + ui_rect box = { strip->offset, layer*32, strip->length, 30 }; + u32 ps = strip->pstr_name, + colour = *((u32 *)af_arritm( &_cutscene.meta.strings, ps )); + + ui_fill( ctx, box, colour | 0xff000000 ); + ui_text( ctx, box, ps_get( &_cutscene.meta.strings, ps ), 1, + k_ui_align_middle_center, 0 ); + } + + ui_fill( ctx, (ui_rect){ (f32)_cutscene.time*_cutscene.meta.info.framerate, + 0, 1, VG_ARRAY_LEN(usage)*32 }, 0xffffffff ); +} + +/* + * Find associated entity data. We should also probably do this on the world + * thingy + */ +struct cs_asoc +{ + mdl_context *orig_data; + u16 entity_type, + entity_index; + ms_override *override; +}; + +static void _cutscene_override_asoc( u32 instance_id, u32 override_index, + struct cs_asoc *out_asoc ) +{ + struct cs_instance *instance = &_cutscene.instances[ instance_id ]; + mdl_context *mdl = &_cutscene.refs[ instance->ref_id ].mdl; + + ms_instance *oins = af_arritm( &_cutscene.meta.instances, instance_id ); + ms_override *override = + af_arritm( &_cutscene.meta.overrides, + oins->override_start + override_index ); + + out_asoc->orig_data = mdl; + out_asoc->entity_type = override->entity_type; + out_asoc->override = override; + const char *name = ps_get( &_cutscene.meta.strings, override->pstr_name ); + + if( out_asoc->entity_type != 28 ) + goto NOT_IMPLEMENTED; + + u32 name_hash = vg_strdjb2( name ); + for( u32 j=0; jarmatures ); j ++ ) + { + mdl_armature *armature = af_arritm( &mdl->armatures, j ); + if( ps_consteq( &mdl->strings, armature->pstr_name, + name, name_hash ) ) + { + out_asoc->entity_index = j; + return; + } + } + +NOT_IMPLEMENTED: + + vg_fatal_condition(); + vg_warn( "The data association was not found.\n" + " Entity Type: %u\n" + " Entity name: %s\n", override->entity_type, name ); + vg_fatal_exit(); +} + +static void _cutscene_get_strip_asoc( ms_strip *strip, + struct cs_asoc *out_asoc ) +{ + if( strip->instance_id == 0xffffffff ) + { + out_asoc->orig_data = NULL;// &_cutscene.meta; + out_asoc->entity_type = mdl_entity_id_type( strip->object_id ); + out_asoc->entity_index = mdl_entity_id_id( strip->object_id ); + out_asoc->override = NULL; + } + else + { + _cutscene_override_asoc( strip->instance_id, strip->object_id, out_asoc ); + } +} + +static void sync_cutscene_loaded( void *payload, u32 size ) +{ + vg_info( "Cutscene ready\n" ); + _cutscene.ready = 1; +} + +static void cutscene_load_thread( void *data ) +{ + const char *path = data; + vg_info( "Loading cutscene: %s\n", path ); + + u32 size = 20*1024*1024; + _cutscene.arena = + _vg_create_linear_allocator( NULL, size, VG_MEMORY_SYSTEM, "Cutscene" ); + + metascene_load( &_cutscene.meta, path, _cutscene.arena ); + + _cutscene.instance_count = af_arrcount( &_cutscene.meta.instances ); + _cutscene.instances = vg_linear_alloc( _cutscene.arena, + sizeof(struct cs_instance) * _cutscene.instance_count ); + + _cutscene.refs = NULL; + _cutscene.unique_refs = 0; + for( u32 i=0; i < _cutscene.instance_count; i ++ ) + { + ms_instance *instance = af_arritm( &_cutscene.meta.instances, i ); + const char *name = ps_get( &_cutscene.meta.strings, instance->pstr_name ); + + struct model_ref *ref = NULL; + u32 ref_id = 0; + + for( u32 j=0; j<_cutscene.unique_refs; j ++ ) + { + struct model_ref *ref_j = &_cutscene.refs[ j ]; + + if( ps_consteq( &_cutscene.meta.strings, instance->pstr_name, + ref_j->name, ref_j->name_hash ) ) + { + ref = ref_j; + ref_id = j; + break; + } + } + + if( !ref ) + { + _cutscene.refs = vg_linear_extend( _cutscene.arena, _cutscene.refs, + sizeof( struct model_ref ) ); + ref_id = _cutscene.unique_refs; + ref = &_cutscene.refs[ ref_id ]; + ref->name = name; + ref->name_hash = vg_strdjb2( name ); + vg_info( "Indexed reference '%s'\n", name ); + _cutscene.unique_refs ++; + } + + _cutscene.instances[ i ].ref_id = ref_id; + _cutscene.instances[ i ].skinning_data = NULL; + } + + /* load model data */ + for( u32 i=0; i<_cutscene.unique_refs; i ++ ) + { + struct model_ref *ref = &_cutscene.refs[ i ]; + char mdl_path_buf[ 512 ]; + vg_str mdl_path; + vg_strnull( &mdl_path, mdl_path_buf, sizeof(mdl_path_buf) ); + vg_strcat( &mdl_path, ref->name ); + vg_strcat( &mdl_path, ".mdl" ); + + vg_info( "Loading instance model: %s\n", mdl_path.buffer ); + mdl_open( &ref->mdl, mdl_path.buffer, _cutscene.arena ); + mdl_load_metadata_block( &ref->mdl, _cutscene.arena ); + mdl_async_full_load_std( &ref->mdl ); + mdl_close( &ref->mdl ); + + u32 skeleton_count = af_arrcount( &ref->mdl.armatures ); + if( skeleton_count ) + { + ref->skeletons = vg_linear_alloc( _cutscene.arena, + sizeof(struct cs_skeleton) * skeleton_count ); + + ref->total_skinning_bones = 0; + for( u32 j=0; jskeletons[ j ]; + skeleton_setup( &skele->sk, &ref->mdl, j, _cutscene.arena ); + skele->skinning_offset = ref->total_skinning_bones; + ref->total_skinning_bones += skele->sk.bone_count; + } + } + else + { + ref->skeletons = NULL; + ref->total_skinning_bones = 0; + } + } + + /* allocate skinning memory per-instance */ + for( u32 i=0; i<_cutscene.instance_count; i ++ ) + { + struct cs_instance *ins = &_cutscene.instances[ i ]; + struct model_ref *ref = &_cutscene.refs[ ins->ref_id ]; + + ins->skinning_data = vg_linear_alloc( _cutscene.arena, + sizeof(m4x3f) * ref->total_skinning_bones ); + + for( u32 j=0; jtotal_skinning_bones; j ++ ) + { + m4x3_identity( ins->skinning_data[ j ] ); + } + + /* load overrides */ + ms_instance *oins = af_arritm( &_cutscene.meta.instances, i ); + for( u32 j=0; joverride_count; j ++ ) + { + ms_override *override = + af_arritm( &_cutscene.meta.overrides, oins->override_start + j ); + + struct cs_asoc asoc; + _cutscene_override_asoc( i, j, &asoc ); + + VG_ASSERT( asoc.entity_type == 28 ); + + struct cs_skeleton *skele = &ref->skeletons[ asoc.entity_index ]; + + m4x3f mmdl; + mdl_transform_m4x3( &override->transform, mmdl ); + + for( u32 l=0; lsk.bone_count; l ++ ) + { + m4x3_copy( mmdl, ins->skinning_data[skele->skinning_offset+l] ); + } + } + } + + vg_async_call( sync_cutscene_loaded, NULL, 0 ); +} + +static int ccmd_cutscene_play( int argc, const char *argv[] ) +{ + if( argc == 1 ) + { + if( _cutscene.ready ) + { + vg_info( "Resetting cutscene..\n" ); + _cutscene.time = 0.0f; + _cutscene.strip = 0; + _cutscene.active_samplers = 0; + return 1; + } + + if( vg_loader_availible() ) + { + _cutscene.ready = 0; + _cutscene.time = 0.0f; + _cutscene.strip = 0; + _cutscene.active_samplers = 0; + + vg_linear_clear( vg_async.buffer ); + u32 len = strlen( argv[0] ) +1; + char *path_buf = vg_linear_alloc( vg_async.buffer, len ); + strcpy( path_buf, argv[0] ); + vg_loader_start( cutscene_load_thread, path_buf ); + return 1; + } + else + { + vg_error( "The loading thread is currently occupied.\n" ); + return 0; + } + } + else + { + vg_error( "Usage: cutscene path/to/cutscene.ms\n" ); + return 0; + } +} + +void cutscene_init(void) +{ + vg_console_reg_cmd( "cutscene", ccmd_cutscene_play, NULL ); +} + +/* + * Currently draws everything as skinned meshes. + */ +void cutscene_render_instance( struct cs_instance *ins, + world_instance *world, vg_camera *cam ) +{ + struct model_ref *ref = &_cutscene.refs[ ins->ref_id ]; + mdl_context *mdl = &ref->mdl; + mesh_bind( &mdl->mesh ); + + shader_model_character_view_use(); + shader_model_character_view_uCamera( cam->transform[3] ); + shader_model_character_view_uPv( cam->mtx.pv ); + shader_model_character_view_uDepthMode( 0 ); + + WORLD_BIND_LIGHT_BUFFERS_UB0_TEX234( world, model_character_view ); + + glActiveTexture( GL_TEXTURE0 ); + shader_model_character_view_uTexMain( 0 ); + + u32 armature_id = 0x00; + u32 material_id = 0x00; + + for( u32 i=0; imeshs ); i ++ ) + { + mdl_mesh *mesh = af_arritm( &mdl->meshs, i ); + VG_ASSERT( mesh->armature_id ); + + if( mesh->armature_id != armature_id ) + { + armature_id = mesh->armature_id; + u32 sk_index = mdl_entity_id_id( armature_id ); + + struct cs_skeleton *skele = &ref->skeletons[ sk_index ]; + + m4x3f *skinning_data = ins->skinning_data + skele->skinning_offset; + glUniformMatrix4x3fv( _uniform_model_character_view_uTransforms, + skele->sk.bone_count, + 0, + (const GLfloat *)skinning_data ); + } + + for( u32 j=0; jsubmesh_count; j ++ ) + { + mdl_submesh *sm = af_arritm( &mdl->submeshs, mesh->submesh_start+j ); + VG_ASSERT( sm->material_id ); + + if( sm->material_id != material_id ) + { + mdl_material *m = af_arritm( &mdl->materials, sm->material_id-1 ); + VG_ASSERT( m->shader == k_shader_standard ); + + struct shader_props_standard *props = m->props.compiled; + VG_ASSERT( props->tex_diffuse ); + + mdl_texture *tex = af_arritm( &mdl->textures, props->tex_diffuse-1); + glBindTexture( GL_TEXTURE_2D, tex->glname ); + } + + mdl_draw_submesh( sm ); + } + } +} + +void cutscene_update( f32 delta ) +{ + _cutscene.time += delta; + u32 frame = _cutscene.time * _cutscene.meta.info.framerate; + + /* clear out finished samplers */ + bool move = 0; + u32 j = 0; + for( u32 i=0; i<_cutscene.active_samplers; i ++ ) + { + struct cs_sampler *si = &_cutscene.samplers[i]; + + if( frame > (si->strip->offset + si->strip->length) ) + { + move = 1; + } + else + { + if( move ) + { + struct cs_sampler *sj = &_cutscene.samplers[j]; + *sj = *si; + } + + j ++; + } + } + _cutscene.active_samplers = j; + + /* add new samplers as we get to them */ + for( u32 i=_cutscene.strip; ioffset ) + { + break; + } + + if( frame > strip->offset + strip->length ) + { + vg_warn( "Skipping?\n" ); + _cutscene.strip ++; + continue; + } + + if( strip->instance_id == 0xffffffff ) + { + // TODO + _cutscene.strip ++; + continue; + } + + struct cs_instance *ins = &_cutscene.instances[ strip->instance_id ]; + + struct cs_asoc asoc; + _cutscene_get_strip_asoc( strip, &asoc ); + VG_ASSERT( asoc.entity_type == 28 ); + + if( strip->data_mode == 1 ) + { + for( u32 j=0; jdata_count; j ++ ) + { + ms_track *track = af_arritm( &_cutscene.meta.tracks, + strip->data_start + j ); + + VG_ASSERT( _cutscene.active_samplers < + VG_ARRAY_LEN(_cutscene.samplers) ); + + struct cs_sampler *samp = + &_cutscene.samplers[ _cutscene.active_samplers ++ ]; + samp->strip = strip; + samp->curves.track = track; + samp->curves.target = NULL; /* DOTO */ + samp->override = asoc.override; + } + } + else + { + VG_ASSERT( _cutscene.active_samplers < + VG_ARRAY_LEN(_cutscene.samplers) ); + + struct cs_sampler *samp = + &_cutscene.samplers[ _cutscene.active_samplers ++ ]; + + struct model_ref *ref = &_cutscene.refs[ ins->ref_id ]; + struct cs_skeleton *skele = &ref->skeletons[ asoc.entity_index ]; + + samp->strip = strip; + samp->skeleton.skinning_data = + &ins->skinning_data[ skele->skinning_offset ]; + samp->skeleton.ref_sk = &skele->sk; + samp->override = asoc.override; + } + + _cutscene.strip ++; + } + + /* sample da samplers */ + for( u32 i=0; i<_cutscene.active_samplers; i ++ ) + { + struct cs_sampler *samp = &_cutscene.samplers[ i ]; + + struct skeleton_anim temp_anim = + { + .strip = samp->strip, + .framerate = _cutscene.meta.info.framerate, + .keyframes_base = af_arritm( &_cutscene.meta.keyframes, + samp->strip->data_start ) + }; + + f32 t = _cutscene.time; + t -= (f32)samp->strip->offset / _cutscene.meta.info.framerate; + + struct skeleton *ref_sk = samp->skeleton.ref_sk; + m4x3f *final_mtx = samp->skeleton.skinning_data; + + ms_keyframe pose[32]; + skeleton_sample_anim( ref_sk, &temp_anim, t, pose ); + + skeleton_apply_pose( ref_sk, pose, + k_anim_apply_defer_ik, final_mtx ); + skeleton_apply_ik_pass( ref_sk, final_mtx ); + skeleton_apply_pose( ref_sk, pose, + k_anim_apply_deffered_only, final_mtx ); + skeleton_apply_inverses( ref_sk, final_mtx ); + + if( samp->override ) + { + m4x3f mmdl; + mdl_transform_m4x3( &samp->override->transform, mmdl ); + skeleton_apply_transform( ref_sk, mmdl, final_mtx ); + } + } +} + +void cutscene_render( world_instance *world, vg_camera *cam ) +{ + if( _cutscene.ready ) + { + for( u32 i=0; i<_cutscene.instance_count; i ++ ) + { + cutscene_render_instance( &_cutscene.instances[i], world, cam ); + } + } +} diff --git a/src/metascene.h b/src/metascene.h index 6b7685d..f95eedc 100644 --- a/src/metascene.h +++ b/src/metascene.h @@ -1,5 +1,6 @@ #pragma once #include "model.h" +#include "world.h" #define MS_VERSION_NR 1 #define MS_VERSION_MIN 1 @@ -43,7 +44,7 @@ struct ms_instance struct ms_override { - u32 pstr_name; + u32 entity_type, pstr_name; mdl_transform transform; }; @@ -74,3 +75,7 @@ struct ms_curve_keyframe }; void metascene_load( ms_context *ms, const char *path, void *alloc ); +void cutscene_init(void); +void cutscene_render( world_instance *world, vg_camera *cam ); +void cutscene_debug_ui( ui_context *ctx ); +void cutscene_update( f32 delta ); diff --git a/src/model.c b/src/model.c index fc7e387..e493096 100644 --- a/src/model.c +++ b/src/model.c @@ -528,4 +528,5 @@ void mdl_async_full_load_std( mdl_context *mdl ) VG_TEX2D_CLAMP|VG_TEX2D_NEAREST, &tex->glname ); } } + #endif diff --git a/src/player_render.c b/src/player_render.c index 1531c34..31346d7 100644 --- a/src/player_render.c +++ b/src/player_render.c @@ -54,7 +54,7 @@ void player_load_animation_reference( const char *path ) mdl_close( meta ); struct skeleton *sk = &localplayer.skeleton; - skeleton_setup( sk, vg_mem.rtmemory, meta ); + skeleton_setup( sk, meta, 0, vg_mem.rtmemory ); localplayer.id_world = skeleton_bone_id( sk, "world" ); localplayer.id_hip = skeleton_bone_id( sk, "hips" ); diff --git a/src/skaterift.c b/src/skaterift.c index b28ee45..1137548 100644 --- a/src/skaterift.c +++ b/src/skaterift.c @@ -163,6 +163,7 @@ void game_load(void) vg_loader_step( player_init, NULL ); vg_loader_step( player_ragdoll_init, NULL ); vg_loader_step( npc_init, NULL ); + vg_loader_step( cutscene_init, NULL ); /* content stuff */ vg_loader_step( addon_system_init, NULL ); @@ -240,6 +241,8 @@ void vg_pre_update(void) vg_slewf( &skaterift.time_rate, target, vg.time_frame_delta * (1.0f/0.3f) ); vg.time_rate = vg_smoothstepf( skaterift.time_rate ); + + cutscene_update( vg.time_rate * vg.time_frame_delta ); /* TODO: how can we compress this? */ ent_miniworld_preupdate(); @@ -607,6 +610,7 @@ void vg_gui( ui_context *ctx ) skaterift_replay_imgui( ctx ); workshop_form_gui( ctx ); remote_player_network_imgui( ctx, vg.pv ); + cutscene_debug_ui( ctx ); if( menu_viewing_map() ) { diff --git a/src/skeleton.h b/src/skeleton.h index 9a3be61..a62c3e3 100644 --- a/src/skeleton.h +++ b/src/skeleton.h @@ -16,7 +16,7 @@ struct skeleton u32 flags; int defer; - ms_keyframe kf; + //ms_keyframe kf; mdl_bone *orig_bone; u32 collider; @@ -34,8 +34,7 @@ struct skeleton *ik; u32 ik_count; - u32 - collider_count, + u32 collider_count, bindable_count; }; @@ -442,8 +441,7 @@ static void skeleton_alloc_from( struct skeleton *skele, } u32 bone_size = sizeof(struct skeleton_bone) * skele->bone_count, - ik_size = sizeof(struct skeleton_ik) * skele->ik_count, - mtx_size = sizeof(m4x3f) * skele->bone_count; + ik_size = sizeof(struct skeleton_ik) * skele->ik_count; skele->bones = vg_linear_alloc( lin_alloc, bone_size ); skele->ik = vg_linear_alloc( lin_alloc, ik_size ); @@ -457,18 +455,20 @@ static void skeleton_fatal_err(void){ } /* Setup a skeleton from model. mdl's metadata should stick around */ -static void skeleton_setup( struct skeleton *skele, - void *lin_alloc, mdl_context *mdl ){ +void skeleton_setup( struct skeleton *skele, mdl_context *mdl, u32 index, + void *lin_alloc ) +{ u32 ik_count = 0, collider_count = 0; skele->bone_count = 0; skele->bones = NULL; - if( !mdl->armatures.count ){ + if( !mdl->armatures.count ) + { vg_error( "No skeleton in model\n" ); skeleton_fatal_err(); } - mdl_armature *armature = af_arritm( &mdl->armatures, 0 ); + mdl_armature *armature = af_arritm( &mdl->armatures, index ); skeleton_alloc_from( skele, lin_alloc, mdl, armature ); for( u32 i=0; ibone_count; i++ ) @@ -520,22 +520,6 @@ static void skeleton_setup( struct skeleton *skele, skele->bones[0].parent = 0xffffffff; skele->bones[0].flags = 0; skele->bones[0].name = "[root]"; - - /* process animation quick refs */ - // for( u32 i=0; ianim_count; i++ ){ - // mdl_animation *anim = - // af_arritm( &mdl->animations, armature->anim_start+i ); - - // skele->anims[i].rate = anim->rate; - // skele->anims[i].length = anim->length; - // skele->anims[i].name = mdl_pstr(mdl, anim->pstr_name); - // skele->anims[i].anim_data = - // af_arritm( &mdl->keyframes, anim->offset ); - - // vg_info( "animation[ %f, %u ] '%s'\n", anim->rate, - // anim->length, - // skele->anims[i].name ); - // } skeleton_create_inverses( skele ); vg_success( "Loaded skeleton with %u bones\n", skele->bone_count ); diff --git a/src/world_render.c b/src/world_render.c index b7a6732..4075981 100644 --- a/src/world_render.c +++ b/src/world_render.c @@ -1018,6 +1018,8 @@ static void render_other_entities( world_instance *world, vg_camera *cam ) npc_update( npc ); npc_render( npc, world, cam ); } + + cutscene_render( world, cam ); } void render_world( world_instance *world, vg_camera *cam, -- 2.25.1