/* * 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; } cl.cin.absPrevTime = cl.cin.absCurrentTime; cl.cin.absCurrentTime = SCR_CinematicTime(); if( cl.cin.paused ) { return; } cl.cin.currentTime += cl.cin.absCurrentTime - cl.cin.absPrevTime; if( !CIN_NeedNextFrame( cl.cin.h, cl.cin.currentTime ) ) { cl.cin.redraw = qfalse; return; } // read next frame SCR_ReadNextCinematicFrame(); if( !cl.cin.pic ) { // end of cinematic SCR_FinishCinematic(); return; } }
/* * SCR_PlayCinematic */ static void SCR_PlayCinematic( const char *arg, int flags ) { struct cinematics_s *cin; CL_SoundModule_Clear(); cin = CIN_Open( arg, 0, qfalse, qtrue ); if( !cin ) { Com_Printf( "SCR_PlayCinematic: couldn't find %s\n", arg ); return; } CL_Disconnect( NULL ); cl.cin.h = cin; cl.cin.keepRatio = (flags & 1) ? qfalse : qtrue; cl.cin.allowConsole = (flags & 2) ? qfalse : qtrue; cl.cin.paused = qfalse; cl.cin.absStartTime = cl.cin.absCurrentTime = cl.cin.absPrevTime = SCR_CinematicTime(); cl.cin.currentTime = 0; CL_SetClientState( CA_CINEMATIC ); CL_SoundModule_StopAllSounds(); SCR_EndLoadingPlaque(); SCR_ReadNextCinematicFrame(); }
/* * 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; } }
/* * SCR_PlayCinematic */ static void SCR_PlayCinematic( char *arg ) { int len; size_t name_size; static cinematics_t clientCin; cinematics_t *cin = cl.cin = &clientCin; roq_chunk_t *chunk = &cin->chunk; name_size = strlen( "video/" ) + strlen( arg ) + strlen( ".roq" ) + 1; cin->name = Mem_ZoneMalloc( name_size ); Q_snprintfz( cin->name, name_size, "video/%s", arg ); COM_DefaultExtension( cin->name, ".roq", name_size ); // nasty hack cin->s_rate = 22050; cin->s_width = 2; cin->width = cin->height = 0; cin->frame = 0; len = FS_FOpenFile( cin->name, &cin->file, FS_READ ); if( !cin->file || len < 1 ) { Com_Printf( "Couldn't find %s\n", cin->name ); SCR_StopCinematic(); return; } // read header RoQ_ReadChunk( cin ); if( chunk->id != RoQ_HEADER1 || chunk->size != RoQ_HEADER2 || chunk->argument != RoQ_HEADER3 ) { Com_Printf( "Invalid video file %s\n", cin->name ); SCR_StopCinematic(); return; } SCR_EndLoadingPlaque(); cin->headerlen = FS_Tell( cin->file ); cin->frame = 0; cin->pic = cin->pic_pending = SCR_ReadNextCinematicFrame(); cin->time = cls.realtime + 1; // add 1 msec so SCR_GetCinematicTime is also valid for early commands CL_SetClientState( CA_ACTIVE ); CL_SoundModule_StopAllSounds(); }
/* * SCR_RunCinematic */ void SCR_RunCinematic( void ) { unsigned int realtime; unsigned int frame; cinematics_t *cin; if( !SCR_GetCinematicTime() ) return; if( cls.key_dest != key_game ) { // stop if menu or console is up SCR_FinishCinematic(); return; } cin = ( cinematics_t * )cl.cin; realtime = cls.realtime; if( realtime <= cin->time ) return; frame = ( realtime - cin->time ) * (float)( RoQ_FRAMERATE ) / 1000; if( frame <= cin->frame ) return; if( frame > cin->frame + 1 ) { Com_Printf( "Dropped frame: %i > %i\n", frame, cin->frame + 1 ); cin->time = realtime - cin->frame * 1000 / RoQ_FRAMERATE; } cin->pic = cin->pic_pending; cin->pic_pending = SCR_ReadNextCinematicFrame(); if( !cin->pic_pending ) { SCR_FinishCinematic(); return; } }