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