256 lines
5.1 KiB
C++
256 lines
5.1 KiB
C++
|
#include "effects/TrackWave.h"
|
|||
|
|
|||
|
#include <algorithm>
|
|||
|
#include <math.h>
|
|||
|
#include <osg/Drawable>
|
|||
|
#include <osg/Geometry>
|
|||
|
#include <osg/CullFace>
|
|||
|
#include <osg/Depth>
|
|||
|
|
|||
|
TrackWave::TrackWave(ElectricWave* pElectricWave)
|
|||
|
: DrawDecorate(pElectricWave), m_fHeight(5),m_fBottomRadius(2),m_fTopRadius(5),\
|
|||
|
m_fSpaceHeight(5),m_fLoopHeight(4),m_fdHeight(0),m_vStart(0, 0, 0), m_vEnd(0, 0, 85),\
|
|||
|
m_fUpdateValue(2), m_nCount(0),m_bZ(true)
|
|||
|
{
|
|||
|
m_fdRadius = (m_fTopRadius - m_fBottomRadius) / m_fHeight;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
TrackWave::~TrackWave(void)
|
|||
|
{
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9>
|
|||
|
void TrackWave::SetStartAndEnd(const osg::Vec3d& vStart, const osg::Vec3d& vEnd)
|
|||
|
{
|
|||
|
m_vStart = vStart;
|
|||
|
m_vEnd = vEnd;
|
|||
|
|
|||
|
osg::Vec3d vDir = m_vEnd - m_vStart;
|
|||
|
// <20><><EFBFBD>㳤<EFBFBD><E3B3A4>
|
|||
|
m_fHeight = vDir.length();
|
|||
|
// <20><>һ<EFBFBD><D2BB>
|
|||
|
vDir.normalize();
|
|||
|
m_matrix = osg::Matrix::rotate(osg::Vec3d(0, 0, 1), vDir);
|
|||
|
|
|||
|
// <20><><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>뾶
|
|||
|
ComputeDRadius();
|
|||
|
|
|||
|
ForceDraw();
|
|||
|
ForceDrawStyle();
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֹ<EFBFBD><D6B9>
|
|||
|
void TrackWave::GetStartAndEnd(osg::Vec3d& vStart, osg::Vec3d& vEnd)
|
|||
|
{
|
|||
|
vStart = m_vStart;
|
|||
|
vEnd = m_vEnd;
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD>ð뾶
|
|||
|
void TrackWave::SetRadius(const double fTopRadius, const double fBottonRadius)
|
|||
|
{
|
|||
|
m_fTopRadius = fTopRadius;
|
|||
|
m_fBottomRadius = fBottonRadius;
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>뾶<EFBFBD>仯<EFBFBD><E4BBAF>
|
|||
|
ComputeDRadius();
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD>ð뾶
|
|||
|
void TrackWave::GetRadius(double& fTopRadius, double& fBottonRadius)
|
|||
|
{
|
|||
|
fTopRadius = m_fTopRadius;
|
|||
|
fBottonRadius = m_fBottomRadius;
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD>û<EFBFBD><C3BB>߶<EFBFBD>
|
|||
|
void TrackWave::SetLoopHeight(const double fLoopHeight)
|
|||
|
{
|
|||
|
m_fLoopHeight = fLoopHeight;
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD>߶<EFBFBD>
|
|||
|
void TrackWave::SetSpaceHeight(const double fSpaceHeight)
|
|||
|
{
|
|||
|
m_fSpaceHeight = fSpaceHeight;
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD>ø<EFBFBD><C3B8><EFBFBD><EFBFBD>ٶ<EFBFBD>
|
|||
|
void TrackWave::SetUpdateSpeed(const double fSpeed)
|
|||
|
{
|
|||
|
m_fUpdateValue = fSpeed;
|
|||
|
}
|
|||
|
|
|||
|
// <20>Ƿ<EFBFBD><C7B7>ǷŴ<C7B7><C5B4><EFBFBD>
|
|||
|
void TrackWave::SetWaveStyle(bool bZ)
|
|||
|
{
|
|||
|
m_bZ = bZ;
|
|||
|
ForceDraw();
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>Ŵ<EFBFBD><C5B4><EFBFBD>
|
|||
|
bool TrackWave::GetWaveSytle(void) const
|
|||
|
{
|
|||
|
return (m_bZ);
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱦ<EFBFBD><C8BE>
|
|||
|
osg::Drawable* TrackWave::CreateDrawable(void)
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ
|
|||
|
osg::Drawable* pDrawable = DrawDecorate::CreateDrawable();
|
|||
|
return (pDrawable);
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD>ö<EFBFBD><C3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
osg::Vec3dArray* TrackWave::GetVertexArrays(void)
|
|||
|
{
|
|||
|
osg::Vec3dArray* pVertexArray = new osg::Vec3dArray;
|
|||
|
|
|||
|
double dCount = (m_fHeight / (m_fSpaceHeight + m_fLoopHeight));
|
|||
|
|
|||
|
// <20><><EFBFBD>㻷<EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD>
|
|||
|
m_nCount = (dCount - (int)dCount >= 0.5f) ? (int)dCount + 1 : (int)dCount;
|
|||
|
|
|||
|
for (int index = 0; index < m_nCount; ++index)
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31>ʼ
|
|||
|
CreateSingleVertex(index, pVertexArray);
|
|||
|
}
|
|||
|
|
|||
|
return (pVertexArray);
|
|||
|
}
|
|||
|
|
|||
|
void TrackWave::CreatePrimitiveSet(osg::Geometry* pGeometry, int nStart, int nCount)
|
|||
|
{
|
|||
|
pGeometry->removePrimitiveSet(0, pGeometry->getNumPrimitiveSets());
|
|||
|
for (int index = 0; index < m_nCount; ++index)
|
|||
|
{
|
|||
|
pGeometry->addPrimitiveSet(new osg::DrawArrays(GL_TRIANGLE_STRIP, index * 122, 122));
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD>Բ<EFBFBD><D4B2>
|
|||
|
void TrackWave::CreateSingleVertex(double index, osg::Vec3dArray* pVertexArray)
|
|||
|
{
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>
|
|||
|
double fHeight = index * (m_fLoopHeight + m_fSpaceHeight) + m_fLoopHeight + m_fdHeight;
|
|||
|
|
|||
|
if ((fHeight - m_fLoopHeight) >= m_fHeight)
|
|||
|
{
|
|||
|
fHeight -= m_fHeight;
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD>㶥<EFBFBD><E3B6A5><EFBFBD>İ뾶
|
|||
|
double fTopRadius = CreateTopRadius(fHeight );
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ײ<EFBFBD><D7B2>뾶
|
|||
|
double fBottonRadius = CreateBottonRadius(fHeight);
|
|||
|
|
|||
|
// <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
|
|||
|
double ftemp = 0;
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD>ֵ
|
|||
|
for (int angle = 0; angle <= 60; ++angle)
|
|||
|
{
|
|||
|
double dTheta = osg::DegreesToRadians(angle * 6.0f);
|
|||
|
|
|||
|
double xCos = std::cos(dTheta);
|
|||
|
double ySin = std::sin(dTheta);
|
|||
|
double xt = fTopRadius * xCos;
|
|||
|
double yt = fTopRadius * ySin;
|
|||
|
|
|||
|
//ftemp = fHeight;
|
|||
|
//<2F>ж<EFBFBD>ֵ<EFBFBD><D6B5>Ч
|
|||
|
ftemp = std::min(fHeight, m_fHeight);
|
|||
|
double zt = ftemp ;
|
|||
|
|
|||
|
double xb = fBottonRadius * xCos ;
|
|||
|
double yb = fBottonRadius * ySin ;
|
|||
|
ftemp = fHeight - m_fLoopHeight;
|
|||
|
|
|||
|
double zb = ftemp ;
|
|||
|
|
|||
|
osg::Vec3d vTop(xt, yt, m_bZ ? zt : (m_fHeight - zt));
|
|||
|
osg::Vec3d vBotton(xb, yb, m_bZ ? zb : (m_fHeight - zb));
|
|||
|
|
|||
|
vTop = vTop * m_matrix;
|
|||
|
vBotton = vBotton * m_matrix;
|
|||
|
|
|||
|
vTop += m_vStart;
|
|||
|
vBotton += m_vStart;
|
|||
|
|
|||
|
pVertexArray->push_back(vTop);
|
|||
|
pVertexArray->push_back(vBotton);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>뾶
|
|||
|
double TrackWave::CreateTopRadius(double fHeight)
|
|||
|
{
|
|||
|
// <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>뾶
|
|||
|
fHeight = std::min(m_fHeight, fHeight);
|
|||
|
|
|||
|
fHeight = m_bZ ? (fHeight) : (m_fHeight - fHeight);
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>
|
|||
|
double fRadius = fHeight * m_fdRadius + m_fBottomRadius;
|
|||
|
return (fRadius);
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ײ<EFBFBD><D7B2>뾶
|
|||
|
double TrackWave::CreateBottonRadius(double fHeight)
|
|||
|
{
|
|||
|
// <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>뾶
|
|||
|
|
|||
|
fHeight = std::min(m_fHeight, fHeight);
|
|||
|
|
|||
|
double btLoopHeihgt = m_fHeight - fHeight ;
|
|||
|
|
|||
|
if (btLoopHeihgt > 0 )
|
|||
|
{
|
|||
|
btLoopHeihgt += m_fLoopHeight;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
btLoopHeihgt = 0;
|
|||
|
}
|
|||
|
|
|||
|
fHeight = m_bZ ? (fHeight - m_fLoopHeight) : (btLoopHeihgt);
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>
|
|||
|
double fRadius = (fHeight) * m_fdRadius + m_fBottomRadius;
|
|||
|
return (fRadius);
|
|||
|
}
|
|||
|
|
|||
|
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
|
|||
|
double TrackWave::GetDis(void)
|
|||
|
{
|
|||
|
const osg::Vec3d v = m_vEnd - m_vStart;
|
|||
|
return (v.length());
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD><EFBFBD>뾶б<EBBEB6><D0B1>
|
|||
|
double TrackWave::ComputeDRadius(void)
|
|||
|
{
|
|||
|
m_fdRadius = (m_fTopRadius - m_fBottomRadius) / m_fHeight;
|
|||
|
return (m_fdRadius);
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD>û<EFBFBD><C3BB>ĸ<EFBFBD><C4B8><EFBFBD>
|
|||
|
int TrackWave::GetCount(void)
|
|||
|
{
|
|||
|
return (m_nCount);
|
|||
|
}
|
|||
|
|
|||
|
// <20><><EFBFBD><EFBFBD>
|
|||
|
void TrackWave::UpdataDrawable(void)
|
|||
|
{
|
|||
|
if((m_fdHeight += m_fUpdateValue) > (m_fHeight))
|
|||
|
{
|
|||
|
m_fdHeight = 0;
|
|||
|
}
|
|||
|
|
|||
|
ForceDraw();
|
|||
|
|
|||
|
DrawDecorate::UpdataDrawable();
|
|||
|
}
|