Warning, /include/Geant4/tools/sg/write_paper is written in an unsupported language. File is not indexed.
0001 // Copyright (C) 2018, Guy Barrand. All rights reserved.
0002 // See the file tools.license for terms.
0003
0004 #ifndef tools_sg_write_paper
0005 #define tools_sg_write_paper
0006
0007 // To traverse a scene graph and "export" it at various file formats
0008 // by using various rendering actions.
0009 // For example by using gl2ps_action, handle the formats:
0010 // gl2ps_eps: gl2ps producing eps
0011 // gl2ps_ps: gl2ps producing ps
0012 // gl2ps_pdf: gl2ps producing pdf
0013 // gl2ps_svg: gl2ps producing svg
0014 // gl2ps_tex: gl2ps producing tex
0015 // gl2ps_pgf: gl2ps producing pgf
0016 // By using the zb_action (zb for zbuffer):
0017 // inzb_ps: tools::sg offscreen zbuffer put in a PostScript file.
0018 // inzb_png: zbuffer put in a png file. It needs to provide a "png_writer" function.
0019 // inzb_jpeg: zbuffer put in a jpeg file. It needs to provide a "jpeg_writer" function.
0020
0021 #include "zb_action"
0022 #include "node"
0023 #include "gl2ps_action"
0024 #include "../wps"
0025 #include "../typedefs"
0026 #include "../touplow"
0027
0028 namespace tools {
0029 namespace sg {
0030
0031 typedef bool (*png_writer)(std::ostream&,const std::string&,
0032 unsigned char*,unsigned int,unsigned int,unsigned int);
0033
0034 typedef bool (*jpeg_writer)(std::ostream&,const std::string&,
0035 unsigned char*,unsigned int,unsigned int,unsigned int,int);
0036
0037 inline bool write_paper(std::ostream& a_out,
0038 gl2ps_manager& a_gl2ps_mgr,zb_manager& a_zb_mgr,
0039 png_writer a_png_writer,jpeg_writer a_jpeg_writer,
0040 float a_back_r,float a_back_g,float a_back_b,float a_back_a,
0041 node& a_scene_graph,
0042 unsigned int a_width,unsigned int a_height,
0043 const std::string& a_file,const std::string& a__format,
0044 bool a_do_transparency,
0045 bool a_top_to_bottom,
0046 const std::string& a_opts_1,const std::string& a_opts_2) {
0047 if(!a_width || !a_height) return false;
0048 std::string a_format = a__format;
0049 tolowercase(a_format); //handle legacy.
0050 int gl2ps_format;
0051 if(gl2ps_s2format(a_format,gl2ps_format)) {
0052 int sort = -1;
0053 if(a_opts_1.size() && !gl2ps_s2sort(a_opts_1,sort)) {
0054 a_out << "tools::sg::write_paper: bad gl2ps sort " << sout(a_opts_1) << "." << std::endl;
0055 return false;
0056 }
0057 int options = -1;
0058 if(a_opts_2.size() && !gl2ps_s2options(a_opts_2,options)) {
0059 a_out << "tools::sg::write_paper: bad gl2ps options " << sout(a_opts_2) << "." << std::endl;
0060 return false;
0061 }
0062 gl2ps_action action(a_gl2ps_mgr,a_out,a_width,a_height);
0063 action.clear_color(a_back_r,a_back_g,a_back_b,a_back_a);
0064 if(!action.open(a_file,gl2ps_format,sort,options)) return false;
0065 action.set_do_transparency(false);
0066 action.set_have_to_do_transparency(false);
0067 a_scene_graph.render(action);
0068 if(!action.end()) { //check that matrices stack are ok.
0069 a_out << "tools::sg::write_paper: bad gl2ps_action end." << std::endl;
0070 action.close();
0071 return false;
0072 } else if(a_do_transparency) {
0073 if(action.have_to_do_transparency()) {
0074 action.set_do_transparency(true);
0075 a_scene_graph.render(action);
0076 if(!action.end()) { //check that matrices stack are ok.
0077 a_out << "tools::sg::write_paper: bad gl2ps_action end." << std::endl;
0078 action.close();
0079 return false;
0080 }
0081 }
0082 }
0083 action.close();
0084 return true;
0085 }
0086
0087 zb_action action(a_zb_mgr,a_out,a_width,a_height);
0088 action.clear_color_buffer(a_back_r,a_back_g,a_back_b,a_back_a);
0089 action.clear_depth_buffer();
0090 action.set_do_transparency(false);
0091 action.set_have_to_do_transparency(false);
0092 a_scene_graph.render(action);
0093 if(!action.end()) { //check that matrices stack are ok.
0094 a_out << "tools::sg::write_paper: bad zb_action end." << std::endl;
0095 return false;
0096 } else if(a_do_transparency) {
0097 if(action.have_to_do_transparency()) {
0098 action.set_do_transparency(true);
0099 a_scene_graph.render(action);
0100 if(!action.end()) { //check that matrices stack are ok.
0101 a_out << "tools::sg::write_paper: bad zb_action end." << std::endl;
0102 return false;
0103 }
0104 }
0105 }
0106
0107 if((a_format=="zb_ps")||(a_format=="inzb_ps")) {
0108 wps wps(a_out);
0109 if(!wps.open_file(a_file)) {
0110 a_out << "tools::sg::write_paper : can't open " << a_file << "." << std::endl;
0111 return false;
0112 }
0113 wps.PS_BEGIN_PAGE();
0114 wps.PS_PAGE_SCALE(float(a_width),float(a_height));
0115 wps.PS_IMAGE(a_width,a_height,wps::rgb_4,zb_action::get_rgb,&action);
0116 wps.PS_END_PAGE();
0117 wps.close_file();
0118 return true;
0119 }
0120
0121 if((a_format=="zb_png")||(a_format=="inzb_png")) {
0122 if(!a_png_writer) {
0123 a_out << "tools::sg::write_paper : no png_writer given." << std::endl;
0124 return false;
0125 }
0126
0127 std::vector<unsigned char> buffer;
0128 if(!action.get_rgbas(a_top_to_bottom,buffer)) {
0129 a_out << "tools::sg::write_paper : can't get rgba image." << std::endl;
0130 return false;
0131 }
0132
0133 if(!a_png_writer(a_out,a_file,buffer.data(),a_width,a_height,4)) {
0134 a_out << "tools::sg::write_paper : tools::png::write() failed." << std::endl;
0135 return false;
0136 }
0137 return true;
0138 }
0139
0140 if((a_format=="zb_jpeg")||(a_format=="zb_jpg")||(a_format=="inzb_jpeg")) {
0141
0142 if(!a_jpeg_writer) {
0143 a_out << "tools::sg::write_paper : no jpeg_writer given." << std::endl;
0144 return false;
0145 }
0146
0147 std::vector<unsigned char> buffer;
0148 if(!action.get_rgbs(a_top_to_bottom,buffer)) {
0149 a_out << "tools::sg::write_paper : can't get rgb image." << std::endl;
0150 return false;
0151 }
0152
0153 if(!a_jpeg_writer(a_out,a_file,buffer.data(),a_width,a_height,3,100)) {
0154 a_out << "tools::sg::write_paper : tools::jpeg::write() failed." << std::endl;
0155 return false;
0156 }
0157 return true;
0158 }
0159
0160 a_out << "tools::sg::write_paper : unknown format " << a_format << std::endl;
0161 return false;
0162 }
0163
0164 inline bool write_paper(std::ostream& a_out,
0165 gl2ps_manager& a_gl2ps_mgr,zb_manager& a_zb_mgr,
0166 png_writer a_png_writer,jpeg_writer a_jpeg_writer,
0167 const tools::colorf& a_back,
0168 node& a_scene_graph,
0169 unsigned int a_width,unsigned int a_height,
0170 const std::string& a_file,const std::string& a_format,
0171 bool a_do_transparency,bool a_top_to_bottom,
0172 const std::string& a_opts_1,const std::string& a_opts_2) {
0173 return tools::sg::write_paper(a_out,a_gl2ps_mgr,a_zb_mgr,
0174 a_png_writer,a_jpeg_writer,
0175 a_back.r(),a_back.g(),a_back.b(),a_back.a(),
0176 a_scene_graph,a_width,a_height,a_file,a_format,
0177 a_do_transparency,a_top_to_bottom,a_opts_1,a_opts_2);
0178 }
0179
0180 inline bool write_paper(std::ostream& a_out,
0181 gl2ps_manager& a_gl2ps_mgr,zb_manager& a_zb_mgr,
0182 png_writer a_png_writer,jpeg_writer a_jpeg_writer,
0183 const tools::colorf& a_back,
0184 node& a_scene_graph,
0185 unsigned int a_width,unsigned int a_height,
0186 const std::string& a_file,const std::string& a_format) {
0187 return tools::sg::write_paper(a_out,a_gl2ps_mgr,a_zb_mgr,
0188 a_png_writer,a_jpeg_writer,
0189 a_back.r(),a_back.g(),a_back.b(),a_back.a(),
0190 a_scene_graph,a_width,a_height,a_file,a_format,
0191 true,true,std::string(),std::string());
0192 }
0193
0194 }}
0195
0196 #endif