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

74 lines
1.8 KiB
C++

#include "twist.h"
#include "globals.h"
#include "intrin.h"
void Twist::AddToScene( float fTime, int iObject, bool isLowPoly )
{
g_Objects[ iObject ].Lock();
for( int i= 0; i < 3; ++i )
{
AddCylinder( fTime, iObject,
fTime * 2.5f + (float)i * c_2PI / 3.0f,
2.0f,
1.66f,
isLowPoly);
}
g_Objects[ iObject ].Unlock();
}
void Twist::AddCylinder( float fTime, int iObject, float fBaseAngle, float fBaseSize, float fSize, bool isLowPoly )
{
DWORD dwColor= 0x80404040;
const int iSliceCount= 64;
const int iSideCount= isLowPoly ? 3 : 24;
float fOffset= 0.0f;
int iBaseIndex= g_Objects[ iObject ].GetVertCount();
for( int iSlices= -iSliceCount; iSlices < iSliceCount; ++iSlices )
{
float fLocalTime= fTime + iSlices / 32.0f;
float fAddAngle= 6.0f * sin( fLocalTime * 0.78f + 0.8f * sin( fLocalTime * 0.37f) );
D3DXVECTOR3 vMid(
fBaseSize * sin( fBaseAngle + fAddAngle ),
(float)iSlices * 0.25f,
fBaseSize * cos( fBaseAngle + fAddAngle ) );
for( int i= 0; i < iSideCount; ++i )
{
if( iSlices != -iSliceCount )
{
int ID1= g_Objects[ iObject ].GetVertCount();
int ID2= ID1 - 1 + ( i == 0 ? iSideCount : 0 );
int ID3= ID1 - iSideCount;
int ID4= ID2 - iSideCount;
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 );
}
float fAngle= fOffset + c_2PI * (float)i / (float)iSideCount;
D3DXVECTOR3 vNormal( cos( fAngle ), 0.0f, -sin( fAngle ) );
Renderjob::SVertex V;
*((D3DXVECTOR3*)&(V.x))= vMid + vNormal * fSize;
*((D3DXVECTOR3*)&(V.nx))= vNormal;
V.dwColor= dwColor;
V.tu= 0.0f;
V.tv= 0.0f;
g_Objects[ iObject ].AddVertex( V );
}
//fOffset+= c_PI / (float)iSideCount;
}
}