123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271 |
- //-----------------------------------------------------------------------------
- // 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_VPATH_H_
- #define _VT_VPATH_H_
- #ifndef _SCENEOBJECT_H_
- #include "scene/sceneObject.h"
- #endif
- #ifndef _VT_PATHNODE_H_
- #include "VPathNode.h"
- #endif
- #ifndef _VT_PATHOBJECT_H_
- #include "VPathObject.h"
- #endif
- //-----------------------------------------------------------------------------
- typedef Vector<VPathNode*> VPathNodeVector;
- typedef VPathNodeVector::iterator VPathNodeIterator;
- typedef Vector<VPathObject*> VPathObjectVector;
- typedef VPathObjectVector::iterator VPathObjectIterator;
- //-----------------------------------------------------------------------------
- class VPath : public SceneObject
- {
- typedef SceneObject Parent;
- friend class VPathEditor;
- public:
- // Static Members.
- static SimObjectPtr<SimSet> gServerSet;
- static U32 gMaxNodeTransmit;
- static U32 gMaxNodeBits;
- static U32 gMaxNodeCount;
- static U32 gMaxObjectTransmit;
- static U32 gMaxObjectBits;
- static U32 gMaxObjectCount;
- static Point3F gBezierAxis;
- static Point3F gBezierUp;
- enum eMaskBits
- {
- InitialUpdateMask = Parent::NextFreeMask << 0,
- PathUpdateMask = Parent::NextFreeMask << 1,
- NodeUpdateMask = Parent::NextFreeMask << 2,
- ObjectUpdateMask = Parent::NextFreeMask << 3,
- NextFreeMask = Parent::NextFreeMask << 4,
- };
- enum ePathType
- {
- k_PathLinear,
- k_PathBezier,
- k_PathInvalid,
- k_PathTypeSize,
- };
- private:
- U32 mPathType;
- VPathNodeVector mNodeList;
- VPathObjectVector mObjectList;
- public:
- VPath( void );
- ~VPath( void );
- bool onAdd( void );
- void onDeleteNotify( SimObject *pObject );
- void onRemove( void );
- static void initPersistFields();
- static SimSet *getServerSet( void );
- // Editor Methods.
- bool collideBox( const Point3F &pStart, const Point3F &pEnd, RayInfo* pInfo );
- // Update Methods.
- F32 getUpdatePriority( CameraScopeQuery *pFocusObject, U32 pUpdateMask, S32 pUpdateSkips );
- void updateContainer( void );
- void updateNodeTransforms( void );
- void setTransform( const MatrixF &pMatrix );
- void setScale( const VectorF &pScale );
- void setPathType( const ePathType &pType );
- static bool setPathType( void *pObject, const char *pArray, const char *pData );
- // Mounting Methods.
- U32 getAvailableMountIndex( void );
- bool isMountIndex( const U32 &pIndex );
- void mountObject( SceneObject *pObject, S32 pIndex, const MatrixF &pTransform = MatrixF::Identity );
- void unmountObject( SceneObject *pObject );
- void getMountTransform( S32 pIndex, const MatrixF &pInTransform, MatrixF *pTransform );
- void getRenderMountTransform( F32 pDelta, S32 pIndex, const MatrixF &pInTransform, MatrixF *pTransform );
- VectorF getMountVelocity( const U32 &pIndex );
- // Persistence Methods.
- void readFields( void );
- void writeFields( Stream &pStream, U32 pTabStop );
- U32 packUpdate( NetConnection *pConnection, U32 pMask, BitStream *pStream );
- void unpackUpdate( NetConnection *pConnection, BitStream *pStream );
- DECLARE_CONOBJECT( VPath );
- public:
- // Node Methods.
- static VPathNode *createNode( void );
- static void deleteNode( VPathNode *pNode );
- void clear( void );
- VPathNode *getNode( const S32 &pNodeIndex );
- VPathNode *addNode( const Point3F &pPosition, const QuatF &pRotation, const F32 &pWeight, const S32 &pLocation = -1 );
- VPathNode *addNode( VPathNode *pNode, const S32 &pLocation = -1 );
- void deleteNode( const S32 &pNodeIndex );
- void removeNode( const S32 &pNodeIndex );
- S32 normalizeNodeIndex( S32 &pNodeIndex );
- S32 normalizeNodeIndex( const S32 &pNodeIndex );
- S32 normalizeNodeIndex( S32 &pNodeIndex, const S32 &pNodeCount );
- // Object Methods.
- bool isObjectAttached( SceneObject *pObject );
- VPathObject *getPathObject( SceneObject *pObject );
- void attachObject( SceneObject *pObject, const bool &pForward, const F32 &pSpeed, const bool &pRelative, const S32 &pStartNode, const S32 &pEndNode );
- void attachObject( SceneObject *pObject, const bool &pForward, const F32 &pSpeed, const bool &pRelative, const S32 &pStartNode, const S32 &pEndNode, const VPathObject::eOrientationType &pOrientationMode );
- void attachObject( SceneObject *pObject, const bool &pForward, const F32 &pSpeed, const bool &pRelative, const S32 &pStartNode, const S32 &pEndNode, const VPathObject::eOrientationType &pOrientationMode, void *pOrientationData );
- void attachObject( VPathObject *pPathObject );
- void onAttachObject( VPathObject *pPathObject );
- void detachObject( SceneObject *pObject );
- void detachObject( VPathObject *pPathObject );
- void onDetachObject( VPathObject *pPathObject );
- void processTick( const Move *pMove );
- void advanceObject( VPathObject *pPathObject, const F32 &pDelta );
- void updatePosition( VPathObject *pPathObject );
- void updateOrientation( VPathObject *pPathObject );
- void updateOrientation( VPathObject *pPathObject, const Point3F &pPathOrientation );
- // Path Methods.
- void calculatePath( void );
- Point3F getAdvancedPathPosition( VPathObject *pPathObject, const F32 &pTargetDistance, F32 &pInterpDelta );
-
- Point3F getPathPosition( VPathNode *pSourceNode, VPathNode *pDestinationNode, const F32 &pTimeInterp, const bool &pForward );
- Point3F getPathPosition( VPathNode *pSourceNode, VPathNode *pDestinationNode, const F32 &pTimeInterp, const bool &pForward, F32 &pPathInterp );
- VectorF getPathOrientation( VPathNode *pSourceNode, VPathNode *pDestinationNode, const F32 &pTimeInterp, const bool &pForward );
- //
- // Linear Path Methods.
- void calculateLinearPath( VPathNode *pNode, VPathNode *pNextNode );
- Point3F getAdvancedLinearPathPosition( VPathObject *pPathObject, const F32 &pTargetDistance, F32 &pInterpDelta );
- Point3F getLinearPathPosition( VPathNode *pSourceNode, VPathNode *pDestinationNode, const F32 &pInterp, const bool &pForward, F32 &pPathInterp );
- VectorF getLinearPathOrientation( VPathNode *pSourceNode, VPathNode *pDestinationNode, const F32 &pInterp, const bool &pForward );
- //
- // Bezier Path Methods.
- void calculateBezierPath( VPathNode *pNode, VPathNode *pNextNode );
- Point3F getAdvancedBezierPathPosition( VPathObject *pPathObject, const F32 &pTargetDistance, F32 &pInterpDelta );
- Point3F getBezierPathPosition( VPathNode *pSourceNode, VPathNode *pDestinationNode, const F32 &pInterp, const bool &pForward, F32 &pPathInterp );
- Point3F getBezierPathPosition( VPathNode *pSourceNode, VPathNode *pDestinationNode, const F32 &pInterp, const Point3F &pReferencePosition, const F32 &pTargetDistance, const bool &pForward, const bool &pRelativeToReference, F32 &pPathInterpDelta );
- VectorF getBezierPathOrientation( VPathNode *pSourceNode, VPathNode *pDestinationNode, const F32 &pInterp, const bool &pForward );
- public:
- // Node Property Methods.
- S32 getNodeCount( void );
- Point3F getNodeLocalPosition( const S32 &pNodeIndex );
- Point3F getNodeWorldPosition( const S32 &pNodeIndex );
- QuatF getNodeLocalRotation( const S32 &pNodeIndex );
- QuatF getNodeWorldRotation( const S32 &pNodeIndex );
- F32 getNodeWeight( const S32 &pNodeIndex );
- F32 getNodeLength( const S32 &pNodeIndex );
- void setNodePosition( const S32 &pNodeIndex, const Point3F &pPosition );
- void setNodeRotation( const S32 &pNodeIndex, const QuatF &pRotation );
- void setNodeWeight( const S32 &pNodeIndex, const F32 &pWeight );
- void setNodeOrientationMode( const S32 &pNodeIndex, const VPathNode::eOrientationType &pType );
- void setNodeOrientationMode( const S32 &pNodeIndex, const VPathNode::eOrientationType &pType, const Point3F pPoint );
- // Path Object Property Methods.
- void setPathObjectActive( SceneObject *pObject, const bool &pActive );
- void setPathObjectInterp( SceneObject *pObject, const F32 &pTimeInterp );
- void setPathObjectOffset( SceneObject *pObject, const Point3F &pOffset );
- void setPathObjectSpeed( SceneObject *pObject, const F32 &pSpeed );
- void setPathObjectOrientationMode( SceneObject *pObject, const VPathObject::eOrientationType &pType );
- void setPathObjectOrientationMode( SceneObject *pObject, const VPathObject::eOrientationType &pType, SceneObject *pLookAtObject );
- void setPathObjectOrientationMode( SceneObject *pObject, const VPathObject::eOrientationType &pType, const Point3F pPoint );
- void setPathObjectForward( SceneObject *pObject, const bool &pForward );
- void setPathObjectNode( SceneObject *pObject, const S32 &pNodeIndex );
- void setPathObjectEndNode( SceneObject *pObject, const S32 &pNodeIndex );
- void setPathObjectInterp( VPathObject *pPathObject, const F32 &pTimeInterp );
- };
- //-----------------------------------------------------------------------------
- // Define Types.
- typedef VPath::ePathType VPathType;
- // Declare Enum Types.
- DefineEnumType( VPathType );
- //-----------------------------------------------------------------------------
- #endif // _VT_VPATH_H_
|