summaryrefslogtreecommitdiff
path: root/indra/newview/llfollowcam.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/newview/llfollowcam.h
Print done when done.
Diffstat (limited to 'indra/newview/llfollowcam.h')
-rw-r--r--indra/newview/llfollowcam.h216
1 files changed, 216 insertions, 0 deletions
diff --git a/indra/newview/llfollowcam.h b/indra/newview/llfollowcam.h
new file mode 100644
index 0000000000..22450d2792
--- /dev/null
+++ b/indra/newview/llfollowcam.h
@@ -0,0 +1,216 @@
+/**
+ * @file llfollowcam.h
+ * @author Jeffrey Ventrella
+ * @brief LLFollowCam class definition
+ *
+ * Copyright (c) 2005-$CurrentYear$, Linden Research, Inc.
+ * $License$
+ */
+
+//--------------------------------------------------------------------
+// FollowCam
+//
+// The FollowCam controls three dynamic variables which determine
+// a camera orientation and position for a "loose" third-person view
+// (orientation being derived from a combination of focus and up
+// vector). It is good for fast-moving vehicles that change
+// acceleration a lot, but it can also be general-purpose, like for
+// avatar navigation. It has a handful of parameters allowing it to
+// be tweaked to assume different styles of tracking objects.
+//
+//--------------------------------------------------------------------
+#ifndef LL_FOLLOWCAM_H
+#define LL_FOLLOWCAM_H
+
+#include "llcoordframe.h"
+#include "indra_constants.h"
+#include "llmath.h"
+#include "lltimer.h"
+#include "llquaternion.h"
+#include "llcriticaldamp.h"
+#include <map>
+#include <vector>
+
+class LLFollowCamParams
+{
+public:
+ LLFollowCamParams();
+ virtual ~LLFollowCamParams();
+
+ //--------------------------------------
+ // setty setty set set
+ //--------------------------------------
+ virtual void setPositionLag ( F32 );
+ virtual void setFocusLag ( F32 );
+ virtual void setFocusThreshold ( F32 );
+ virtual void setPositionThreshold ( F32 );
+ virtual void setDistance ( F32 );
+ virtual void setPitch ( F32 );
+ virtual void setFocusOffset ( const LLVector3& );
+ virtual void setBehindnessAngle ( F32 );
+ virtual void setBehindnessLag ( F32 );
+ virtual void setPosition ( const LLVector3& );
+ virtual void setFocus ( const LLVector3& );
+ virtual void setPositionLocked ( bool );
+ virtual void setFocusLocked ( bool );
+
+
+ //--------------------------------------
+ // getty getty get get
+ //--------------------------------------
+ virtual F32 getPositionLag() const;
+ virtual F32 getFocusLag() const;
+ virtual F32 getPositionThreshold() const;
+ virtual F32 getFocusThreshold() const;
+ virtual F32 getDistance() const;
+ virtual F32 getPitch() const;
+ virtual LLVector3 getFocusOffset() const;
+ virtual F32 getBehindnessAngle() const;
+ virtual F32 getBehindnessLag() const;
+ virtual LLVector3 getPosition() const;
+ virtual LLVector3 getFocus() const;
+ virtual bool getFocusLocked() const;
+ virtual bool getPositionLocked() const;
+ virtual bool getUseFocus() const { return mUseFocus; }
+ virtual bool getUsePosition() const { return mUsePosition; }
+
+protected:
+ F32 mPositionLag;
+ F32 mFocusLag;
+ F32 mFocusThreshold;
+ F32 mPositionThreshold;
+ F32 mDistance;
+ F32 mPitch;
+ LLVector3 mFocusOffset;
+ F32 mBehindnessMaxAngle;
+ F32 mBehindnessLag;
+ F32 mMaxCameraDistantFromSubject;
+
+ bool mPositionLocked;
+ bool mFocusLocked;
+ bool mUsePosition; // specific camera point specified by script
+ bool mUseFocus; // specific focus point specified by script
+ LLVector3 mPosition; // where the camera is (in world-space)
+ LLVector3 mFocus; // what the camera is aimed at (in world-space)
+};
+
+class LLFollowCam : public LLFollowCamParams
+{
+public:
+ //--------------------
+ // Contructor
+ //--------------------
+ LLFollowCam();
+
+ //--------------------
+ // Destructor
+ //--------------------
+ virtual ~LLFollowCam();
+
+ //---------------------------------------------------------------------------------------
+ // The following methods must be called every time step. However, if you know for
+ // sure that your subject matter (what the camera is looking at) is not moving,
+ // then you can get away with not calling "update" But keep in mind that "update"
+ // may still be needed after the subject matter has stopped moving because the
+ // camera may still need to animate itself catching up to its ideal resting place.
+ //---------------------------------------------------------------------------------------
+ void setSubjectPositionAndRotation ( const LLVector3 p, const LLQuaternion r );
+ void update();
+
+ // initialize from another instance of llfollowcamparams
+ void copyParams(LLFollowCamParams& params);
+
+ //-----------------------------------------------------------------------------------
+ // this is how to bang the followCam into a specific configuration. Keep in mind
+ // that it will immediately try to adjust these values according to its attributes.
+ //-----------------------------------------------------------------------------------
+ void reset( const LLVector3 position, const LLVector3 focus, const LLVector3 upVector );
+
+ void setMaxCameraDistantFromSubject ( F32 m ); // this should be determined by llAgent
+ bool isZoomedToMinimumDistance();
+ LLVector3 getUpVector();
+ void zoom( S32 );
+
+ // overrides for setters and getters
+ virtual void setPitch( F32 );
+ virtual void setDistance( F32 );
+ virtual void setPosition(const LLVector3& pos);
+ virtual void setFocus(const LLVector3& focus);
+ virtual void setPositionLocked ( bool );
+ virtual void setFocusLocked ( bool );
+
+ LLVector3 getSimulatedPosition() const;
+ LLVector3 getSimulatedFocus() const;
+
+ //------------------------------------------
+ // protected members of FollowCam
+ //------------------------------------------
+protected:
+ F32 mPositionLagTimeScale; // derived from mPositionLag
+ F32 mFocusLagTimeScale; // derived from mFocusLag
+ F32 mPitchCos; // derived from mPitch
+ F32 mPitchSin; // derived from mPitch
+ LLGlobalVec mSimulatedPositionGlobal; // where the camera is (global coordinates), simulated
+ LLGlobalVec mSimulatedFocusGlobal; // what the camera is aimed at (global coordinates), simulated
+ F32 mSimulatedDistance;
+
+ //---------------------
+ // dynamic variables
+ //---------------------
+ bool mZoomedToMinimumDistance;
+ LLFrameTimer mTimer;
+ LLVector3 mSubjectPosition; // this is the position of what I'm looking at
+ LLQuaternion mSubjectRotation; // this is the rotation of what I'm looking at
+ LLVector3 mUpVector; // the camera's up vector in world-space (determines roll)
+ LLVector3 mRelativeFocus;
+ LLVector3 mRelativePos;
+
+ bool mPitchSineAndCosineNeedToBeUpdated;
+
+ //------------------------------------------
+ // protected methods of FollowCam
+ //------------------------------------------
+protected:
+ void calculatePitchSineAndCosine();
+ BOOL updateBehindnessConstraint(LLVector3 focus, LLVector3& cam_position);
+
+};// end of FollowCam class
+
+
+class LLFollowCamMgr
+{
+public:
+ static void cleanupClass ( );
+
+ static void setPositionLag ( const LLUUID& source, F32 lag);
+ static void setFocusLag ( const LLUUID& source, F32 lag);
+ static void setFocusThreshold ( const LLUUID& source, F32 threshold);
+ static void setPositionThreshold ( const LLUUID& source, F32 threshold);
+ static void setDistance ( const LLUUID& source, F32 distance);
+ static void setPitch ( const LLUUID& source, F32 pitch);
+ static void setFocusOffset ( const LLUUID& source, const LLVector3& offset);
+ static void setBehindnessAngle ( const LLUUID& source, F32 angle);
+ static void setBehindnessLag ( const LLUUID& source, F32 lag);
+ static void setPosition ( const LLUUID& source, const LLVector3 position);
+ static void setFocus ( const LLUUID& source, const LLVector3 focus);
+ static void setPositionLocked ( const LLUUID& source, bool locked);
+ static void setFocusLocked ( const LLUUID& source, bool locked );
+
+ static void setCameraActive ( const LLUUID& source, bool active );
+
+ static LLFollowCamParams* getActiveFollowCamParams();
+ static LLFollowCamParams* getParamsForID(const LLUUID& source);
+ static void removeFollowCamParams(const LLUUID& source);
+ static bool isScriptedCameraSource(const LLUUID& source);
+ static void dump();
+
+protected:
+
+ typedef std::map<LLUUID, LLFollowCamParams*> param_map_t;
+ static param_map_t sParamMap;
+
+ typedef std::vector<LLFollowCamParams*> param_stack_t;
+ static param_stack_t sParamStack;
+};
+
+#endif //LL_FOLLOWCAM_H