static void WaterSimulation(void) { LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); device->SetRenderTarget(0, g_pSurfaces[TEX_HEIGHT2]); device->SetDepthStencilSurface(NULL); D3DXHANDLE shader = g_pWaterEffect->GetTechniqueByName("WaterSimulation"); D3DXHANDLE heightmap_current_var = g_pWaterEffect->GetParameterByName(NULL, "heightmap_current"); D3DXHANDLE heightmap_prev_var = g_pWaterEffect->GetParameterByName(NULL, "heightmap_prev"); D3DXHANDLE texturesize_var = g_pWaterEffect->GetParameterByName(NULL, "texture_size"); D3DXHANDLE damping_var = g_pWaterEffect->GetParameterByName(NULL, "fDamping"); Vector4 texturesize; texturesize[0] = 1.0f/(float)g_ImageInfo.m_iWidth; texturesize[1] = 1.0f/(float)g_ImageInfo.m_iHeight; texturesize[2] = (float)g_ImageInfo.m_iWidth; texturesize[3] = (float)g_ImageInfo.m_iHeight; g_pWaterEffect->SetTechnique(shader); g_pWaterEffect->SetTexture(heightmap_prev_var, g_pTextures[TEX_HEIGHT0]); g_pWaterEffect->SetTexture(heightmap_current_var, g_pTextures[TEX_HEIGHT1]); g_pWaterEffect->SetFloat(damping_var, 0.99f); g_pWaterEffect->SetVector(texturesize_var, (D3DXVECTOR4*)&texturesize); g_pWaterEffect->Begin(NULL,0); g_pWaterEffect->BeginPass(0); GutDrawFullScreenQuad_DX9(&g_ImageInfo); g_pWaterEffect->EndPass(); g_pWaterEffect->End(); }
static void RenderWater(void) { LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); D3DXHANDLE shader = g_pWaterEffect->GetTechniqueByName("Water"); D3DXHANDLE normalmap_var = g_pWaterEffect->GetParameterByName(NULL, "NormalmapTex"); D3DXHANDLE watermap_var = g_pWaterEffect->GetParameterByName(NULL, "WaterTex"); D3DXHANDLE texcoordscale_var = g_pWaterEffect->GetParameterByName(NULL, "fTexcoordScale"); g_pWaterEffect->SetTechnique(shader); g_pWaterEffect->SetTexture(normalmap_var, g_pTextures[TEX_NORMAL]); g_pWaterEffect->SetTexture(watermap_var, g_pWaterTexture); g_pWaterEffect->SetFloat(texcoordscale_var, 0.2f); g_pWaterEffect->Begin(NULL,0); g_pWaterEffect->BeginPass(0); GutDrawFullScreenQuad_DX9(&g_ImageInfo); g_pWaterEffect->EndPass(); g_pWaterEffect->End(); }
static void HeightmapToNormal(void) { LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); device->SetRenderTarget(0, g_pSurfaces[TEX_NORMAL]); device->SetDepthStencilSurface(NULL); D3DXHANDLE shader = g_pWaterEffect->GetTechniqueByName("ConvertNormal"); D3DXHANDLE heightmap_current_var = g_pWaterEffect->GetParameterByName(NULL, "heightmap_current"); D3DXHANDLE normalscale_var = g_pWaterEffect->GetParameterByName(NULL, "fNormalScale"); g_pWaterEffect->SetTechnique(shader); g_pWaterEffect->SetTexture(heightmap_current_var, g_pTextures[TEX_HEIGHT2]); g_pWaterEffect->SetFloat(normalscale_var, 1.0f); g_pWaterEffect->Begin(NULL,0); g_pWaterEffect->BeginPass(0); GutDrawFullScreenQuad_DX9(&g_ImageInfo); g_pWaterEffect->EndPass(); g_pWaterEffect->End(); }
static void ParticleSimulation(void) { LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9(); device->SetRenderTarget(0, g_pSurfaces[TEX_POSITION1]); device->SetRenderTarget(1, g_pSurfaces[TEX_VELOCITY1]); device->SetDepthStencilSurface(NULL); RECT rect; rect.left = 0; rect.right = g_texture_width; rect.top = 0; rect.bottom = g_num_particles / g_texture_width; if ( rect.bottom==0 ) return; device->SetScissorRect(&rect); device->SetRenderState(D3DRS_SCISSORTESTENABLE, TRUE); D3DXHANDLE shader = g_pParticleFX->GetTechniqueByName("Simulate"); D3DXHANDLE positiontex_var = g_pParticleFX->GetParameterByName(NULL, "PositionTex"); D3DXHANDLE velocitytex_var = g_pParticleFX->GetParameterByName(NULL, "VelocityTex"); D3DXHANDLE noisetex_var = g_pParticleFX->GetParameterByName(NULL, "NoiseTex"); D3DXHANDLE force_var = g_pParticleFX->GetParameterByName(NULL, "Force"); D3DXHANDLE time_var = g_pParticleFX->GetParameterByName(NULL, "fTimeAdvance"); D3DXHANDLE rand_var = g_pParticleFX->GetParameterByName(NULL, "Rand"); D3DXHANDLE tan_var = g_pParticleFX->GetParameterByName(NULL, "fTan"); D3DXHANDLE liferange_var = g_pParticleFX->GetParameterByName(NULL, "LifeRange"); D3DXHANDLE speedrange_var = g_pParticleFX->GetParameterByName(NULL, "SpeedRange"); D3DXHANDLE sizerange_var = g_pParticleFX->GetParameterByName(NULL, "SizeRange"); Vector4 vForce = g_vForce * g_fTimeAdvance; Vector4 vRand[3]; Vector4 vLifeRange(1.0f, 2.0f, 0.0f, 0.0f); Vector4 vSpeedRange(1.0f, 2.0f, 0.0f, 0.0f); Vector4 vSizeRange(0.01f, 0.02f, 0.0f, 0.0f); for ( int i=0; i<3; i++ ) { vRand[i][0] = float(rand()%1024)/1024.0f; vRand[i][1] = float(rand()%1024)/1024.0f; vRand[i][2] = float(rand()%1024)/1024.0f; vRand[i][3] = float(rand()%1024)/1024.0f; } g_pParticleFX->SetTechnique(shader); g_pParticleFX->SetTexture(positiontex_var, g_pTextures[TEX_POSITION0]); g_pParticleFX->SetTexture(velocitytex_var, g_pTextures[TEX_VELOCITY0]); g_pParticleFX->SetTexture(noisetex_var, g_pNoiseTexture); g_pParticleFX->SetVector(force_var, (D3DXVECTOR4*)&vForce); g_pParticleFX->SetVectorArray(rand_var, (D3DXVECTOR4*)&vRand, 3); g_pParticleFX->SetVector(liferange_var, (D3DXVECTOR4*)&vLifeRange); g_pParticleFX->SetVector(speedrange_var, (D3DXVECTOR4*)&vSpeedRange); g_pParticleFX->SetVector(sizerange_var, (D3DXVECTOR4*)&vSizeRange); g_pParticleFX->SetFloat(time_var, g_fTimeAdvance); g_pParticleFX->SetFloat(tan_var, FastMath::Tan(FastMath::DegToRad(g_fEmitTheta))); g_pParticleFX->Begin(NULL,0); g_pParticleFX->BeginPass(0); GutDrawFullScreenQuad_DX9(&g_ImageInfo); g_pParticleFX->EndPass(); g_pParticleFX->End(); device->SetRenderTarget(1, NULL); device->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE); }