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

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