2020-10-17 16:32:16 +08:00
|
|
|
/****************************************************************************
|
|
|
|
Copyright (c) 2013-2017 Chukong Technologies Inc.
|
2013-06-06 12:02:54 +08:00
|
|
|
|
2022-07-09 22:23:34 +08:00
|
|
|
https://axis-project.github.io/
|
2013-06-06 12:02:54 +08:00
|
|
|
|
|
|
|
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.
|
|
|
|
****************************************************************************/
|
|
|
|
|
|
|
|
#ifndef __CCBONE_H__
|
|
|
|
#define __CCBONE_H__
|
|
|
|
|
2020-10-21 10:12:00 +08:00
|
|
|
#include "CCArmatureDefine.h"
|
|
|
|
#include "CCDatas.h"
|
|
|
|
#include "CCTween.h"
|
|
|
|
#include "CCDecorativeDisplay.h"
|
|
|
|
#include "CCDisplayManager.h"
|
|
|
|
#include "CocosStudioExport.h"
|
2014-04-27 01:11:22 +08:00
|
|
|
#include "2d/CCNode.h"
|
2014-04-26 13:03:25 +08:00
|
|
|
#include "math/CCMath.h"
|
2013-06-06 12:02:54 +08:00
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
namespace cocostudio
|
|
|
|
{
|
2013-06-06 12:02:54 +08:00
|
|
|
|
2013-09-15 19:08:45 +08:00
|
|
|
class Armature;
|
2013-09-13 18:07:37 +08:00
|
|
|
|
2022-07-11 17:50:21 +08:00
|
|
|
class CCS_DLL Bone : public axis::Node
|
2013-06-06 12:02:54 +08:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
/**
|
|
|
|
* Allocates and initializes a bone.
|
|
|
|
* @return A initialized bone which is marked as "autorelease".
|
|
|
|
*/
|
2021-12-25 10:04:45 +08:00
|
|
|
static Bone* create();
|
2013-06-06 12:02:54 +08:00
|
|
|
/**
|
|
|
|
* Allocates and initializes a bone.
|
2013-06-07 10:52:32 +08:00
|
|
|
*
|
|
|
|
* @param name If name is not null, then set name to the bone's name
|
2013-06-06 12:02:54 +08:00
|
|
|
* @return A initialized bone which is marked as "autorelease".
|
|
|
|
*/
|
2021-12-26 23:26:34 +08:00
|
|
|
static Bone* create(std::string_view name);
|
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
|
|
|
Bone();
|
2013-09-16 14:13:55 +08:00
|
|
|
/**
|
|
|
|
* @js NA
|
|
|
|
* @lua NA
|
|
|
|
*/
|
2020-10-17 16:32:16 +08:00
|
|
|
virtual ~Bone(void);
|
2013-06-07 10:52:32 +08:00
|
|
|
|
|
|
|
/**
|
2013-09-15 19:08:45 +08:00
|
|
|
* Initializes an empty Bone with nothing init.
|
2013-06-06 12:02:54 +08:00
|
|
|
*/
|
2013-11-05 19:53:38 +08:00
|
|
|
virtual bool init() override;
|
2013-06-06 12:02:54 +08:00
|
|
|
|
|
|
|
/**
|
2013-09-15 19:08:45 +08:00
|
|
|
* Initializes a Bone with the specified name
|
|
|
|
* @param name Bone's name.
|
2013-06-06 12:02:54 +08:00
|
|
|
*/
|
2021-12-26 23:26:34 +08:00
|
|
|
virtual bool init(std::string_view name);
|
2013-06-06 12:02:54 +08:00
|
|
|
|
|
|
|
/**
|
2013-09-13 18:07:37 +08:00
|
|
|
* Add display and use displayData to init the display.
|
2013-06-06 12:02:54 +08:00
|
|
|
* If index already have a display, then replace it.
|
|
|
|
* If index is current display index, then also change display to _index
|
|
|
|
*
|
2013-06-07 10:52:32 +08:00
|
|
|
* @param displayData it include the display information, like DisplayType.
|
2013-09-15 19:08:45 +08:00
|
|
|
* If you want to create a sprite display, then create a SpriteDisplayData param
|
2013-06-06 12:02:54 +08:00
|
|
|
*
|
2013-08-01 21:40:13 +08:00
|
|
|
* @param index the index of the display you want to replace or add to
|
2013-06-06 12:02:54 +08:00
|
|
|
* -1 : append display from back
|
|
|
|
*/
|
2021-12-25 10:04:45 +08:00
|
|
|
void addDisplay(DisplayData* displayData, int index);
|
2013-09-13 18:07:37 +08:00
|
|
|
|
2022-07-11 17:50:21 +08:00
|
|
|
void addDisplay(axis::Node* display, int index);
|
2013-06-07 10:52:32 +08:00
|
|
|
|
2013-10-30 09:41:40 +08:00
|
|
|
void removeDisplay(int index);
|
|
|
|
|
2022-07-15 19:17:01 +08:00
|
|
|
AX_DEPRECATED_ATTRIBUTE void changeDisplayByIndex(int index, bool force);
|
|
|
|
AX_DEPRECATED_ATTRIBUTE void changeDisplayByName(std::string_view name, bool force);
|
2014-01-02 11:07:31 +08:00
|
|
|
|
|
|
|
void changeDisplayWithIndex(int index, bool force);
|
2021-12-26 23:26:34 +08:00
|
|
|
void changeDisplayWithName(std::string_view name, bool force);
|
2013-06-06 12:02:54 +08:00
|
|
|
|
|
|
|
/**
|
2021-12-25 10:04:45 +08:00
|
|
|
* Add a child to this bone, and it will let this child call setParent(Bone *parent) function to set self to it's
|
|
|
|
* parent
|
2015-06-17 13:16:06 +08:00
|
|
|
* @param child the child you want to add
|
2013-06-06 12:02:54 +08:00
|
|
|
*/
|
2021-12-25 10:04:45 +08:00
|
|
|
void addChildBone(Bone* child);
|
2013-06-07 10:52:32 +08:00
|
|
|
|
2013-06-06 12:02:54 +08:00
|
|
|
/**
|
2013-06-07 10:52:32 +08:00
|
|
|
* Set parent bone.
|
2016-01-12 12:22:24 +08:00
|
|
|
* If parent is null, then also remove this bone from armature.
|
2021-12-25 10:04:45 +08:00
|
|
|
* It will not set the Armature, if you want to add the bone to a Armature, you should use Armature::addBone(Bone
|
|
|
|
* *bone, const char* parentName).
|
2013-06-06 12:02:54 +08:00
|
|
|
*
|
2013-06-07 10:52:32 +08:00
|
|
|
* @param parent the parent bone.
|
2013-11-05 15:32:13 +08:00
|
|
|
* nullptr : remove this bone from armature
|
2013-06-06 12:02:54 +08:00
|
|
|
*/
|
2021-12-25 10:04:45 +08:00
|
|
|
void setParentBone(Bone* parent);
|
2013-06-07 10:52:32 +08:00
|
|
|
|
2013-06-06 12:02:54 +08:00
|
|
|
/**
|
2013-06-07 10:52:32 +08:00
|
|
|
* Get parent bone
|
|
|
|
* @return parent bone
|
2013-06-06 12:02:54 +08:00
|
|
|
*/
|
2021-12-25 10:04:45 +08:00
|
|
|
Bone* getParentBone();
|
2013-06-07 10:52:32 +08:00
|
|
|
|
2013-11-11 15:29:24 +08:00
|
|
|
using Node::removeFromParent;
|
2013-06-06 12:02:54 +08:00
|
|
|
/**
|
2013-09-13 18:07:37 +08:00
|
|
|
* Remove itself from its parent.
|
2013-11-11 15:29:24 +08:00
|
|
|
* @param recursion whether or not to remove childBone's display
|
2013-06-06 12:02:54 +08:00
|
|
|
*/
|
2013-11-11 15:29:24 +08:00
|
|
|
void removeFromParent(bool recursion);
|
2013-06-07 10:52:32 +08:00
|
|
|
|
2013-06-06 12:02:54 +08:00
|
|
|
/**
|
2013-09-15 19:08:45 +08:00
|
|
|
* Removes a child Bone
|
2015-06-17 13:16:06 +08:00
|
|
|
* @param bone the bone you want to remove
|
2013-06-06 12:02:54 +08:00
|
|
|
*/
|
2021-12-25 10:04:45 +08:00
|
|
|
void removeChildBone(Bone* bone, bool recursion);
|
2013-06-07 10:52:32 +08:00
|
|
|
|
2013-11-05 19:53:38 +08:00
|
|
|
void update(float delta) override;
|
2013-06-06 12:02:54 +08:00
|
|
|
|
2022-07-11 17:50:21 +08:00
|
|
|
void updateDisplayedColor(const axis::Color3B& parentColor) override;
|
2019-11-25 01:35:26 +08:00
|
|
|
void updateDisplayedOpacity(uint8_t parentOpacity) override;
|
2013-06-06 12:02:54 +08:00
|
|
|
|
2013-06-07 10:52:32 +08:00
|
|
|
//! Update color to render display
|
2013-12-11 16:12:14 +08:00
|
|
|
virtual void updateColor() override;
|
2013-06-06 12:02:54 +08:00
|
|
|
|
2013-09-13 18:07:37 +08:00
|
|
|
//! Update zorder
|
|
|
|
void updateZOrder();
|
2013-06-06 12:02:54 +08:00
|
|
|
|
2014-01-19 03:35:27 +08:00
|
|
|
virtual void setLocalZOrder(int zOrder) override;
|
2013-09-13 18:07:37 +08:00
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
Tween* getTween();
|
2013-09-13 18:07:37 +08:00
|
|
|
|
2013-06-07 10:52:32 +08:00
|
|
|
/*
|
|
|
|
* Whether or not the bone's transform property changed. if true, the bone will update the transform.
|
|
|
|
*/
|
2013-11-05 19:53:38 +08:00
|
|
|
virtual void setTransformDirty(bool dirty) { _boneTransformDirty = dirty; }
|
|
|
|
virtual bool isTransformDirty() { return _boneTransformDirty; }
|
2013-06-06 12:02:54 +08:00
|
|
|
|
2022-07-11 17:50:21 +08:00
|
|
|
virtual axis::Mat4 getNodeToArmatureTransform() const;
|
|
|
|
virtual axis::Mat4 getNodeToWorldTransform() const override;
|
2013-09-13 18:07:37 +08:00
|
|
|
|
2022-07-11 17:50:21 +08:00
|
|
|
axis::Node* getDisplayRenderNode();
|
2013-10-30 09:41:40 +08:00
|
|
|
DisplayType getDisplayRenderNodeType();
|
2013-09-13 18:07:37 +08:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Get the ColliderBody list in this bone. The object in the Array is ColliderBody.
|
|
|
|
*/
|
2013-12-16 14:34:09 +08:00
|
|
|
virtual ColliderDetector* getColliderDetector() const;
|
2013-06-06 12:02:54 +08:00
|
|
|
|
2013-12-06 13:40:49 +08:00
|
|
|
#if ENABLE_PHYSICS_BOX2D_DETECT || ENABLE_PHYSICS_CHIPMUNK_DETECT
|
2021-12-25 10:04:45 +08:00
|
|
|
virtual void setColliderFilter(ColliderFilter* filter);
|
|
|
|
virtual ColliderFilter* getColliderFilter();
|
2013-12-06 13:40:49 +08:00
|
|
|
#endif
|
2013-11-05 19:53:38 +08:00
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
virtual void setBoneData(BoneData* boneData);
|
|
|
|
virtual BoneData* getBoneData() const;
|
2013-11-05 19:53:38 +08:00
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
virtual void setArmature(Armature* armature);
|
|
|
|
virtual Armature* getArmature() const;
|
2013-11-05 19:53:38 +08:00
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
virtual void setChildArmature(Armature* childArmature);
|
|
|
|
virtual Armature* getChildArmature() const;
|
2013-11-05 19:53:38 +08:00
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
virtual DisplayManager* getDisplayManager() const { return _displayManager; }
|
2013-11-20 12:04:47 +08:00
|
|
|
/**
|
|
|
|
* @lua NA
|
|
|
|
*/
|
2013-11-05 19:53:38 +08:00
|
|
|
virtual void setIgnoreMovementBoneData(bool ignore) { _ignoreMovementBoneData = ignore; }
|
|
|
|
virtual bool isIgnoreMovementBoneData() const { return _ignoreMovementBoneData; }
|
|
|
|
|
2013-11-06 15:25:44 +08:00
|
|
|
/*
|
|
|
|
* This function is deprecated, please use isIgnoreMovementBoneData()
|
2013-11-20 12:04:47 +08:00
|
|
|
* @lua NA
|
2013-11-06 15:25:44 +08:00
|
|
|
*/
|
2022-07-15 19:17:01 +08:00
|
|
|
AX_DEPRECATED_ATTRIBUTE virtual bool getIgnoreMovementBoneData() const { return isIgnoreMovementBoneData(); }
|
2013-11-06 15:25:44 +08:00
|
|
|
|
2013-12-13 15:02:09 +08:00
|
|
|
/*
|
|
|
|
* Set blend function
|
|
|
|
*/
|
2022-07-11 17:50:21 +08:00
|
|
|
virtual void setBlendFunc(const axis::BlendFunc& blendFunc);
|
|
|
|
virtual axis::BlendFunc getBlendFunc(void) { return _blendFunc; }
|
2013-12-13 15:02:09 +08:00
|
|
|
|
|
|
|
/*
|
2021-12-25 10:04:45 +08:00
|
|
|
* Set if blend function is dirty
|
2013-12-13 15:02:09 +08:00
|
|
|
*/
|
|
|
|
virtual void setBlendDirty(bool dirty) { _blendDirty = dirty; }
|
2020-10-17 16:32:16 +08:00
|
|
|
virtual bool isBlendDirty(void) { return _blendDirty; }
|
2013-11-05 19:53:38 +08:00
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
virtual FrameData* getTweenData() const { return _tweenData; }
|
|
|
|
|
|
|
|
virtual BaseData* getWorldInfo() const { return _worldInfo; }
|
2013-11-05 19:53:38 +08:00
|
|
|
|
|
|
|
protected:
|
2021-12-25 10:04:45 +08:00
|
|
|
void applyParentTransform(Bone* parent);
|
2013-11-05 19:53:38 +08:00
|
|
|
|
2013-06-06 12:02:54 +08:00
|
|
|
/*
|
2013-09-16 12:21:18 +08:00
|
|
|
* The origin state of the Bone. Display's state is effected by _boneData, m_pNode, _tweenData
|
2013-09-15 19:08:45 +08:00
|
|
|
* when call setData function, it will copy from the BoneData.
|
2013-06-06 12:02:54 +08:00
|
|
|
*/
|
2021-12-25 10:04:45 +08:00
|
|
|
BoneData* _boneData;
|
2013-06-07 10:52:32 +08:00
|
|
|
|
2013-09-15 19:08:45 +08:00
|
|
|
//! A weak reference to the Armature
|
2021-12-25 10:04:45 +08:00
|
|
|
Armature* _armature;
|
2013-06-07 10:52:32 +08:00
|
|
|
|
2013-09-15 19:08:45 +08:00
|
|
|
//! A weak reference to the child Armature
|
2021-12-25 10:04:45 +08:00
|
|
|
Armature* _childArmature;
|
2013-06-06 12:02:54 +08:00
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
DisplayManager* _displayManager;
|
2013-06-07 10:52:32 +08:00
|
|
|
|
|
|
|
/*
|
2021-12-25 10:04:45 +08:00
|
|
|
* When Armature play an animation, if there is not a MovementBoneData of this bone in this MovementData, this
|
|
|
|
* bone will be hidden. Set IgnoreMovementBoneData to true, then this bone will also be shown.
|
2013-06-07 10:52:32 +08:00
|
|
|
*/
|
2013-11-05 19:53:38 +08:00
|
|
|
bool _ignoreMovementBoneData;
|
2013-06-06 12:02:54 +08:00
|
|
|
|
2022-07-11 17:50:21 +08:00
|
|
|
axis::BlendFunc _blendFunc;
|
2013-12-13 15:02:09 +08:00
|
|
|
bool _blendDirty;
|
2013-10-30 09:41:40 +08:00
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
Tween* _tween; //! Calculate tween effect
|
2013-06-06 12:02:54 +08:00
|
|
|
|
2013-09-13 18:07:37 +08:00
|
|
|
//! Used for making tween effect in every frame
|
2021-12-25 10:04:45 +08:00
|
|
|
FrameData* _tweenData;
|
2013-06-07 10:52:32 +08:00
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
Bone* _parentBone; //! A weak reference to its parent
|
|
|
|
bool _boneTransformDirty; //! Whether or not transform dirty
|
2013-06-07 10:52:32 +08:00
|
|
|
|
|
|
|
//! self Transform, use this to change display's state
|
2022-07-11 17:50:21 +08:00
|
|
|
axis::Mat4 _worldTransform;
|
2013-10-30 09:41:40 +08:00
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
BaseData* _worldInfo;
|
|
|
|
|
2013-10-30 09:41:40 +08:00
|
|
|
//! Armature's parent bone
|
2021-12-25 10:04:45 +08:00
|
|
|
Bone* _armatureParentBone;
|
|
|
|
|
2013-10-30 09:41:40 +08:00
|
|
|
//! Data version
|
|
|
|
float _dataVersion;
|
2013-06-06 12:02:54 +08:00
|
|
|
};
|
|
|
|
|
2021-12-25 10:04:45 +08:00
|
|
|
} // namespace cocostudio
|
2013-06-06 12:02:54 +08:00
|
|
|
|
2013-06-07 10:52:32 +08:00
|
|
|
#endif /*__CCBONE_H__*/
|