2013-06-06 12:02:54 +08:00
/****************************************************************************
2014-01-07 11:47:11 +08:00
Copyright ( c ) 2013 - 2014 Chukong Technologies Inc .
2013-06-06 12:02:54 +08:00
http : //www.cocos2d-x.org
Permission is hereby granted , free of charge , to any person obtaining a copy
of this software and associated documentation files ( the " Software " ) , to deal
in the Software without restriction , including without limitation the rights
to use , copy , modify , merge , publish , distribute , sublicense , and / or sell
copies of the Software , and to permit persons to whom the Software is
furnished to do so , subject to the following conditions :
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software .
THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM ,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2013-09-13 18:07:37 +08:00
2013-06-06 12:02:54 +08:00
# ifndef __CCARMATURE_H__
# define __CCARMATURE_H__
2013-10-16 16:48:39 +08:00
# include "cocostudio/CCArmatureDefine.h"
# include "cocostudio/CCBone.h"
# include "cocostudio/CCBatchNode.h"
# include "cocostudio/CCArmatureAnimation.h"
# include "cocostudio/CCSpriteFrameCacheHelper.h"
# include "cocostudio/CCArmatureDataManager.h"
2014-04-26 13:03:25 +08:00
# include "math/CCMath.h"
2013-06-06 12:02:54 +08:00
2013-09-13 18:07:37 +08:00
class b2Body ;
struct cpBody ;
2013-06-06 12:02:54 +08:00
2013-10-15 18:00:03 +08:00
namespace cocostudio {
2013-09-13 18:07:37 +08:00
2013-09-16 14:13:55 +08:00
CC_DEPRECATED_ATTRIBUTE typedef ProcessBase CCProcessBase ;
CC_DEPRECATED_ATTRIBUTE typedef BaseData CCBaseData ;
CC_DEPRECATED_ATTRIBUTE typedef DisplayData CCDisplayData ;
CC_DEPRECATED_ATTRIBUTE typedef SpriteDisplayData CCSpriteDisplayData ;
CC_DEPRECATED_ATTRIBUTE typedef ArmatureDisplayData CCArmatureDisplayData ;
CC_DEPRECATED_ATTRIBUTE typedef ParticleDisplayData CCParticleDisplayData ;
CC_DEPRECATED_ATTRIBUTE typedef BoneData CCBoneData ;
CC_DEPRECATED_ATTRIBUTE typedef FrameData CCFrameData ;
CC_DEPRECATED_ATTRIBUTE typedef MovementBoneData CCMovementBoneData ;
CC_DEPRECATED_ATTRIBUTE typedef MovementData CCMovementData ;
CC_DEPRECATED_ATTRIBUTE typedef AnimationData CCAnimationData ;
CC_DEPRECATED_ATTRIBUTE typedef ContourData CCContourData ;
CC_DEPRECATED_ATTRIBUTE typedef TextureData CCTextureData ;
CC_DEPRECATED_ATTRIBUTE typedef DecorativeDisplay CCDecorativeDisplay ;
CC_DEPRECATED_ATTRIBUTE typedef DisplayData CCDisplayData ;
CC_DEPRECATED_ATTRIBUTE typedef DisplayFactory CCDisplayFactory ;
CC_DEPRECATED_ATTRIBUTE typedef BatchNode CCBatchNode ;
CC_DEPRECATED_ATTRIBUTE typedef DecorativeDisplay CCDecorativeDisplay ;
CC_DEPRECATED_ATTRIBUTE typedef DisplayManager CCDisplayManager ;
CC_DEPRECATED_ATTRIBUTE typedef ColliderBody CCColliderBody ;
CC_DEPRECATED_ATTRIBUTE typedef ColliderDetector CCColliderDetector ;
CC_DEPRECATED_ATTRIBUTE typedef SpriteFrameCacheHelper CCSpriteFrameCacheHelper ;
CC_DEPRECATED_ATTRIBUTE typedef ArmatureData CCArmatureData ;
CC_DEPRECATED_ATTRIBUTE typedef Bone CCBone ;
CC_DEPRECATED_ATTRIBUTE typedef ArmatureAnimation CCArmatureAnimation ;
CC_DEPRECATED_ATTRIBUTE typedef Armature CCArmature ;
CC_DEPRECATED_ATTRIBUTE typedef ArmatureDataManager CCArmatureDataManager ;
2014-02-17 14:30:17 +08:00
CC_DEPRECATED_ATTRIBUTE typedef cocos2d : : tweenfunc : : TweenType CCTweenType ;
2013-09-16 14:13:55 +08:00
2013-12-06 18:07:16 +08:00
class Armature : public cocos2d : : Node , public cocos2d : : BlendProtocol
2013-06-06 12:02:54 +08:00
{
public :
2013-09-13 18:07:37 +08:00
2013-09-13 16:46:31 +08:00
/**
2013-09-13 18:07:37 +08:00
* Allocates and initializes an armature .
* @ return An initialized armature which is marked as " autorelease " .
*/
2013-09-15 19:08:45 +08:00
static Armature * create ( ) ;
2013-09-13 18:07:37 +08:00
2013-09-13 11:41:20 +08:00
/**
2013-09-15 19:08:45 +08:00
* Allocates an armature , and use the ArmatureData named name in ArmatureDataManager to initializes the armature .
2013-09-13 18:07:37 +08:00
*
2013-09-15 19:08:45 +08:00
* @ param name Armature will use the name to find the ArmatureData to initializes it .
2013-09-13 18:07:37 +08:00
* @ return A initialized armature which is marked as " autorelease " .
*/
2013-12-23 14:05:46 +08:00
static Armature * create ( const std : : string & name ) ;
2013-09-13 18:07:37 +08:00
2013-12-23 14:05:46 +08:00
static Armature * create ( const std : : string & name , Bone * parentBone ) ;
2013-06-06 12:02:54 +08:00
public :
2013-11-20 12:04:47 +08:00
/**
* @ js ctor
*/
2013-09-15 19:08:45 +08:00
Armature ( ) ;
2013-09-16 14:13:55 +08:00
/**
* @ js NA
* @ lua NA
*/
2013-11-06 11:20:16 +08:00
virtual ~ Armature ( void ) ;
2013-06-06 12:02:54 +08:00
/**
* Init the empty armature
*/
2013-11-05 19:53:38 +08:00
virtual bool init ( ) override ;
2013-09-13 18:07:37 +08:00
2013-06-06 12:02:54 +08:00
/**
2013-09-13 18:07:37 +08:00
* Init an armature with specified name
2013-09-15 19:08:45 +08:00
* @ param name Armature name
2013-06-06 12:02:54 +08:00
*/
2013-12-23 14:05:46 +08:00
virtual bool init ( const std : : string & name ) ;
2013-06-06 12:02:54 +08:00
2013-12-23 14:05:46 +08:00
virtual bool init ( const std : : string & name , Bone * parentBone ) ;
2013-06-06 12:02:54 +08:00
/**
2013-09-15 19:08:45 +08:00
* Add a Bone to this Armature ,
2013-06-06 12:02:54 +08:00
*
2013-09-15 19:08:45 +08:00
* @ param bone The Bone you want to add to Armature
2013-11-05 15:32:13 +08:00
* @ param parentName The parent Bone ' s name you want to add to . If it ' s nullptr , then set Armature to its parent
2013-06-06 12:02:54 +08:00
*/
2013-12-23 14:05:46 +08:00
virtual void addBone ( Bone * bone , const std : : string & parentName ) ;
2013-06-06 12:02:54 +08:00
/**
* Get a bone with the specified name
*
* @ param name The bone ' s name you want to get
*/
2013-12-23 14:05:46 +08:00
virtual Bone * getBone ( const std : : string & name ) const ;
2013-06-06 12:02:54 +08:00
/**
* Change a bone ' s parent with the specified parent name .
*
* @ param bone The bone you want to change parent
2013-09-13 18:07:37 +08:00
* @ param parentName The new parent ' s name .
2013-06-06 12:02:54 +08:00
*/
2013-12-23 14:05:46 +08:00
virtual void changeBoneParent ( Bone * bone , const std : : string & parentName ) ;
2013-06-06 12:02:54 +08:00
/**
2013-09-15 19:08:45 +08:00
* Remove a bone with the specified name . If recursion it will also remove child Bone recursionly .
2013-06-06 12:02:54 +08:00
*
* @ param bone The bone you want to remove
2013-09-13 18:07:37 +08:00
* @ param recursion Determine whether remove the bone ' s child recursion .
2013-06-06 12:02:54 +08:00
*/
2013-09-15 19:08:45 +08:00
virtual void removeBone ( Bone * bone , bool recursion ) ;
2013-06-06 12:02:54 +08:00
/**
2013-09-15 19:08:45 +08:00
* Get Armature ' s bone dictionary
* @ return Armature ' s bone dictionary
2013-06-06 12:02:54 +08:00
*/
2013-12-16 14:34:09 +08:00
const cocos2d : : Map < std : : string , Bone * > & getBoneDic ( ) const ;
2013-06-06 12:02:54 +08:00
2013-09-13 18:07:37 +08:00
/**
* This boundingBox will calculate all bones ' boundingBox every time
2013-06-06 12:02:54 +08:00
*/
2013-11-05 19:53:38 +08:00
virtual cocos2d : : Rect getBoundingBox ( ) const override ;
2013-09-13 18:07:37 +08:00
2013-11-05 19:53:38 +08:00
Bone * getBoneAtPoint ( float x , float y ) const ;
2013-09-13 18:07:37 +08:00
2013-09-16 14:13:55 +08:00
// overrides
/**
* @ js NA
* @ lua NA
*/
2014-05-31 07:42:05 +08:00
virtual void visit ( cocos2d : : Renderer * renderer , const cocos2d : : Mat4 & parentTransform , uint32_t parentFlags ) override ;
virtual void draw ( cocos2d : : Renderer * renderer , const cocos2d : : Mat4 & transform , uint32_t flags ) override ;
2013-09-16 14:13:55 +08:00
virtual void update ( float dt ) override ;
2013-12-26 15:49:20 +08:00
virtual void onEnter ( ) override ;
virtual void onExit ( ) override ;
2014-05-15 01:07:09 +08:00
virtual const cocos2d : : Mat4 & getNodeToParentTransform ( ) const override ;
2013-11-20 12:04:47 +08:00
/**
* @ js NA
* @ lua NA
*/
2013-10-15 18:00:03 +08:00
inline void setBlendFunc ( const cocos2d : : BlendFunc & blendFunc ) override { _blendFunc = blendFunc ; }
2013-11-20 12:04:47 +08:00
/**
* @ js NA
* @ lua NA
*/
2013-10-15 18:00:03 +08:00
inline const cocos2d : : BlendFunc & getBlendFunc ( void ) const override { return _blendFunc ; }
2013-09-16 14:13:55 +08:00
2013-06-06 12:02:54 +08:00
2013-09-13 11:41:20 +08:00
/**
2013-09-13 18:07:37 +08:00
* Set contentsize and Calculate anchor point .
2013-09-13 11:41:20 +08:00
*/
2013-09-13 18:07:37 +08:00
virtual void updateOffsetPoint ( ) ;
2014-05-15 01:07:09 +08:00
virtual void setAnchorPoint ( const cocos2d : : Vec2 & point ) override ;
virtual const cocos2d : : Vec2 & getAnchorPointInPoints ( ) const override ;
2013-09-13 18:07:37 +08:00
2013-09-15 19:08:45 +08:00
virtual void setAnimation ( ArmatureAnimation * animation ) ;
2013-11-05 19:53:38 +08:00
virtual ArmatureAnimation * getAnimation ( ) const ;
2013-09-14 19:54:49 +08:00
2013-11-05 19:53:38 +08:00
virtual bool getArmatureTransformDirty ( ) const ;
2013-09-13 18:07:37 +08:00
2013-10-30 09:41:40 +08:00
2013-12-06 13:40:49 +08:00
# if ENABLE_PHYSICS_BOX2D_DETECT || ENABLE_PHYSICS_CHIPMUNK_DETECT
2013-11-01 14:36:44 +08:00
virtual void setColliderFilter ( ColliderFilter * filter ) ;
2013-12-06 13:40:49 +08:00
# elif ENABLE_PHYSICS_SAVE_CALCULATED_VERTEX
virtual void drawContour ( ) ;
# endif
2013-11-01 14:36:44 +08:00
2013-11-05 19:53:38 +08:00
virtual void setArmatureData ( ArmatureData * armatureData ) { _armatureData = armatureData ; }
2013-11-06 15:25:44 +08:00
virtual ArmatureData * getArmatureData ( ) const { return _armatureData ; }
2013-11-05 19:53:38 +08:00
virtual void setParentBone ( Bone * parentBone ) ;
virtual Bone * getParentBone ( ) const ;
virtual void setVersion ( float version ) { _version = version ; }
virtual float getVersion ( ) const { return _version ; }
2013-12-17 17:00:01 +08:00
virtual void setBatchNode ( BatchNode * batchNode ) { _batchNode = batchNode ; }
virtual BatchNode * getBatchNode ( ) const { return _batchNode ; }
2013-09-13 18:07:37 +08:00
# if ENABLE_PHYSICS_BOX2D_DETECT
virtual b2Fixture * getShapeList ( ) ;
2013-11-20 12:04:47 +08:00
/**
* @ js NA
* @ lua NA
*/
2013-11-05 19:53:38 +08:00
virtual void setBody ( b2Body * body ) ;
2013-11-20 12:04:47 +08:00
/**
* @ js NA
* @ lua NA
*/
2013-11-05 19:53:38 +08:00
virtual b2Body * getBody ( ) const ;
2013-09-13 18:07:37 +08:00
# elif ENABLE_PHYSICS_CHIPMUNK_DETECT
2013-11-20 12:04:47 +08:00
/**
* @ js NA
* @ lua NA
*/
2013-09-13 18:07:37 +08:00
virtual cpShape * getShapeList ( ) ;
2013-11-20 12:04:47 +08:00
/**
* @ js NA
* @ lua NA
*/
2013-11-05 19:53:38 +08:00
virtual void setBody ( cpBody * body ) ;
2013-11-20 12:04:47 +08:00
/**
* @ js NA
* @ lua NA
*/
2013-11-05 19:53:38 +08:00
virtual cpBody * getBody ( ) const ;
2013-09-13 18:07:37 +08:00
# endif
2013-06-06 12:02:54 +08:00
protected :
2013-09-13 18:07:37 +08:00
2013-06-06 12:02:54 +08:00
/*
2013-09-15 19:08:45 +08:00
* Used to create Bone internal
2013-11-20 12:04:47 +08:00
* @ js NA
* @ lua NA
2013-06-06 12:02:54 +08:00
*/
2013-12-23 14:05:46 +08:00
Bone * createBone ( const std : : string & boneName ) ;
2013-06-06 12:02:54 +08:00
protected :
2013-11-05 19:53:38 +08:00
ArmatureData * _armatureData ;
2013-12-17 17:00:01 +08:00
2013-11-05 19:53:38 +08:00
BatchNode * _batchNode ;
2013-12-17 17:00:01 +08:00
2013-11-05 19:53:38 +08:00
Bone * _parentBone ;
float _version ;
2013-09-15 20:24:25 +08:00
mutable bool _armatureTransformDirty ;
2013-09-14 19:54:49 +08:00
2013-12-16 14:34:09 +08:00
cocos2d : : Map < std : : string , Bone * > _boneDic ; //! The dictionary of the bones, include all bones in the armature, no matter it is the direct bone or the indirect bone. It is different from m_pChindren.
2013-09-13 18:07:37 +08:00
2013-12-16 14:34:09 +08:00
cocos2d : : Vector < Bone * > _topBoneList ;
2013-09-13 18:07:37 +08:00
2013-10-15 18:00:03 +08:00
cocos2d : : BlendFunc _blendFunc ; //! It's required for CCTextureProtocol inheritance
2013-06-06 12:02:54 +08:00
2014-05-15 01:07:09 +08:00
cocos2d : : Vec2 _offsetPoint ;
cocos2d : : Vec2 _realAnchorPointInPoints ;
2013-06-06 12:02:54 +08:00
2013-09-15 20:24:25 +08:00
ArmatureAnimation * _animation ;
2013-06-06 12:02:54 +08:00
2013-09-13 18:07:37 +08:00
# if ENABLE_PHYSICS_BOX2D_DETECT
2013-11-05 19:53:38 +08:00
b2Body * _body ;
2013-09-13 18:07:37 +08:00
# elif ENABLE_PHYSICS_CHIPMUNK_DETECT
2013-11-05 19:53:38 +08:00
cpBody * _body ;
2013-09-13 18:07:37 +08:00
# endif
2013-06-06 12:02:54 +08:00
} ;
2013-10-15 18:00:03 +08:00
}
2013-06-06 12:02:54 +08:00
2013-06-07 10:52:32 +08:00
# endif /*__CCARMATURE_H__*/