Atoms Crowd  4.1.0
BlendSpaceOperator.h
1 #pragma once
2 // ===========================================================================
3 // Copyright (c) 2015 Toolchefs Ltd. All rights reserved.
4 //
5 // Use of this software is subject to the terms of the Toolchefs license
6 // agreement provided at the time of installation or download, or which
7 // otherwise accompanies this software in either electronic or hard copy form.
8 // ===========================================================================
9 
10 
11 #include <AtomsGraph/Ports.h>
12 #include <Atoms/Globals.h>
13 #include <Atoms/Graph/Operators/StateMachineBaseNodeOperator.h>
14 #include <Atoms/Graph/Operators/ClipReaderOperator.h>
15 #include <Atoms/AnimationClip.h>
16 #include <Atoms/Graph/AgentBehaviourNetwork.h>
17 #include <Atoms/Locomotion.h>
18 
19 #include <deque>
20 
21 namespace Atoms
22 {
23 
25  {
26  public:
27 
28  enum WaitingState
29  {
30  kNone = 0,
31  kIn,
32  kOut,
33  kWaitingForIn,
34  kWaitingForOut
35  };
36 
37  struct OutputData
38  {
39  AtomsGraph::DoublePort* frameRatePort;
40  AtomsGraph::DoublePort* timePort;
41  AtomsGraph::DoublePort* weightPort;
42  AtomsGraph::BooleanPort* activePort;
43  Atoms::ClipReaderOperator* clipReaderOp;
44  AnimationClipPtr clip;
45  AtomsMath::Vector2 position;
46  double time;
47  double length;
48  double fps;
49  int start;
50  int end;
51  bool active;
52  bool hasLoop;
53  bool unsynced;
54  int blendIn;
55  int blendOut;
56  std::string name;
57  };
58 
59  NODE_STANDARD_MEMBERS
60 
62 
63  virtual ~BlendSpaceOperator();
64 
65  bool compute(const AtomsGraph::ComputeData* computeData);
66 
67  void reset();
68 
69  void resetTime();
70 
71  inline OutputData& outputPortData(size_t index) { return m_outPortData[index]; }
72 
73  inline size_t numOutputPorts() const { return m_outPortData.size(); }
74 
75  void setLocomotionTriangles(const std::vector<AtomsUtils::Triangle2>& triangles) { m_locomotionTriangles = triangles; };
76 
77  inline void setMaxAngularAcceleration(const double value) { m_maxAngularAcceleration = value; };
78 
79  inline void setMaxLinearAcceleration(const double value) { m_maxLinearAcceleration = value; };
80 
81  inline void setLinearAverageNumFrames(const int value) { m_linearAverageNumFrames = value; };
82 
83  inline void setAngularAverageNumFrames(const int value) { m_angularAverageNumFrames = value; };
84 
85  inline void setForcedUnsyncedClips(const bool value) { m_forceUnsyncedClips = value; };
86 
87  bool isReadyToTransition(const OutputData& clipData, double frameStep);
88 
89  // methods from the AnimationStateOperator
90  bool isReadyToTransition(double frameRate = 1.0, bool checkTransitionFrames = true, bool checkForceTransition = true);
91  void advanceSingleClip(double timeStep, double frameStep, bool randomClip = false);
92  double computeBlendInOffset(double frameRate, bool checkTransitionFrames = true);
93  void computeBlendInOffsetInPlace(double frameRate, bool checkTransitionFrames = true);
94  double getBlendInOffset();
95  void prepareForBlendIn(double offset, double timeStep);
96  bool isBlendInStage(double offset, unsigned int blend);
97  bool isBlendOutStage(double& frameDifference, unsigned int blend);
98  double computeBlendInWeight(double offset, unsigned int blend);
99  double computeBlendOutWeight(unsigned int blend);
100  void setUpBlendOutFrame(double offset, double timeStep);
101  bool isBlendOutFinished(unsigned int blend);
102  void initSubState(double frame);
103  bool hasClips() { return false; };
104 
105  void buildNetwork(const AtomsPtr<Atoms::StateMachine>& stateMachine, const Atoms::AnimationState& state, std::map<std::string, std::string>& clipToAgentTypeNames, std::mutex& mutex, AtomsCore::Rand32* idRandom);
106 
107  void buildNetwork(const Atoms::LocomotionCPtr& loco);
108 
109  WaitingState waitingState() { return m_waitingState; };
110  const AtomsCore::Vector2f &currentPosition() { return m_cachedPosition; };
111  const AtomsCore::Vector2f &getInputPosition() { return m_userPosition; };
112  const AtomsCore::Vector3f &barycentricCoordinates() { return m_prevBarycentricCoordinates; };
113  const AtomsUtils::Triangle2 &currentTriangle() { return m_prevTriangle; };
114  const int unsyncedClipId() { return m_nextMajorId; };
115 
116  private:
117 
118  void setClipWeights(const std::vector<BlendSpaceOperator::OutputData>& datas, const AtomsCore::Vector3f& weights, const AtomsUtils::Triangle2& triangle, const double multiplier = 1.0);
119  void cacheBarycentricCoordinatesAndTriangle(const AtomsCore::Vector3f& barycentricCoords, const AtomsUtils::Triangle2& triangle);
120 
121  std::vector<OutputData> m_outPortData;
122 
123  std::vector<AtomsUtils::Triangle2> m_locomotionTriangles;
124 
125  std::deque<float> m_angularVelocities;
126 
127  std::deque<float> m_linearVelocities;
128 
129  AtomsCore::Vector3f m_prevBarycentricCoordinates;
130  AtomsCore::Vector3f m_cachedWeights;
131  AtomsUtils::Triangle2 m_prevTriangle;
132  AtomsUtils::Triangle2 m_cachedTriangle;
133 
134  AtomsCore::Vector2f m_userPosition;
135  AtomsCore::Vector2f m_cachedPosition;
136 
137  double m_time;
138 
139  double m_previousTime;
140 
141  double m_previousUseClipDirection;
142 
143  double m_maxAngularAcceleration;
144 
145  double m_maxLinearAcceleration;
146 
147  int m_currentUnsyncedStep;
148 
149  int m_currentMajorId;
150 
151  int m_nextMajorId;
152 
153  int m_majorId;
154 
155  int m_angularAverageNumFrames;
156 
157  int m_linearAverageNumFrames;
158 
159  WaitingState m_waitingState;
160 
161  bool m_forceUnsyncedClips;
162 
163  };
164 }
Atoms::BlendSpaceOperator::compute
bool compute(const AtomsGraph::ComputeData *computeData)
Compute function.
AtomsUtils::Triangle2
Triangle 2D class.
Definition: Triangle.h:87
Atoms::BlendSpaceOperator
Definition: BlendSpaceOperator.h:25
Atoms::AnimationState
Animation State.
Definition: AnimationState.h:25
Atoms::StateMachineBaseNodeOperator
Definition: StateMachineBaseNodeOperator.h:27
AtomsCore::Vector2f
AtomsMath::Vector2f Vector2f
Vector2 class.
Definition: AtomsMath.h:55
AtomsGraph::PortTemplate
Generic node port class.
Definition: PortTemplate.h:24
Atoms
Atoms namespace.
Definition: Agent.h:28
Atoms::BlendSpaceOperator::reset
void reset()
Operator reset function.
Atoms::BlendSpaceOperator::OutputData
Definition: BlendSpaceOperator.h:38
AtomsGraph::ComputeData
Definition: Node.h:21
AtomsCore::Vector3f
AtomsMath::Vector3f Vector3f
Vector3 class.
Definition: AtomsMath.h:58
Atoms::ClipReaderOperator
Definition: ClipReaderOperator.h:22
Atoms::LocomotionCPtr
AtomsPtr< const Locomotion > LocomotionCPtr
locomotion const pointer
Definition: Locomotion.h:82
Atoms::AnimationClipPtr
AtomsPtr< AnimationClip > AnimationClipPtr
animation clip pointer
Definition: AnimationClip.h:27