bool Terrain::Draw(RenderContext& renderContext) { renderContext.ApplyShader(m_useShaderType); XCShaderHandle* shaderHandle = nullptr; // Set constants ICamera& cam = renderContext.GetGlobalShaderData().m_camera; PerObjectBuffer perObject = { MatrixTranspose(m_World).GetUnaligned(), MatrixTranspose(m_World * cam.GetViewMatrix() * cam.GetProjectionMatrix()).GetUnaligned(), MatrixInverseTranspose(m_World).GetUnaligned(), XCMatrix().GetUnaligned(), m_material }; m_pCBPerObject->UploadDataOnGPU(renderContext.GetDeviceContext(), &perObject, sizeof(PerObjectBuffer)); if (m_useShaderType == ShaderType_LightTexture) { shaderHandle = (XCShaderHandle*)renderContext.GetShader(ShaderType_LightTexture); shaderHandle->SetConstantBuffer("PerObjectBuffer", renderContext.GetDeviceContext(), *m_pCBPerObject); shaderHandle->SetResource("gDiffuseMap", renderContext.GetDeviceContext(), m_textures[0]); } else if (m_useShaderType == ShaderType_TerrainMultiTexture) { shaderHandle = (XCShaderHandle*)renderContext.GetShader(ShaderType_TerrainMultiTexture); shaderHandle->SetConstantBuffer("PerObjectBuffer", renderContext.GetDeviceContext(), *m_pCBPerObject); shaderHandle->SetResource("gDiffuseMap", renderContext.GetDeviceContext(), m_textures[0]); shaderHandle->SetResource("gDiffuseMap1", renderContext.GetDeviceContext(), m_textures[1]); shaderHandle->SetResource("gDiffuseMap2", renderContext.GetDeviceContext(), m_textures[2]); shaderHandle->SetResource("gBlendMap", renderContext.GetDeviceContext(), m_textures[3]); } #if defined(FORWARD_LIGHTING) XCLightManager* lightMgr = (XCLightManager*)&SystemLocator::GetInstance()->RequestSystem("LightsManager"); shaderHandle->SetConstantBuffer("cbLightsPerFrame", renderContext.GetDeviceContext(), lightMgr->GetLightConstantBuffer()); #endif shaderHandle->SetVertexBuffer(renderContext.GetDeviceContext(), &m_vertexPosNormTexBuffer); shaderHandle->SetIndexBuffer(renderContext.GetDeviceContext(), m_indexBuffer); renderContext.DrawIndexedInstanced(m_indexBuffer.m_indexData.size(), m_indexBuffer.GetIndexBufferInGPUMem()); return true; }