/* * SCR_RunCinematic */ void SCR_RunCinematic( void ) { if( cls.state != CA_CINEMATIC ) { return; } if( ( cls.key_dest != key_game && cls.key_dest != key_console ) || (cls.key_dest == key_console && !SCR_AllowCinematicConsole()) ) { // stop if menu or console is up SCR_FinishCinematic(); return; } if( cl.cin.pause_cnt > 0 ) { return; } // CIN_NeedNextFrame is going to query us for raw samples length CIN_AddRawSamplesListener( cl.cin.h, NULL, &SCR_CinematicRawSamples, &SCR_CinematicGetRawSamplesLength ); if( !CIN_NeedNextFrame( cl.cin.h, SCR_CinematicTime() - cl.cin.startTime ) ) { cl.cin.redraw = false; return; } // read next frame SCR_ReadNextCinematicFrame(); if( !cl.cin.pic ) { // end of cinematic SCR_FinishCinematic(); return; } }
/* * CL_GameModule_AddRawSamplesListener */ static bool CL_GameModule_AddRawSamplesListener( struct cinematics_s *cin, void *listener, cg_raw_samples_cb_t rs, cg_get_raw_samples_cb_t grs ) { int i; cg_raw_samples_listener_t *cglistener, *freel; freel = NULL; cglistener = cg_raw_samples_listeners; for( i = 0; i < MAX_CGAME_RAW_SAMPLES_LISTENERS; i++ ) { if( !freel && !cglistener->inuse ) { // grab a free one freel = cglistener; } else if( cglistener->inuse && cglistener->cin == cin && cglistener->ptr == listener && cglistener->rs == rs && cglistener->grs == grs ) { // same listener return true; } cglistener++; } if( !freel ) { return false; } // fill in our proxy cglistener = freel; cglistener->inuse = true; cglistener->cin = cin; cglistener->ptr = listener; cglistener->load_seq = cg_load_seq; cglistener->rs = (cin_raw_samples_cb_t)rs; cglistener->grs = (cin_get_raw_samples_cb_t)grs; if( !CIN_AddRawSamplesListener( cin, cglistener, &CL_GameModule_RawSamples, &CL_GameModule_GetRawSamplesLength ) ) { // free listener cglistener->inuse = false; return false; } return true; }