167 lines
4.1 KiB
C++
167 lines
4.1 KiB
C++
#include "spike.h"
|
|
#include "globals.h"
|
|
#include "intrin.h"
|
|
|
|
Spike g_SpikeBall;
|
|
|
|
void Spike::PrepareBaseSphere()
|
|
{
|
|
m_iBaseSphereUsed= 12;
|
|
D3DXVECTOR3 v[ 4 ] =
|
|
{
|
|
D3DXVECTOR3( -1.0f, 1.0f, -1.0f ),
|
|
D3DXVECTOR3( -1.0f, -1.0f, 1.0f ),
|
|
D3DXVECTOR3( 1.0f, 1.0f, 1.0f ),
|
|
D3DXVECTOR3( 1.0f, -1.0f, -1.0f ),
|
|
};
|
|
|
|
m_vecBaseSphere[ 0 ]= v[ 0 ];
|
|
m_vecBaseSphere[ 1 ]= v[ 1 ];
|
|
m_vecBaseSphere[ 2 ]= v[ 2 ];
|
|
|
|
m_vecBaseSphere[ 3 ]= v[ 0 ];
|
|
m_vecBaseSphere[ 4 ]= v[ 2 ];
|
|
m_vecBaseSphere[ 5 ]= v[ 3 ];
|
|
|
|
m_vecBaseSphere[ 6 ]= v[ 3 ];
|
|
m_vecBaseSphere[ 7 ]= v[ 2 ];
|
|
m_vecBaseSphere[ 8 ]= v[ 1 ];
|
|
|
|
m_vecBaseSphere[ 9 ]= v[ 3 ];
|
|
m_vecBaseSphere[ 10 ]= v[ 1 ];
|
|
m_vecBaseSphere[ 11 ]= v[ 0 ];
|
|
|
|
|
|
for( int iSub = 0; iSub < 2; ++iSub )
|
|
{
|
|
int iNew= m_iBaseSphereUsed;
|
|
for( int iTri= 0; iTri < m_iBaseSphereUsed; iTri+= 3 )
|
|
{
|
|
D3DXVECTOR3 v[ 6 ] =
|
|
{
|
|
m_vecBaseSphere[ iTri ],
|
|
m_vecBaseSphere[ iTri + 1 ],
|
|
m_vecBaseSphere[ iTri + 2 ],
|
|
};
|
|
v[ 3 ]= ( v[ 0 ] + v[ 1 ] ) * 0.5f;
|
|
v[ 4 ]= ( v[ 1 ] + v[ 2 ] ) * 0.5f;
|
|
v[ 5 ]= ( v[ 2 ] + v[ 0 ] ) * 0.5f;
|
|
|
|
for( int iV= 0; iV < 6; ++iV )
|
|
{
|
|
D3DXVec3Normalize( v + iV, v + iV );
|
|
}
|
|
|
|
m_vecBaseSphere[ iTri + 0 ]= v[ 0 ];
|
|
m_vecBaseSphere[ iTri + 1 ]= v[ 3 ];
|
|
m_vecBaseSphere[ iTri + 2 ]= v[ 5 ];
|
|
|
|
m_vecBaseSphere[ iNew++ ]= v[ 3 ];
|
|
m_vecBaseSphere[ iNew++ ]= v[ 1 ];
|
|
m_vecBaseSphere[ iNew++ ]= v[ 4 ];
|
|
|
|
m_vecBaseSphere[ iNew++ ]= v[ 5 ];
|
|
m_vecBaseSphere[ iNew++ ]= v[ 4 ];
|
|
m_vecBaseSphere[ iNew++ ]= v[ 2 ];
|
|
|
|
m_vecBaseSphere[ iNew++ ]= v[ 5 ];
|
|
m_vecBaseSphere[ iNew++ ]= v[ 3 ];
|
|
m_vecBaseSphere[ iNew++ ]= v[ 4 ];
|
|
}
|
|
m_iBaseSphereUsed= iNew;
|
|
assert( m_iBaseSphereUsed <= c_iSphereMem );
|
|
}
|
|
}
|
|
|
|
void Spike::AddToScene( float fTime, int iObject )
|
|
{
|
|
DWORD dwColor= 0x50ff2040;
|
|
for( int j= 0; j < c_iLayers; j++ )
|
|
{
|
|
D3DXVECTOR3 vRotNext;
|
|
GenRot( fTime - (float)j / 32.0f, vRotNext );
|
|
D3DXMatrixRotationYawPitchRoll( &m_LayerRot[ j ], vRotNext.x, vRotNext.y, vRotNext.z );
|
|
}
|
|
|
|
g_Objects[ iObject ].Lock();
|
|
for( int iTri= 0; iTri < m_iBaseSphereUsed; iTri+= 3 )
|
|
{
|
|
D3DXVECTOR3 vCenter;
|
|
vCenter= ( m_vecBaseSphere[ iTri ] + m_vecBaseSphere[ iTri + 1 ] + m_vecBaseSphere[ iTri + 2 ] ) / 3.0f;
|
|
|
|
D3DXVECTOR3 vOutSide[ 3 ];
|
|
for( int i= 0; i < 3; ++i )
|
|
{
|
|
Renderjob::SVertex V;
|
|
D3DXVec3TransformNormal( ((D3DXVECTOR3*)&(V.x)), &m_vecBaseSphere[ iTri + i ], &m_LayerRot[ 0 ] );
|
|
*((D3DXVECTOR3*)&(V.nx))= *((D3DXVECTOR3*)&(V.x));
|
|
|
|
V.dwColor= dwColor;
|
|
V.tu= 0.0f;
|
|
V.tv= 0.0f;
|
|
g_Objects[ iObject ].AddVertex( V );
|
|
vOutSide[ i ]= m_vecBaseSphere[ iTri + i ] - vCenter;
|
|
}
|
|
|
|
D3DXVECTOR3 Dir;
|
|
D3DXVec3Normalize( &Dir, &vCenter );
|
|
|
|
D3DXVec3TransformNormal( &vCenter, &Dir, &m_LayerRot[ 0 ] );
|
|
for( int j= 1; j < c_iLayers; j++ )
|
|
{
|
|
float fSize= 0.9f - (float)j * 0.025f;
|
|
fSize*= fSize;
|
|
fSize*= fSize;
|
|
float fLength= 0.125f;
|
|
|
|
D3DXVECTOR3 DirCur;
|
|
D3DXVec3TransformNormal( &DirCur, &Dir, &m_LayerRot[ j ] );
|
|
vCenter+= DirCur * fLength;
|
|
|
|
for( int i= 0; i < 3; ++i )
|
|
{
|
|
D3DXVECTOR3 SideCur;
|
|
D3DXVec3TransformNormal( &SideCur, &vOutSide[ i ], &m_LayerRot[ j ] );
|
|
int ID1= g_Objects[ iObject ].GetVertCount();
|
|
int ID2= ID1 - 1 + ( i == 0 ? 3 : 0 );
|
|
int ID3= ID1 - 3;
|
|
int ID4= ID2 - 3;
|
|
|
|
g_Objects[ iObject ].AddIndex( ID1 );
|
|
g_Objects[ iObject ].AddIndex( ID2 );
|
|
g_Objects[ iObject ].AddIndex( ID3 );
|
|
|
|
g_Objects[ iObject ].AddIndex( ID3 );
|
|
g_Objects[ iObject ].AddIndex( ID2 );
|
|
g_Objects[ iObject ].AddIndex( ID4 );
|
|
|
|
Renderjob::SVertex V;
|
|
*((D3DXVECTOR3*)&(V.x))= vCenter + SideCur * fSize;
|
|
D3DXVec3Normalize( ((D3DXVECTOR3*)&(V.nx)), &SideCur );
|
|
|
|
V.dwColor= dwColor;
|
|
V.tu= 0.0f;
|
|
V.tv= 0.0f;
|
|
g_Objects[ iObject ].AddVertex( V );
|
|
}
|
|
|
|
}
|
|
|
|
/*for( int i= 0; i < 3; ++i )
|
|
{
|
|
g_Objects[ iObject ].AddTriangle(
|
|
m_vecBaseSphere[ iTri + i ],
|
|
m_vecBaseSphere[ iTri + ( ( i + 1 ) % 3 ) ],
|
|
vCenter,
|
|
0xffffffff );
|
|
}*/
|
|
}
|
|
g_Objects[ iObject ].Unlock();
|
|
}
|
|
|
|
void Spike::GenRot( float fTime, D3DXVECTOR3& vecRot )
|
|
{
|
|
vecRot.x= sin( fTime * 0.33f ) * 4.0f;
|
|
vecRot.y= cos( fTime * 0.47f ) * 3.0f;
|
|
vecRot.z= cos( fTime * 0.19f ) * 6.0f;
|
|
} |