state_scopes.h 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #pragma once
  2. #include <QOpenGLFunctions_3_3_Core>
  3. namespace Render::GL {
  4. struct DepthMaskScope {
  5. GLboolean prev{};
  6. explicit DepthMaskScope(bool enableWrite) {
  7. glGetBooleanv(GL_DEPTH_WRITEMASK, &prev);
  8. glDepthMask(enableWrite ? GL_TRUE : GL_FALSE);
  9. }
  10. ~DepthMaskScope() { glDepthMask(prev); }
  11. };
  12. struct PolygonOffsetScope {
  13. GLboolean prevEnable;
  14. float factor, units;
  15. PolygonOffsetScope(float f, float u)
  16. : prevEnable(glIsEnabled(GL_POLYGON_OFFSET_FILL)), factor(f), units(u) {
  17. glEnable(GL_POLYGON_OFFSET_FILL);
  18. glPolygonOffset(factor, units);
  19. }
  20. ~PolygonOffsetScope() {
  21. if (prevEnable == 0U) {
  22. glDisable(GL_POLYGON_OFFSET_FILL);
  23. }
  24. glPolygonOffset(0.0F, 0.0F);
  25. }
  26. };
  27. struct BlendScope {
  28. GLboolean prevEnable;
  29. BlendScope(bool enable = true) : prevEnable(glIsEnabled(GL_BLEND)) {
  30. if (enable) {
  31. glEnable(GL_BLEND);
  32. } else {
  33. glDisable(GL_BLEND);
  34. }
  35. }
  36. ~BlendScope() {
  37. if (prevEnable != 0U) {
  38. glEnable(GL_BLEND);
  39. } else {
  40. glDisable(GL_BLEND);
  41. }
  42. }
  43. };
  44. struct DepthTestScope {
  45. GLboolean prevEnable;
  46. explicit DepthTestScope(bool enable)
  47. : prevEnable(glIsEnabled(GL_DEPTH_TEST)) {
  48. if (enable) {
  49. glEnable(GL_DEPTH_TEST);
  50. } else {
  51. glDisable(GL_DEPTH_TEST);
  52. }
  53. }
  54. ~DepthTestScope() {
  55. if (prevEnable != 0U) {
  56. glEnable(GL_DEPTH_TEST);
  57. } else {
  58. glDisable(GL_DEPTH_TEST);
  59. }
  60. }
  61. };
  62. } // namespace Render::GL