123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 |
- //-----------------------------------------------------------------------------
- // Verve
- // Copyright (C) 2014 - Violent Tulip
- //
- // Permission is hereby granted, free of charge, to any person obtaining a copy
- // of this software and associated documentation files (the "Software"), to
- // deal in the Software without restriction, including without limitation the
- // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- // sell copies of the Software, and to permit persons to whom the Software is
- // furnished to do so, subject to the following conditions:
- //
- // The above copyright notice and this permission notice shall be included in
- // all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- // IN THE SOFTWARE.
- //-----------------------------------------------------------------------------
- #ifndef _VT_VPATHOBJECT_H_
- #define _VT_VPATHOBJECT_H_
- #ifndef _GAMEBASE_H_
- #include "T3D/gameBase/gameBase.h"
- #endif
- #ifndef _VNETSTATE_H_
- #include "VNetState.h"
- #endif
- #ifndef _MOVEMANAGER_H_
- #include "T3D/gameBase/moveManager.h"
- #endif
- //-----------------------------------------------------------------------------
- class VPath;
- class NetConnection;
- struct VPathObject
- {
- public:
- enum eState
- {
- k_StateUpdateObject = BIT( 0 ),
- k_StateUpdateMount = BIT( 1 ),
- k_StateUpdatePosition = BIT( 2 ),
- k_StateUpdateState = BIT( 3 ),
- k_StateAttach = BIT( 4 ),
- k_StateDetach = BIT( 5 ),
- k_StateUpdate = ( k_StateUpdateObject | k_StateUpdateMount | k_StateUpdatePosition | k_StateUpdateState ),
- k_StateInit = ( k_StateAttach | k_StateUpdate ),
- };
- enum eOrientationType
- {
- k_OrientationFree,
- k_OrientationInterpolate,
- k_OrientationToPath,
- k_OrientationToObject,
- k_OrientationToPoint,
- k_OrientationTypeSize,
- };
- struct sOrientation
- {
- eOrientationType Type;
- // k_OrientationToObject
- SceneObject *Object;
- // k_OrientationToPoint
- Point3F Point;
- };
- struct sDelta
- {
- Point3F Position[2];
- VectorF Orientation[2];
- };
- protected:
- bool mActive;
- U32 mLastTime;
- F32 mLastDelta;
- SceneObject *mObject;
- VNetState mNetState;
- sDelta mDelta;
- F32 mTimeInterp;
- F32 mPathInterp;
- Point3F mPosition;
- Point3F mOffset;
- sOrientation mOrientationMode;
- VectorF mOrientation;
- bool mForward;
- F32 mSpeed;
- S32 mSourceNode;
- S32 mDestinationNode;
- S32 mStartNode;
- S32 mEndNode;
- public:
- VPathObject( void );
- ~VPathObject( void );
- // Network Methods.
- U32 packUpdate( NetConnection *pConnection, BitStream *pStream );
- void unpackUpdate( NetConnection *pConnection, BitStream *pStream );
- //-------------------------------------------------------------------------
- //
- // Gets
- //
- //-------------------------------------------------------------------------
- inline const bool &isActive( void ) { return mActive; };
-
- inline SceneObject *getObject( void ) { return mObject; };
- inline const F32 &getTimeInterp( void ) { return mTimeInterp; };
- inline const F32 &getPathInterp( void ) { return mPathInterp; };
- inline const Point3F &getPosition( void ) { return mPosition; };
- inline const Point3F &getOffset( void ) { return mOffset; };
- inline const VectorF &getOrientation( void ) { return mOrientation; };
- inline const sOrientation &getOrientationMode( void ) { return mOrientationMode; };
- inline const bool &isForward( void ) { return mForward; };
- inline const F32 &getSpeed( void ) { return mSpeed; };
- inline const S32 &getSourceNode( void ) { return mSourceNode; };
- inline const S32 &getDestinationNode( void ) { return mDestinationNode; };
- inline const S32 &getStartNode( void ) { return mStartNode; };
- inline const S32 &getEndNode( void ) { return mEndNode; };
- Point3F getWorldPosition( void );
- Point3F getRenderWorldPosition( const F32 &pDelta );
- MatrixF getTransform( void );
- MatrixF getRenderTransform( const F32 &pDelta );
- inline F32 getTimeDelta( const bool &pUpdate = true )
- {
- if ( !pUpdate )
- {
- return mLastDelta;
- }
- // Calculate Delta.
- const S32 time = Sim::getCurrentTime();
- const F32 delta = ( time - mLastTime ) / 1000.f;
- // Store Time.
- mLastTime = time;
- mLastDelta = delta;
- // Return Delta.
- return delta;
- };
- inline void resetTime( void )
- {
- mLastTime = Sim::getCurrentTime();
- };
- //-------------------------------------------------------------------------
- //
- // Sets
- //
- //-------------------------------------------------------------------------
- void setActive( const bool &pActive );
- void setObject( SceneObject *pObject );
- void setTimeInterp( const F32 &pInterp );
- void setPathInterp( const F32 &pInterp );
- void setPosition( const Point3F &pPosition );
- void setOffset( const Point3F &pOffset );
- void setOrientation( const VectorF &pOrientation );
- void setOrientationMode( const eOrientationType &pType );
- void setOrientationMode( const eOrientationType &pType, SceneObject *pObject );
- void setOrientationMode( const eOrientationType &pType, const Point3F &pPoint );
- void setForward( const bool &pForward );
- void setSpeed( const F32 &pSpeed );
- void setNode( const S32 &pSourceNodeIndex, const S32 &pDestinationNodeIndex );
- void setStartNode( const S32 &pNodeIndex );
- void setEndNode( const S32 &pNodeIndex );
- // Delta Methods.
- void resetDelta( void );
- void resetDelta( const Point3F &pPosition, const VectorF &pOrientation );
- void popDelta( void );
- void pushDelta( const Point3F &pPosition, const VectorF &pOrientation );
- Point3F getPositionDelta( const F32 &pInterp );
- VectorF getOrientationDelta( const F32 &pInterp );
- // Net State Methods.
- inline VNetStateInfo *getState( NetConnection *pConnection ) { return mNetState.getState( pConnection ); };
- inline void setMaskBits( const U32 &pMask ) { mNetState.setMaskBits( pMask ); };
- inline void clearMaskBits( const U32 &pMask ) { mNetState.clearMaskBits( pMask ); };
- inline bool isConnection( NetConnection *pConnection ) { return mNetState.isConnection( pConnection ); };
- inline void addConnection( NetConnection *pConnection ) { mNetState.addConnection( pConnection ); };
- inline void clearConnection( NetConnection *pConnection ) { mNetState.clearConnection( pConnection ); };
- // Enum Methods.
- static eOrientationType getOrientationTypeEnum( const char *pLabel );
- static StringTableEntry getOrientationTypeLabel( const eOrientationType &pType );
- };
- //-----------------------------------------------------------------------------
- // Define Types.
- typedef VPathObject::eOrientationType VPathObjectOrientationType;
- // Declare Enum Types.
- DefineEnumType( VPathObjectOrientationType );
- //-----------------------------------------------------------------------------
- #endif // _VT_VPATHOBJECT_H_
|