1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
/*!
@file
@author Albert Semenov
@date 08/2008
*/
#ifndef LOOP_CONTROLLER_H_
#define LOOP_CONTROLLER_H_
#include "IAnimationNode.h"
#include "IAnimationGraph.h"
#include "ConnectionReceiver.h"
namespace animation
{
class LoopController :
public IAnimationNode
{
public:
LoopController() :
IAnimationNode(),
mLength(0),
mCurrentTime(0),
mIsAnimationRun(false),
mState(0)
{
}
LoopController(const std::string& _name, IAnimationGraph* _graph) :
IAnimationNode(_name, _graph),
mLength(0),
mCurrentTime(0),
mIsAnimationRun(false),
mState(0)
{
}
virtual ~LoopController()
{
}
virtual void setEvent(const std::string& _name, float _value = 0)
{
if (_name == "Start") start();
else if (_name == "Stop") stop();
else if (_name == "Weight") mConnection.forceEvent("Weight", _value);
}
virtual void addConnection(const std::string& _eventout, IAnimationNode* _node, const std::string& _eventin)
{
mConnection.addConnection(_eventout, _node, _eventin);
}
virtual void removeConnection(const std::string& _eventout, IAnimationNode* _node, const std::string& _eventin)
{
mConnection.removeConnection(_eventout, _node, _eventin);
}
virtual void addTime(float _value)
{
if (mIsAnimationRun)
{
if (mLength != 0)
{
mCurrentTime += _value;
while (mCurrentTime > mLength) mCurrentTime -= mLength;
}
else
{
if (mState)
{
mLength = mState->getLength();
if (mLength != 0)
{
mCurrentTime += _value;
while (mCurrentTime > mLength) mCurrentTime -= mLength;
}
}
}
mConnection.forceEvent("Position", mCurrentTime);
}
}
virtual void setProperty(const std::string& _key, const std::string& _value)
{
if (_key == "LengthByState")
{
mState = getGraph()->getNodeByName(_value);
}
else if (_key == "Length")
{
mLength = MyGUI::utility::parseValue<float>(_value);
}
}
private:
void start()
{
mCurrentTime = 0;
mIsAnimationRun = true;
mConnection.forceEvent("Start");
}
void stop()
{
mIsAnimationRun = false;
mConnection.forceEvent("Stop");
}
private:
float mLength;
float mCurrentTime;
bool mIsAnimationRun;
IAnimationNode* mState;
ConnectionReceiver mConnection;
};
} // namespace animation
#endif // LOOP_CONTROLLER_H_
|