Files
bluflame/evoke-64k/trunk/ev10/swarm.cpp
2026-04-18 22:31:51 +02:00

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 );
}
}