You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

291 rivejä
7.2 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. #include <lol/engine-internal.h>
  11. #include <cstdlib>
  12. namespace lol
  13. {
  14. template<typename T> class TrackedState
  15. {
  16. public:
  17. inline TrackedState()
  18. : m_changed(false)
  19. {}
  20. inline void TrackValue(T const &value)
  21. {
  22. m_value = value;
  23. m_changed = true;
  24. }
  25. inline bool HasChanged()
  26. {
  27. return m_changed;
  28. }
  29. inline T GetValue()
  30. {
  31. return m_value;
  32. }
  33. private:
  34. T m_value;
  35. bool m_changed;
  36. };
  37. class RenderContextData
  38. {
  39. friend class RenderContext;
  40. private:
  41. TrackedState<ibox2> m_viewport;
  42. TrackedState<vec4> m_clear_color;
  43. TrackedState<float> m_clear_depth;
  44. TrackedState<AlphaFunc> m_alpha_func;
  45. TrackedState<float> m_alpha_value;
  46. TrackedState<BlendEquation> m_blend_rgb, m_blend_alpha;
  47. TrackedState<BlendFunc> m_blend_src, m_blend_dst;
  48. TrackedState<DepthFunc> m_depth_func;
  49. TrackedState<DepthMask> m_depth_mask;
  50. TrackedState<CullMode> m_cull_mode;
  51. TrackedState<PolygonMode> m_polygon_mode;
  52. TrackedState<ScissorMode> m_scissor_mode;
  53. TrackedState<vec4> m_scissor_rect;
  54. };
  55. /*
  56. * Public RenderContext class
  57. */
  58. RenderContext::RenderContext()
  59. : m_data(new RenderContextData())
  60. {
  61. }
  62. RenderContext::~RenderContext()
  63. {
  64. if (m_data->m_viewport.HasChanged())
  65. Renderer::Get()->SetViewport(m_data->m_viewport.GetValue());
  66. if (m_data->m_clear_color.HasChanged())
  67. Renderer::Get()->SetClearColor(m_data->m_clear_color.GetValue());
  68. if (m_data->m_clear_depth.HasChanged())
  69. Renderer::Get()->SetClearDepth(m_data->m_clear_depth.GetValue());
  70. if (m_data->m_alpha_func.HasChanged())
  71. Renderer::Get()->SetAlphaFunc(m_data->m_alpha_func.GetValue(),
  72. m_data->m_alpha_value.GetValue());
  73. if (m_data->m_blend_src.HasChanged())
  74. Renderer::Get()->SetBlendFunc(m_data->m_blend_src.GetValue(),
  75. m_data->m_blend_dst.GetValue());
  76. if (m_data->m_depth_func.HasChanged())
  77. Renderer::Get()->SetDepthFunc(m_data->m_depth_func.GetValue());
  78. if (m_data->m_depth_mask.HasChanged())
  79. Renderer::Get()->SetDepthMask(m_data->m_depth_mask.GetValue());
  80. if (m_data->m_cull_mode.HasChanged())
  81. Renderer::Get()->SetCullMode(m_data->m_cull_mode.GetValue());
  82. if (m_data->m_polygon_mode.HasChanged())
  83. Renderer::Get()->SetPolygonMode(m_data->m_polygon_mode.GetValue());
  84. if (m_data->m_scissor_mode.HasChanged())
  85. Renderer::Get()->SetScissorMode(m_data->m_scissor_mode.GetValue());
  86. delete m_data;
  87. }
  88. void RenderContext::SetViewport(ibox2 viewport)
  89. {
  90. if (!m_data->m_viewport.HasChanged())
  91. m_data->m_viewport.TrackValue(Renderer::Get()->GetViewport());
  92. Renderer::Get()->SetViewport(viewport);
  93. }
  94. ibox2 RenderContext::GetViewport()
  95. {
  96. return Renderer::Get()->GetViewport();
  97. }
  98. void RenderContext::SetClearColor(vec4 color)
  99. {
  100. if (!m_data->m_clear_color.HasChanged())
  101. m_data->m_clear_color.TrackValue(Renderer::Get()->GetClearColor());
  102. Renderer::Get()->SetClearColor(color);
  103. }
  104. vec4 RenderContext::GetClearColor()
  105. {
  106. return Renderer::Get()->GetClearColor();
  107. }
  108. void RenderContext::SetClearDepth(float depth)
  109. {
  110. if (!m_data->m_clear_depth.HasChanged())
  111. m_data->m_clear_depth.TrackValue(Renderer::Get()->GetClearDepth());
  112. Renderer::Get()->SetClearDepth(depth);
  113. }
  114. float RenderContext::GetClearDepth()
  115. {
  116. return Renderer::Get()->GetClearDepth();
  117. }
  118. void RenderContext::SetAlphaFunc(AlphaFunc func, float alpha)
  119. {
  120. if (!m_data->m_alpha_func.HasChanged())
  121. m_data->m_alpha_func.TrackValue(Renderer::Get()->GetAlphaFunc());
  122. if (!m_data->m_alpha_value.HasChanged())
  123. m_data->m_alpha_value.TrackValue(Renderer::Get()->GetAlphaValue());
  124. Renderer::Get()->SetAlphaFunc(func, alpha);
  125. }
  126. AlphaFunc RenderContext::GetAlphaFunc()
  127. {
  128. return Renderer::Get()->GetAlphaFunc();
  129. }
  130. float RenderContext::GetAlphaValue()
  131. {
  132. return Renderer::Get()->GetAlphaValue();
  133. }
  134. void RenderContext::SetBlendEquation(BlendEquation rgb, BlendEquation alpha)
  135. {
  136. if (!m_data->m_blend_rgb.HasChanged())
  137. m_data->m_blend_rgb.TrackValue(Renderer::Get()->GetBlendEquationRgb());
  138. if (!m_data->m_blend_alpha.HasChanged())
  139. m_data->m_blend_alpha.TrackValue(Renderer::Get()->GetBlendEquationAlpha());
  140. Renderer::Get()->SetBlendEquation(rgb, alpha);
  141. }
  142. BlendEquation RenderContext::GetBlendEquationRgb()
  143. {
  144. return Renderer::Get()->GetBlendEquationRgb();
  145. }
  146. BlendEquation RenderContext::GetBlendEquationAlpha()
  147. {
  148. return Renderer::Get()->GetBlendEquationAlpha();
  149. }
  150. void RenderContext::SetBlendFunc(BlendFunc src, BlendFunc dst)
  151. {
  152. if (!m_data->m_blend_src.HasChanged())
  153. m_data->m_blend_src.TrackValue(Renderer::Get()->GetBlendFuncSrc());
  154. if (!m_data->m_blend_dst.HasChanged())
  155. m_data->m_blend_dst.TrackValue(Renderer::Get()->GetBlendFuncDst());
  156. Renderer::Get()->SetBlendFunc(src, dst);
  157. }
  158. BlendFunc RenderContext::GetBlendFuncSrc()
  159. {
  160. return Renderer::Get()->GetBlendFuncSrc();
  161. }
  162. BlendFunc RenderContext::GetBlendFuncDst()
  163. {
  164. return Renderer::Get()->GetBlendFuncDst();
  165. }
  166. void RenderContext::SetDepthFunc(DepthFunc func)
  167. {
  168. if (!m_data->m_depth_func.HasChanged())
  169. m_data->m_depth_func.TrackValue(Renderer::Get()->GetDepthFunc());
  170. Renderer::Get()->SetDepthFunc(func);
  171. }
  172. DepthFunc RenderContext::GetDepthFunc()
  173. {
  174. return Renderer::Get()->GetDepthFunc();
  175. }
  176. void RenderContext::SetDepthMask(DepthMask mask)
  177. {
  178. if (!m_data->m_depth_mask.HasChanged())
  179. m_data->m_depth_mask.TrackValue(Renderer::Get()->GetDepthMask());
  180. Renderer::Get()->SetDepthMask(mask);
  181. }
  182. DepthMask RenderContext::GetDepthMask()
  183. {
  184. return Renderer::Get()->GetDepthMask();
  185. }
  186. void RenderContext::SetCullMode(CullMode mode)
  187. {
  188. if (!m_data->m_cull_mode.HasChanged())
  189. m_data->m_cull_mode.TrackValue(Renderer::Get()->GetCullMode());
  190. Renderer::Get()->SetCullMode(mode);
  191. }
  192. CullMode RenderContext::GetCullMode()
  193. {
  194. return Renderer::Get()->GetCullMode();
  195. }
  196. void RenderContext::SetPolygonMode(PolygonMode mode)
  197. {
  198. if (!m_data->m_polygon_mode.HasChanged())
  199. m_data->m_polygon_mode.TrackValue(Renderer::Get()->GetPolygonMode());
  200. Renderer::Get()->SetPolygonMode(mode);
  201. }
  202. PolygonMode RenderContext::GetPolygonMode()
  203. {
  204. return Renderer::Get()->GetPolygonMode();
  205. }
  206. void RenderContext::SetScissorMode(ScissorMode mode)
  207. {
  208. if (!m_data->m_scissor_mode.HasChanged())
  209. m_data->m_scissor_mode.TrackValue(Renderer::Get()->GetScissorMode());
  210. Renderer::Get()->SetScissorMode(mode);
  211. }
  212. void RenderContext::SetScissorRect(vec4 rect)
  213. {
  214. if (!m_data->m_scissor_rect.HasChanged())
  215. m_data->m_scissor_rect.TrackValue(Renderer::Get()->GetScissorRect());
  216. Renderer::Get()->SetScissorRect(rect);
  217. }
  218. ScissorMode RenderContext::GetScissorMode()
  219. {
  220. return Renderer::Get()->GetScissorMode();
  221. }
  222. vec4 RenderContext::GetScissorRect()
  223. {
  224. return Renderer::Get()->GetScissorRect();
  225. }
  226. } /* namespace lol */