94 lines
2.7 KiB
C++
94 lines
2.7 KiB
C++
#include "swarm.h"
|
|
#include "globals.h"
|
|
#include "intrin.h"
|
|
|
|
const int g_SwarmCount= 1 + OI_SWARM_LAST - OI_SWARM_FIRST;
|
|
SWarm g_SwarmData[ g_SwarmCount ];
|
|
|
|
void PrepareSwarm()
|
|
{
|
|
g_Random.setSeed( 137 );
|
|
|
|
for(int i = 0; i < g_SwarmCount; i++ )
|
|
{
|
|
int iObj= OI_SWARM_FIRST + i;
|
|
assert( iObj <= OI_SWARM_LAST );
|
|
g_Objects[ iObj ].CreateTorus();
|
|
g_Objects[ iObj ].AddVertexColor( 0x60c00000 );
|
|
g_Objects[ iObj ].m_iUsedPreShader= PreDepth;
|
|
g_Objects[ iObj ].m_iUsedShader[ 0 ]= EnvLit;
|
|
|
|
SWarm& o= g_SwarmData[ i ];
|
|
|
|
o.m_fScale= g_Random.genFloat( -1.0f, 1.0f );
|
|
o.m_fScale= o.m_fScale * o.m_fScale * 0.35f + 0.35f;
|
|
|
|
float fCurSizeOffset= 5.0f - o.m_fScale * 6.0f;
|
|
o.m_PositionOffset[ 0 ]= g_Random.genFloat( -1.0f, 1.0f ) * fCurSizeOffset;
|
|
o.m_PositionOffset[ 1 ]= g_Random.genFloat( -1.0f, 1.0f ) * fCurSizeOffset;
|
|
o.m_PositionOffset[ 2 ]= g_Random.genFloat( -1.0f, 1.0f ) * fCurSizeOffset;
|
|
|
|
o.m_RotFacs[ 0 ]= g_Random.genFloat( -1.0f, 1.0f ) * c_PI;
|
|
o.m_RotFacs[ 1 ]= g_Random.genFloat( -1.0f, 1.0f ) * c_PI;
|
|
o.m_RotFacs[ 2 ]= g_Random.genFloat( -1.0f, 1.0f ) * c_PI;
|
|
|
|
o.m_fTimeOffset= (float)i * 0.02f + g_Random.genFloat( -1.0f, 1.0f ) * fCurSizeOffset * fCurSizeOffset * 0.125f;
|
|
}
|
|
}
|
|
|
|
void UpdateSwarm( float fTime )
|
|
{
|
|
for(int i = 0; i < g_SwarmCount; i++ )
|
|
{
|
|
SWarm& o= g_SwarmData[ i ];
|
|
float fCurTime= 0.25f * fTime+ o.m_fTimeOffset;
|
|
|
|
float fX;
|
|
float fY;
|
|
float fZ;
|
|
|
|
float fBeat= g_fShaderBeat;
|
|
fBeat= minimum( 1.0f, fBeat );
|
|
fBeat= 1.0f - 0.25f * fBeat;
|
|
if( fTime > 120.0f )
|
|
{
|
|
fCurTime*= 8.0f;
|
|
float fRadius= 12.0f + 4.0f * sin( fCurTime * 1.37f );
|
|
fX= o.m_PositionOffset[ 0 ] ;
|
|
fY= fRadius * cos( fCurTime ) + fBeat * o.m_PositionOffset[ 1 ];
|
|
fZ= fRadius * sin( fCurTime ) + fBeat * o.m_PositionOffset[ 2 ];
|
|
float fSize= 0.75f;
|
|
fX*= fSize;
|
|
fY*= fSize;
|
|
fZ*= fSize;
|
|
}
|
|
else
|
|
{
|
|
float fRadius= 12.0f + 4.0f * sin( fCurTime * 1.37f );
|
|
fX= fRadius * sin( fCurTime ) + fBeat * o.m_PositionOffset[ 0 ];
|
|
fZ= fRadius * cos( fCurTime ) + fBeat * o.m_PositionOffset[ 2 ];
|
|
float fUp= fCurTime - 48;
|
|
if( fUp < -4.0f )
|
|
{
|
|
fUp= -4.0f;
|
|
}
|
|
fY= fUp + sin( fCurTime * 0.5f ) * fUp * 0.25f + fBeat * o.m_PositionOffset[ 1 ];
|
|
}
|
|
|
|
float fRX= o.m_RotFacs[ 0 ] * fCurTime;
|
|
float fRY= o.m_RotFacs[ 1 ] * fCurTime;
|
|
float fRZ= o.m_RotFacs[ 2 ] * fCurTime;
|
|
|
|
D3DXMATRIX matResult;
|
|
D3DXMATRIX mat;
|
|
D3DXMatrixScaling( &matResult, o.m_fScale, o.m_fScale, o.m_fScale );
|
|
D3DXMatrixRotationYawPitchRoll( &mat, fRX, fRY, fRZ );
|
|
D3DXMatrixMultiply( &matResult,&matResult,&mat);
|
|
D3DXMatrixTranslation( &mat, fX, fY, fZ );
|
|
D3DXMatrixMultiply( &matResult,&matResult,&mat);
|
|
|
|
int iObj= OI_SWARM_FIRST + i;
|
|
assert( iObj <= OI_SWARM_LAST );
|
|
g_Objects[ iObj ].SetTransformation( matResult );
|
|
}
|
|
} |