SpriteBatch.h 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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 _SPRITE_BATCH_H_
  23. #define _SPRITE_BATCH_H_
  24. #ifndef _SPRITE_BATCH_ITEM_H_
  25. #include "2d/core/SpriteBatchItem.h"
  26. #endif
  27. #ifndef _SCENE_RENDER_OBJECT_H_
  28. #include "2d/scene/SceneRenderObject.h"
  29. #endif
  30. //------------------------------------------------------------------------------
  31. class SpriteBatchQuery;
  32. //------------------------------------------------------------------------------
  33. class SpriteBatch
  34. {
  35. public:
  36. static const S32 INVALID_SPRITE_PROXY = -1;
  37. protected:
  38. typedef HashMap< U32, SpriteBatchItem* > typeSpriteBatchHash;
  39. typedef HashMap< SpriteBatchItem::LogicalPosition, SpriteBatchItem* > typeSpritePositionHash;
  40. typedef HashMap< StringTableEntry, SpriteBatchItem* > typeSpriteNameHash;
  41. typeSpriteBatchHash mSprites;
  42. typeSpritePositionHash mSpritePositions;
  43. typeSpriteNameHash mSpriteNames;
  44. SpriteBatchItem* mSelectedSprite;
  45. SceneRenderQueue::RenderSort mBatchSortMode;
  46. bool mBatchCulling;
  47. Vector2 mDefaultSpriteStride;
  48. Vector2 mDefaultSpriteSize;
  49. F32 mDefaultSpriteAngle;
  50. private:
  51. SpriteBatchQuery* mpSpriteBatchQuery;
  52. U32 mMasterBatchId;
  53. b2Transform mBatchTransform;
  54. bool mBatchTransformDirty;
  55. U32 mBatchTransformId;
  56. b2AABB mLocalAABB;
  57. Vector2 mLocalExtents;
  58. bool mLocalExtentsDirty;
  59. public:
  60. SpriteBatch();
  61. virtual ~SpriteBatch();
  62. virtual bool onAdd();
  63. virtual void onRemove();
  64. void prepareRender( SceneRenderObject* pSceneRenderObject, const SceneRenderState* pSceneRenderState, SceneRenderQueue* pSceneRenderQueue );
  65. void render( const SceneRenderState* pSceneRenderState, const SceneRenderRequest* pSceneRenderRequest, BatchRender* pBatchRenderer );
  66. inline void setBatchTransformDirty( void ) { mBatchTransformDirty = true; mBatchTransformId++; }
  67. inline bool getBatchTransformDirty( void ) const { return mBatchTransformDirty; }
  68. inline U32 getBatchTransformId( void ) { return mBatchTransformId; }
  69. const b2Transform& getBatchTransform( void ) const { return mBatchTransform; }
  70. inline void setLocalExtentsDirty( void ) { mLocalExtentsDirty = true; }
  71. inline bool getLocalExtentsDirty( void ) const { return mLocalExtentsDirty; }
  72. inline const Vector2& getLocalExtents( void ) { if ( getLocalExtentsDirty() ) updateLocalExtents(); return mLocalExtents; }
  73. inline const b2AABB& getLocalAABB(void) { if (getLocalExtentsDirty()) updateLocalExtents(); return mLocalAABB; }
  74. void createQueryProxy( SpriteBatchItem* pSpriteBatchItem );
  75. void destroyQueryProxy( SpriteBatchItem* pSpriteBatchItem );
  76. void moveQueryProxy( SpriteBatchItem* pSpriteBatchItem, const b2AABB& localAABB );
  77. SpriteBatchQuery* getSpriteBatchQuery( const bool clearQuery = false );
  78. virtual void copyTo( SpriteBatch* pSpriteBatch ) const;
  79. inline U32 getSpriteCount( void ) { return (U32)mSprites.size(); }
  80. U32 addSprite( const SpriteBatchItem::LogicalPosition& logicalPosition );
  81. bool removeSprite( void );
  82. virtual void clearSprites( void );
  83. inline void setBatchSortMode( SceneRenderQueue::RenderSort sortMode ) { mBatchSortMode = sortMode; }
  84. inline SceneRenderQueue::RenderSort getBatchSortMode( void ) const { return mBatchSortMode; }
  85. void setBatchCulling( const bool batchCulling );
  86. inline bool getBatchCulling( void ) const { return mBatchCulling; }
  87. inline void setDefaultSpriteStride( const Vector2& defaultStride ) { mDefaultSpriteStride = defaultStride; }
  88. inline const Vector2& getDefaultSpriteStride( void ) const { return mDefaultSpriteStride; }
  89. inline void setDefaultSpriteSize( const Vector2& defaultSize ) { mDefaultSpriteSize = defaultSize; }
  90. inline const Vector2& getDefaultSpriteSize( void ) const { return mDefaultSpriteSize; }
  91. inline void setDefaultSpriteAngle( const F32 defaultAngle ) { mDefaultSpriteAngle = defaultAngle; }
  92. inline F32 getDefaultSpriteAngle( void ) const { return mDefaultSpriteAngle; }
  93. bool selectSprite( const SpriteBatchItem::LogicalPosition& logicalPosition );
  94. bool selectSpriteId( const U32 batchId );
  95. bool selectSpriteName( const char* pName );
  96. inline void deselectSprite( void ) { mSelectedSprite = NULL; }
  97. bool isSpriteSelected( void ) const { return mSelectedSprite != NULL; }
  98. U32 getSpriteId( void ) const;
  99. void setSpriteImage( const char* pAssetId, const U32 imageFrame );
  100. void setSpriteImage( const char* pAssetId, const char* namedFrame );
  101. StringTableEntry getSpriteImage( void ) const;
  102. void setSpriteImageFrame( const U32 imageFrame );
  103. U32 getSpriteImageFrame( void ) const;
  104. void setSpriteNamedImageFrame( const char* namedFrame );
  105. StringTableEntry getSpriteNamedImageFrame( void ) const;
  106. void setSpriteAnimation( const char* pAssetId );
  107. StringTableEntry getSpriteAnimation(void) const;
  108. void setSpriteAnimationFrame(const U32 animationFrame);
  109. U32 getSpriteAnimationFrame(void) const;
  110. void clearSpriteAsset( void );
  111. void setSpriteVisible( const bool visible );
  112. bool getSpriteVisible( void ) const;
  113. void setSpriteLocalPosition( const Vector2& localPosition );
  114. Vector2 getSpriteLocalPosition( void );
  115. const SpriteBatchItem::LogicalPosition getSpriteLogicalPosition( void ) const;
  116. void setSpriteAngle( const F32 localAngle );
  117. F32 getSpriteAngle( void ) const;
  118. void setSpriteDepth( const F32 depth );
  119. F32 getSpriteDepth( void ) const;
  120. void setSpriteSize( const Vector2& size );
  121. Vector2 getSpriteSize( void ) const;
  122. void setSpriteFlipX( const bool flipX );
  123. bool getSpriteFlipX( void ) const;
  124. void setSpriteFlipY( const bool flipY );
  125. bool getSpriteFlipY( void ) const;
  126. void setSpriteSortPoint( const Vector2& sortPoint );
  127. Vector2 getSpriteSortPoint( void ) const;
  128. void setSpriteRenderGroup( const char* pRenderGroup );
  129. StringTableEntry getSpriteRenderGroup( void ) const;
  130. void setSpriteBlendMode( const bool blendMode );
  131. bool getSpriteBlendMode( void ) const;
  132. void setSpriteSrcBlendFactor( GLenum srcBlendFactor );
  133. GLenum getSpriteSrcBlendFactor( void ) const;
  134. void setSpriteDstBlendFactor( GLenum dstBlendFactor );
  135. GLenum getSpriteDstBlendFactor( void ) const;
  136. void setSpriteBlendColor( const ColorF& blendColor );
  137. const ColorF& getSpriteBlendColor( void ) const;
  138. void setSpriteBlendAlpha( const F32 alpha );
  139. F32 getSpriteBlendAlpha( void ) const;
  140. void setSpriteUseComplexColor(const bool complexColor);
  141. bool getSpriteUseComplexColor(void) const;
  142. void setSpriteComplexColor(const ColorF& blendColor0, const ColorF& blendColor1, const ColorF& blendColor2, const ColorF& blendColor3);
  143. const ColorF& getSpriteComplexColor(const S8 cornerID) const;
  144. void setSpriteAlphaTest( const F32 alphaTestMode );
  145. F32 getSpriteAlphaTest( void ) const;
  146. void setSpriteDataObject( SimObject* pDataObject );
  147. SimObject* getSpriteDataObject( void ) const;
  148. void setUserData( void* pUserData );
  149. void* getUserData( void ) const;
  150. void setSpriteName( const char* pName );
  151. StringTableEntry getSpriteName( void ) const;
  152. static void WriteCustomTamlSchema( const AbstractClassRep* pClassRep, TiXmlElement* pParentElement );
  153. protected:
  154. SpriteBatchItem* createSprite( void );
  155. SpriteBatchItem* createSprite( const Vector2* explicitVertices );
  156. SpriteBatchItem* findSpritePosition( const SpriteBatchItem::LogicalPosition& logicalPosition );
  157. SpriteBatchItem* findSpriteId( const U32 batchId );
  158. SpriteBatchItem* findSpriteName( const char* pName );
  159. virtual SpriteBatchItem* createSprite( const SpriteBatchItem::LogicalPosition& logicalPosition );
  160. void integrateSprites(const F32 totalTime, const F32 elapsedTime, DebugStats* pDebugStats);
  161. void setBatchTransform( const b2Transform& batchTransform );
  162. void updateLocalExtents(const b2AABB *precalculatedLocalAABB = NULL);
  163. void createSpriteBatchQuery( void );
  164. void destroySpriteBatchQuery( void );
  165. void onTamlCustomWrite( TamlCustomNodes& customNodes );
  166. void onTamlCustomRead( const TamlCustomNodes& customNodes );
  167. private:
  168. bool destroySprite( const U32 batchId );
  169. bool checkSpriteSelected( void ) const;
  170. b2AABB calculateLocalAABB( const b2AABB& renderAABB );
  171. };
  172. #endif // _SPRITE_BATCH_H_