Advertisement
Guest User

Untitled

a guest
May 25th, 2015
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.53 KB | None | 0 0
  1. //------------------------------------------------------------------------------------------------------
  2. // _____ _______ ____ _ ___ ____ ____ _____ _ _ ____ ___ _ _ _____ ______ ___ _
  3. // / _ \ \ / / ____| _ \| | / _ \| _ \| _ \ | ____| \ | |/ ___|_ _| \ | | ____| | _ \ \/ / / |
  4. // | | | \ \ / /| _| | |_) | | | | | | |_) | | | | | _| | \| | | _ | || \| | _| | | | \ /| | |
  5. // | |_| |\ V / | |___| _ <| |__| |_| | _ <| |_| | | |___| |\ | |_| || || |\ | |___ | |_| / \| | |
  6. // \___/ \_/ |_____|_| \_\_____\___/|_| \_\____/ |_____|_| \_|\____|___|_| \_|_____| |____/_/\_\_|_|
  7. //
  8. // Overlord Engine v1.113
  9. // Copyright Overlord Thomas Goussaert & Overlord Brecht Kets
  10. // http://www.digitalartsandentertainment.com/
  11. //------------------------------------------------------------------------------------------------------
  12. //Precompiled Header [ALWAYS ON TOP IN CPP]
  13. #include "stdafx.h"
  14. #include "PostProcessingMaterial.h"
  15. #include "RenderTarget.h"
  16. #include "../Base/OverlordGame.h"
  17. #include "../Content/ContentManager.h"
  18. #include "../Helpers/VertexHelper.h"
  19.  
  20. PostProcessingMaterial::PostProcessingMaterial(wstring effectFile, unsigned int renderIndex, const wstring& technique)
  21. : m_IsInitialized(false),
  22. m_pEffect(nullptr),
  23. m_effectFile(effectFile),
  24. m_pInputLayoutSize(0),
  25. m_InputLayoutID(0),
  26. m_RenderIndex(renderIndex),
  27. m_pRenderTarget(nullptr),
  28. m_pVertexBuffer(nullptr),
  29. m_pIndexBuffer(nullptr),
  30. m_NumVertices(4),
  31. m_NumIndices(6),
  32. m_VertexBufferStride(0),
  33. m_pTechnique(nullptr),
  34. m_TechniqueName(technique)
  35. {
  36. }
  37.  
  38.  
  39. PostProcessingMaterial::~PostProcessingMaterial()
  40. {
  41. SafeRelease(m_pInputLayout);
  42. m_pInputLayoutDescriptions.clear();
  43. SafeDelete(m_pRenderTarget);
  44. SafeRelease(m_pVertexBuffer);
  45. SafeRelease(m_pIndexBuffer);
  46. }
  47.  
  48. void PostProcessingMaterial::Initialize(const GameContext& gameContext)
  49. {
  50. if(!m_IsInitialized)
  51. {
  52. m_VertexBufferStride = sizeof(VertexPosTex);
  53.  
  54. // Load Effect
  55. LoadEffect(gameContext, m_effectFile);
  56.  
  57. // Create Vertex Buffer
  58. CreateVertexBuffer(gameContext);
  59.  
  60. // Create Index Buffer
  61. CreateIndexBuffer(gameContext);
  62.  
  63. // Create RenderTarget
  64. m_pRenderTarget = new RenderTarget(gameContext.pDevice);
  65.  
  66. RENDERTARGET_DESC renderTargetDesc;
  67. renderTargetDesc.Height = OverlordGame::GetGameSettings().Window.Height;
  68. renderTargetDesc.Width = OverlordGame::GetGameSettings().Window.Width;
  69.  
  70. m_pRenderTarget->Create(renderTargetDesc);
  71.  
  72. m_IsInitialized = true;
  73. }
  74. }
  75.  
  76. bool PostProcessingMaterial::LoadEffect(const GameContext& gameContext, const wstring& effectFile)
  77. {
  78. //Load Effect
  79. m_pEffect = ContentManager::Load<ID3DX11Effect>(effectFile);
  80. m_pTechnique = m_pEffect->GetTechniqueByIndex(0);
  81.  
  82. EffectHelper::BuildInputLayout(gameContext.pDevice, m_pTechnique, &m_pInputLayout, m_pInputLayoutDescriptions, m_pInputLayoutSize, m_InputLayoutID);
  83. LoadEffectVariables();
  84. return true;
  85. }
  86.  
  87. void PostProcessingMaterial::SetRenderIndex(unsigned int index)
  88. {
  89. m_RenderIndex = index;
  90. }
  91.  
  92. unsigned int PostProcessingMaterial::GetRenderIndex()
  93. {
  94. return m_RenderIndex;
  95. }
  96.  
  97. void PostProcessingMaterial::Draw(const GameContext& gameContext, RenderTarget* previousRendertarget)
  98. {
  99. // Clear the render target
  100. float temp[] = { 0, 0, 0, 0 };
  101. m_pRenderTarget->Clear(gameContext, temp);
  102.  
  103. // update the effect variables
  104. UpdateEffectVariables(previousRendertarget);
  105.  
  106. // set input layout
  107. gameContext.pDeviceContext->IASetInputLayout(m_pInputLayout);
  108.  
  109. // set vertex buffer
  110. UINT offset = 0;
  111. gameContext.pDeviceContext->IASetVertexBuffers(0, 1, &m_pVertexBuffer, &m_VertexBufferStride, &offset);
  112.  
  113. // set index buffer
  114. gameContext.pDeviceContext->IASetIndexBuffer(m_pIndexBuffer, DXGI_FORMAT_R32_UINT, 0);
  115.  
  116. // set primitive topology
  117. gameContext.pDeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY::D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
  118.  
  119. // draw
  120. D3DX11_TECHNIQUE_DESC techDesc;
  121. m_pTechnique->GetDesc(&techDesc);
  122. for (UINT i = 0; i < techDesc.Passes; ++i)
  123. {
  124. m_pTechnique->GetPassByIndex(i)->Apply(0, gameContext.pDeviceContext);
  125. gameContext.pDeviceContext->DrawIndexed(m_NumIndices, 0, 0);
  126. }
  127.  
  128. // generate mips
  129. gameContext.pDeviceContext->GenerateMips(m_pRenderTarget->GetShaderResourceView());
  130.  
  131. // call PsSetShaderResources to reset the shader resources
  132. ID3D11ShaderResourceView *const pSRV[1] = {NULL};
  133. gameContext.pDeviceContext->PSSetShaderResources(0, 1, pSRV);
  134. }
  135.  
  136. void PostProcessingMaterial::CreateVertexBuffer(const GameContext& gameContext)
  137. {
  138. // create a vertex buffer for a full screen quad using VertexPosTex
  139. if (!m_pVertexBuffer)
  140. {
  141.  
  142. D3D11_BUFFER_DESC buffer_Desc = {};
  143. buffer_Desc.Usage = D3D11_USAGE::D3D11_USAGE_DYNAMIC;
  144. buffer_Desc.ByteWidth = sizeof(VertexPosTex)* m_NumVertices;
  145. buffer_Desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
  146. buffer_Desc.CPUAccessFlags = D3D10_CPU_ACCESS_FLAG::D3D10_CPU_ACCESS_WRITE;
  147. buffer_Desc.MiscFlags = 0;
  148.  
  149. vector<VertexPosTex> vertices;
  150. vertices.push_back(VertexPosTex(XMFLOAT3(-1, -1, 0), XMFLOAT2(0, 1)));
  151. vertices.push_back(VertexPosTex(XMFLOAT3(-1, 1, 0), XMFLOAT2(0, 0)));
  152. vertices.push_back(VertexPosTex(XMFLOAT3(1, 1, 0), XMFLOAT2(1, 0)));
  153. vertices.push_back(VertexPosTex(XMFLOAT3(1, -1, 0), XMFLOAT2(1, 1)));
  154.  
  155. D3D11_SUBRESOURCE_DATA initData;
  156. initData.pSysMem = vertices.data();
  157.  
  158. auto hr = gameContext.pDevice->CreateBuffer(&buffer_Desc, &initData, &m_pVertexBuffer);
  159. Logger::LogHResult(hr, L"PostProcessingMaterial::Initialize() :: can't create vertex buffer");
  160.  
  161. }
  162. }
  163.  
  164. void PostProcessingMaterial::CreateIndexBuffer(const GameContext& gameContext)
  165. {
  166. // Create the index buffer for a full screen quad
  167. if (!m_pIndexBuffer)
  168. {
  169. D3D11_BUFFER_DESC buffer_Desc = {};
  170. buffer_Desc.Usage = D3D11_USAGE::D3D11_USAGE_DYNAMIC;
  171. buffer_Desc.ByteWidth = sizeof(DWORD)* m_NumIndices;
  172. buffer_Desc.BindFlags = D3D11_BIND_INDEX_BUFFER;
  173. buffer_Desc.CPUAccessFlags = D3D10_CPU_ACCESS_FLAG::D3D10_CPU_ACCESS_WRITE;
  174. buffer_Desc.MiscFlags = 0;
  175.  
  176. vector<DWORD> indices;
  177. indices.push_back(0);
  178. indices.push_back(1);
  179. indices.push_back(3);
  180. indices.push_back(1);
  181. indices.push_back(2);
  182. indices.push_back(3);
  183.  
  184. D3D11_SUBRESOURCE_DATA initData;
  185. initData.pSysMem = indices.data();
  186.  
  187. auto hr = gameContext.pDevice->CreateBuffer(&buffer_Desc, &initData, &m_pIndexBuffer);
  188. Logger::LogHResult(hr, L"PostProcessingMaterial::Initialize() :: can't create index buffer");
  189. }
  190. }
  191.  
  192. RenderTarget* PostProcessingMaterial::GetRenderTarget()
  193. {
  194. return m_pRenderTarget;
  195. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement