text: //-----------------------------------------------------------------------------
  // Torque Game Engine
  // Copyright (C) GarageGames.com, Inc.
  //-----------------------------------------------------------------------------
  
  #ifndef _PATHSHAPE_H_
  #define _PATHSHAPE_H_
  
  #ifndef _STATICSHAPE_H_
  #include "T3D/staticShape.h"
  #endif
  
  #ifndef _CAMERASPLINE_H_
  #include "T3D/cameraSpline.h"
  #endif
  
  #ifndef _SIMPATH_H_
  #include "scene/simPath.h"
  #endif
  //----------------------------------------------------------------------------
  struct PathShapeData: public StaticShapeData {
     typedef StaticShapeData Parent;
  
  
     PathShapeData();
     static void consoleInit();
  
     DECLARE_CONOBJECT(PathShapeData);
     bool preload(bool server, String &errorStr);
     static void initPersistFields();
     virtual void packData(BitStream* stream);
     virtual void unpackData(BitStream* stream);
  };
  
  
  //----------------------------------------------------------------------------
  class PathShape: public StaticShape
  {
  public:
     enum State {
        Forward,
        Backward,
        Stop,
        StateBits = 3
     };
  
  private:
     typedef StaticShape Parent;
  
       enum MaskBits {
        WindowMask     = Parent::NextFreeMask,
        PositionMask   = WindowMask << 1,
        TargetMask     = PositionMask << 1,
        StateMask      = TargetMask << 1,
        NextFreeMask   = StateMask << 1
  
  	  };
  
     struct StateDelta {
        F32 time;
        F32 timeVec;
     };
     StateDelta delta;
  
     enum Constants {
        NodeWindow = 20    // Maximum number of active nodes
     };
  
     PathShapeData* mDataBlock;
     CameraSpline mSpline;
     S32 mNodeBase;
     S32 mNodeCount;
     F32 mPosition;
     S32 mState;
     F32 mTarget;
     bool mTargetSet;
     void interpolateMat(F32 pos,MatrixF* mat);
     void advancePosition(S32 ms);
  
  public:
     DECLARE_CONOBJECT(PathShape);
  
     PathShape();
     ~PathShape();
  
     StringTableEntry mControl[4];
  
     static void initPersistFields();
     static void consoleInit();
     bool onAdd();
     void onRemove();
     bool onNewDataBlock(GameBaseData* dptr, bool reload);
     void onNode(S32 node);
  
     void processTick(const Move*);
     void interpolateTick(F32 dt);
  
     U32  packUpdate(NetConnection *, U32 mask, BitStream *stream);
     void unpackUpdate(NetConnection *, BitStream *stream);
  
     void reset(F32 speed = 1);
     void pushFront(CameraSpline::Knot *knot);
     void pushBack(CameraSpline::Knot *knot);
     void popFront();
  
     void setPosition(F32 pos);
     void setTarget(F32 pos);
     void setState(State s);
     S32 getState();
     SimObjectRef< SimPath::Path >  mSimPath;
  };
  
  
  #endif
  