summaryrefslogtreecommitdiff
path: root/indra/llcharacter/llmotioncontroller.h
diff options
context:
space:
mode:
authorJames Cook <james@lindenlab.com>2007-01-02 08:33:20 +0000
committerJames Cook <james@lindenlab.com>2007-01-02 08:33:20 +0000
commit420b91db29485df39fd6e724e782c449158811cb (patch)
treeb471a94563af914d3ed3edd3e856d21cb1b69945 /indra/llcharacter/llmotioncontroller.h
Print done when done.
Diffstat (limited to 'indra/llcharacter/llmotioncontroller.h')
-rw-r--r--indra/llcharacter/llmotioncontroller.h207
1 files changed, 207 insertions, 0 deletions
diff --git a/indra/llcharacter/llmotioncontroller.h b/indra/llcharacter/llmotioncontroller.h
new file mode 100644
index 0000000000..d43d6d9a8f
--- /dev/null
+++ b/indra/llcharacter/llmotioncontroller.h
@@ -0,0 +1,207 @@
+/**
+ * @file llmotioncontroller.h
+ * @brief Implementation of LLMotionController class.
+ *
+ * Copyright (c) 2001-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+#ifndef LL_LLMOTIONCONTROLLER_H
+#define LL_LLMOTIONCONTROLLER_H
+
+//-----------------------------------------------------------------------------
+// Header files
+//-----------------------------------------------------------------------------
+#include <string>
+#include <map>
+#include <deque>
+
+#include "linked_lists.h"
+#include "lluuidhashmap.h"
+#include "llmotion.h"
+#include "llpose.h"
+#include "llframetimer.h"
+#include "llstatemachine.h"
+#include "llstring.h"
+
+//-----------------------------------------------------------------------------
+// Class predeclaration
+// This is necessary because llcharacter.h includes this file.
+//-----------------------------------------------------------------------------
+class LLCharacter;
+
+//-----------------------------------------------------------------------------
+// LLMotionRegistry
+//-----------------------------------------------------------------------------
+typedef LLMotion*(*LLMotionConstructor)(const LLUUID &id);
+
+class LLMotionTableEntry
+{
+public:
+ LLMotionTableEntry();
+ LLMotionTableEntry(LLMotionConstructor constructor, const LLUUID& id);
+ ~LLMotionTableEntry(){};
+
+ LLMotion* create(const LLUUID& id);
+ static BOOL uuidEq(const LLUUID &uuid, const LLMotionTableEntry &id_pair)
+ {
+ if (uuid == id_pair.mID)
+ {
+ return TRUE;
+ }
+ return FALSE;
+ }
+
+ const LLUUID& getID() { return mID; }
+
+protected:
+ LLMotionConstructor mConstructor;
+ LLUUID mID;
+};
+
+class LLMotionRegistry
+{
+public:
+ // Constructor
+ LLMotionRegistry();
+
+ // Destructor
+ ~LLMotionRegistry();
+
+ // adds motion classes to the registry
+ // returns true if successfull
+ BOOL addMotion( const LLUUID& id, LLMotionConstructor create);
+
+ // creates a new instance of a named motion
+ // returns NULL motion is not registered
+ LLMotion *createMotion( const LLUUID &id );
+
+ // initialization of motion failed, don't try to create this motion again
+ void markBad( const LLUUID& id );
+
+
+protected:
+ LLUUIDHashMap<LLMotionTableEntry, 32> mMotionTable;
+};
+
+//-----------------------------------------------------------------------------
+// class LLMotionController
+//-----------------------------------------------------------------------------
+class LLMotionController
+{
+public:
+ // Constructor
+ LLMotionController();
+
+ // Destructor
+ virtual ~LLMotionController();
+
+ // set associated character
+ // this must be called exactly once by the containing character class.
+ // this is generally done in the Character constructor
+ void setCharacter( LLCharacter *character );
+
+ // registers a motion with the controller
+ // (actually just forwards call to motion registry)
+ // returns true if successfull
+ BOOL addMotion( const LLUUID& id, LLMotionConstructor create );
+
+ // creates a motion from the registry
+ LLMotion *createMotion( const LLUUID &id );
+
+ // unregisters a motion with the controller
+ // (actually just forwards call to motion registry)
+ // returns true if successfull
+ void removeMotion( const LLUUID& id );
+
+ // start motion
+ // begins playing the specified motion
+ // returns true if successful
+ BOOL startMotion( const LLUUID &id, F32 start_offset );
+
+ // stop motion
+ // stops a playing motion
+ // in reality, it begins the ease out transition phase
+ // returns true if successful
+ BOOL stopMotionLocally( const LLUUID &id, BOOL stop_immediate );
+
+ // update motions
+ // invokes the update handlers for each active motion
+ // activates sequenced motions
+ // deactivates terminated motions`
+ void updateMotion();
+
+ // flush motions
+ // releases all motion instances
+ void flushAllMotions();
+
+ // pause and continue all motions
+ void pause();
+ void unpause();
+ BOOL isPaused() { return mPaused; }
+
+ void setTimeStep(F32 step);
+
+ void setTimeFactor(F32 time_factor);
+ F32 getTimeFactor() { return mTimeFactor; }
+
+ LLMotion* getFirstActiveMotion();
+ LLMotion* getNextActiveMotion();
+
+//protected:
+ BOOL isMotionActive( LLMotion *motion );
+ BOOL isMotionLoading( LLMotion *motion );
+ LLMotion *findMotion( const LLUUID& id );
+
+protected:
+ void deleteAllMotions();
+ void addLoadedMotion(LLMotion *motion);
+ BOOL activateMotion(LLMotion *motion, F32 time);
+ BOOL deactivateMotion(LLMotion *motion);
+ void updateRegularMotions();
+ void updateAdditiveMotions();
+ void resetJointSignatures();
+ void updateMotionsByType(LLMotion::LLMotionBlendType motion_type);
+protected:
+
+ F32 mTimeFactor;
+ static LLMotionRegistry sRegistry;
+ LLPoseBlender mPoseBlender;
+
+ LLCharacter *mCharacter;
+
+// Life cycle of an animation:
+//
+// Animations are instantiated and immediately put in the mAllMotions map for their entire lifetime.
+// If the animations depend on any asset data, the appropriate data is fetched from the data server,
+// and the animation is put on the mLoadingMotions list.
+// Once an animations is loaded, it will be initialized and put on the mLoadedMotions deque.
+// Any animation that is currently playing also sits in the mActiveMotions list.
+
+ std::map<LLUUID, LLMotion*> mAllMotions;
+
+ LLLinkedList<LLMotion> mLoadingMotions;
+ std::deque<LLMotion*> mLoadedMotions;
+ LLLinkedList<LLMotion> mActiveMotions;
+
+ LLFrameTimer mTimer;
+ F32 mTime;
+ F32 mTimeOffset;
+ F32 mLastTime;
+ BOOL mHasRunOnce;
+ BOOL mPaused;
+ F32 mTimeStep;
+ S32 mTimeStepCount;
+ F32 mLastInterp;
+ F32 mPauseTime;
+
+ U8 mJointSignature[2][LL_CHARACTER_MAX_JOINTS];
+};
+
+//-----------------------------------------------------------------------------
+// Class declaractions
+//-----------------------------------------------------------------------------
+#include "llcharacter.h"
+
+#endif // LL_LLMOTIONCONTROLLER_H
+