⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 shader_membrane.cpp

📁 游戏编程精华02-含有几十个游戏编程例子
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		}
	}
}


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 + -