bool CChoreoChannel::GetSortedCombinedEventList( char const *cctoken, CUtlRBTree< CChoreoEvent * >& events ) { events.RemoveAll(); int i; // Sort items int c = GetNumEvents(); for ( i = 0; i < c; i++ ) { CChoreoEvent *e = GetEvent( i ); Assert( e ); if ( e->GetType() != CChoreoEvent::SPEAK ) continue; if ( e->GetCloseCaptionType() == CChoreoEvent::CC_DISABLED ) continue; // A master with no slaves is not a combined event if ( e->GetCloseCaptionType() == CChoreoEvent::CC_MASTER && e->GetNumSlaves() == 0 ) continue; char const *token = e->GetCloseCaptionToken(); if ( Q_stricmp( token, cctoken ) ) continue; events.Insert( e ); } return ( events.Count() > 0 ) ? true : false; }
//gets the index of a specified event. It will return -1 if the event is not //found int32 CHotKey::GetEventIndex(const CUIEvent& Event) const { for(uint32 nCurrEvent = 0; nCurrEvent < GetNumEvents(); nCurrEvent++) { if(*(m_StartEventList[nCurrEvent]) == Event) { return nCurrEvent; } } return -1; }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CChoreoChannel::MarkForSaveAll( bool mark ) { SetMarkedForSave( mark ); int c = GetNumEvents(); for ( int i = 0; i < c; i++ ) { CChoreoEvent *e = GetEvent( i ); e->SetMarkedForSave( mark ); } }
//sorts the hotkeys events so that they will always be listed in the same //order, and make the menus look consistant void CHotKey::SortEvents() { //create a buffer CUIEvent* pEventList[256]; //copy all the keys into it uint32 nCurrKey; for(nCurrKey = 0; nCurrKey < GetNumEvents(); nCurrKey++) { pEventList[nCurrKey] = m_StartEventList[nCurrKey]; } ::qsort(&pEventList, GetNumEvents(), sizeof(CUIEvent*), SortKeysCallback); //now copy the list back for(nCurrKey = 0; nCurrKey < GetNumEvents(); nCurrKey++) { m_StartEventList[nCurrKey] = pEventList[nCurrKey]; } }
void CChoreoChannel::SaveToBuffer( CUtlBuffer& buf, CChoreoScene *pScene, IChoreoStringPool *pStringPool ) { buf.PutShort( pStringPool->FindOrAddString( GetName() ) ); int c = GetNumEvents(); Assert( c <= 255 ); buf.PutUnsignedChar( c ); for ( int i = 0; i < c; i++ ) { CChoreoEvent *e = GetEvent( i ); Assert( e ); e->SaveToBuffer( buf, pScene, pStringPool ); } buf.PutChar( GetActive() ? 1 : 0 ); }
WIA_DEV_CAP_DRV* CWIACapabilityManager::GetCommands() { return &m_CapabilityArray[GetNumEvents()]; }
// Compute master/slave, count, endtime info for close captioning data //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CChoreoChannel::ReconcileCloseCaption() { // Create a dictionary based on the combined token name CUtlDict< EventGroup, int > validSpeakEventsGroupedByName; int i; // Sort items int c = GetNumEvents(); for ( i = 0; i < c; i++ ) { CChoreoEvent *e = GetEvent( i ); Assert( e ); if ( e->GetType() != CChoreoEvent::SPEAK ) continue; CChoreoEvent::CLOSECAPTION type; type = e->GetCloseCaptionType(); if ( type == CChoreoEvent::CC_DISABLED ) { e->SetUsingCombinedFile( false ); e->SetRequiredCombinedChecksum( 0 ); e->SetNumSlaves( 0 ); e->SetLastSlaveEndTime( 0.0f ); continue; } char const *name = e->GetCloseCaptionToken(); if ( !name || !name[0] ) { // Fixup invalid slave tag if ( type == CChoreoEvent::CC_SLAVE ) { e->SetCloseCaptionType( CChoreoEvent::CC_MASTER ); e->SetUsingCombinedFile( false ); e->SetRequiredCombinedChecksum( 0 ); e->SetNumSlaves( 0 ); e->SetLastSlaveEndTime( 0.0f ); } continue; } int idx = validSpeakEventsGroupedByName.Find( name ); if ( idx == validSpeakEventsGroupedByName.InvalidIndex() ) { EventGroup eg; eg.timeSortedEvents.Insert( e ); validSpeakEventsGroupedByName.Insert( name, eg ); } else { EventGroup & eg = validSpeakEventsGroupedByName[ idx ]; eg.timeSortedEvents.Insert( e ); } } c = validSpeakEventsGroupedByName.Count(); // Now walk list of events by group if ( !c ) { return; } for ( i = 0; i < c; ++i ) { EventGroup & eg = validSpeakEventsGroupedByName[ i ]; int sortedEventInGroup = eg.timeSortedEvents.Count(); // If there's only one, just mark it valid if ( sortedEventInGroup <= 1 ) { CChoreoEvent *e = eg.timeSortedEvents[ 0 ]; Assert( e ); // Make sure it's the master e->SetCloseCaptionType( CChoreoEvent::CC_MASTER ); // Since it's by itself, can't be using "combined" file e->SetUsingCombinedFile( false ); e->SetRequiredCombinedChecksum( 0 ); e->SetNumSlaves( 0 ); e->SetLastSlaveEndTime( 0.0f ); continue; } // Okay, read them back in of start time int j = eg.timeSortedEvents.FirstInorder(); CChoreoEvent *master = NULL; while ( j != eg.timeSortedEvents.InvalidIndex() ) { CChoreoEvent *e = eg.timeSortedEvents[ j ]; if ( !master ) { master = e; e->SetCloseCaptionType( CChoreoEvent::CC_MASTER ); //e->SetUsingCombinedFile( true ); e->SetRequiredCombinedChecksum( 0 ); e->SetNumSlaves( sortedEventInGroup - 1 ); e->SetLastSlaveEndTime( e->GetEndTime() ); } else { // Keep bumping out the end time master->SetLastSlaveEndTime( e->GetEndTime() ); e->SetCloseCaptionType( CChoreoEvent::CC_SLAVE ); e->SetUsingCombinedFile( master->IsUsingCombinedFile() ); e->SetRequiredCombinedChecksum( 0 ); e->SetLastSlaveEndTime( 0.0f ); } j = eg.timeSortedEvents.NextInorder( j ); } } }
void CChoreoChannel::ReconcileGestureTimes() { // Sort gesture events within channel by starting time CUtlRBTree< CChoreoEvent * > sortedGestures( 0, 0, ChoreEventStartTimeLessFunc ); int i; // Sort items int c = GetNumEvents(); for ( i = 0; i < c; i++ ) { CChoreoEvent *e = GetEvent( i ); Assert( e ); if ( e->GetType() != CChoreoEvent::GESTURE ) continue; sortedGestures.Insert( e ); } // Now walk list of gestures if ( !sortedGestures.Count() ) return; CChoreoEvent *previous = NULL; for ( i = sortedGestures.FirstInorder(); i != sortedGestures.InvalidIndex(); i = sortedGestures.NextInorder( i ) ) { CChoreoEvent *event = sortedGestures[ i ]; if ( !previous ) { // event->SetStartTime( 0.0f ); } else if ( previous->GetSyncToFollowingGesture() ) { // TODO: ask the sequence for what tags to match CEventAbsoluteTag *pEntryTag = event->FindEntryTag( CChoreoEvent::PLAYBACK ); CEventAbsoluteTag *pExitTag = previous->FindExitTag( CChoreoEvent::PLAYBACK ); if (pEntryTag && pExitTag) { float entryTime = pEntryTag->GetAbsoluteTime( ); // get current decay rate of previous gesture float duration = previous->GetDuration(); float decayTime = (1.0 - pExitTag->GetPercentage()) * duration; // adjust the previous gestures end time to current apex + existing decay rate previous->RescaleGestureTimes( previous->GetStartTime(), entryTime + decayTime, true ); previous->SetEndTime( entryTime + decayTime ); // set the previous gestures end tag to the current apex pExitTag->SetAbsoluteTime( entryTime ); event->PreventTagOverlap( ); previous->PreventTagOverlap( ); } // BUG: Tracker 3298: ywb 1/31/04 // I think this fixes the issue with abutting past NULL gestures on paste: // Here's the bug report: // ------------------------- // When copying and pasteing posture and gesture clips in face poser the beginings of the clips stretch // to the begining of the scene even if there is a null gesture in place at the begining. // ------------------------- /* else if ( pEntryTag && !Q_stricmp( previous->GetName(), "NULL" ) ) { // If the previous was a null event, then do a bit of fixup event->SetStartTime( previous->GetEndTime() ); event->PreventTagOverlap( ); } */ // The previous event decays from it's end dispaly end time to the current event's display start time // The next event starts just after the display end time of the previous event } previous = event; } if ( previous ) { CChoreoScene *scene = previous->GetScene(); if ( scene ) { // HACK: Could probably do better by allowing user to drag the blue "end time" bar //float finish = scene->FindStopTime(); //previous->RescaleGestureTimes( previous->GetStartTime(), finish ); //previous->SetEndTime( finish ); } } /* c = 0; for ( i = sortedGestures.FirstInorder(); i != sortedGestures.InvalidIndex(); i = sortedGestures.NextInorder( i ) ) { CChoreoEvent *event = sortedGestures[ i ]; Msg( "event %i start %f disp %f dispend %f end %f\n", c + 1, event->GetStartTime( CChoreoEvent::SIMULATION ), event->GetStartTime( CChoreoEvent::DISPLAY ), event->GetEndTime( CChoreoEvent::DISPLAY ), event->GetEndTime( CChoreoEvent::SIMULATION ) ); c++; } */ }