/** * @file llmultigesture.h * @brief Gestures that are asset-based and can have multiple steps. * * Copyright (c) 2004-$CurrentYear$, Linden Research, Inc. * $License$ */ #ifndef LL_LLMULTIGESTURE_H #define LL_LLMULTIGESTURE_H #include #include #include #include "lluuid.h" #include "llframetimer.h" class LLDataPacker; class LLGestureStep; class LLMultiGesture { public: LLMultiGesture(); virtual ~LLMultiGesture(); // Maximum number of bytes this could hold once serialized. S32 getMaxSerialSize() const; BOOL serialize(LLDataPacker& dp) const; BOOL deserialize(LLDataPacker& dp); void dump(); void reset(); const std::string& getTrigger() const { return mTrigger; } protected: LLMultiGesture(const LLMultiGesture& gest); const LLMultiGesture& operator=(const LLMultiGesture& rhs); public: // name is stored at asset level // desc is stored at asset level KEY mKey; MASK mMask; // String, like "/foo" or "hello" that makes it play std::string mTrigger; // Replaces the trigger substring with this text std::string mReplaceText; std::vector mSteps; // Is the gesture currently playing? BOOL mPlaying; // "instruction pointer" for steps S32 mCurrentStep; // We're waiting for triggered animations to stop playing BOOL mWaitingAnimations; // We're waiting a fixed amount of time BOOL mWaitingTimer; // Waiting after the last step played for all animations to complete BOOL mWaitingAtEnd; // Timer for waiting LLFrameTimer mWaitTimer; void (*mDoneCallback)(LLMultiGesture* gesture, void* data); void* mCallbackData; // Animations that we requested to start std::set mRequestedAnimIDs; // Once the animation starts playing (sim says to start playing) // the ID is moved from mRequestedAnimIDs to here. std::set mPlayingAnimIDs; }; enum EStepType { STEP_ANIMATION = 0, STEP_SOUND = 1, STEP_CHAT = 2, STEP_WAIT = 3, STEP_EOF = 4 }; class LLGestureStep { public: LLGestureStep() {} virtual ~LLGestureStep() {} virtual EStepType getType() = 0; // Return a user-readable label for this step virtual std::string getLabel() const = 0; virtual S32 getMaxSerialSize() const = 0; virtual BOOL serialize(LLDataPacker& dp) const = 0; virtual BOOL deserialize(LLDataPacker& dp) = 0; virtual void dump() = 0; }; // By default, animation steps start animations. // If the least significant bit is 1, it will stop animations. const U32 ANIM_FLAG_STOP = 0x01; class LLGestureStepAnimation : public LLGestureStep { public: LLGestureStepAnimation(); virtual ~LLGestureStepAnimation(); virtual EStepType getType() { return STEP_ANIMATION; } virtual std::string getLabel() const; virtual S32 getMaxSerialSize() const; virtual BOOL serialize(LLDataPacker& dp) const; virtual BOOL deserialize(LLDataPacker& dp); virtual void dump(); public: std::string mAnimName; LLUUID mAnimAssetID; U32 mFlags; }; class LLGestureStepSound : public LLGestureStep { public: LLGestureStepSound(); virtual ~LLGestureStepSound(); virtual EStepType getType() { return STEP_SOUND; } virtual std::string getLabel() const; virtual S32 getMaxSerialSize() const; virtual BOOL serialize(LLDataPacker& dp) const; virtual BOOL deserialize(LLDataPacker& dp); virtual void dump(); public: std::string mSoundName; LLUUID mSoundAssetID; U32 mFlags; }; class LLGestureStepChat : public LLGestureStep { public: LLGestureStepChat(); virtual ~LLGestureStepChat(); virtual EStepType getType() { return STEP_CHAT; } virtual std::string getLabel() const; virtual S32 getMaxSerialSize() const; virtual BOOL serialize(LLDataPacker& dp) const; virtual BOOL deserialize(LLDataPacker& dp); virtual void dump(); public: std::string mChatText; U32 mFlags; }; const U32 WAIT_FLAG_TIME = 0x01; const U32 WAIT_FLAG_ALL_ANIM = 0x02; class LLGestureStepWait : public LLGestureStep { public: LLGestureStepWait(); virtual ~LLGestureStepWait(); virtual EStepType getType() { return STEP_WAIT; } virtual std::string getLabel() const; virtual S32 getMaxSerialSize() const; virtual BOOL serialize(LLDataPacker& dp) const; virtual BOOL deserialize(LLDataPacker& dp); virtual void dump(); public: F32 mWaitSeconds; U32 mFlags; }; #endif