//----------------------------------------------------------------------------- // Purpose: // Input : *actor - // *parameters - //----------------------------------------------------------------------------- void CBaseFlex::AddFlexSequence( CExpressionInfo *info ) { if ( !info ) return; CChoreoEvent *event = info->m_pEvent; if ( !event ) return; CChoreoScene *scene = info->m_pScene; if ( !scene ) return; if (info->m_iLayer >= 0) { SetLayerWeight( info->m_iLayer, event->GetIntensity( scene->GetTime() ) ); } }
//----------------------------------------------------------------------------- // Purpose: // Input : *actor - // *parameters - //----------------------------------------------------------------------------- void CBaseFlex::AddFlexGesture( CExpressionInfo *info ) { if ( !info ) return; CChoreoEvent *event = info->m_pEvent; if ( !event ) return; CChoreoScene *scene = info->m_pScene; if ( !scene ) return; if (info->m_iLayer >= 0) { // this happens after StudioFrameAdvance() float duration = event->GetDuration( ); float orig_duration = SequenceDuration( info->m_nSequence ); // when we come by again after StudioFrameAdvance() has moved forward 0.1 seconds, what frame should we be on? float flCycle = GetLayerCycle( info->m_iLayer ); float flNextCycle = event->GetShiftedTimeFromReferenceTime( (m_flAnimTime - info->m_flStartAnim + 0.1) / duration ); // FIXME: what time should this use? SetLayerWeight( info->m_iLayer, event->GetIntensity( scene->GetTime() ) ); float rate = (flNextCycle - flCycle) * orig_duration / 0.1; /* Msg( "%d : %.2f (%.2f) : %.3f %.3f : %.3f\n", info->m_iLayer, scene->GetTime(), (scene->GetTime() - event->GetStartTime()) / duration, flCycle, flNextCycle, rate ); */ SetLayerPlaybackRate( info->m_iLayer, rate ); } }
//----------------------------------------------------------------------------- // Purpose: // Input : *event - //----------------------------------------------------------------------------- void CBaseFlex::AddFlexAnimation( CExpressionInfo *info ) { if ( !info ) return; CChoreoEvent *event = info->m_pEvent; if ( !event ) return; CChoreoScene *scene = info->m_pScene; if ( !scene ) return; if ( !event->GetTrackLookupSet() ) { // Create lookup data for ( int i = 0; i < event->GetNumFlexAnimationTracks(); i++ ) { CFlexAnimationTrack *track = event->GetFlexAnimationTrack( i ); if ( !track ) continue; if ( track->IsComboType() ) { char name[ 512 ]; Q_strncpy( name, "right_" ,sizeof(name)); strcat( name, track->GetFlexControllerName() ); track->SetFlexControllerIndex( 0, FindFlexController( name ), 0 ); Q_strncpy( name, "left_" ,sizeof(name)); strcat( name, track->GetFlexControllerName() ); track->SetFlexControllerIndex( 0, FindFlexController( name ), 1 ); } else { track->SetFlexControllerIndex( 0, FindFlexController( (char *)track->GetFlexControllerName() ) ); } } event->SetTrackLookupSet( true ); } float scenetime = scene->GetTime(); float weight = event->GetIntensity( scenetime ); // Compute intensity for each track in animation and apply // Iterate animation tracks for ( int i = 0; i < event->GetNumFlexAnimationTracks(); i++ ) { CFlexAnimationTrack *track = event->GetFlexAnimationTrack( i ); if ( !track ) continue; // Disabled if ( !track->IsTrackActive() ) continue; // Map track flex controller to global name if ( track->IsComboType() ) { for ( int side = 0; side < 2; side++ ) { int controller = track->GetFlexControllerIndex( side ); // Get spline intensity for controller float flIntensity = track->GetIntensity( scenetime, side ); if ( controller >= 0 ) { float orig = GetFlexWeight( controller ); SetFlexWeight( controller, orig * (1 - weight) + flIntensity * weight ); } } } else { int controller = track->GetFlexControllerIndex( 0 ); // Get spline intensity for controller float flIntensity = track->GetIntensity( scenetime, 0 ); if ( controller >= 0 ) { float orig = GetFlexWeight( controller ); SetFlexWeight( controller, orig * (1 - weight) + flIntensity * weight ); } } } info->m_bStarted = true; }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CBaseFlex::AddSceneExpressions( void ) { // Iterate expressions and look for active slots for ( int i = 0; i < m_Expressions.Count(); i++ ) { CExpressionInfo *info = &m_Expressions[ i ]; Assert( info ); // FIXME: Need a safe handle to m_pEvent in case of memory deletion? CChoreoEvent *event = info->m_pEvent; Assert( event ); CChoreoScene *scene = info->m_pScene; Assert( scene ); switch ( event->GetType() ) { case CChoreoEvent::FLEXANIMATION: { if ( event->HasEndTime() ) { AddFlexAnimation( info ); } } break; case CChoreoEvent::EXPRESSION: { // Expressions have to have an end time!!! if ( event->HasEndTime() ) { // Look up the actual strings const char *scenefile = event->GetParameters(); const char *name = event->GetParameters2(); // Have to find both strings if ( scenefile && name ) { // Find the scene file flexsettinghdr_t *pExpHdr = ( flexsettinghdr_t * )FindSceneFile( scenefile ); if ( pExpHdr ) { flexsettinghdr_t *pOverrideHdr = NULL; // Find overrides, if any exist studiohdr_t *hdr = GetModelPtr(); if ( hdr && scene_allowoverrides.GetBool() ) { char overridefile[ 512 ]; char shortname[ 128 ]; char modelname[ 128 ]; //Q_strncpy( modelname, modelinfo->GetModelName( model ) ,sizeof(modelname)); Q_strncpy( modelname, hdr->name ,sizeof(modelname)); // Fix up the name Extract_FileBase( modelname, shortname ); Q_snprintf( overridefile,sizeof(overridefile), "%s/%s", shortname, scenefile ); pOverrideHdr = ( flexsettinghdr_t * )FindSceneFile( overridefile ); } float scenetime = scene->GetTime(); float scale = event->GetIntensity( scenetime ); // Add the named expression AddExpression( name, scale, pExpHdr, pOverrideHdr, !info->m_bStarted ); } } } } break; case CChoreoEvent::SEQUENCE: { AddFlexSequence( info ); } break; case CChoreoEvent::GESTURE: { AddFlexGesture( info ); } break; default: break; } /* float scenetime = scene->GetTime(); float scale = event->GetIntensity( scenetime ); Msg( "%s %f : ", event->GetName(), scale ); // Add the named expression AddExpression( name, scale, pExpHdr, pOverrideHdr, !info->m_bStarted ); */ info->m_bStarted = true; } }