SkeletonObject.h 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. //-----------------------------------------------------------------------------
  2. // Copyright (c) 2013 GarageGames, LLC
  3. //
  4. // Permission is hereby granted, free of charge, to any person obtaining a copy
  5. // of this software and associated documentation files (the "Software"), to
  6. // deal in the Software without restriction, including without limitation the
  7. // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  8. // sell copies of the Software, and to permit persons to whom the Software is
  9. // furnished to do so, subject to the following conditions:
  10. //
  11. // The above copyright notice and this permission notice shall be included in
  12. // all copies or substantial portions of the Software.
  13. //
  14. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  19. // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  20. // IN THE SOFTWARE.
  21. //-----------------------------------------------------------------------------
  22. #ifndef _SKELETON_OBJECT_H_
  23. #define _SKELETON_OBJECT_H_
  24. #ifndef _SPRITE_BATCH_H_
  25. #include "2d/core/SpriteBatch.h"
  26. #endif
  27. #ifndef _SCENE_OBJECT_H_
  28. #include "2d/sceneobject/SceneObject.h"
  29. #endif
  30. #ifndef _SKELETON_ASSET_H_
  31. #include "2d/assets/SkeletonAsset.h"
  32. #endif
  33. //------------------------------------------------------------------------------
  34. class SkeletonObject : public SceneObject, public SpriteBatch
  35. {
  36. protected:
  37. typedef SceneObject Parent;
  38. private:
  39. typedef Vector<SpriteBatchItem*> typeSkeletonSpritesVector;
  40. typeSkeletonSpritesVector mSkeletonSprites;
  41. AssetPtr<SkeletonAsset> mSkeletonAsset;
  42. spSkeleton* mSkeleton;
  43. spAnimationState* mState;
  44. F32 mPreTickTime;
  45. F32 mPostTickTime;
  46. F32 mTimeScale;
  47. F32 mLastFrameTime;
  48. F32 mAnimationDuration;
  49. F32 mTotalAnimationTime;
  50. bool mAnimationFinished;
  51. bool mAnimationCycle;
  52. Vector2 mSkeletonScale;
  53. Vector2 mSkeletonOffset;
  54. StringTableEntry mCurrentAnimation;
  55. StringTableEntry mCurrentSkin;
  56. bool mFlipX;
  57. bool mFlipY;
  58. public:
  59. SkeletonObject();
  60. virtual ~SkeletonObject();
  61. static void initPersistFields();
  62. virtual void preIntegrate( const F32 totalTime, const F32 elapsedTime, DebugStats* pDebugStats );
  63. virtual void integrateObject( const F32 totalTime, const F32 elapsedTime, DebugStats* pDebugStats );
  64. virtual void interpolateObject( const F32 timeDelta );
  65. virtual void copyTo( SimObject* object );
  66. virtual bool canPrepareRender( void ) const { return true; }
  67. virtual bool validRender( void ) const { return mSkeletonAsset.notNull(); }
  68. virtual bool shouldRender( void ) const { return true; }
  69. virtual void scenePrepareRender( const SceneRenderState* pSceneRenderState, SceneRenderQueue* pSceneRenderQueue );
  70. virtual void sceneRender( const SceneRenderState* pSceneRenderState, const SceneRenderRequest* pSceneRenderRequest, BatchRender* pBatchRenderer );
  71. /// Render flipping.
  72. void setFlip( const bool flipX, const bool flipY ) { mFlipX = flipX; mFlipY = flipY; }
  73. void setFlipX( const bool flipX ) { setFlip( flipX, mFlipY ); }
  74. void setFlipY( const bool flipY ) { setFlip( mFlipX, flipY ); }
  75. inline bool getFlipX( void ) const { return mFlipX; }
  76. inline bool getFlipY( void ) const { return mFlipY; }
  77. bool setSkeletonAsset( const char* pSkeletonAssetId );
  78. inline StringTableEntry getSkeletonAsset( void ) const { return mSkeletonAsset.getAssetId(); }
  79. inline bool setAnimationName( const char* pAnimation ) { return setAnimationName( pAnimation, mAnimationCycle ); }
  80. bool setAnimationName( const char* pAnimation, const bool isLooping = false);
  81. inline StringTableEntry getAnimationName( void ) const { return mCurrentAnimation; }
  82. bool setMix( const char* pFromAnimation, const char* pToAnimation, float time);
  83. bool setCurrentSkin( const char* pSkin );
  84. inline StringTableEntry getCurrentSkin( void ) const { return mCurrentSkin; }
  85. void setRootBoneScale( const Vector2& scale );
  86. inline void setRootBoneScale( const F32 x, const F32 y ){ setRootBoneScale( Vector2(x, y) ); }
  87. inline Vector2 getRootBoneScale( void ) const { return mSkeletonScale; }
  88. void setRootBoneOffset( const Vector2& scale );
  89. inline void setRootBoneOffset( const F32 x, const F32 y ){ setRootBoneOffset( Vector2(x, y) ); }
  90. inline Vector2 getRootBoneOffset( void ) const { return mSkeletonOffset; }
  91. inline F32 getAnimationDuration( void ) const { return mAnimationDuration; }
  92. inline bool isAnimationFinished( void ) const { return mAnimationFinished; };
  93. inline void setAnimationCycle( const bool isLooping ) { mAnimationCycle = isLooping; }
  94. inline bool getAnimationCycle( void ) const {return mAnimationCycle; };
  95. void onAnimationFinished();
  96. /// Declare Console Object.
  97. DECLARE_CONOBJECT( SkeletonObject );
  98. protected:
  99. void generateComposition( void );
  100. void updateComposition( const F32 time );
  101. protected:
  102. static bool setSkeletonAsset( void* obj, const char* data ) { static_cast<SkeletonObject*>(obj)->setSkeletonAsset(data); return false; }
  103. static const char* getSkeletonAsset(void* obj, const char* data) { return static_cast<SkeletonObject*>(obj)->getSkeletonAsset(); }
  104. static bool writeSkeletonAsset( void* obj, StringTableEntry pFieldName ) { return static_cast<SkeletonObject*>(obj)->mSkeletonAsset.notNull(); }
  105. static bool setAnimationName( void* obj, const char* data ) { static_cast<SkeletonObject*>(obj)->setAnimationName(data, static_cast<SkeletonObject*>(obj)->getAnimationCycle()); return false; }
  106. static const char* getAnimationName(void* obj, const char* data) { return static_cast<SkeletonObject*>(obj)->getAnimationName(); }
  107. static bool writeAnimationName( void*obj, StringTableEntry pAnimation ) { return static_cast<SkeletonObject*>(obj)->getAnimationName() != StringTable->EmptyString; }
  108. static bool setCurrentSkin( void* obj, const char* data ) { static_cast<SkeletonObject*>(obj)->setCurrentSkin(data); return false; }
  109. static const char* getCurrentSkin(void* obj, const char* data) { return static_cast<SkeletonObject*>(obj)->getCurrentSkin(); }
  110. static bool writeCurrentSkin( void*obj, StringTableEntry pSkin ) { return static_cast<SkeletonObject*>(obj)->getCurrentSkin() != StringTable->EmptyString; }
  111. static bool setRootBoneScale(void* obj, const char* data) { static_cast<SkeletonObject*>(obj)->setRootBoneScale(Vector2(data)); return false; }
  112. static const char* getRootBoneScale(void* obj, const char* data) { return static_cast<SkeletonObject*>(obj)->getRootBoneScale().scriptThis(); }
  113. static bool writeRootBoneScale( void* obj, StringTableEntry pFieldName ) { return static_cast<SkeletonObject*>(obj)->getRootBoneScale().notZero(); }
  114. static bool setRootBoneOffset(void* obj, const char* data) { static_cast<SkeletonObject*>(obj)->setRootBoneOffset(Vector2(data)); return false; }
  115. static const char* getRootBoneOffset(void* obj, const char* data) { return static_cast<SkeletonObject*>(obj)->getRootBoneOffset().scriptThis(); }
  116. static bool writeRootBoneOffset( void* obj, StringTableEntry pFieldName ) { return static_cast<SkeletonObject*>(obj)->getRootBoneOffset().notZero(); }
  117. static bool setAnimationCycle( void* obj, const char* data ) { static_cast<SkeletonObject*>(obj)->setAnimationCycle( dAtob(data) ); return false; }
  118. static bool writeAnimationCycle( void* obj, StringTableEntry pFieldName ) { return static_cast<SkeletonObject*>(obj)->getAnimationCycle() == false; }
  119. static bool writeFlipX( void* obj, StringTableEntry pFieldName ) { return static_cast<SkeletonObject*>(obj)->getFlipX() == true; }
  120. static bool writeFlipY( void* obj, StringTableEntry pFieldName ) { return static_cast<SkeletonObject*>(obj)->getFlipY() == true; }
  121. };
  122. #endif // _SKELETON_OBJECT_H_