143 lines
3.8 KiB
C++
143 lines
3.8 KiB
C++
#include "bowfront.h"
|
|
#include "flockspline.h"
|
|
|
|
BowFrontInfo g_BowFrontData[ g_iBowFrontCount ];
|
|
|
|
static D3DXVECTOR3 UpFly[4]=
|
|
{
|
|
D3DXVECTOR3( 0.0f, -4.0f, 0.0f ),
|
|
D3DXVECTOR3( 0.0f, 0.0f, 0.0f ),
|
|
D3DXVECTOR3( 0.0f, 16.0f, 0.0f ),
|
|
D3DXVECTOR3( 0.0f, 20.0f, 0.0f ),
|
|
};
|
|
|
|
D3DXVECTOR2 vecFlock[ 1024 ];
|
|
float fFlockTime[ 1024 ];
|
|
|
|
void GenerateBowFront()
|
|
{
|
|
for( int i= 0; i < g_iBowFrontCount; ++i )
|
|
{
|
|
g_BowFrontData[ i ].Disable();
|
|
}
|
|
|
|
float fBaseHeight= 0.0f;
|
|
float fStartWidth= -48.0f;
|
|
float fEndWidth= 48.0f;
|
|
float fStartLength= 128.0f;
|
|
float fEndLength= -120.0f;
|
|
|
|
int BowCount= 96;
|
|
|
|
int iCount= 0;
|
|
|
|
g_BowFrontData[ iCount ].m_vCenter.x= -64.0f;
|
|
g_BowFrontData[ iCount ].m_vCenter.y= -80.0f;
|
|
g_BowFrontData[ iCount ].m_vCenter.z= 0.0f;
|
|
g_BowFrontData[ iCount ].m_fInner= 192.0f;
|
|
g_BowFrontData[ iCount ].m_fOuter= g_BowFrontData[ iCount ].m_fInner + 32.0f;
|
|
g_BowFrontData[ iCount ].m_fWidth= 16.0f;
|
|
g_BowFrontData[ iCount ].m_fMaxSpreadAngle= 4.0f;
|
|
g_BowFrontData[ iCount ].m_fStartTime= 3.75f;
|
|
g_BowFrontData[ iCount ].m_fEndTime= 4.75f;
|
|
|
|
iCount++;
|
|
|
|
int iFlock= 0;
|
|
|
|
for( int i= 0; i < BowCount; ++i )
|
|
{
|
|
float fPosX= g_Random.genFloat( fStartWidth, fEndWidth );
|
|
float fPosZ= fStartLength - g_Random.genFloat( 0.0f, 8.0f );
|
|
float fTime= 16.0f;
|
|
while( true )
|
|
{
|
|
assert( iCount < g_iBowFrontCount );
|
|
float fStepLength= g_Random.genFloat( 8.0f, 20.0f );
|
|
g_BowFrontData[ iCount ].m_vCenter.x= fPosX;
|
|
g_BowFrontData[ iCount ].m_vCenter.y= fBaseHeight;
|
|
fPosZ-= fStepLength;
|
|
g_BowFrontData[ iCount ].m_vCenter.z= fPosZ;
|
|
fPosZ-= fStepLength;
|
|
float fThick= fStepLength * 0.1f + g_Random.genFloat( 0.0f, 0.75f );
|
|
g_BowFrontData[ iCount ].m_fInner= fStepLength - fThick;
|
|
g_BowFrontData[ iCount ].m_fOuter= fStepLength + fThick;
|
|
g_BowFrontData[ iCount ].m_fWidth= fThick * 0.35f;
|
|
g_BowFrontData[ iCount ].m_fMaxSpreadAngle= g_Random.genFloat( 1.2f, 3.1f );
|
|
g_BowFrontData[ iCount ].m_fStartTime= fTime;
|
|
|
|
fTime+= 0.25f * fStepLength;
|
|
g_BowFrontData[ iCount ].m_fEndTime= fTime * (31.0f / 32.0f);// - g_Random.genFloat( 0.25f, fStepLength * 0.625f );
|
|
|
|
iCount++;
|
|
if( iCount % 3 == 1 && fabs( -18.0f - fPosX ) < 20.0f && fabs( fPosZ ) < 32.0f )
|
|
{
|
|
vecFlock[ iFlock ].x= fPosX;
|
|
vecFlock[ iFlock ].y= fPosZ;
|
|
fFlockTime[ iFlock ]= fTime;
|
|
iFlock++;
|
|
}
|
|
|
|
if( fPosZ < fEndLength )
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
for( int i= 0; i < iFlock; ++i )
|
|
{
|
|
for( int j =0; j < 4; ++j )
|
|
{
|
|
UpFly[ j ].x= vecFlock[ i ].x;
|
|
UpFly[ j ].z= vecFlock[ i ].y;
|
|
}
|
|
|
|
int iBase= 192;
|
|
assert( iBase + i < g_iFlockCount );
|
|
|
|
g_Flocks[ iBase + i ].GeneratePreSpline(
|
|
UpFly,
|
|
4,
|
|
1.5f,
|
|
0.25f );
|
|
|
|
g_Flocks[ iBase + i ].GenerateUpVectors();
|
|
g_Flocks[ iBase + i ].GenerateSplinePoints( 128 );
|
|
g_Flocks[ iBase + i ].GenerateBoids03( 24 );
|
|
g_Flocks[ iBase + i ].m_iTesselation= 2;
|
|
g_Flocks[ iBase + i ].m_fTimeOffset= fFlockTime[ i ] - 258.0f;
|
|
}
|
|
}
|
|
|
|
void AddBowFrontToScene( float fTime )
|
|
{
|
|
g_Objects[ OI_BowFront ].Lock();
|
|
for( int i= 0; i < g_iBowFrontCount; ++i )
|
|
{
|
|
if( fTime > g_BowFrontData[ i ].m_fEndTime )
|
|
{
|
|
continue;
|
|
}
|
|
if( fTime < g_BowFrontData[ i ].m_fStartTime )
|
|
{
|
|
continue;
|
|
}
|
|
float fTimePercent= ( fTime - g_BowFrontData[ i ].m_fStartTime ) /
|
|
( g_BowFrontData[ i ].m_fEndTime - g_BowFrontData[ i ].m_fStartTime );
|
|
fTimePercent*= g_BowFrontData[ i ].m_fMaxSpreadAngle + c_PI;
|
|
fTimePercent-= g_BowFrontData[ i ].m_fMaxSpreadAngle;
|
|
|
|
float fStartAngle= maximum( fTimePercent, 0.0f );
|
|
float fEndAngle= minimum( fTimePercent + g_BowFrontData[ i ].m_fMaxSpreadAngle, c_PI );
|
|
|
|
g_Objects[ OI_BowFront ].AddRainbow(
|
|
g_BowFrontData[ i ].m_vCenter,
|
|
g_BowFrontData[ i ].m_fInner, g_BowFrontData[ i ].m_fOuter,
|
|
g_BowFrontData[ i ].m_fWidth,
|
|
fStartAngle, fEndAngle,
|
|
D3DXVECTOR3(0.0f, 0.0f, 0.0f) );
|
|
|
|
}
|
|
g_Objects[ OI_BowFront ].Unlock();
|
|
} |