📄 ca_water.cpp
字号:
ymin[ind] = 0.0f;
ymax[ind] = 1.0f;
ind++;
/*
const int numobjects = 6;
int ind = 0;
float xmin[numobjects];
float xmax[numobjects];
float ymin[numobjects];
float ymax[numobjects];
DWORD color = 0x00000000; // ARGB
xmin[ind] = 0.485f;
xmax[ind] = 0.50f;
ymin[ind] = 0.15f;
ymax[ind] = 0.40f;
ind++; assert( ind < numobjects );
xmin[ind] = 0.485f;
xmax[ind] = 0.50f;
ymin[ind] = 0.45f;
ymax[ind] = 0.55f;
ind++; assert( ind < numobjects );
xmin[ind] = 0.485f;
xmax[ind] = 0.50f;
ymin[ind] = 0.60f;
ymax[ind] = 0.75f;
ind++; assert( ind < numobjects );
xmin[ind] = 0.051f; // big square in corner
xmax[ind] = 0.401f;
ymin[ind] = 0.051f;
ymax[ind] = 0.301f;
ind++; assert( ind < numobjects );
xmin[ind] = 0.80f; // 2 parallel walls
xmax[ind] = 0.83f;
ymin[ind] = 0.70f;
ymax[ind] = 0.95f;
ind++; assert( ind < numobjects );
xmin[ind] = 0.92f;
xmax[ind] = 0.95f;
ymin[ind] = 0.70f;
ymax[ind] = 0.95f;
ind++;
*/
float x_center[ numobjects ];
float y_center[ numobjects ];
float x_size[ numobjects ];
float y_size[ numobjects ];
for( i=0; i < numobjects; i++ )
{
x_center[i] = (xmin[i] + xmax[i])/2.0f;
y_center[i] = (ymin[i] + ymax[i])/2.0f;
x_size[i] = (xmax[i] - xmin[i]);
y_size[i] = (ymax[i] - ymin[i]);
}
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
// Draw into the velocity texture:
if( bInlineDroplet )
{
// Rendering is happening in middle of physics calc.
// Render to appropriate velocity texture
// hr = m_pD3DDev->SetRenderTarget( mpFilterTarget[m_nTex_VelTarg], NULL);
// ASSERT_IF_FAILED(hr);
}
else
{
// rendering happening outside physics calc
// Render to appropriate velocity texture for next frame
m_pD3DDev->GetRenderTarget( &pBack_Color );
m_pD3DDev->GetDepthStencilSurface( &pBack_Depth );
SetInitialRenderStates();
hr = m_pD3DDev->SetStreamSource(0, m_pVertexBuffer, sizeof(QuadVertex));
ASSERT_IF_FAILED(hr);
hr = m_pD3DDev->SetRenderTarget( mpFilterTarget[m_nTex_VelTarg], NULL);
ASSERT_IF_FAILED(hr);
}
hr = m_pD3DDev->SetVertexShader( m_dwVertexShader );
ASSERT_IF_FAILED(hr);
/*
///////////////////////////////////////
// Set render mode - additive
hr = m_pD3DDev->SetPixelShader( 0 );
ASSERT_IF_FAILED(hr);
m_pD3DDev->SetTexture(0, m_pDropletTexture->GetTexture() );
// Additive blend
m_pD3DDev->SetRenderState( D3DRS_ALPHABLENDENABLE, false );
m_pD3DDev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE );
m_pD3DDev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ZERO );
m_pD3DDev->SetRenderState( D3DRS_TEXTUREFACTOR, color ); // ARGB
m_pD3DDev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
m_pD3DDev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TFACTOR );
m_pD3DDev->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TFACTOR ); // blue only
m_pD3DDev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
m_pD3DDev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
*/
///////////////////////////////////////
// Set render mode to use source texture
// Alpha determines fixed vs. free areas
hr = m_pD3DDev->SetPixelShader( 0 );
ASSERT_IF_FAILED(hr);
m_pD3DDev->SetTexture(0, m_pInitialStateTexture->GetTexture() );
// Additive blend
m_pD3DDev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
m_pD3DDev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
m_pD3DDev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
// m_pD3DDev->SetRenderState( D3DRS_TEXTUREFACTOR, color ); // ARGB
m_pD3DDev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
m_pD3DDev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_pD3DDev->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TFACTOR ); // blue only
m_pD3DDev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
m_pD3DDev->SetTextureStageState( 1, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
m_pD3DDev->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
m_pD3DDev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
float x,y;
for( i=0; i < numobjects; i++ )
{
// shift x,y into -1 to 1 range
x = (x_center[i] - 0.5f)*2.0f;
y = (y_center[i] - 0.5f)*2.0f;
// alter matrix to place the droplet
D3DXMATRIX matWorld;
D3DXMATRIX matView;
D3DXMATRIX matProj;
D3DXMATRIX matViewProj;
D3DXMATRIX matWorldViewProj;
D3DXVECTOR3 vEyePt = D3DXVECTOR3( 0.0f, 0.0f, -5.0f );
D3DXVECTOR3 vLookatPt = D3DXVECTOR3( x, y, 0.0f );
D3DXVECTOR3 vUp = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
// Set World, View, Projection, and combination matrices.
D3DXMatrixLookAtLH(&matView, &vEyePt, &vLookatPt, &vUp);
// 2.0f cause translation extends from -1 to 1
D3DXMatrixOrthoLH(&matProj, 2.0f, 2.0f, 0.2f, 20.0f); // x,y, zmin zmax
D3DXMatrixMultiply(&matViewProj, &matView, &matProj);
// draw a single quad to texture:
// the quad covers the whole "screen" exactly
// D3DXMatrixScaling(&matWorld, 1.0f/x_size[i], 1.0f/y_size[i], 1.0f);
D3DXMatrixScaling(&matWorld, x_size[i], y_size[i], 1.0f);
D3DXMatrixMultiply(&matWorldViewProj, &matWorld, &matViewProj);
D3DXMatrixTranspose(&matWorldViewProj, &matWorldViewProj);
m_pD3DDev->SetVertexShaderConstant(CV_WORLDVIEWPROJ_0, &matWorldViewProj(0, 0), 4);
// Draw the square object
hr = m_pD3DDev->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 2);
ASSERT_IF_FAILED(hr);
}
// reset world view proj matrix
m_pD3DDev->SetVertexShaderConstant(CV_WORLDVIEWPROJ_0, &m_mWorldViewProj(0, 0), 4);
// Reset to original render target & depth
if( !bInlineDroplet )
{
hr = m_pD3DDev->SetRenderTarget( pBack_Color, pBack_Depth );
ASSERT_IF_FAILED(hr);
}
}
void CA_Water::DrawDroplet( float x, float y, bool bInlineDroplet )
{
//////////////////////////////////////////////////
// input x,y in range 0.0 to 1.0 to cover whole target
HRESULT hr;
assert( m_pD3DDev != NULL );
IDirect3DSurface8 *pBack_Color;
IDirect3DSurface8 *pBack_Depth;
/////////////////////////////
float scale = 10.0f;
scale += 25.0f * ((float)rand()/((float)RAND_MAX));
// shift x,y into -1 to 1 range
x = (x - 0.5f)*2.0f;
y = (y - 0.5f)*2.0f;
// FDebug("Rendering droplet at %f %f\n", x,y );
// Draw into the velocity texture:
if( bInlineDroplet )
{
// Rendering is happening in middle of physics calc.
// Render to appropriate velocity texture
hr = m_pD3DDev->SetRenderTarget( mpFilterTarget[m_nTex_VelTarg], NULL);
ASSERT_IF_FAILED(hr);
}
else
{
// rendering happening outside physics calc
// Render to appropriate velocity texture for next frame
scale = 14.0f;
m_pD3DDev->GetRenderTarget( &pBack_Color );
m_pD3DDev->GetDepthStencilSurface( &pBack_Depth );
SetInitialRenderStates();
hr = m_pD3DDev->SetStreamSource(0, m_pVertexBuffer, sizeof(QuadVertex));
ASSERT_IF_FAILED(hr);
hr = m_pD3DDev->SetRenderTarget( mpFilterTarget[m_nTex_VelTarg], NULL);
ASSERT_IF_FAILED(hr);
}
// alter matrix to place the droplet
D3DXMATRIX matWorld;
D3DXMATRIX matView;
D3DXMATRIX matProj;
D3DXMATRIX matViewProj;
D3DXMATRIX matWorldViewProj;
D3DXVECTOR3 vEyePt = D3DXVECTOR3( 0.0f, 0.0f, -5.0f );
D3DXVECTOR3 vLookatPt = D3DXVECTOR3( x, y, 0.0f );
D3DXVECTOR3 vUp = D3DXVECTOR3( 0.0f, 1.0f, 0.0f );
// Set World, View, Projection, and combination matrices.
D3DXMatrixLookAtLH(&matView, &vEyePt, &vLookatPt, &vUp);
// 2.0f cause translation extends from -1 to 1
D3DXMatrixOrthoLH(&matProj, 2.0f, 2.0f, 0.2f, 20.0f); // x,y, zmin zmax
D3DXMatrixMultiply(&matViewProj, &matView, &matProj);
// draw a single quad to texture:
// the quad covers the whole "screen" exactly
D3DXMatrixScaling(&matWorld, 1.0f/scale, 1.0f/scale, 1.0f);
D3DXMatrixMultiply(&matWorldViewProj, &matWorld, &matViewProj);
D3DXMatrixTranspose(&matWorldViewProj, &matWorldViewProj);
m_pD3DDev->SetVertexShaderConstant(CV_WORLDVIEWPROJ_0, &matWorldViewProj(0, 0), 4);
///////////////////////////////////////
// Set render mode - additive
hr = m_pD3DDev->SetPixelShader( 0 );
ASSERT_IF_FAILED(hr);
hr = m_pD3DDev->SetVertexShader( m_dwVertexShader );
ASSERT_IF_FAILED(hr);
m_pD3DDev->SetTexture(0, m_pDropletTexture->GetTexture() );
// Additive blend
m_pD3DDev->SetRenderState( D3DRS_ALPHABLENDENABLE, true );
m_pD3DDev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE );
m_pD3DDev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE );
m_pD3DDev->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
m_pD3DDev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_pD3DDev->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TFACTOR ); // blue only
m_pD3DDev->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
m_pD3DDev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
// Draw the droplet
hr = m_pD3DDev->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 2);
ASSERT_IF_FAILED(hr);
// reset world view proj matrix
m_pD3DDev->SetVertexShaderConstant(CV_WORLDVIEWPROJ_0, &m_mWorldViewProj(0, 0), 4);
// Reset to original render target & depth
if( !bInlineDroplet )
{
hr = m_pD3DDev->SetRenderTarget( pBack_Color, pBack_Depth );
ASSERT_IF_FAILED(hr);
}
}
void CA_Water::Do_CreateNormalMapSteps()
{
HRESULT hr = S_OK;
D3DXVECTOR4 offset( 0.0f, 0.0f, 0.0f, 0.0f);
hr = m_pD3DDev->SetTexture( 0, mpTextureFiltered[m_nTex_HeightTarg] );
hr = m_pD3DDev->SetTexture( 1, mpTextureFiltered[m_nTex_HeightTarg] );
hr = m_pD3DDev->SetTexture( 2, mpTextureFiltered[m_nTex_HeightTarg] );
hr = m_pD3DDev->SetTexture( 3, mpTextureFiltered[m_nTex_HeightTarg] );
ASSERT_IF_FAILED(hr);
m_pD3DDev->SetRenderTarget( mpFilterTarget[ m_nTex_NrmlTarg ], NULL );
ASSERT_IF_FAILED( hr );
if( m_bUseNormalMapMethod2 )
{
// Set constants for red & green scale factors (also essential color masks)
// Red mask first
float pix_masks[4] = { m_fNrmlSTScale, 0.0f, 0.0f, 0.0f };
hr = m_pD3DDev->SetPixelShaderConstant( PCN_RED_MASK, &pix_masks, 1 );
ASSERT_IF_FAILED(hr);
// Now green mask & scale:
pix_masks[0] = 0.0f;
pix_masks[1] = m_fNrmlSTScale;
hr = m_pD3DDev->SetPixelShaderConstant( PCN_GREEN_MASK, &pix_masks, 1 );
ASSERT_IF_FAILED(hr);
hr = SetPixelShader( m_dwPSH_NormalMapCreate2_Scale );
ASSERT_IF_FAILED(hr);
}
else
{
hr = SetPixelShader( m_dwPSH_NormalMapCreate );
ASSERT_IF_FAILED( hr );
}
// use nearest neighbor offsets
offset.x = 4.0f;
m_pD3DDev->SetVertexShaderConstant(CV_UV_OFFSET_TO_USE, &offset, 1);
hr = m_pD3DDev->DrawPrimitive(D3DPT_TRIANGLEFAN, 0, 2);
ASSERT_IF_FAILED(hr);
}
HRESULT CA_Water::DoSingleTimeStep_3Pass()
{
HRESULT hr;
int i;
// variable for writing to constant memory which uv-offsets to use
D3DXVECTOR4 offset(0.0f, 1.0f, 0.0f, 0.0f);
m_pD3DDev->SetVertexShaderConstant( CV_ONOFF_1, &offset, 1);
// Set force restoring values to equilibrium (0.5 = gray)
float eq_rest[4] = { m_fEqRestore_factor,m_fEqRestore_factor,m_fEqRestore_factor, 1.0f };
hr = m_pD3DDev->SetPixelShaderConstant( PCN_EQ_REST_FAC, &eq_rest, 1);
ASSERT_IF_FAILED(hr);
//////////////////////////////////////////////////////////
// Set constant for offseting values to 0.5 for gray = 0
m_fhalfoff = 0.503916f;
if( m_nThreshCnt > m_nLowThresh )
{
m_fhalfoff = 0.503966f;
}
m_nThreshCnt ++;
if( m_nThreshCnt > m_nLowThresh + m_nThresh )
{
m_nThreshCnt = 0;
}
float pix_offset[4] = { m_fhalfoff,m_fhalfoff,m_fhalfoff, 1.0f };
hr = m_pD3DDev->SetPixelShaderConstant( PCN_ADDHALF, &pix_offset[0] , 1);
ASSERT_IF_FAILED(hr);
// no need to clear temporary target
// even if wireframe mode, render to texture as solid
m_pD3DDev->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID );
DWORD wrapval = m_bWrap ? D3DTADDRESS_WRAP : D3DTADDRESS_CLAMP;
m_pD3DDev->SetTextureStageState(0, D3DTSS_ADDRESSU, wrapval);
m_pD3DDev->SetTextureStageState(0, D3DTSS_ADDRESSV, wrapval);
m_pD3DDev->SetTextureStageState(1, D3DTSS_ADDRESSU, wrapval);
m_pD3DDev->SetTextureStageState(1, D3DTSS_ADDRESSV, wrapval);
m_pD3DDev->SetTextureStageState(2, D3DTSS_ADDRESSU, wrapval);
m_pD3DDev->SetTextureStageState(2, D3DTSS_ADDRESSV, wrapval);
m_pD3DDev->SetTextureStageState(3, D3DTSS_ADDRESSU, wrapval);
m_pD3DDev->SetTextureStageState(3, D3DTSS_ADDRESSV, wrapval);
for(i = 0; i < 4; i++ )
{
m_pD3DDev->SetTextureStageState(i, D3DTSS_MAGFILTER, D3DTEXF_LINEAR );
m_pD3DDev->SetTextureStageState(i, D3DTSS_MINFILTER, D3DTEXF_LINEAR );
}
/////////////////////////////////////////////////////////
// First, write the source texture into the blue channel
// I do this in preparation for a 2D dependent green-blue lookup
// into a "rules" texture which governs how old pixels spawn
// or die into new pixels.
// The logic for the game of life depends on 9 pixels: the source
// pixel and it's 8 neightbors. These are accumulated in three
// passes.
hr = m_pD3DDev->SetRenderTarget( m_pIntermediateTarg, NULL);
ASSERT_IF_FAILED( hr );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -