DYTSrouce/src/effects/TrackWave.cpp

256 lines
5.1 KiB
C++
Raw Normal View History

2025-01-04 04:12:51 +00:00
#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();
}