Counter Strike : Global Offensive Source Code
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.

645 lines
22 KiB

  1. //====== Copyright � 1996-2008, Valve Corporation, All rights reserved. =====//
  2. //
  3. // Dme representation of QC: $sequence
  4. //
  5. //===========================================================================//
  6. // Valve includes
  7. #include "datamodel/dmelementfactoryhelper.h"
  8. #include "movieobjects/dmeattributereference.h"
  9. #include "movieobjects/dmeanimationlist.h"
  10. #include "movieobjects/dmechannel.h"
  11. #include "movieobjects/dmeconnectionoperator.h"
  12. #include "movieobjects/dmedag.h"
  13. #include "mdlobjects/dmeanimcmd.h"
  14. #include "mdlobjects/dmeik.h"
  15. #include "mdlobjects/dmemotioncontrol.h"
  16. #include "mdlobjects/dmesequence.h"
  17. #include "mdlobjects/dmebonemask.h"
  18. // memdbgon must be the last include file in a .cpp file!!!
  19. #include "tier0/memdbgon.h"
  20. //-----------------------------------------------------------------------------
  21. // CDmeAnimationEvent
  22. //-----------------------------------------------------------------------------
  23. //-----------------------------------------------------------------------------
  24. // Expose this class to the scene database
  25. //-----------------------------------------------------------------------------
  26. IMPLEMENT_ELEMENT_FACTORY( DmeAnimationEvent, CDmeAnimationEvent );
  27. //-----------------------------------------------------------------------------
  28. //
  29. //-----------------------------------------------------------------------------
  30. void CDmeAnimationEvent::OnConstruction()
  31. {
  32. m_nFrame.Init( this, "frame" );
  33. m_sDataString.Init( this, "dataString" );
  34. }
  35. //-----------------------------------------------------------------------------
  36. //
  37. //-----------------------------------------------------------------------------
  38. void CDmeAnimationEvent::OnDestruction()
  39. {
  40. }
  41. //-----------------------------------------------------------------------------
  42. // CDmeSequenceActivity
  43. //-----------------------------------------------------------------------------
  44. //-----------------------------------------------------------------------------
  45. // Expose this class to the scene database
  46. //-----------------------------------------------------------------------------
  47. IMPLEMENT_ELEMENT_FACTORY( DmeSequenceActivity, CDmeSequenceActivity );
  48. //-----------------------------------------------------------------------------
  49. //
  50. //-----------------------------------------------------------------------------
  51. void CDmeSequenceActivity::OnConstruction()
  52. {
  53. m_nWeight.InitAndSet( this, "weight", 1.0 );
  54. m_sModifierList.Init( this, "modifierList" );
  55. }
  56. //-----------------------------------------------------------------------------
  57. //
  58. //-----------------------------------------------------------------------------
  59. void CDmeSequenceActivity::OnDestruction()
  60. {
  61. }
  62. //-----------------------------------------------------------------------------
  63. // CDmeSequenceBlendBase
  64. //-----------------------------------------------------------------------------
  65. //-----------------------------------------------------------------------------
  66. // Expose this class to the scene database
  67. //-----------------------------------------------------------------------------
  68. IMPLEMENT_ELEMENT_FACTORY( DmeSequenceBlendBase, CDmeSequenceBlendBase );
  69. //-----------------------------------------------------------------------------
  70. //
  71. //-----------------------------------------------------------------------------
  72. void CDmeSequenceBlendBase::OnConstruction()
  73. {
  74. m_sPoseParameterName.Init( this, "poseParameterName" );
  75. }
  76. //-----------------------------------------------------------------------------
  77. //
  78. //-----------------------------------------------------------------------------
  79. void CDmeSequenceBlendBase::OnDestruction()
  80. {
  81. }
  82. //-----------------------------------------------------------------------------
  83. // CDmeSequenceBlend
  84. //-----------------------------------------------------------------------------
  85. //-----------------------------------------------------------------------------
  86. // Expose this class to the scene database
  87. //-----------------------------------------------------------------------------
  88. IMPLEMENT_ELEMENT_FACTORY( DmeSequenceBlend, CDmeSequenceBlend );
  89. //-----------------------------------------------------------------------------
  90. //
  91. //-----------------------------------------------------------------------------
  92. void CDmeSequenceBlend::OnConstruction()
  93. {
  94. m_flParamStart.Init( this, "paramStart" );
  95. m_flParamEnd.Init( this, "paramEnd" );
  96. }
  97. //-----------------------------------------------------------------------------
  98. //
  99. //-----------------------------------------------------------------------------
  100. void CDmeSequenceBlend::OnDestruction()
  101. {
  102. }
  103. //-----------------------------------------------------------------------------
  104. // CDmeSequenceCalcBlend
  105. //-----------------------------------------------------------------------------
  106. //-----------------------------------------------------------------------------
  107. // Expose this class to the scene database
  108. //-----------------------------------------------------------------------------
  109. IMPLEMENT_ELEMENT_FACTORY( DmeSequenceCalcBlend, CDmeSequenceCalcBlend );
  110. //-----------------------------------------------------------------------------
  111. //
  112. //-----------------------------------------------------------------------------
  113. void CDmeSequenceCalcBlend::OnConstruction()
  114. {
  115. m_sAttachmentName.Init( this, "attachmentName" );
  116. m_eMotionControl.InitAndCreate( this, "motionControl" );
  117. }
  118. //-----------------------------------------------------------------------------
  119. //
  120. //-----------------------------------------------------------------------------
  121. void CDmeSequenceCalcBlend::OnDestruction()
  122. {
  123. }
  124. //-----------------------------------------------------------------------------
  125. // CDmeSequenceLayerBase
  126. //-----------------------------------------------------------------------------
  127. //-----------------------------------------------------------------------------
  128. // Expose this class to the scene database
  129. //-----------------------------------------------------------------------------
  130. IMPLEMENT_ELEMENT_FACTORY( DmeSequenceLayerBase, CDmeSequenceLayerBase );
  131. //-----------------------------------------------------------------------------
  132. //
  133. //-----------------------------------------------------------------------------
  134. void CDmeSequenceLayerBase::OnConstruction()
  135. {
  136. m_eAnimation.Init( this, "animation" );
  137. }
  138. //-----------------------------------------------------------------------------
  139. //
  140. //-----------------------------------------------------------------------------
  141. void CDmeSequenceLayerBase::OnDestruction()
  142. {
  143. }
  144. //-----------------------------------------------------------------------------
  145. // CDmeSequenceAddLayer
  146. //-----------------------------------------------------------------------------
  147. //-----------------------------------------------------------------------------
  148. // Expose this class to the scene database
  149. //-----------------------------------------------------------------------------
  150. IMPLEMENT_ELEMENT_FACTORY( DmeSequenceAddLayer, CDmeSequenceAddLayer );
  151. //-----------------------------------------------------------------------------
  152. //
  153. //-----------------------------------------------------------------------------
  154. void CDmeSequenceAddLayer::OnConstruction()
  155. {
  156. }
  157. //-----------------------------------------------------------------------------
  158. //
  159. //-----------------------------------------------------------------------------
  160. void CDmeSequenceAddLayer::OnDestruction()
  161. {
  162. }
  163. //-----------------------------------------------------------------------------
  164. // CDmeSequenceBlendLayer
  165. //-----------------------------------------------------------------------------
  166. //-----------------------------------------------------------------------------
  167. // Expose this class to the scene database
  168. //-----------------------------------------------------------------------------
  169. IMPLEMENT_ELEMENT_FACTORY( DmeSequenceBlendLayer, CDmeSequenceBlendLayer );
  170. //-----------------------------------------------------------------------------
  171. //
  172. //-----------------------------------------------------------------------------
  173. void CDmeSequenceBlendLayer::OnConstruction()
  174. {
  175. m_flStartFrame.Init( this, "startFrame" );
  176. m_flPeakFrame.Init( this, "peakFrame" );
  177. m_flTailFrame.Init( this, "tailFrame" );
  178. m_flEndFrame.Init( this, "endFrame" );
  179. m_bSpline.Init( this, "spline" );
  180. m_bCrossfade.Init( this, "crossfade" );
  181. m_bNoBlend.Init( this, "noBlend" );
  182. m_bLocal.Init( this, "local" );
  183. m_sPoseParameterName.Init( this, "poseParameterName" );
  184. }
  185. //-----------------------------------------------------------------------------
  186. //
  187. //-----------------------------------------------------------------------------
  188. void CDmeSequenceBlendLayer::OnDestruction()
  189. {
  190. }
  191. //-----------------------------------------------------------------------------
  192. // CDmeSequenceBase
  193. //-----------------------------------------------------------------------------
  194. //-----------------------------------------------------------------------------
  195. // Expose this class to the scene database
  196. //-----------------------------------------------------------------------------
  197. IMPLEMENT_ELEMENT_FACTORY( DmeSequenceBase, CDmeSequenceBase );
  198. //-----------------------------------------------------------------------------
  199. //
  200. //-----------------------------------------------------------------------------
  201. void CDmeSequenceBase::OnConstruction()
  202. {
  203. m_eActivity.InitAndCreate( this, "activity" );
  204. m_bHidden.InitAndSet( this, "hidden", false );
  205. m_bDelta.InitAndSet( this, "delta", false );
  206. m_bWorldSpace.InitAndSet( this, "worldSpace", false );
  207. m_bPreDelta.InitAndSet( this, "preDelta", false );
  208. m_bAutoPlay.InitAndSet( this, "autoPlay", false );
  209. m_bRealtime.InitAndSet( this, "realtime", false );
  210. m_flFadeIn.InitAndSet( this, "fadein", 0.2f );
  211. m_flFadeOut.InitAndSet( this, "fadeout", 0.2f );
  212. m_sEntryNode.Init( this, "entryNode" );
  213. m_sExitNode.Init( this, "exitNode" );
  214. m_bReverseNodeTransition.Init( this, "reverseNodeTransition" );
  215. m_bSnap.Init( this, "snap" );
  216. m_bPost.Init( this, "post" );
  217. m_bLoop.Init( this, "loop" );
  218. m_eIkLockList.Init( this, "ikLockList", FATTRIB_NEVERCOPY );
  219. m_eAnimationEventList.Init( this, "animationEventList" );
  220. m_eLayerList.Init( this, "layerList" );
  221. m_sKeyValues.Init( this, "keyValues" );
  222. if ( m_eActivity.GetElement() )
  223. {
  224. if ( !Q_strcmp( "unnamed", m_eActivity.GetElement()->GetName() ) )
  225. {
  226. m_eActivity.GetElement()->SetName( "" );
  227. }
  228. }
  229. }
  230. //-----------------------------------------------------------------------------
  231. //
  232. //-----------------------------------------------------------------------------
  233. void CDmeSequenceBase::OnDestruction()
  234. {
  235. }
  236. //-----------------------------------------------------------------------------
  237. // qsort function for sorting DmeBaseSequence elements based on type and
  238. // sequence references.
  239. //
  240. // * A DmeBaseSequence must be either a DmeSequence or a DmeMultiSequence
  241. // They are mutually exclusive, cannot be both
  242. // * DmeMultiSequence refer to DmeSequence's so should always go last
  243. // * DmeMultiSequence cannot refer to other DmeMultiSequence so they are
  244. // considered equal
  245. // * DmeSequence can refer to other DmeSequence elements via DmeAnimCmd's
  246. // but circular references are not allowed. If a DmeSequence refers
  247. // to another, the DmeSequence being referenced needs to be before the
  248. // DmeSequence doing the referring
  249. // * If no referrals between two DmeSequence's, sort based on DmeAnimCmd count
  250. // so DmeSequence's with fewer DmeAnimCmd's go first
  251. //-----------------------------------------------------------------------------
  252. int CDmeSequenceBase::QSortFunction( const void *pVoidSeq1, const void *pVoidSeq2 )
  253. {
  254. const CDmeSequenceBase *pBaseSeq1 = *( const CDmeSequenceBase ** )pVoidSeq1;
  255. const CDmeSequenceBase *pBaseSeq2 = *( const CDmeSequenceBase ** )pVoidSeq2;
  256. if ( !pBaseSeq1 || !pBaseSeq2 )
  257. return 0;
  258. const CDmeSequence* pSeq1 = CastElement< CDmeSequence >( pBaseSeq1 ); // NULL if MultiSequence
  259. const CDmeSequence* pSeq2 = CastElement< CDmeSequence >( pBaseSeq2 ); // NULL if MultiSequence
  260. if ( pSeq1 && !pSeq2 ) // 1 Seq, 2 Multi, 1 < 2
  261. return -1;
  262. if ( !pSeq1 && pSeq2 ) // 1 Multi, 2 Seq, 1 > 2
  263. return 1;
  264. if ( !pSeq1 && !pSeq2 ) // Both Multi, 1 == 2, Multi can't refer to other multi
  265. return 0;
  266. // Both Seq, check for references
  267. bool bRef[2] = { false, false };
  268. const CDmeSequence *const pSeq[2] = { pSeq1, pSeq2 };
  269. for ( int i = 0; i < 2; ++i )
  270. {
  271. for ( int j = 0; j < pSeq[i]->m_eAnimationCommandList.Count(); ++j )
  272. {
  273. const CDmeAnimCmd *pAnimCmd = pSeq[i]->m_eAnimationCommandList[j];
  274. const CDmeAnimCmdSubtract *pAnimCmdSubtract = CastElement< CDmeAnimCmdSubtract >( pAnimCmd );
  275. if ( pAnimCmdSubtract && pAnimCmdSubtract->m_eAnimation.GetHandle() == pSeq[ (i + 1) % 2 ]->GetHandle() )
  276. {
  277. bRef[i] = true;
  278. break;
  279. }
  280. else
  281. {
  282. const CDmeAnimCmdAlign *pAnimCmdAlign = CastElement< CDmeAnimCmdAlign >( pAnimCmd );
  283. if ( pAnimCmdAlign && pAnimCmdAlign->m_eAnimation.GetHandle() == pSeq[ ( i + 1 ) % 2 ]->GetHandle() )
  284. {
  285. bRef[i] = true;
  286. break;
  287. }
  288. }
  289. }
  290. }
  291. if ( bRef[0] && !bRef[1] ) // 1 references 2, so 1 > 2
  292. return 1;
  293. if ( !bRef[0] && bRef[1] ) // 1 references by 2, so 1 < 2
  294. return -1;
  295. if ( bRef[0] && bRef[1] )
  296. {
  297. Error( "Animation %s & %s reference each other, circular references are not allowed\n", pSeq1->GetName(), pSeq2->GetName() );
  298. return 0;
  299. }
  300. if ( pSeq1->m_eAnimationCommandList.Count() < pSeq2->m_eAnimationCommandList.Count() )
  301. {
  302. return -1;
  303. }
  304. else if ( pSeq1->m_eAnimationCommandList.Count() > pSeq2->m_eAnimationCommandList.Count() )
  305. {
  306. return 1;
  307. }
  308. return 0;
  309. }
  310. //-----------------------------------------------------------------------------
  311. // CDmeSequence
  312. //-----------------------------------------------------------------------------
  313. //-----------------------------------------------------------------------------
  314. // Expose this class to the scene database
  315. //-----------------------------------------------------------------------------
  316. IMPLEMENT_ELEMENT_FACTORY( DmeSequence, CDmeSequence );
  317. //-----------------------------------------------------------------------------
  318. //
  319. //-----------------------------------------------------------------------------
  320. void CDmeSequence::OnConstruction()
  321. {
  322. m_eSkeleton.Init( this, "skeleton" );
  323. m_eAnimationList.Init( this, "animationList" );
  324. m_flFPS.InitAndSet( this, "fps", 30.0f );
  325. m_vOrigin.InitAndSet( this, "origin", Vector( 0.0f, 0.0f, 0.0f ) );
  326. m_flScale.InitAndSet( this, "scale", 1.0f );
  327. m_nStartLoop.Init( this, "startLoop" );
  328. m_bForceLoop.Init( this, "forceLoop" );
  329. m_bAutoIk.Init( this, "autoIk" );
  330. m_flMotionRollback.InitAndSet( this, "motionRollback", 0.3f );
  331. m_bAnimBlocks.InitAndSet( this, "animBlocks", true );
  332. m_bAnimBlockStall.InitAndSet( this, "animBlockStall", true );
  333. m_eMotionControl.InitAndCreate( this, "motionControl" );
  334. m_eAnimationCommandList.Init( this, "animationCommandList" );
  335. m_eIkRuleList.Init( this, "ikRuleList", FATTRIB_NEVERCOPY );
  336. m_eBoneMask.Init( this, "boneMask" );
  337. }
  338. //-----------------------------------------------------------------------------
  339. //
  340. //-----------------------------------------------------------------------------
  341. void CDmeSequence::OnDestruction()
  342. {
  343. }
  344. //-----------------------------------------------------------------------------
  345. //
  346. //-----------------------------------------------------------------------------
  347. CDmeChannelsClip *CDmeSequence::GetDmeChannelsClip() const
  348. {
  349. CDmeAnimationList *pDmeAnimationList = m_eAnimationList.GetElement();
  350. if ( !pDmeAnimationList )
  351. return NULL;
  352. for ( int i = 0; i < pDmeAnimationList->GetAnimationCount(); ++i )
  353. {
  354. CDmeChannelsClip *pDmeChannelsClip = pDmeAnimationList->GetAnimation( i );
  355. if ( pDmeChannelsClip )
  356. return pDmeChannelsClip;
  357. }
  358. return NULL;
  359. }
  360. //-----------------------------------------------------------------------------
  361. //
  362. //-----------------------------------------------------------------------------
  363. DmeFramerate_t CDmeSequence::GetFrameRate(
  364. DmeFramerate_t fallbackFrameRate /* = 30 */,
  365. bool bForceFallback /* = false */ ) const
  366. {
  367. CDmeChannelsClip *pDmeChannelsClip = GetDmeChannelsClip();
  368. if ( !pDmeChannelsClip )
  369. return fallbackFrameRate;
  370. DmeFramerate_t dmeFrameRate = fallbackFrameRate;
  371. if ( !bForceFallback && pDmeChannelsClip->HasAttribute( "frameRate" ) )
  372. {
  373. const int nFrameRate = pDmeChannelsClip->GetValue< int >( "frameRate", 0 );
  374. if ( nFrameRate >= 0 )
  375. {
  376. dmeFrameRate = DmeFramerate_t( nFrameRate );
  377. }
  378. }
  379. return dmeFrameRate;
  380. }
  381. //-----------------------------------------------------------------------------
  382. //
  383. //-----------------------------------------------------------------------------
  384. int CDmeSequence::GetFrameCount(
  385. DmeFramerate_t fallbackFrameRate /* = 30 */,
  386. bool bForceFallback /* = false */ ) const
  387. {
  388. CDmeChannelsClip *pDmeChannelsClip = GetDmeChannelsClip();
  389. if ( !pDmeChannelsClip )
  390. return 0;
  391. const DmeFramerate_t dmeFrameRate = GetFrameRate( fallbackFrameRate, bForceFallback );
  392. const DmeTime_t nStartTime = pDmeChannelsClip->GetStartTime();
  393. const int nStartFrame = FrameForTime( nStartTime, dmeFrameRate );
  394. const DmeTime_t nEndTime = pDmeChannelsClip->GetEndTime();
  395. const int nEndFrame = FrameForTime( nEndTime, dmeFrameRate );
  396. return nEndFrame - nStartFrame + 1;
  397. }
  398. //-----------------------------------------------------------------------------
  399. // Does a search through connection operators for dependent DmeOperators
  400. //-----------------------------------------------------------------------------
  401. void CDmeSequence::GetDependentOperators( CUtlVector< IDmeOperator * > &operatorList, CDmeOperator *pDmeOperator ) const
  402. {
  403. if ( !pDmeOperator || !CastElement< CDmeOperator >( pDmeOperator ) )
  404. return;
  405. // Abort if the specified operator is already in the operatorList
  406. for ( int i = 0; i < operatorList.Count(); ++i )
  407. {
  408. CDmeOperator *pTmpDmeOperator = CastElement< CDmeOperator >( reinterpret_cast< CDmeOperator * >( operatorList[i] ) );
  409. if ( pTmpDmeOperator && pTmpDmeOperator == pDmeOperator )
  410. return;
  411. }
  412. operatorList.AddToTail( pDmeOperator );
  413. CUtlVector< CDmAttribute * > outAttrList;
  414. pDmeOperator->GetOutputAttributes( outAttrList );
  415. for ( int i = 0; i < outAttrList.Count(); ++i )
  416. {
  417. CDmElement *pDmElement = outAttrList[i]->GetOwner();
  418. if ( !pDmElement )
  419. continue;
  420. if ( pDmElement != pDmeOperator )
  421. {
  422. CUtlVector< CDmElement * > reList0;
  423. FindReferringElements( reList0, pDmElement, g_pDataModel->GetSymbol( "element" ), false );
  424. for ( int j = 0; j < reList0.Count(); ++j )
  425. {
  426. CDmeAttributeReference *pRe0 = CastElement< CDmeAttributeReference >( reList0[j] );
  427. if ( !pRe0 || pRe0->GetReferencedAttribute() != outAttrList[i] )
  428. continue;
  429. CUtlVector< CDmElement * > reList1;
  430. FindReferringElements( reList1, pRe0, g_pDataModel->GetSymbol( "input" ), false );
  431. for ( int k = 0; k < reList1.Count(); ++k )
  432. {
  433. CDmeConnectionOperator *pRe1 = CastElement< CDmeConnectionOperator >( reList1[k] );
  434. if ( !pRe1 )
  435. continue;
  436. GetDependentOperators( operatorList, pRe1 );
  437. }
  438. }
  439. }
  440. GetDependentOperators( operatorList, CastElement< CDmeOperator >( pDmElement ) );
  441. }
  442. }
  443. //-----------------------------------------------------------------------------
  444. //
  445. //-----------------------------------------------------------------------------
  446. void CDmeSequence::PrepareChannels( CUtlVector< IDmeOperator * > &dmeOperatorList )
  447. {
  448. dmeOperatorList.RemoveAll();
  449. CDmeAnimationList *pDmeAnimationList = m_eAnimationList.GetElement();
  450. if ( !pDmeAnimationList )
  451. return;
  452. for ( int i = 0; i < pDmeAnimationList->GetAnimationCount(); ++i )
  453. {
  454. CDmeChannelsClip *pDmeChannelsClip = pDmeAnimationList->GetAnimation( i );
  455. if ( !pDmeChannelsClip )
  456. continue;
  457. for ( int j = 0; j < pDmeChannelsClip->m_Channels.Count(); ++j )
  458. {
  459. CDmeChannel *pDmeChannel = pDmeChannelsClip->m_Channels[j];
  460. if ( !pDmeChannel )
  461. continue;
  462. pDmeChannel->SetMode( CM_PLAY );
  463. GetDependentOperators( dmeOperatorList, pDmeChannel );
  464. }
  465. }
  466. }
  467. //-----------------------------------------------------------------------------
  468. // Update channels so they are in position for the next frame
  469. //-----------------------------------------------------------------------------
  470. void CDmeSequence::UpdateChannels( CUtlVector< IDmeOperator * > &dmeOperatorList, DmeTime_t nClipTime )
  471. {
  472. CDmeAnimationList *pDmeAnimationList = m_eAnimationList.GetElement();
  473. if ( !pDmeAnimationList )
  474. return;
  475. for ( int i = 0; i < pDmeAnimationList->GetAnimationCount(); ++i )
  476. {
  477. CDmeChannelsClip *pDmeChannelsClip = pDmeAnimationList->GetAnimation( i );
  478. if ( !pDmeChannelsClip )
  479. continue;
  480. const DmeTime_t channelTime = pDmeChannelsClip->ToChildMediaTime( nClipTime );
  481. const int nChannelsCount = pDmeChannelsClip->m_Channels.Count();
  482. for ( int j = 0; j < nChannelsCount; ++j )
  483. {
  484. pDmeChannelsClip->m_Channels[j]->SetCurrentTime( channelTime );
  485. }
  486. }
  487. // Recompute the position of the joints
  488. {
  489. CDisableUndoScopeGuard guard;
  490. g_pDmElementFramework->SetOperators( dmeOperatorList );
  491. g_pDmElementFramework->Operate( true );
  492. }
  493. g_pDmElementFramework->BeginEdit();
  494. }
  495. //-----------------------------------------------------------------------------
  496. // CDmeMultiSequence
  497. //-----------------------------------------------------------------------------
  498. //-----------------------------------------------------------------------------
  499. // Expose this class to the scene database
  500. //-----------------------------------------------------------------------------
  501. IMPLEMENT_ELEMENT_FACTORY( DmeMultiSequence, CDmeMultiSequence );
  502. //-----------------------------------------------------------------------------
  503. //
  504. //-----------------------------------------------------------------------------
  505. void CDmeMultiSequence::OnConstruction()
  506. {
  507. m_nBlendWidth.InitAndSet( this, "blendWidth", 0 );
  508. m_eBlendRef.Init( this, "blendRef", FATTRIB_NEVERCOPY );
  509. m_eBlendComp.Init( this, "blendComp", FATTRIB_NEVERCOPY );
  510. m_eBlendCenter.Init( this, "blendCenter", FATTRIB_NEVERCOPY );
  511. m_eSequenceList.Init( this, "sequenceList", FATTRIB_NEVERCOPY );
  512. m_eBlendList.Init( this, "blendList" );
  513. }
  514. //-----------------------------------------------------------------------------
  515. //
  516. //-----------------------------------------------------------------------------
  517. void CDmeMultiSequence::OnDestruction()
  518. {
  519. }