void CubeMesh::Draw(RenderContext& context)
{
#if defined(DEBUG_OBB)
    context.SetRasterizerState(m_rasterType);
    context.ApplyShader(m_useShaderType);

    context.GetDeviceContext().IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
    context.GetDeviceContext().IASetVertexBuffers(0, 1, &m_pVB, &m_Stride, &m_Offset);
    context.GetDeviceContext().IASetIndexBuffer(m_pIB, DXGI_FORMAT_R16_UINT, m_Offset);

    // Set constants
    cbWorld wbuffer = { XMMatrixTranspose(m_World) };
    cbInvTransposeWorld invTransWorld = { MatrixInverseTranspose(m_World) };
    cbMatTexPerObject matTexPerObject = { *m_texture->GetTextureCoordinateMatrix(), m_material };

    if (m_useShaderType == ShaderType_LightTexture)
    {
        LightTextureShader* lightTexShader = (LightTextureShader*)context.GetShader(ShaderType_LightTexture);
        lightTexShader->setCBWorld(context.GetDeviceContext(), &wbuffer);
        lightTexShader->setCBInvTransposeMatrix(context.GetDeviceContext(), &invTransWorld);
        lightTexShader->setCBMatTexPerObject(context.GetDeviceContext(), &matTexPerObject);
        lightTexShader->setTexture2D(context.GetDeviceContext(), m_texture->GetTextureResource());
    }
    else
    {
        //Solid Shader
        SolidColorShader* solidColorShader = (SolidColorShader*)context.GetShader(ShaderType_SolidColor);
        solidColorShader->setCBWorld(context.GetDeviceContext(), wbuffer);
    }

    context.DrawIndexedInstanced(36);
#endif
}
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;
}