92 Zeilen
1.5 KiB

  1. //
  2. // Lol Engine
  3. //
  4. // Copyright: (c) 2010-2013 Sam Hocevar <sam@hocevar.net>
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the Do What The Fuck You Want To
  7. // Public License, Version 2, as published by Sam Hocevar. See
  8. // http://www.wtfpl.net/ for more details.
  9. //
  10. #if defined HAVE_CONFIG_H
  11. # include "config.h"
  12. #endif
  13. #include <cstdlib>
  14. #include "core.h"
  15. namespace lol
  16. {
  17. class TrackedState
  18. {
  19. public:
  20. inline TrackedState()
  21. : m_state(Unchanged)
  22. {}
  23. inline void TrackValue(bool set)
  24. {
  25. m_state = set ? MustSet : MustUnset;
  26. }
  27. inline bool HasChanged()
  28. {
  29. return m_state != Unchanged;
  30. }
  31. inline bool GetValue()
  32. {
  33. return m_state == MustSet;
  34. }
  35. private:
  36. enum
  37. {
  38. Unchanged,
  39. MustSet,
  40. MustUnset,
  41. }
  42. m_state;
  43. };
  44. class RenderContextData
  45. {
  46. friend class RenderContext;
  47. private:
  48. Scene *m_scene;
  49. TrackedState m_blend;
  50. };
  51. /*
  52. * Public RenderContext class
  53. */
  54. RenderContext::RenderContext()
  55. : m_data(new RenderContextData())
  56. {
  57. m_data->m_scene = Scene::GetDefault();
  58. }
  59. RenderContext::~RenderContext()
  60. {
  61. if (m_data->m_blend.HasChanged())
  62. g_renderer->SetBlendState(m_data->m_blend.GetValue());
  63. delete m_data;
  64. }
  65. void RenderContext::SetBlendState(bool set)
  66. {
  67. if (!m_data->m_blend.HasChanged())
  68. m_data->m_blend.TrackValue(g_renderer->GetBlendState());
  69. g_renderer->SetBlendState(set);
  70. }
  71. } /* namespace lol */