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