MainRenderer.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. #include "anki/renderer/MainRenderer.h"
  2. #include "anki/core/Logger.h"
  3. #include "anki/renderer/Deformer.h"
  4. #include "anki/util/Filesystem.h"
  5. #include <cstdlib>
  6. #include <cstdio>
  7. #include <fstream>
  8. #define glewGetContext() (&glContext)
  9. namespace anki {
  10. //==============================================================================
  11. MainRenderer::~MainRenderer()
  12. {}
  13. //==============================================================================
  14. void MainRenderer::init(const Renderer::Initializer& initializer_)
  15. {
  16. ANKI_LOGI("Initializing main renderer...");
  17. initGl();
  18. const F32 renderingQuality = initializer_.renderingQuality;
  19. windowWidth = initializer_.width;
  20. windowHeight = initializer_.height;
  21. drawToDefaultFbo = (renderingQuality > 0.9 && !initializer_.dbg.enabled);
  22. // init the offscreen Renderer
  23. //
  24. RendererInitializer initializer = initializer_;
  25. initializer.width *= renderingQuality;
  26. initializer.height *= renderingQuality;
  27. if(drawToDefaultFbo)
  28. {
  29. initializer.pps.drawToDefaultFbo = true;
  30. initializer.is.drawToDefaultFbo = !initializer.pps.enabled;
  31. }
  32. else
  33. {
  34. initializer.pps.drawToDefaultFbo = false;
  35. initializer.is.drawToDefaultFbo = false;
  36. sProg.load("shaders/Final.glsl");
  37. }
  38. Renderer::init(initializer);
  39. dbg.init(initializer);
  40. deformer.reset(new Deformer);
  41. ANKI_LOGI("Main renderer initialized");
  42. }
  43. //==============================================================================
  44. void MainRenderer::initGl()
  45. {
  46. /*glewExperimental = GL_TRUE;
  47. if(glewInit() != GLEW_OK)
  48. {
  49. throw ANKI_EXCEPTION("GLEW initialization failed");
  50. }*/
  51. // Ignore the first error
  52. glGetError();
  53. // print GL info
  54. ANKI_LOGI("OpenGL info: OGL "
  55. << reinterpret_cast<const char*>(glGetString(GL_VERSION))
  56. << ", GLSL " << reinterpret_cast<const char*>(
  57. glGetString(GL_SHADING_LANGUAGE_VERSION)));
  58. // get max texture units
  59. GlStateSingleton::get().setClearColor(Vec4(1.0, 0.0, 1.0, 1.0));
  60. GlStateSingleton::get().setClearDepthValue(1.0);
  61. GlStateSingleton::get().setClearStencilValue(0);
  62. glDepthFunc(GL_LEQUAL);
  63. // CullFace is always on
  64. glCullFace(GL_BACK);
  65. GlStateSingleton::get().enable(GL_CULL_FACE);
  66. // defaults
  67. GlStateSingleton::get().disable(GL_BLEND);
  68. GlStateSingleton::get().disable(GL_STENCIL_TEST);
  69. //glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  70. glDepthMask(GL_TRUE);
  71. glDepthFunc(GL_LESS);
  72. try
  73. {
  74. ANKI_CHECK_GL_ERROR();
  75. }
  76. catch(std::exception& e)
  77. {
  78. throw ANKI_EXCEPTION("OpenGL initialization failed") << e;
  79. }
  80. }
  81. //==============================================================================
  82. void MainRenderer::render(Scene& scene)
  83. {
  84. Renderer::render(scene);
  85. dbg.run();
  86. // Render the PPS FAI to the framebuffer
  87. //
  88. if(!drawToDefaultFbo)
  89. {
  90. Fbo::unbindAll(); // Bind the window framebuffer
  91. GlStateSingleton::get().setViewport(0, 0, windowWidth, windowHeight);
  92. GlStateSingleton::get().disable(GL_DEPTH_TEST);
  93. GlStateSingleton::get().disable(GL_BLEND);
  94. sProg->bind();
  95. #if 0
  96. const Texture& finalFai = pps.getHdr().getFai();
  97. #else
  98. const Texture& finalFai = pps.getFai();
  99. #endif
  100. sProg->findUniformVariable("rasterImage").set(finalFai);
  101. drawQuad();
  102. }
  103. GLenum glerr = glGetError();
  104. if(glerr != GL_NO_ERROR)
  105. {
  106. throw ANKI_EXCEPTION("GL error");
  107. }
  108. }
  109. //==============================================================================
  110. void MainRenderer::takeScreenshotTga(const char* filename)
  111. {
  112. // open file and check
  113. std::fstream fs;
  114. fs.open(filename, std::ios::out | std::ios::binary);
  115. if(!fs.is_open())
  116. {
  117. throw ANKI_EXCEPTION("Cannot write screenshot file:"
  118. + filename);
  119. }
  120. // write headers
  121. static const U8 tgaHeaderUncompressed[12] = {
  122. 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  123. Array<U8, 6> header;
  124. header[1] = getWidth() / 256;
  125. header[0] = getWidth() % 256;
  126. header[3] = getHeight() / 256;
  127. header[2] = getHeight() % 256;
  128. header[4] = 24;
  129. header[5] = 0;
  130. fs.write((char*)tgaHeaderUncompressed, sizeof(tgaHeaderUncompressed));
  131. fs.write((char*)&header[0], sizeof(header));
  132. // get the buffer
  133. U8* buffer = new U8[getWidth() * getHeight() * 3];
  134. for(U i = 0; i < getWidth() * getHeight(); i += 3)
  135. {
  136. U8 temp = buffer[i];
  137. buffer[i] = buffer[i + 2];
  138. buffer[i + 2] = temp;
  139. }
  140. glReadPixels(0, 0, getWidth(), getHeight(), GL_RGB, GL_UNSIGNED_BYTE,
  141. buffer);
  142. fs.write((char*)buffer, getWidth() * getHeight() * 3);
  143. // end
  144. fs.close();
  145. delete[] buffer;
  146. }
  147. //==============================================================================
  148. void MainRenderer::takeScreenshotJpeg(const char* filename)
  149. {
  150. #if 0
  151. // open file
  152. FILE* outfile = fopen(filename, "wb");
  153. if(!outfile)
  154. {
  155. throw ANKI_EXCEPTION("Cannot open file \"" + filename + "\"");
  156. }
  157. // set jpg params
  158. jpeg_compress_struct cinfo;
  159. jpeg_error_mgr jerr;
  160. cinfo.err = jpeg_std_error(&jerr);
  161. jpeg_create_compress(&cinfo);
  162. jpeg_stdio_dest(&cinfo, outfile);
  163. cinfo.image_width = getWidth();
  164. cinfo.image_height = getHeight();
  165. cinfo.input_components = 3;
  166. cinfo.in_color_space = JCS_RGB;
  167. jpeg_set_defaults(&cinfo);
  168. jpeg_set_quality (&cinfo, screenshotJpegQuality, true);
  169. jpeg_start_compress(&cinfo, true);
  170. // read from OGL
  171. char* buffer = (char*)malloc(getWidth()*getHeight()*3*sizeof(char));
  172. glReadPixels(0, 0, getWidth(), getHeight(), GL_RGB, GL_UNSIGNED_BYTE,
  173. buffer);
  174. // write buffer to file
  175. JSAMPROW row_pointer;
  176. while(cinfo.next_scanline < cinfo.image_height)
  177. {
  178. row_pointer = (JSAMPROW)&buffer[(getHeight() - 1 -
  179. cinfo.next_scanline) * 3 * getWidth()];
  180. jpeg_write_scanlines(&cinfo, &row_pointer, 1);
  181. }
  182. jpeg_finish_compress(&cinfo);
  183. // done
  184. free(buffer);
  185. fclose(outfile);
  186. #endif
  187. }
  188. //==============================================================================
  189. void MainRenderer::takeScreenshot(const char* filename)
  190. {
  191. std::string ext = getFileExtension(filename);
  192. // exec from this extension
  193. if(ext == ".tga")
  194. {
  195. takeScreenshotTga(filename);
  196. }
  197. else if(ext == ".jpg" || ext == ".jpeg")
  198. {
  199. takeScreenshotJpeg(filename);
  200. }
  201. else
  202. {
  203. throw ANKI_EXCEPTION("Unsupported file extension: " + filename);
  204. }
  205. //ANKI_LOGI("Screenshot \"" << filename << "\" saved");
  206. }
  207. } // end namespace anki