MainRenderer.cpp 5.7 KB

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