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