//----------------------------------------------------------------------------- // Purpose: All events are leading edge triggered // Input : currenttime - // *event - //----------------------------------------------------------------------------- void C_SceneEntity::StartEvent( float currenttime, CChoreoScene *scene, CChoreoEvent *event ) { Assert( event ); if ( !Q_stricmp( event->GetName(), "NULL" ) ) { Scene_Printf( "%s : %8.2f: ignored %s\n", GetSceneFileName(), currenttime, event->GetDescription() ); return; } C_BaseFlex *pActor = NULL; CChoreoActor *actor = event->GetActor(); if ( actor ) { pActor = FindNamedActor( actor ); if ( NULL == pActor ) { // This can occur if we haven't been networked an actor yet... we need to queue it so that we can // fire off the start event as soon as we have the actor resident on the client. QueueStartEvent( currenttime, scene, event ); return; } } Scene_Printf( "%s : %8.2f: start %s\n", GetSceneFileName(), currenttime, event->GetDescription() ); switch ( event->GetType() ) { case CChoreoEvent::FLEXANIMATION: { if ( pActor ) { DispatchStartFlexAnimation( scene, pActor, event ); } } break; case CChoreoEvent::EXPRESSION: { if ( pActor ) { DispatchStartExpression( scene, pActor, event ); } } break; default: break; } }
void C_SceneEntity::PostDataUpdate( DataUpdateType_t updateType ) { BaseClass::PostDataUpdate( updateType ); char const *str = GetSceneFileName(); if ( updateType == DATA_UPDATE_CREATED ) { Assert( str && str[ 0 ] ); if ( str && str[ 0 ] ) { LoadSceneFromFile( str ); // Kill everything except flex events Assert( m_pScene ); if ( m_pScene ) { int types[ 2 ]; types[ 0 ] = CChoreoEvent::FLEXANIMATION; types[ 1 ] = CChoreoEvent::EXPRESSION; m_pScene->RemoveEventsExceptTypes( types, 2 ); } SetNextClientThink( CLIENT_THINK_ALWAYS ); } } // Playback state changed... if ( m_bWasPlaying != m_bIsPlayingBack ) { for(int i = 0; i < m_hActorList.Count() ; ++i ) { C_BaseFlex *actor = m_hActorList[ i ].Get(); if ( !actor ) continue; Assert( m_pScene ); if ( m_pScene ) { ClearSceneEvents( m_pScene, false ); if ( m_bIsPlayingBack ) { m_pScene->ResetSimulation(); actor->StartChoreoScene( m_pScene ); } else { m_pScene->ResetSimulation(); actor->RemoveChoreoScene( m_pScene ); } } } } }
void C_SceneEntity::ClearSceneEvents( CChoreoScene *scene, bool canceled ) { if ( !m_pScene ) return; Scene_Printf( "%s : %8.2f: clearing events\n", GetSceneFileName(), m_flCurrentTime ); int i; for ( i = 0 ; i < m_pScene->GetNumActors(); i++ ) { C_BaseFlex *pActor = FindNamedActor( m_pScene->GetActor( i ) ); if ( !pActor ) continue; // Clear any existing expressions pActor->ClearSceneEvents( scene, canceled ); } WipeQueuedEvents(); }
//----------------------------------------------------------------------------- // Purpose: // Input : currenttime - // *event - //----------------------------------------------------------------------------- void C_SceneEntity::EndEvent( float currenttime, CChoreoScene *scene, CChoreoEvent *event ) { Assert( event ); if ( !Q_stricmp( event->GetName(), "NULL" ) ) { return; } C_BaseFlex *pActor = NULL; CChoreoActor *actor = event->GetActor(); if ( actor ) { pActor = FindNamedActor( actor ); } Scene_Printf( "%s : %8.2f: finish %s\n", GetSceneFileName(), currenttime, event->GetDescription() ); switch ( event->GetType() ) { case CChoreoEvent::FLEXANIMATION: { if ( pActor ) { DispatchEndFlexAnimation( scene, pActor, event ); } } break; case CChoreoEvent::EXPRESSION: { if ( pActor ) { DispatchEndExpression( scene, pActor, event ); } } break; default: break; } }
//----------------------------------------------------------------------------- // Purpose: All events are leading edge triggered // Input : currenttime - // *event - //----------------------------------------------------------------------------- void C_SceneEntity::StartEvent( float currenttime, CChoreoScene *scene, CChoreoEvent *event ) { Assert( event ); if ( !Q_stricmp( event->GetName(), "NULL" ) ) { Scene_Printf( "%s : %8.2f: ignored %s\n", GetSceneFileName(), currenttime, event->GetDescription() ); return; } C_BaseFlex *pActor = NULL; CChoreoActor *actor = event->GetActor(); if ( actor ) { pActor = FindNamedActor( actor ); if ( NULL == pActor ) { // This can occur if we haven't been networked an actor yet... we need to queue it so that we can // fire off the start event as soon as we have the actor resident on the client. QueueStartEvent( currenttime, scene, event ); return; } } Scene_Printf( "%s : %8.2f: start %s\n", GetSceneFileName(), currenttime, event->GetDescription() ); switch ( event->GetType() ) { case CChoreoEvent::FLEXANIMATION: { if ( pActor ) { DispatchStartFlexAnimation( scene, pActor, event ); } } break; case CChoreoEvent::EXPRESSION: { if ( pActor ) { DispatchStartExpression( scene, pActor, event ); } } break; case CChoreoEvent::GESTURE: { // Verify data. Assert( m_bMultiplayer ); Assert( scene != NULL ); Assert( event != NULL ); if ( pActor ) { DispatchStartGesture( scene, pActor, event ); } } break; case CChoreoEvent::SEQUENCE: { // Verify data. Assert( m_bMultiplayer ); Assert( scene != NULL ); Assert( event != NULL ); if ( pActor ) { DispatchStartSequence( scene, pActor, event ); } } break; case CChoreoEvent::LOOP: { // Verify data. Assert( m_bMultiplayer ); Assert( scene != NULL ); Assert( event != NULL ); DispatchProcessLoop( scene, event ); } case CChoreoEvent::SPEAK: { if ( IsClientOnly() && pActor ) { // FIXME: dB hack. soundlevel needs to be moved into inside of wav? soundlevel_t iSoundlevel = SNDLVL_TALKING; if ( event->GetParameters2() ) { iSoundlevel = (soundlevel_t)atoi( event->GetParameters2() ); if ( iSoundlevel == SNDLVL_NONE ) { iSoundlevel = SNDLVL_TALKING; } } DispatchStartSpeak( scene, pActor, event, iSoundlevel ); } } break; default: break; } event->m_flPrevTime = currenttime; }
void C_SceneEntity::PostDataUpdate( DataUpdateType_t updateType ) { BaseClass::PostDataUpdate( updateType ); char const *str = GetSceneFileName(); char szFilename[MAX_PATH]; if ( str ) { Assert( V_strlen( str ) < MAX_PATH ); V_strcpy( szFilename, str ); } else { szFilename[0] = '\0'; } char szSceneHWM[MAX_PATH]; if ( GetHWMorphSceneFileName( szFilename, szSceneHWM ) ) { V_strcpy( szFilename, szSceneHWM ); } if ( updateType == DATA_UPDATE_CREATED ) { Assert( szFilename && szFilename[ 0 ] ); if ( szFilename && szFilename[ 0 ] ) { LoadSceneFromFile( szFilename ); // Kill everything except flex events Assert( m_pScene ); // Should handle gestures and sequences clientside. if ( m_bMultiplayer ) { if ( m_pScene ) { int types[6]; types[0] = CChoreoEvent::FLEXANIMATION; types[1] = CChoreoEvent::EXPRESSION; types[2] = CChoreoEvent::GESTURE; types[3] = CChoreoEvent::SEQUENCE; types[4] = CChoreoEvent::SPEAK; types[5] = CChoreoEvent::LOOP; m_pScene->RemoveEventsExceptTypes( types, 6 ); } PrefetchAnimBlocks( m_pScene ); } else { if ( m_pScene ) { int types[ 2 ]; types[ 0 ] = CChoreoEvent::FLEXANIMATION; types[ 1 ] = CChoreoEvent::EXPRESSION; m_pScene->RemoveEventsExceptTypes( types, 2 ); } } SetNextClientThink( CLIENT_THINK_ALWAYS ); } } // Playback state changed... if ( m_bWasPlaying != m_bIsPlayingBack ) { for(int i = 0; i < m_hActorList.Count() ; ++i ) { C_BaseFlex *actor = m_hActorList[ i ].Get(); if ( !actor ) continue; Assert( m_pScene ); if ( m_pScene ) { ClearSceneEvents( m_pScene, false ); if ( m_bIsPlayingBack ) { m_pScene->ResetSimulation(); actor->StartChoreoScene( m_pScene ); } else { m_pScene->ResetSimulation(); actor->RemoveChoreoScene( m_pScene ); } } } } }