diff options
author | James Cook <james@lindenlab.com> | 2007-01-02 08:33:20 +0000 |
---|---|---|
committer | James Cook <james@lindenlab.com> | 2007-01-02 08:33:20 +0000 |
commit | 420b91db29485df39fd6e724e782c449158811cb (patch) | |
tree | b471a94563af914d3ed3edd3e856d21cb1b69945 /indra/llcharacter/lljoint.h |
Print done when done.
Diffstat (limited to 'indra/llcharacter/lljoint.h')
-rw-r--r-- | indra/llcharacter/lljoint.h | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/indra/llcharacter/lljoint.h b/indra/llcharacter/lljoint.h new file mode 100644 index 0000000000..2fc86e87df --- /dev/null +++ b/indra/llcharacter/lljoint.h @@ -0,0 +1,163 @@ +/** + * @file lljoint.h + * @brief Implementation of LLJoint class. + * + * Copyright (c) 2001-$CurrentYear$, Linden Research, Inc. + * $License$ + */ + +#ifndef LL_LLJOINT_H +#define LL_LLJOINT_H + +//----------------------------------------------------------------------------- +// Header Files +//----------------------------------------------------------------------------- +#include <string> + +#include "linked_lists.h" +#include "v3math.h" +#include "v4math.h" +#include "m4math.h" +#include "llquaternion.h" +#include "xform.h" +#include "lldarray.h" + +const S32 LL_CHARACTER_MAX_JOINTS_PER_MESH = 15; +const U32 LL_CHARACTER_MAX_JOINTS = 32; // must be divisible by 4! +const U32 LL_HAND_JOINT_NUM = 31; +const U32 LL_FACE_JOINT_NUM = 30; +const S32 LL_CHARACTER_MAX_PRIORITY = 7; +const F32 LL_MAX_PELVIS_OFFSET = 5.f; + +//----------------------------------------------------------------------------- +// class LLJoint +//----------------------------------------------------------------------------- +class LLJoint +{ +public: + // priority levels, from highest to lowest + enum JointPriority + { + USE_MOTION_PRIORITY = -1, + LOW_PRIORITY = 0, + MEDIUM_PRIORITY, + HIGH_PRIORITY, + HIGHER_PRIORITY, + HIGHEST_PRIORITY, + ADDITIVE_PRIORITY = LL_CHARACTER_MAX_PRIORITY + }; + + enum DirtyFlags + { + MATRIX_DIRTY = 0x1 << 0, + ROTATION_DIRTY = 0x1 << 1, + POSITION_DIRTY = 0x1 << 2, + ALL_DIRTY = 0x7 + }; +protected: + std::string mName; + + // parent joint + LLJoint *mParent; + + // explicit transformation members + LLXformMatrix mXform; + +public: + U32 mDirtyFlags; + BOOL mWorldRotationDirty; + BOOL mUpdateXform; + + // describes the skin binding pose + LLVector3 mSkinOffset; + + S32 mJointNum; + + LLDynamicArray<LLVector3> mConstraintSilhouette; + + // child joints + LLLinkedList<LLJoint> mChildren; + + // debug statics + static S32 sNumTouches; + static S32 sNumUpdates; + +public: + LLJoint(); + LLJoint( const std::string &name, LLJoint *parent=NULL ); + + virtual ~LLJoint(); + + // set name and parent + void setup( const std::string &name, LLJoint *parent=NULL ); + + void touch(U32 flags = ALL_DIRTY); + + // get/set name + const std::string &getName() { return mName; } + void setName( const std::string &name ) { mName = name; } + + // getParent + LLJoint *getParent() { return mParent; } + + // getRoot + LLJoint *getRoot(); + + // search for child joints by name + LLJoint *findJoint( const std::string &name ); + + // add/remove children + void addChild( LLJoint *joint ); + void removeChild( LLJoint *joint ); + void removeAllChildren(); + + // get/set local position + const LLVector3& getPosition(); + void setPosition( const LLVector3& pos ); + + // get/set world position + LLVector3 getWorldPosition(); + LLVector3 getLastWorldPosition(); + void setWorldPosition( const LLVector3& pos ); + + // get/set local rotation + const LLQuaternion& getRotation(); + void setRotation( const LLQuaternion& rot ); + + // get/set world rotation + LLQuaternion getWorldRotation(); + LLQuaternion getLastWorldRotation(); + void setWorldRotation( const LLQuaternion& rot ); + + // get/set local scale + const LLVector3& getScale(); + void setScale( const LLVector3& scale ); + + // get/set world matrix + const LLMatrix4 &getWorldMatrix(); + void setWorldMatrix( const LLMatrix4& mat ); + + void updateWorldMatrixChildren(); + void updateWorldMatrixParent(); + + void updateWorldPRSParent(); + + void updateWorldMatrix(); + + // get/set skin offset + const LLVector3 &getSkinOffset(); + void setSkinOffset( const LLVector3 &offset); + + LLXformMatrix *getXform() { return &mXform; } + + void setConstraintSilhouette(LLDynamicArray<LLVector3>& silhouette); + + void clampRotation(LLQuaternion old_rot, LLQuaternion new_rot); + + virtual BOOL isAnimatable() { return TRUE; } + + S32 getJointNum() { return mJointNum; } + void setJointNum(S32 joint_num) { mJointNum = joint_num; } +}; +#endif // LL_LLJOINT_H + |