MainRenderer.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. #include <cstdlib>
  2. #include <cstdio>
  3. #include <jpeglib.h>
  4. #include <fstream>
  5. #include <boost/filesystem.hpp>
  6. #include <boost/algorithm/string.hpp>
  7. #include "GfxApi/GlException.h"
  8. #include "MainRenderer.h"
  9. #include "Core/App.h"
  10. #include "RendererInitializer.h"
  11. #include "Ssao.h"
  12. #include "Core/Logger.h"
  13. //==============================================================================
  14. // init =
  15. //==============================================================================
  16. void MainRenderer::init(const RendererInitializer& initializer_)
  17. {
  18. INFO("Initializing main renderer...");
  19. initGl();
  20. sProg.loadRsrc("shaders/Final.glsl");
  21. //
  22. // init the offscreen Renderer
  23. //
  24. RendererInitializer initializer = initializer_;
  25. renderingQuality = initializer.mainRendererQuality;
  26. initializer.width = AppSingleton::getInstance().getWindowWidth() * renderingQuality;
  27. initializer.height = AppSingleton::getInstance().getWindowHeight() * renderingQuality;
  28. Renderer::init(initializer);
  29. dbg.init(initializer);
  30. INFO("Main renderer initialized");
  31. }
  32. //==============================================================================
  33. // initGl =
  34. //==============================================================================
  35. void MainRenderer::initGl()
  36. {
  37. GLenum err = glewInit();
  38. if(err != GLEW_OK)
  39. {
  40. throw EXCEPTION("GLEW initialization failed");
  41. }
  42. // Ignore re first error
  43. glGetError();
  44. // print GL info
  45. INFO("OpenGL info: OGL " << reinterpret_cast<const char*>(glGetString(GL_VERSION)) <<
  46. ", GLSL " << reinterpret_cast<const char*>(glGetString(GL_SHADING_LANGUAGE_VERSION)));
  47. // get max texture units
  48. //glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS, &maxColorAtachments);
  49. int& tun = Texture::getTextureUnitsNum();
  50. glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &tun);
  51. glClearColor(0.1, 0.1, 0.1, 1.0);
  52. glClearDepth(1.0);
  53. glClearStencil(0);
  54. glDepthFunc(GL_LEQUAL);
  55. // CullFace is always on
  56. glCullFace(GL_BACK);
  57. glEnable(GL_CULL_FACE);
  58. // defaults
  59. //glDisable(GL_LIGHTING);
  60. //glDisable(GL_TEXTURE_2D);
  61. GlStateMachineSingleton::getInstance().enable(GL_BLEND, false);
  62. glDisable(GL_STENCIL_TEST);
  63. glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  64. glDepthMask(true);
  65. glDepthFunc(GL_LESS);
  66. try
  67. {
  68. ON_GL_FAIL_THROW_EXCEPTION();
  69. }
  70. catch(std::exception& e)
  71. {
  72. throw EXCEPTION("OpenGL initialization failed: " + e.what());
  73. }
  74. }
  75. //==============================================================================
  76. // render =
  77. //==============================================================================
  78. void MainRenderer::render(Camera& cam_)
  79. {
  80. Renderer::render(cam_);
  81. dbg.run();
  82. //
  83. // Render the PPS FAI to the framebuffer
  84. //
  85. glBindFramebuffer(GL_FRAMEBUFFER, 0); // Bind the window framebuffer
  86. setViewport(0, 0, AppSingleton::getInstance().getWindowWidth(), AppSingleton::getInstance().getWindowHeight());
  87. GlStateMachineSingleton::getInstance().enable(GL_DEPTH_TEST, false);
  88. GlStateMachineSingleton::getInstance().enable(GL_BLEND, false);
  89. sProg->bind();
  90. //sProg->findUniVar("rasterImage")->set(ms.getNormalFai(), 0);
  91. //sProg->findUniVar("rasterImage")->set(pps.getSsao().getFai(), 0);
  92. sProg->findUniVar("rasterImage")->set(pps.getPostPassFai(), 0);
  93. drawQuad();
  94. }
  95. //==============================================================================
  96. // takeScreenshotTga =
  97. //==============================================================================
  98. void MainRenderer::takeScreenshotTga(const char* filename)
  99. {
  100. // open file and check
  101. std::fstream fs;
  102. fs.open(filename, std::ios::out | std::ios::binary);
  103. if(!fs.is_open())
  104. {
  105. throw EXCEPTION("Cannot create screenshot. File \"" + filename + "\"");
  106. }
  107. // write headers
  108. unsigned char tgaHeaderUncompressed[12] = {0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  109. unsigned char header[6];
  110. header[1] = getWidth() / 256;
  111. header[0] = getWidth() % 256;
  112. header[3] = getHeight() / 256;
  113. header[2] = getHeight() % 256;
  114. header[4] = 24;
  115. header[5] = 0;
  116. fs.write((char*)tgaHeaderUncompressed, 12);
  117. fs.write((char*)header, 6);
  118. // write the buffer
  119. char* buffer = (char*)calloc(getWidth()*getHeight()*3, sizeof(char));
  120. glReadPixels(0, 0, getWidth(), getHeight(), GL_BGR, GL_UNSIGNED_BYTE, buffer);
  121. fs.write(buffer, getWidth()*getHeight()*3);
  122. // end
  123. fs.close();
  124. free(buffer);
  125. }
  126. //==============================================================================
  127. // takeScreenshotJpeg =
  128. //==============================================================================
  129. void MainRenderer::takeScreenshotJpeg(const char* filename)
  130. {
  131. // open file
  132. FILE* outfile = fopen(filename, "wb");
  133. if(!outfile)
  134. {
  135. throw EXCEPTION("Cannot open file \"" + filename + "\"");
  136. }
  137. // set jpg params
  138. jpeg_compress_struct cinfo;
  139. jpeg_error_mgr jerr;
  140. cinfo.err = jpeg_std_error(&jerr);
  141. jpeg_create_compress(&cinfo);
  142. jpeg_stdio_dest(&cinfo, outfile);
  143. cinfo.image_width = getWidth();
  144. cinfo.image_height = getHeight();
  145. cinfo.input_components = 3;
  146. cinfo.in_color_space = JCS_RGB;
  147. jpeg_set_defaults(&cinfo);
  148. jpeg_set_quality (&cinfo, screenshotJpegQuality, true);
  149. jpeg_start_compress(&cinfo, true);
  150. // read from OGL
  151. char* buffer = (char*)malloc(getWidth()*getHeight()*3*sizeof(char));
  152. glReadPixels(0, 0, getWidth(), getHeight(), GL_RGB, GL_UNSIGNED_BYTE, buffer);
  153. // write buffer to file
  154. JSAMPROW row_pointer;
  155. while(cinfo.next_scanline < cinfo.image_height)
  156. {
  157. row_pointer = (JSAMPROW) &buffer[(getHeight()-1-cinfo.next_scanline)*3*getWidth()];
  158. jpeg_write_scanlines(&cinfo, &row_pointer, 1);
  159. }
  160. jpeg_finish_compress(&cinfo);
  161. // done
  162. free(buffer);
  163. fclose(outfile);
  164. }
  165. //==============================================================================
  166. // takeScreenshot =
  167. //==============================================================================
  168. void MainRenderer::takeScreenshot(const char* filename)
  169. {
  170. std::string ext = boost::filesystem::path(filename).extension();
  171. boost::to_lower(ext);
  172. // exec from this extension
  173. if(ext == ".tga")
  174. {
  175. takeScreenshotTga(filename);
  176. }
  177. else if(ext == ".jpg" || ext == ".jpeg")
  178. {
  179. takeScreenshotJpeg(filename);
  180. }
  181. else
  182. {
  183. throw EXCEPTION("File \"" + filename + "\": Unsupported extension");
  184. }
  185. //INFO("Screenshot \"" << filename << "\" saved");
  186. }