port from perforce
This commit is contained in:
94
evoke-64k/trunk/ev10/swarm.cpp
Normal file
94
evoke-64k/trunk/ev10/swarm.cpp
Normal file
@@ -0,0 +1,94 @@
|
||||
#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 );
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user