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