#include "StdAfx.h" #include "GrpVertexShader.h" #include "GrpD3DXBuffer.h" #include "StateManager.h" #include CVertexShader::CVertexShader() { Initialize(); } CVertexShader::~CVertexShader() { Destroy(); } void CVertexShader::Initialize() { m_handle=0; } void CVertexShader::Destroy() { if (m_handle) { m_handle->Release(); m_handle = nullptr; } } bool CVertexShader::CreateFromDiskFile(const char* c_szFileName, const DWORD* c_pdwVertexDecl) { Destroy(); if (!c_szFileName || !*c_szFileName) return false; // UTF-8 → UTF-16 for D3DX std::wstring wFileName = Utf8ToWide(c_szFileName); LPD3DXBUFFER lpd3dxShaderBuffer = nullptr; LPD3DXBUFFER lpd3dxErrorBuffer = nullptr; HRESULT hr = D3DXAssembleShaderFromFileW( wFileName.c_str(), nullptr, nullptr, 0, &lpd3dxShaderBuffer, &lpd3dxErrorBuffer ); if (FAILED(hr)) { if (lpd3dxErrorBuffer) { const char* err = (const char*)lpd3dxErrorBuffer->GetBufferPointer(); TraceError("Vertex shader compile error: %s", err); } return false; } if (FAILED( ms_lpd3dDevice->CreateVertexShader( (const DWORD*)lpd3dxShaderBuffer->GetBufferPointer(), &m_handle ))) return false; return true; } void CVertexShader::Set() { STATEMANAGER.SetVertexShader(m_handle); }