//
// Lol Engine
//
// Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net>
//   This program is free software; you can redistribute it and/or
//   modify it under the terms of the Do What The Fuck You Want To
//   Public License, Version 2, as published by Sam Hocevar. See
//   http://www.wtfpl.net/ for more details.
//

#if defined HAVE_CONFIG_H
#   include "config.h"
#endif

#include <cstdlib>

#include "core.h"

namespace lol
{

class TrackedState
{
public:
    inline TrackedState()
      : m_state(Unchanged)
    {}

    inline void TrackValue(bool set)
    {
        m_state = set ? MustSet : MustUnset;
    }

    inline bool HasChanged()
    {
        return m_state != Unchanged;
    }

    inline bool GetValue()
    {
        return m_state == MustSet;
    }

private:
    enum
    {
        Unchanged,
        MustSet,
        MustUnset,
    }
    m_state;
};

class RenderContextData
{
    friend class RenderContext;

private:
    Scene *m_scene;

    TrackedState m_blend;
};

/*
 * Public RenderContext class
 */

RenderContext::RenderContext()
  : m_data(new RenderContextData())
{
    m_data->m_scene = Scene::GetDefault();
}

RenderContext::~RenderContext()
{
    if (m_data->m_blend.HasChanged())
        g_renderer->SetBlendState(m_data->m_blend.GetValue());

    delete m_data;
}

void RenderContext::SetBlendState(bool set)
{
    if (!m_data->m_blend.HasChanged())
        m_data->m_blend.TrackValue(g_renderer->GetBlendState());

    g_renderer->SetBlendState(set);
}

} /* namespace lol */