📄 shader_membrane.cpp
字号:
}
}
}
void CShaderMembrane::LoadTexture( LPDIRECT3DTEXTURE8 * ppTex, const EBString & filename )
{
HRESULT hr;
if( *ppTex != NULL )
{
SAFE_RELEASE( *ppTex );
}
//load texture
hr = D3DXCreateTextureFromFile(m_pD3DDev, GetFilePath(filename.c_str()).c_str(), ppTex );
if( !FAILED(hr))
{
m_pD3DDev->SetTexture(0, *ppTex);
m_pD3DDev->SetTexture(1, *ppTex);
}
}
// ------------------------------------------------------------------------------
// CShaderMembrane::Free
//
// Description: Called when we switch away from this demo. Free up all the
// memory that is in use.
// ------------------------------------------------------------------------------
HRESULT CShaderMembrane::Free()
{
SAFE_RELEASE(m_pVertexBuffer);
SAFE_RELEASE(m_pIndexBuffer);
SAFE_RELEASE(m_pShadeTexture);
SAFE_RELEASE(m_pEdgeTexture);
SAFE_DELETE_ARRAY(m_pAttributes);
if (m_pD3DDev)
{
m_pD3DDev->DeleteVertexShader(m_dwCurrentShader);
SAFE_RELEASE(m_pD3DDev);
}
delete m_pUI, m_pUI = 0;
return S_OK;
}
HRESULT CShaderMembrane::LoadXFile(const char* fileName, const DWORD dwFVF)
{
ID3DXMesh *tempMesh, *tempMeshFVF, *tempMeshOpt;
HRESULT hr = D3DXLoadMeshFromX(const_cast<char*>(fileName), D3DXMESH_SYSTEMMEM , m_pD3DDev, NULL,
NULL, &m_dwNumSections, &tempMesh);
tempMesh->Optimize(D3DXMESHOPT_ATTRSORT, NULL, NULL, NULL, NULL, &tempMeshOpt);
DWORD attribSize = m_dwNumSections;
hr = tempMeshOpt->GetAttributeTable(NULL, &attribSize);
SAFE_DELETE_ARRAY( m_pAttributes );
m_pAttributes = new D3DXATTRIBUTERANGE[attribSize];
hr = tempMeshOpt->GetAttributeTable(m_pAttributes, &attribSize);
SAFE_RELEASE( m_pVertexBuffer );
SAFE_RELEASE( m_pIndexBuffer );
//convert to our format
hr = tempMeshOpt->CloneMeshFVF(D3DXMESH_WRITEONLY, dwFVF, m_pD3DDev, &tempMeshFVF);
tempMeshFVF->GetVertexBuffer(&m_pVertexBuffer);
tempMeshFVF->GetIndexBuffer(&m_pIndexBuffer);
SAFE_RELEASE(tempMesh);
SAFE_RELEASE(tempMeshFVF);
SAFE_RELEASE(tempMeshOpt);
//set index buffer
m_pD3DDev->SetIndices( m_pIndexBuffer, 0);
hr = m_pD3DDev->SetStreamSource(0, m_pVertexBuffer, sizeof( MembraneVertex ) );
if (FAILED(hr))
return hr;
return S_OK;
}
// ------------------------------------------------------------------------------
// CShaderMembrane::Start
//
// Description: Called to reset
// ------------------------------------------------------------------------------
HRESULT CShaderMembrane::Start()
{
return S_OK;
}
HRESULT CShaderMembrane::SetTextureStageStates()
{
m_pD3DDev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
m_pD3DDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
m_pD3DDev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
m_pD3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
// Cycle between textures to show variety of effects
static DWORD time = timeGetTime();
static int count = 0;
int limit = 3000;
if( m_bCycleTexture )
{
if( timeGetTime() - time > limit )
{
time = timeGetTime();
switch( count )
{
case 0:
LoadTexture( &m_pShadeTexture, "Inv_colors.tga" );
SetTCCycle( false );
count++;
break;
case 1:
LoadTexture( &m_pShadeTexture, "BlueBands.tga" );
SetTCCycle( true );
count++;
break;
case 2:
LoadTexture( &m_pShadeTexture, "Toonish_01.tga" );
SetTCCycle( false );
count++;
break;
case 3:
LoadTexture( &m_pShadeTexture, "YellowRed.tga" );
SetTCCycle( false );
count++;
break;
case 4:
LoadTexture( &m_pShadeTexture, "PurpleGreenBright.tga" );
SetTCCycle( false );
count = 0;
break;
default:
LoadTexture( &m_pShadeTexture, "PurpleGreenBright.tga" );
SetTCCycle( false );
count = 0;
break;
}
}
}
if( m_bAppCycleTexCoords != m_bCycleTexCoords )
{
SetTCCycle( m_bCycleTexCoords );
}
if( m_bCycleTexCoords )
{
m_pD3DDev->SetVertexShaderConstant(20, m_tc, 1);
#define TCINC 0.005f
float inc = TCINC;
m_tc[0] += inc;
if( m_tc[0] > 1.0f )
inc = -TCINC;
else if( m_tc[0] < 0.0f )
inc = TCINC;
}
return S_OK;
}
void CShaderMembrane::SetTCCycle( bool on )
{
if( on != m_bCycleTexCoords ||
m_bAppCycleTexCoords != m_bCycleTexCoords )
{
m_bCycleTexCoords = on;
m_bAppCycleTexCoords = on;
m_tc[0] = 0.0f;
m_pD3DDev->SetVertexShaderConstant(20, m_tc, 1);
}
}
// ------------------------------------------------------------------------------
// CShaderMembrane::Tick
//
// Description: This function is called every frame. Here is where we write
// and update constants, clear the z- and back-buffer and render our
// primitives
// ------------------------------------------------------------------------------
HRESULT CShaderMembrane::Tick(EBTimer* pTimer)
{
HRESULT hr = S_OK;
SetVertexShaderMatrices();
SetTextureStageStates();
if( m_bWireframe )
{
m_pD3DDev->SetRenderState( D3DRS_FILLMODE, D3DFILL_WIREFRAME );
}
else
{
m_pD3DDev->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );
}
m_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0L);
for(int i = 0; i < m_dwNumSections; i++)
{
m_pD3DDev->DrawIndexedPrimitive( D3DPT_TRIANGLELIST,
m_pAttributes[i].VertexStart,
m_pAttributes[i].VertexCount,
m_pAttributes[i].FaceStart*3,
m_pAttributes[i].FaceCount );
}
return hr;
}
void CShaderMembrane::MouseButton(HWND hWnd, eButtonID button, bool bDown, int x, int y)
{
if(button == MOUSE_LEFTBUTTON)
{
if(bDown)
{
m_pUI->OnLButtonDown(x, y);
}
else
{
m_pUI->OnLButtonUp(x, y);
}
}
return;
}
void CShaderMembrane::MouseMove(HWND hWnd, int x, int y)
{
m_pUI->OnMouseMove(x, y);
return;
}
void CShaderMembrane::Keyboard(DWORD dwKey, UINT nFlags, bool bDown)
{
if ( bDown )
{
switch ( dwKey )
{
case 'H' :
case VK_F1 :
{
::MessageBoxEx( NULL, " Help : F1 - Help \n\n Home - Reset To Defaults \n\n W - Wireframe Toggle \n\n Space\\Pause - Toggle Pause/Resume \n\n Left Button & Mouse - Rotate Object\n\n Shift Left Button & Mouse - Pan Camera \n\n Ctrl Left Button & Mouse - Move Camera In & Out\n\n",
"Help", MB_ICONINFORMATION | MB_TASKMODAL, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ) );
break;
}
case 'W' :
{
m_bWireframe = !m_bWireframe;
m_dwEffectDirtyFlags |= EBEFFECT_DIRTY_PUBLICSTATE;
break;
}
case 'R' :
{
m_bWireframe = false;
m_dwEffectDirtyFlags |= EBEFFECT_DIRTY_PUBLICSTATE;
break;
}
case VK_HOME :
case VK_END :
case VK_NUMPAD7 :
case VK_NUMPAD1 :
case '7' :
case '1' :
{
m_pUI->Reset();
m_bWireframe = false;
m_dwEffectDirtyFlags |= EBEFFECT_DIRTY_PUBLICSTATE;
SetDefaultView();
break;
}
case VK_LEFT :
case VK_NUMPAD4 :
case '4' :
{
m_pUI->Translate( -1.0f, 0.0f, 0.0f );
break;
}
case VK_RIGHT :
case VK_NUMPAD6 :
case '6' :
{
m_pUI->Translate( 1.0f, 0.0f, 0.0f );
break;
}
case VK_UP :
case VK_NUMPAD8 :
case '8' :
{
m_pUI->Translate( 0.0f, 0.0f, -1.0f );
break;
}
case VK_DOWN :
case VK_NUMPAD2 :
case '2' :
{
m_pUI->Translate( 0.0f, 0.0f, 1.0f );
break;
}
case VK_PRIOR :
case VK_NUMPAD9 :
case '9' :
{
m_pUI->Translate( 0.0f, 1.0f, 0.0f );
break;
}
case VK_NEXT :
case VK_NUMPAD3 :
case '3' :
{
m_pUI->Translate( 0.0f, -1.0f, 0.0f );
break;
}
case VK_ADD :
{
m_pUI->Translate( 0.0f, 0.0f, 1.0f );
break;
}
case VK_SUBTRACT :
{
m_pUI->Translate( 0.0f, 0.0f, -1.0f );
break;
}
default :
{
break;
}
};
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -