Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

566 lines
17 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose:
  4. //
  5. // $NoKeywords: $
  6. //=============================================================================//
  7. #include "cbase.h"
  8. #include "c_baseanimatingoverlay.h"
  9. #include "bone_setup.h"
  10. #include "tier0/vprof.h"
  11. #include "engine/ivdebugoverlay.h"
  12. #include "datacache/imdlcache.h"
  13. #include "eventlist.h"
  14. #include "dt_utlvector_recv.h"
  15. // memdbgon must be the last include file in a .cpp file!!!
  16. #include "tier0/memdbgon.h"
  17. extern ConVar r_sequence_debug;
  18. C_BaseAnimatingOverlay::C_BaseAnimatingOverlay()
  19. {
  20. // FIXME: where does this initialization go now?
  21. //for ( int i=0; i < MAX_OVERLAYS; i++ )
  22. //{
  23. // memset( &m_Layer[i], 0, sizeof(m_Layer[0]) );
  24. // m_Layer[i].m_nOrder = MAX_OVERLAYS;
  25. //}
  26. // FIXME: where does this initialization go now?
  27. // AddVar( m_Layer, &m_iv_AnimOverlay, LATCH_ANIMATION_VAR );
  28. }
  29. #undef CBaseAnimatingOverlay
  30. BEGIN_RECV_TABLE_NOBASE(CAnimationLayer, DT_Animationlayer)
  31. RecvPropInt( RECVINFO_NAME(m_nSequence, m_nSequence)),
  32. RecvPropFloat( RECVINFO_NAME(m_flCycle, m_flCycle)),
  33. RecvPropFloat( RECVINFO_NAME(m_flPrevCycle, m_flPrevCycle)),
  34. RecvPropFloat( RECVINFO_NAME(m_flWeight, m_flWeight)),
  35. RecvPropInt( RECVINFO_NAME(m_nOrder, m_nOrder))
  36. END_RECV_TABLE()
  37. const char *s_m_iv_AnimOverlayNames[C_BaseAnimatingOverlay::MAX_OVERLAYS] =
  38. {
  39. "C_BaseAnimatingOverlay::m_iv_AnimOverlay00",
  40. "C_BaseAnimatingOverlay::m_iv_AnimOverlay01",
  41. "C_BaseAnimatingOverlay::m_iv_AnimOverlay02",
  42. "C_BaseAnimatingOverlay::m_iv_AnimOverlay03",
  43. "C_BaseAnimatingOverlay::m_iv_AnimOverlay04",
  44. "C_BaseAnimatingOverlay::m_iv_AnimOverlay05",
  45. "C_BaseAnimatingOverlay::m_iv_AnimOverlay06",
  46. "C_BaseAnimatingOverlay::m_iv_AnimOverlay07",
  47. "C_BaseAnimatingOverlay::m_iv_AnimOverlay08",
  48. "C_BaseAnimatingOverlay::m_iv_AnimOverlay09",
  49. "C_BaseAnimatingOverlay::m_iv_AnimOverlay10",
  50. "C_BaseAnimatingOverlay::m_iv_AnimOverlay11",
  51. "C_BaseAnimatingOverlay::m_iv_AnimOverlay12",
  52. "C_BaseAnimatingOverlay::m_iv_AnimOverlay13",
  53. "C_BaseAnimatingOverlay::m_iv_AnimOverlay14"
  54. };
  55. void ResizeAnimationLayerCallback( void *pStruct, int offsetToUtlVector, int len )
  56. {
  57. C_BaseAnimatingOverlay *pEnt = (C_BaseAnimatingOverlay*)pStruct;
  58. CUtlVector < C_AnimationLayer > *pVec = &pEnt->m_AnimOverlay;
  59. CUtlVector< CInterpolatedVar< C_AnimationLayer > > *pVecIV = &pEnt->m_iv_AnimOverlay;
  60. Assert( (char*)pVec - (char*)pEnt == offsetToUtlVector );
  61. Assert( pVec->Count() == pVecIV->Count() );
  62. Assert( pVec->Count() <= C_BaseAnimatingOverlay::MAX_OVERLAYS );
  63. int diff = len - pVec->Count();
  64. if ( diff == 0 )
  65. return;
  66. // remove all entries
  67. for ( int i=0; i < pVec->Count(); i++ )
  68. {
  69. pEnt->RemoveVar( &pVec->Element( i ) );
  70. }
  71. // adjust vector sizes
  72. if ( diff > 0 )
  73. {
  74. pVec->AddMultipleToTail( diff );
  75. pVecIV->AddMultipleToTail( diff );
  76. }
  77. else
  78. {
  79. pVec->RemoveMultiple( len, -diff );
  80. pVecIV->RemoveMultiple( len, -diff );
  81. }
  82. // Rebind all the variables in the ent's list.
  83. for ( int i=0; i < len; i++ )
  84. {
  85. IInterpolatedVar *pWatcher = &pVecIV->Element( i );
  86. pWatcher->SetDebugName( s_m_iv_AnimOverlayNames[i] );
  87. pEnt->AddVar( &pVec->Element( i ), pWatcher, LATCH_ANIMATION_VAR, true );
  88. }
  89. // FIXME: need to set historical values of nOrder in pVecIV to MAX_OVERLAY
  90. }
  91. BEGIN_RECV_TABLE_NOBASE( C_BaseAnimatingOverlay, DT_OverlayVars )
  92. RecvPropUtlVector(
  93. RECVINFO_UTLVECTOR_SIZEFN( m_AnimOverlay, ResizeAnimationLayerCallback ),
  94. C_BaseAnimatingOverlay::MAX_OVERLAYS,
  95. RecvPropDataTable(NULL, 0, 0, &REFERENCE_RECV_TABLE( DT_Animationlayer ) ) )
  96. END_RECV_TABLE()
  97. IMPLEMENT_CLIENTCLASS_DT( C_BaseAnimatingOverlay, DT_BaseAnimatingOverlay, CBaseAnimatingOverlay )
  98. RecvPropDataTable( "overlay_vars", 0, 0, &REFERENCE_RECV_TABLE( DT_OverlayVars ) )
  99. END_RECV_TABLE()
  100. BEGIN_PREDICTION_DATA( C_BaseAnimatingOverlay )
  101. /*
  102. DEFINE_FIELD( C_BaseAnimatingOverlay, m_Layer[0][2].m_nSequence, FIELD_INTEGER ),
  103. DEFINE_FIELD( C_BaseAnimatingOverlay, m_Layer[0][2].m_flCycle, FIELD_FLOAT ),
  104. DEFINE_FIELD( C_BaseAnimatingOverlay, m_Layer[0][2].m_flPlaybackRate, FIELD_FLOAT),
  105. DEFINE_FIELD( C_BaseAnimatingOverlay, m_Layer[0][2].m_flWeight, FIELD_FLOAT),
  106. DEFINE_FIELD( C_BaseAnimatingOverlay, m_Layer[1][2].m_nSequence, FIELD_INTEGER ),
  107. DEFINE_FIELD( C_BaseAnimatingOverlay, m_Layer[1][2].m_flCycle, FIELD_FLOAT ),
  108. DEFINE_FIELD( C_BaseAnimatingOverlay, m_Layer[1][2].m_flPlaybackRate, FIELD_FLOAT),
  109. DEFINE_FIELD( C_BaseAnimatingOverlay, m_Layer[1][2].m_flWeight, FIELD_FLOAT),
  110. DEFINE_FIELD( C_BaseAnimatingOverlay, m_Layer[2][2].m_nSequence, FIELD_INTEGER ),
  111. DEFINE_FIELD( C_BaseAnimatingOverlay, m_Layer[2][2].m_flCycle, FIELD_FLOAT ),
  112. DEFINE_FIELD( C_BaseAnimatingOverlay, m_Layer[2][2].m_flPlaybackRate, FIELD_FLOAT),
  113. DEFINE_FIELD( C_BaseAnimatingOverlay, m_Layer[2][2].m_flWeight, FIELD_FLOAT),
  114. DEFINE_FIELD( C_BaseAnimatingOverlay, m_Layer[3][2].m_nSequence, FIELD_INTEGER ),
  115. DEFINE_FIELD( C_BaseAnimatingOverlay, m_Layer[3][2].m_flCycle, FIELD_FLOAT ),
  116. DEFINE_FIELD( C_BaseAnimatingOverlay, m_Layer[3][2].m_flPlaybackRate, FIELD_FLOAT),
  117. DEFINE_FIELD( C_BaseAnimatingOverlay, m_Layer[3][2].m_flWeight, FIELD_FLOAT),
  118. */
  119. END_PREDICTION_DATA()
  120. C_AnimationLayer* C_BaseAnimatingOverlay::GetAnimOverlay( int i )
  121. {
  122. Assert( i >= 0 && i < MAX_OVERLAYS );
  123. return &m_AnimOverlay[i];
  124. }
  125. void C_BaseAnimatingOverlay::SetNumAnimOverlays( int num )
  126. {
  127. if ( m_AnimOverlay.Count() < num )
  128. {
  129. m_AnimOverlay.AddMultipleToTail( num - m_AnimOverlay.Count() );
  130. }
  131. else if ( m_AnimOverlay.Count() > num )
  132. {
  133. m_AnimOverlay.RemoveMultiple( num, m_AnimOverlay.Count() - num );
  134. }
  135. }
  136. int C_BaseAnimatingOverlay::GetNumAnimOverlays() const
  137. {
  138. return m_AnimOverlay.Count();
  139. }
  140. void C_BaseAnimatingOverlay::GetRenderBounds( Vector& theMins, Vector& theMaxs )
  141. {
  142. BaseClass::GetRenderBounds( theMins, theMaxs );
  143. if ( !IsRagdoll() )
  144. {
  145. CStudioHdr *pStudioHdr = GetModelPtr();
  146. if ( !pStudioHdr || !pStudioHdr->SequencesAvailable() )
  147. return;
  148. int nSequences = pStudioHdr->GetNumSeq();
  149. int i;
  150. for (i = 0; i < m_AnimOverlay.Count(); i++)
  151. {
  152. if (m_AnimOverlay[i].m_flWeight > 0.0)
  153. {
  154. if ( m_AnimOverlay[i].m_nSequence >= nSequences )
  155. {
  156. continue;
  157. }
  158. mstudioseqdesc_t &seqdesc = pStudioHdr->pSeqdesc( m_AnimOverlay[i].m_nSequence );
  159. VectorMin( seqdesc.bbmin, theMins, theMins );
  160. VectorMax( seqdesc.bbmax, theMaxs, theMaxs );
  161. }
  162. }
  163. }
  164. }
  165. void C_BaseAnimatingOverlay::CheckForLayerChanges( CStudioHdr *hdr, float currentTime )
  166. {
  167. bool bLayersChanged = false;
  168. // FIXME: damn, there has to be a better way than this.
  169. int i;
  170. for (i = 0; i < m_iv_AnimOverlay.Count(); i++)
  171. {
  172. CDisableRangeChecks disableRangeChecks;
  173. int iHead, iPrev1, iPrev2;
  174. m_iv_AnimOverlay[i].GetInterpolationInfo( currentTime, &iHead, &iPrev1, &iPrev2 );
  175. // fake up previous cycle values.
  176. float t0;
  177. C_AnimationLayer *pHead = m_iv_AnimOverlay[i].GetHistoryValue( iHead, t0 );
  178. // reset previous
  179. float t1;
  180. C_AnimationLayer *pPrev1 = m_iv_AnimOverlay[i].GetHistoryValue( iPrev1, t1 );
  181. // reset previous previous
  182. float t2;
  183. C_AnimationLayer *pPrev2 = m_iv_AnimOverlay[i].GetHistoryValue( iPrev2, t2 );
  184. if ( pHead && pPrev1 && pHead->m_nSequence != pPrev1->m_nSequence )
  185. {
  186. bLayersChanged = true;
  187. #if 1 // _DEBUG
  188. if (/* Q_stristr( hdr->pszName(), r_sequence_debug.GetString()) != NULL || */ r_sequence_debug.GetInt() == entindex())
  189. {
  190. DevMsgRT( "(%7.4f : %30s : %5.3f : %4.2f : %1d)\n", t0, hdr->pSeqdesc( pHead->m_nSequence ).pszLabel(), (float)pHead->m_flCycle, (float)pHead->m_flWeight, i );
  191. DevMsgRT( "(%7.4f : %30s : %5.3f : %4.2f : %1d)\n", t1, hdr->pSeqdesc( pPrev1->m_nSequence ).pszLabel(), (float)pPrev1->m_flCycle, (float)pPrev1->m_flWeight, i );
  192. if (pPrev2)
  193. DevMsgRT( "(%7.4f : %30s : %5.3f : %4.2f : %1d)\n", t2, hdr->pSeqdesc( pPrev2->m_nSequence ).pszLabel(), (float)pPrev2->m_flCycle, (float)pPrev2->m_flWeight, i );
  194. }
  195. #endif
  196. if (pPrev1)
  197. {
  198. pPrev1->m_nSequence = pHead->m_nSequence;
  199. pPrev1->m_flCycle = pHead->m_flPrevCycle;
  200. pPrev1->m_flWeight = pHead->m_flWeight;
  201. }
  202. if (pPrev2)
  203. {
  204. float num = 0;
  205. if ( fabs( t0 - t1 ) > 0.001f )
  206. num = (t2 - t1) / (t0 - t1);
  207. pPrev2->m_nSequence = pHead->m_nSequence;
  208. float flTemp;
  209. if (IsSequenceLooping( hdr, pHead->m_nSequence ))
  210. {
  211. flTemp = LoopingLerp( num, (float)pHead->m_flPrevCycle, (float)pHead->m_flCycle );
  212. }
  213. else
  214. {
  215. flTemp = Lerp( num, (float)pHead->m_flPrevCycle, (float)pHead->m_flCycle );
  216. }
  217. pPrev2->m_flCycle = flTemp;
  218. pPrev2->m_flWeight = pHead->m_flWeight;
  219. }
  220. /*
  221. if (stricmp( r_seq_overlay_debug.GetString(), hdr->name ) == 0)
  222. {
  223. DevMsgRT( "(%30s %6.2f : %6.2f : %6.2f)\n", hdr->pSeqdesc( pHead->nSequence ).pszLabel(), (float)pPrev2->m_flCycle, (float)pPrev1->m_flCycle, (float)pHead->m_flCycle );
  224. }
  225. */
  226. m_iv_AnimOverlay[i].SetLooping( IsSequenceLooping( hdr, pHead->m_nSequence ) );
  227. m_iv_AnimOverlay[i].Interpolate( currentTime );
  228. // reset event indexes
  229. m_flOverlayPrevEventCycle[i] = pHead->m_flPrevCycle - 0.01;
  230. }
  231. }
  232. if (bLayersChanged)
  233. {
  234. // render bounds may have changed
  235. UpdateVisibility();
  236. }
  237. }
  238. void C_BaseAnimatingOverlay::AccumulateLayers( IBoneSetup &boneSetup, Vector pos[], Quaternion q[], float currentTime )
  239. {
  240. BaseClass::AccumulateLayers( boneSetup, pos, q, currentTime );
  241. int i;
  242. // resort the layers
  243. int layer[MAX_OVERLAYS];
  244. for (i = 0; i < MAX_OVERLAYS; i++)
  245. {
  246. layer[i] = MAX_OVERLAYS;
  247. }
  248. for (i = 0; i < m_AnimOverlay.Count(); i++)
  249. {
  250. if (m_AnimOverlay[i].m_nOrder < MAX_OVERLAYS)
  251. {
  252. /*
  253. Assert( layer[m_AnimOverlay[i].m_nOrder] == MAX_OVERLAYS );
  254. layer[m_AnimOverlay[i].m_nOrder] = i;
  255. */
  256. // hacky code until initialization of new layers is finished
  257. if (layer[m_AnimOverlay[i].m_nOrder] != MAX_OVERLAYS)
  258. {
  259. m_AnimOverlay[i].m_nOrder = MAX_OVERLAYS;
  260. }
  261. else
  262. {
  263. layer[m_AnimOverlay[i].m_nOrder] = i;
  264. }
  265. }
  266. }
  267. CheckForLayerChanges( boneSetup.GetStudioHdr(), currentTime );
  268. int nSequences = boneSetup.GetStudioHdr()->GetNumSeq();
  269. // add in the overlay layers
  270. int j;
  271. for (j = 0; j < MAX_OVERLAYS; j++)
  272. {
  273. i = layer[ j ];
  274. if (i < m_AnimOverlay.Count())
  275. {
  276. if ( m_AnimOverlay[i].m_nSequence >= nSequences )
  277. {
  278. continue;
  279. }
  280. /*
  281. DevMsgRT( 1 , "%.3f %.3f %.3f\n", currentTime, fWeight, dadt );
  282. debugoverlay->AddTextOverlay( GetAbsOrigin() + Vector( 0, 0, 64 ), -j - 1, 0,
  283. "%2d(%s) : %6.2f : %6.2f",
  284. m_AnimOverlay[i].m_nSequence,
  285. hdr->pSeqdesc( m_AnimOverlay[i].m_nSequence )->pszLabel(),
  286. m_AnimOverlay[i].m_flCycle,
  287. m_AnimOverlay[i].m_flWeight
  288. );
  289. */
  290. m_AnimOverlay[i].BlendWeight();
  291. float fWeight = m_AnimOverlay[i].m_flWeight;
  292. if (fWeight > 0)
  293. {
  294. // check to see if the sequence changed
  295. // FIXME: move this to somewhere more reasonable
  296. // do a nice spline interpolation of the values
  297. // if ( m_AnimOverlay[i].m_nSequence != m_iv_AnimOverlay.GetPrev( i )->nSequence )
  298. float fCycle = m_AnimOverlay[ i ].m_flCycle;
  299. fCycle = ClampCycle( fCycle, IsSequenceLooping( m_AnimOverlay[i].m_nSequence ) );
  300. if (fWeight > 1)
  301. fWeight = 1;
  302. boneSetup.AccumulatePose( pos, q, m_AnimOverlay[i].m_nSequence, fCycle, fWeight, currentTime, m_pIk );
  303. #if 1 // _DEBUG
  304. if (/* Q_stristr( hdr->pszName(), r_sequence_debug.GetString()) != NULL || */ r_sequence_debug.GetInt() == entindex())
  305. {
  306. if (1)
  307. {
  308. DevMsgRT( "%8.4f : %30s : %5.3f : %4.2f : %1d\n", currentTime, boneSetup.GetStudioHdr()->pSeqdesc( m_AnimOverlay[i].m_nSequence ).pszLabel(), fCycle, fWeight, i );
  309. }
  310. else
  311. {
  312. int iHead, iPrev1, iPrev2;
  313. m_iv_AnimOverlay[i].GetInterpolationInfo( currentTime, &iHead, &iPrev1, &iPrev2 );
  314. // fake up previous cycle values.
  315. float t0;
  316. C_AnimationLayer *pHead = m_iv_AnimOverlay[i].GetHistoryValue( iHead, t0 );
  317. // reset previous
  318. float t1;
  319. C_AnimationLayer *pPrev1 = m_iv_AnimOverlay[i].GetHistoryValue( iPrev1, t1 );
  320. // reset previous previous
  321. float t2;
  322. C_AnimationLayer *pPrev2 = m_iv_AnimOverlay[i].GetHistoryValue( iPrev2, t2 );
  323. if ( pHead && pPrev1 && pPrev2 )
  324. {
  325. DevMsgRT( "%6.2f : %30s %6.2f (%6.2f:%6.2f:%6.2f) : %6.2f (%6.2f:%6.2f:%6.2f) : %1d\n", currentTime, boneSetup.GetStudioHdr()->pSeqdesc( m_AnimOverlay[i].m_nSequence ).pszLabel(),
  326. fCycle, (float)pPrev2->m_flCycle, (float)pPrev1->m_flCycle, (float)pHead->m_flCycle,
  327. fWeight, (float)pPrev2->m_flWeight, (float)pPrev1->m_flWeight, (float)pHead->m_flWeight,
  328. i );
  329. }
  330. else
  331. {
  332. DevMsgRT( "%6.2f : %30s %6.2f : %6.2f : %1d\n", currentTime, boneSetup.GetStudioHdr()->pSeqdesc( m_AnimOverlay[i].m_nSequence ).pszLabel(), fCycle, fWeight, i );
  333. }
  334. }
  335. }
  336. #endif
  337. //#define DEBUG_TF2_OVERLAYS
  338. #if defined( DEBUG_TF2_OVERLAYS )
  339. engine->Con_NPrintf( 10 + j, "%30s %6.2f : %6.2f : %1d", boneSetup.GetStudioHdr()->pSeqdesc( m_AnimOverlay[i].m_nSequence ).pszLabel(), fCycle, fWeight, i );
  340. }
  341. else
  342. {
  343. engine->Con_NPrintf( 10 + j, "%30s %6.2f : %6.2f : %1d", " ", 0.f, 0.f, i );
  344. #endif
  345. }
  346. }
  347. #if defined( DEBUG_TF2_OVERLAYS )
  348. else
  349. {
  350. engine->Con_NPrintf( 10 + j, "%30s %6.2f : %6.2f : %1d", " ", 0.f, 0.f, i );
  351. }
  352. #endif
  353. }
  354. }
  355. void C_BaseAnimatingOverlay::DoAnimationEvents( CStudioHdr *pStudioHdr )
  356. {
  357. if ( !pStudioHdr || !pStudioHdr->SequencesAvailable() )
  358. return;
  359. MDLCACHE_CRITICAL_SECTION();
  360. int nSequences = pStudioHdr->GetNumSeq();
  361. BaseClass::DoAnimationEvents( pStudioHdr );
  362. bool watch = false; // Q_strstr( hdr->name, "rifle" ) ? true : false;
  363. CheckForLayerChanges( pStudioHdr, gpGlobals->curtime ); // !!!
  364. int j;
  365. for (j = 0; j < m_AnimOverlay.Count(); j++)
  366. {
  367. if ( m_AnimOverlay[j].m_nSequence >= nSequences )
  368. {
  369. continue;
  370. }
  371. mstudioseqdesc_t &seqdesc = pStudioHdr->pSeqdesc( m_AnimOverlay[j].m_nSequence );
  372. if ( seqdesc.numevents == 0 )
  373. continue;
  374. // stalled?
  375. if (m_AnimOverlay[j].m_flCycle == m_flOverlayPrevEventCycle[j])
  376. continue;
  377. bool bLoopingSequence = IsSequenceLooping( m_AnimOverlay[j].m_nSequence );
  378. bool bLooped = false;
  379. //in client code, m_flOverlayPrevEventCycle is set to -1 when we first start an overlay, looping or not
  380. if ( bLoopingSequence &&
  381. m_flOverlayPrevEventCycle[j] > 0.0f &&
  382. m_AnimOverlay[j].m_flCycle <= m_flOverlayPrevEventCycle[j] )
  383. {
  384. if (m_flOverlayPrevEventCycle[j] - m_AnimOverlay[j].m_flCycle > 0.5)
  385. {
  386. bLooped = true;
  387. }
  388. else
  389. {
  390. // things have backed up, which is bad since it'll probably result in a hitch in the animation playback
  391. // but, don't play events again for the same time slice
  392. return;
  393. }
  394. }
  395. mstudioevent_t *pevent = seqdesc.pEvent( 0 );
  396. // This makes sure events that occur at the end of a sequence occur are
  397. // sent before events that occur at the beginning of a sequence.
  398. if (bLooped)
  399. {
  400. for (int i = 0; i < (int)seqdesc.numevents; i++)
  401. {
  402. // ignore all non-client-side events
  403. if ( pevent[i].type & AE_TYPE_NEWEVENTSYSTEM )
  404. {
  405. if ( !( pevent[i].type & AE_TYPE_CLIENT ) )
  406. continue;
  407. }
  408. else if ( pevent[i].event < 5000 ) //Adrian - Support the old event system
  409. continue;
  410. if ( pevent[i].cycle <= m_flOverlayPrevEventCycle[j] )
  411. continue;
  412. if ( watch )
  413. {
  414. Msg( "%i FE %i Looped cycle %f, prev %f ev %f (time %.3f)\n",
  415. gpGlobals->tickcount,
  416. pevent[i].event,
  417. pevent[i].cycle,
  418. m_flOverlayPrevEventCycle[j],
  419. (float)m_AnimOverlay[j].m_flCycle,
  420. gpGlobals->curtime );
  421. }
  422. FireEvent( GetAbsOrigin(), GetAbsAngles(), pevent[ i ].event, pevent[ i ].pszOptions() );
  423. }
  424. // Necessary to get the next loop working
  425. m_flOverlayPrevEventCycle[j] = -0.01;
  426. }
  427. for (int i = 0; i < (int)seqdesc.numevents; i++)
  428. {
  429. if ( pevent[i].type & AE_TYPE_NEWEVENTSYSTEM )
  430. {
  431. if ( !( pevent[i].type & AE_TYPE_CLIENT ) )
  432. continue;
  433. }
  434. else if ( pevent[i].event < 5000 ) //Adrian - Support the old event system
  435. continue;
  436. if ( (pevent[i].cycle > m_flOverlayPrevEventCycle[j] && pevent[i].cycle <= m_AnimOverlay[j].m_flCycle) )
  437. {
  438. if ( watch )
  439. {
  440. Msg( "%i (seq: %d) FE %i Normal cycle %f, prev %f ev %f (time %.3f)\n",
  441. gpGlobals->tickcount,
  442. m_AnimOverlay[j].m_nSequence.GetRaw(),
  443. pevent[i].event,
  444. pevent[i].cycle,
  445. m_flOverlayPrevEventCycle[j],
  446. (float)m_AnimOverlay[j].m_flCycle,
  447. gpGlobals->curtime );
  448. }
  449. FireEvent( GetAbsOrigin(), GetAbsAngles(), pevent[ i ].event, pevent[ i ].pszOptions() );
  450. }
  451. }
  452. m_flOverlayPrevEventCycle[j] = m_AnimOverlay[j].m_flCycle;
  453. }
  454. }
  455. //-----------------------------------------------------------------------------
  456. // Purpose:
  457. //-----------------------------------------------------------------------------
  458. CStudioHdr *C_BaseAnimatingOverlay::OnNewModel()
  459. {
  460. CStudioHdr *hdr = BaseClass::OnNewModel();
  461. // Clear out animation layers
  462. for ( int i=0; i < m_AnimOverlay.Count(); i++ )
  463. {
  464. m_AnimOverlay[i].Reset();
  465. m_AnimOverlay[i].m_nOrder = MAX_OVERLAYS;
  466. }
  467. return hdr;
  468. }