void RenderSquareShadow(LPDIRECT3DDEVICE7 lpDevice,float x,float y,float z,float w,float h) { WORD wIndices[] = { 0,1,2, 3,2,1, 1,5,3, 3,5,7, 0,4,1, 1,4,5, 0,2,4, 4,2,6, 2,3,6, 6,3,7, }; D3DLIGHT7 light; lpDevice->GetLight(0,&light); D3DVECTOR length=Normalize(light.dvDirection)*(-100); D3DVERTEX v[8]; v[0] = D3DVERTEX( D3DVECTOR( x-w/2, y, z-h/2 ),D3DVECTOR(0,1,0), 0, 1 ); v[1] = D3DVERTEX( D3DVECTOR( x-w/2, y, z+h/2 ),D3DVECTOR(0,1,0), 0, 0 ); v[2] = D3DVERTEX( D3DVECTOR( x+w/2, y, z-h/2 ),D3DVECTOR(0,1,0), 1, 1 ); v[3] = D3DVERTEX( D3DVECTOR( x+w/2, y, z+h/2 ),D3DVECTOR(0,1,0), 1, 0 ); v[4] = D3DVERTEX( D3DVECTOR( x-w/2, y, z-h/2 )-length,D3DVECTOR(0,1,0), 0, 0 ); v[5] = D3DVERTEX( D3DVECTOR( x-w/2, y, z+h/2 )-length,D3DVECTOR(0,1,0), 0, 0 ); v[6] = D3DVERTEX( D3DVECTOR( x+w/2, y, z-h/2 )-length,D3DVECTOR(0,1,0), 0, 0 ); v[7] = D3DVERTEX( D3DVECTOR( x+w/2, y, z+h/2 )-length,D3DVECTOR(0,1,0), 0, 0 ); RenderShadow(lpDevice,v,8,wIndices,sizeof(wIndices)/sizeof(wIndices[0])); }
// Runden Schatten malen void RenderRoundShadow(LPDIRECT3DDEVICE7 lpDevice,float x,float y,float z,float r) { #define EDGES 12 static D3DVERTEX v[(EDGES+1)*2]; D3DLIGHT7 light; lpDevice->GetLight(0,&light); D3DVECTOR length=Normalize(light.dvDirection)*(-100.0f); for (int i=0;i<=EDGES;i++) { v[i]=v[i+EDGES+1]=D3DVERTEX(D3DVECTOR(x+sinf(float(i)/float(EDGES)*g_PI*2.0f)*r,y,z+cosf(float(i)/float(EDGES)*g_PI*2.0f)*r),D3DVECTOR(0,1,0),0,0); v[i+EDGES+1].x-=length.x; v[i+EDGES+1].y-=length.y; v[i+EDGES+1].z-=length.z; } static WORD wIndices[(EDGES-2)*3+EDGES*6]; const PWORD Cap=&wIndices[0]; const PWORD Side=&wIndices[(EDGES-2)*3]; for (i=0;i<EDGES-2;i++) { Cap[i*3]=0; Cap[i*3+1]=i+1; Cap[i*3+2]=i+2; } for (i=0;i<EDGES;i++) { Side[i*6+0]=i; Side[i*6+1]=i+EDGES+2; Side[i*6+2]=i+1; Side[i*6+3]=i; Side[i*6+4]=i+EDGES+1; Side[i*6+5]=i+EDGES+2; } RenderShadow(lpDevice,v,EDGES*2+2,wIndices,sizeof(wIndices)/sizeof(wIndices[0])); // RenderShadow(lpDevice,v,8,wIndices,(EDGES-2)*3); }