Beispiel #1
0
/*
* 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;
	}
}
Beispiel #2
0
/*
* 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;
}