Atoms Crowd  4.1.0
StateMachineOperator.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/Operator.h>
14 #include <Atoms/AnimationClip.h>
15 #include <Atoms/AnimationState.h>
16 #include <Atoms/StateMachine.h>
17 #include <Atoms/Graph/AgentBehaviourNetwork.h>
18 #include <Atoms/Graph/Operators/StateMachineBaseNodeOperator.h>
19 #include <mutex>
20 
21 namespace Atoms
22 {
23 
24  class ATOMS_EXPORT StateMachineOperator : public Operator
25  {
26  public:
27 
29  {
30  public:
32  op(nullptr),
33  weight(0),
34  frame(0),
35  weightPort(nullptr),
36  timePort(nullptr),
37  activePort(nullptr),
38  forceActive(false)
39  {}
40 
42  AtomsGraph::DoublePort* weightPort;
43  AtomsGraph::DoublePort* timePort;
44  AtomsGraph::BooleanPort* activePort;
45 
46  double weight;
47  double frame;
48  bool forceActive;
49  };
50 
52  {
53  public:
54  int blendIn;
55  int blendOut;
56  };
57 
58  NODE_STANDARD_MEMBERS
59 
61 
62  virtual ~StateMachineOperator();
63 
64  bool compute(const AtomsGraph::ComputeData* computeData);
65 
66  void reset();
67 
68  void setFps(double fps);
69 
70  void initRandom(int value);
71 
72  void advanceTime(const AtomsGraph::ComputeData* computeData, const double frameStep, const bool incrementFrame = true);
73 
74  void linearBlendStates(const std::pair<int, int>& transition,
75  int stateIndex,
76  double frameStep,
77  double timeStep,
78  unsigned int blendInTransition,
79  const AtomsGraph::ComputeData* computeData);
80 
81  bool isStateInQueue(int state);
82 
83  void buildNetwork(const AtomsPtr<Atoms::StateMachine> &stateMachine, std::map<std::string, std::string>& clipToAgentTypeNames, std::mutex& mutex, const double startFrame, const double maxAngularAcceleration, const double maxLinearAccelerationTmp, const int linearAverageNumFrames, const int angularAverageNumFrames, const bool forceUnsyncedClips);
84 
85  AgentBehaviourNetwork& network() { return m_network; };
86 
87  void advanceSingleState(int stateIndex, double timeStep, double frameStep);
88 
89  const std::list<unsigned int>& getStateQueue() const { return m_stateQueue; };
90 
91  const bool isInTransition() const { return m_isInTransition; }
92 
93  private:
94 
95  AgentBehaviourNetwork m_network;
96 
97  AtomsGraph::DoublePort* m_timePort;
98 
99  AtomsGraph::DoublePort* m_fpsPort;
100 
101  AtomsGraph::LongPort* m_statePort;
102 
103  AtomsGraph::BooleanPort* m_allowPathSearch;
104 
105  std::map<int, AnimationStateData> m_states;
106 
107  std::unordered_map<int, int> m_statePortIndex;
108 
109  std::map<std::pair<int, int>, int> m_transitionPortIndex;
110 
111  std::map < std::pair<int, int>, TransitionNoClipData> m_transitionNoClipsData;
112 
113  std::list<unsigned int> m_stateQueue;
114 
115  AtomsCore::Vector3 m_previousDirection;
116 
117  AtomsCore::Vector3 m_cacheUpVector;
118 
119  AtomsCore::Vector3 m_cacheDirectionVector;
120 
121  AtomsCore::Rand32 m_idRandom;
122 
123  double m_framesBlendInOffset;
124 
125  double m_previousTime;
126 
127  //double m_prevTurnAngle;
128 
129  int m_currentState;
130 
131  int m_previousState;
132 
133  int m_prevFromOneShot;
134 
135  bool m_first;
136 
137  bool m_isInTransition;
138 
139  bool m_transitionStarted;
140 
141  bool m_transitionIsEnded;
142  };
143 }
Atoms::StateMachineOperator::reset
void reset()
Operator reset function.
Atoms::StateMachineOperator::AnimationStateData
Definition: StateMachineOperator.h:29
Atoms::AgentBehaviourNetwork
Agent behaviour network.
Definition: AgentBehaviourNetwork.h:29
Atoms::StateMachineOperator::TransitionNoClipData
Definition: StateMachineOperator.h:52
Atoms::StateMachineOperator::compute
bool compute(const AtomsGraph::ComputeData *computeData)
Compute function.
Atoms::StateMachineOperator
Definition: StateMachineOperator.h:25
AtomsCore::Vector3
AtomsMath::Vector3 Vector3
Vector3 class.
Definition: AtomsMath.h:57
Atoms::StateMachineBaseNodeOperator
Definition: StateMachineBaseNodeOperator.h:27
AtomsGraph::PortTemplate
Generic node port class.
Definition: PortTemplate.h:24
Atoms
Atoms namespace.
Definition: Agent.h:28
Atoms::Operator
Operator node.
Definition: Operator.h:26
AtomsGraph::ComputeData
Definition: Node.h:21