11 #ifndef hifi_AnimNode_h
12 #define hifi_AnimNode_h
18 #include <glm/glm.hpp>
19 #include <glm/gtc/quaternion.hpp>
21 #include "AnimSkeleton.h"
22 #include "AnimVariant.h"
23 #include "AnimContext.h"
37 class AnimNode :
public std::enable_shared_from_this<AnimNode> {
39 using Type = AnimNodeType;
40 using Pointer = std::shared_ptr<AnimNode>;
41 using ConstPointer = std::shared_ptr<const AnimNode>;
43 friend class AnimDebugDraw;
44 friend void buildChildMap(std::map<QString, Pointer>& map, Pointer node);
45 friend class AnimStateMachine;
46 friend class AnimRandomSwitch;
48 AnimNode(Type type,
const QString&
id) : _type(type), _id(id) {}
49 virtual ~AnimNode() {}
51 const QString& getID()
const {
return _id; }
52 Type getType()
const {
return _type; }
54 void addOutputJoint(
const QString& outputJointName) { _outputJointNames.push_back(outputJointName); }
58 void addChild(Pointer child);
59 void removeChild(Pointer child);
60 void replaceChild(Pointer oldChild, Pointer newChild);
61 Pointer getChild(
int i)
const;
62 int getChildCount()
const {
return (
int)_children.size(); }
65 void setSkeleton(AnimSkeleton::ConstPointer skeleton);
67 AnimSkeleton::ConstPointer getSkeleton()
const {
return _skeleton; }
69 virtual const AnimPoseVec& evaluate(
const AnimVariantMap& animVars,
const AnimContext& context,
float dt, AnimVariantMap& triggersOut) = 0;
70 virtual const AnimPoseVec& overlay(
const AnimVariantMap& animVars,
const AnimContext& context,
float dt, AnimVariantMap& triggersOut,
71 const AnimPoseVec& underPoses) {
72 return evaluate(animVars, context, dt, triggersOut);
75 void setCurrentFrame(
float frame);
76 void setActive(
bool active);
79 bool traverse(F func) {
80 if (func(shared_from_this())) {
81 for (
auto&& child : _children) {
82 if (!child->traverse(func)) {
90 Pointer findByName(
const QString&
id) {
92 traverse([&](Pointer node) {
93 if (
id == node->getID()) {
102 int findChildIndexByName(
const QString&
id) {
103 for (
size_t i = 0; i < _children.size(); ++i) {
104 if (_children[i]->getID() ==
id) {
111 const AnimPoseVec& getPoses()
const {
return getPosesInternal(); }
115 virtual void setCurrentFrameInternal(
float frame) {}
116 virtual void setSkeletonInternal(AnimSkeleton::ConstPointer skeleton) { _skeleton = skeleton; }
117 virtual void setActiveInternal(
bool active) {}
120 virtual const AnimPoseVec& getPosesInternal()
const = 0;
122 void processOutputJoints(AnimVariantMap& triggersOut)
const;
126 std::vector<AnimNode::Pointer> _children;
127 AnimSkeleton::ConstPointer _skeleton;
128 std::weak_ptr<AnimNode> _parent;
129 std::vector<QString> _outputJointNames;
130 bool _active {
false };
133 AnimNode(
const AnimNode&) =
delete;
134 AnimNode& operator=(
const AnimNode&) =
delete;