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.

135 lines
3.0 KiB

  1. //
  2. // Lol Engine
  3. //
  4. // Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net>
  5. //
  6. // Lol Engine is free software. It comes without any warranty, to
  7. // the extent permitted by applicable law. You can redistribute it
  8. // and/or modify it under the terms of the Do What the Fuck You Want
  9. // to Public License, Version 2, as published by the WTFPL Task Force.
  10. // See http://www.wtfpl.net/ for more details.
  11. //
  12. #include <lol/engine-internal.h>
  13. #if defined _WIN32
  14. # define WIN32_LEAN_AND_MEAN
  15. # include <windows.h>
  16. # undef WIN32_LEAN_AND_MEAN
  17. # undef near /* Fuck Microsoft */
  18. # undef far /* Fuck Microsoft again */
  19. #endif
  20. #include "lolgl.h"
  21. namespace lol
  22. {
  23. class VideoData
  24. {
  25. friend class Video;
  26. private:
  27. static DebugRenderMode render_mode;
  28. };
  29. DebugRenderMode VideoData::render_mode = DebugRenderMode::Default;
  30. /*
  31. * Public Video class
  32. */
  33. void Video::Setup(ivec2 size)
  34. {
  35. Scene::AddNew(size);
  36. /* Initialise reasonable scene default properties */
  37. SetDebugRenderMode(DebugRenderMode::Default);
  38. }
  39. void Video::SetDebugRenderMode(DebugRenderMode d)
  40. {
  41. switch(d)
  42. {
  43. //All these modes are handled in the shaders.
  44. case DebugRenderMode::Default:
  45. case DebugRenderMode::Flat:
  46. case DebugRenderMode::Lighting:
  47. case DebugRenderMode::Normal:
  48. case DebugRenderMode::UV:
  49. {
  50. #if defined HAVE_GLES_2X
  51. #elif defined LOL_USE_GLEW || defined HAVE_GL_2X
  52. glEnable(GL_CULL_FACE);
  53. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  54. #endif
  55. break;
  56. }
  57. case DebugRenderMode::Wireframe:
  58. {
  59. #if defined HAVE_GLES_2X
  60. #elif defined LOL_USE_GLEW || defined HAVE_GL_2X
  61. glDisable(GL_CULL_FACE);
  62. glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  63. #endif
  64. break;
  65. }
  66. default:
  67. return; /* Unknown render mode */
  68. }
  69. VideoData::render_mode = d;
  70. }
  71. DebugRenderMode Video::GetDebugRenderMode()
  72. {
  73. return VideoData::render_mode;
  74. }
  75. void Video::Destroy()
  76. {
  77. Scene::DestroyAll();
  78. }
  79. void Video::Capture(uint32_t *buffer)
  80. {
  81. #if defined LOL_USE_GLEW || defined HAVE_GL_2X || defined HAVE_GLEX_2X
  82. GLint v[4];
  83. glGetIntegerv(GL_VIEWPORT, v);
  84. int width = v[2], height = v[3];
  85. # if defined HAVE_GL_2X
  86. glPixelStorei(GL_PACK_ROW_LENGTH, 0);
  87. # endif
  88. glPixelStorei(GL_PACK_ALIGNMENT, 1);
  89. # if defined GL_BGRA
  90. glReadPixels(0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, buffer);
  91. # else
  92. glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
  93. # endif
  94. for (int j = 0; j < height / 2; j++)
  95. for (int i = 0; i < width; i++)
  96. {
  97. uint32_t tmp = buffer[j * width + i];
  98. buffer[j * width + i] = buffer[(height - j - 1) * width + i];
  99. buffer[(height - j - 1) * width + i] = tmp;
  100. }
  101. #else
  102. UNUSED(buffer);
  103. #endif
  104. }
  105. void Video::Resize(ivec2 size)
  106. {
  107. Scene::GetScene(0).resize(size);
  108. }
  109. ivec2 Video::GetSize()
  110. {
  111. return Scene::GetScene(0).get_renderer()->GetViewport().extent();
  112. }
  113. } /* namespace lol */