MainRenderer.cpp 6.6 KB

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