#pragma once #include #include #include #include "effects/DrawDecorate.h" class TrackWave : public DrawDecorate { public: explicit TrackWave(ElectricWave* pElectricWave); virtual ~TrackWave(void); // 设置起始点和终止点 virtual void SetStartAndEnd(const osg::Vec3d& vStart, const osg::Vec3d& vEnd); // 设置起始点和终止点 void GetStartAndEnd(osg::Vec3d& vStart, osg::Vec3d& vEnd); // 设置半径 void SetRadius(const double fTopRadius, const double fBottonRadius); // 获得半径 void GetRadius(double& fTopRadius, double& fBottonRadius); // 设置环高度 void SetLoopHeight(const double fLoopHeight); // 获得环高度 double GetLoopHeight(void) const { return (m_fLoopHeight); } // 设置间隔高度 void SetSpaceHeight(const double fSpaceHeight); // 获得间隔高度 double GetSpaceHeight(void) { return (m_fSpaceHeight); } // 设置更新速度 void SetUpdateSpeed(const double fSpeed); // 获得更新速度 double GetUpdateSpeed(void) const {return (m_fUpdateValue);} // 是否是放大波 void SetWaveStyle(bool bZ); // 获得是否放大波 bool GetWaveSytle(void) const; protected: // 创建渲染体 virtual osg::Drawable* CreateDrawable(void); // 获得顶点数组 virtual osg::Vec3dArray* GetVertexArrays(void); // 获得渲染体 // virtual osg::PrimitiveSet* GetPrimitiveSet(int nStart, int nCount); virtual void CreatePrimitiveSet(osg::Geometry* pGeometry, int nStart, int nCount); public: // 更新 virtual void UpdataDrawable(void); protected: // 创建圆环 virtual void CreateSingleVertex(double index, osg::Vec3dArray* pVertexArray); // 计算顶部半径 double CreateTopRadius(double fHeight); // 计算底部半径 double CreateBottonRadius(double fHeight); // 获取两点间的距离 double GetDis(void); // 计算半径斜率 double ComputeDRadius(void); // 获得环的个数 int GetCount(void); protected: double m_fHeight; // 高度 double m_fBottomRadius; // 底部半径 double m_fTopRadius; // 顶部半径 double m_fSpaceHeight; // 间隔高度 double m_fLoopHeight; // 环高度 double m_fdRadius; // 半径变化率 double m_fdHeight; // 高度变化率 double m_fUpdateValue; // 更新速度 osg::Vec3d m_vStart; // 起始点 osg::Vec3d m_vEnd; // 终止点 int m_nCount; // 环的个数 osg::Matrix m_matrix; // 用于计算旋转 bool m_bZ; friend class CUpdataTrackWave; };