MainRenderer.cpp 6.6 KB

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