1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
// Bumpmap texture erstellen
HRESULT hResult;
if(FAILED(hResult = g_pD3DD->CreateTexture(dwWidth,dwHeight,1,0,fmtBumpMap,D3DPOOL_SYSTEMMEM,&m_pBumpMap))) {
// Fehler
DirectXError(__FILE__,__LINE__,hResult,"Fehler beim erstellen der Wasser Bumpmap");
return NULL;
}
// Rechteck sperren und ein paar Bumps für Wellen hineinzeichnen
D3DLOCKED_RECT d3dlr;
if(FAILED(hResult = m_pBumpMap->LockRect(0,&d3dlr,0,0))) {
// Fehler beim sperre der Textur
DirectXError(__FILE__,__LINE__,hResult,"BumpMap:");
return NULL;
}
m_pBumpMap->LockRect( 0, &d3dlr, 0, 0 );
CHAR* pDst = (CHAR*)d3dlr.pBits;
CHAR iDu, iDv;
for( DWORD y=0; y<dwHeight; y++ )
{
CHAR* pPixel = pDst;
for( DWORD x=0; x<dwWidth; x++ )
{
FLOAT fx = x/(FLOAT)dwWidth - 0.5f;
FLOAT fy = y/(FLOAT)dwHeight - 0.5f;
FLOAT r = sqrtf( fx*fx + fy*fy );
iDu = (CHAR)( 64 * cosf( 300.0f * r ) * expf( -r * 5.0f ) );
iDu += (CHAR)( 32 * cosf( 150.0f * ( fx + fy ) ) );
iDu += (CHAR)( 16 * cosf( 140.0f * ( fx * 0.85f - fy ) ) );
iDv = (CHAR)( 64 * sinf( 300.0f * r ) * expf( -r * 5.0f ) );
iDv += (CHAR)( 32 * sinf( 150.0f * ( fx + fy ) ) );
iDv += (CHAR)( 16 * sinf( 140.0f * ( fx * 0.85f - fy ) ) );
*pPixel++ = iDu;
*pPixel++ = iDv;
}
pDst += d3dlr.Pitch;
}
|