Geant4 Cross Reference |
1 // Copyright (C) 2010, Guy Barrand. All rights 1 // Copyright (C) 2010, Guy Barrand. All rights reserved. 2 // See the file tools.license for terms. 2 // See the file tools.license for terms. 3 3 4 #ifndef toolx_sg_gl 4 #ifndef toolx_sg_gl 5 #define toolx_sg_gl 5 #define toolx_sg_gl 6 6 7 #include "../OpenGL" 7 #include "../OpenGL" 8 8 9 #include <tools/platform> //for APPLE TargetCo 9 #include <tools/platform> //for APPLE TargetConditionals.h 10 #include <tools/img> 10 #include <tools/img> 11 11 12 #include <ostream> 12 #include <ostream> 13 #include <sstream> << 14 13 15 namespace toolx { 14 namespace toolx { 16 namespace sg { 15 namespace sg { 17 //namespace gl : no, problem with g4tools. 16 //namespace gl : no, problem with g4tools. 18 17 19 inline void gl_clear_errors() { 18 inline void gl_clear_errors() { 20 GLenum glerror = ::glGetError(); 19 GLenum glerror = ::glGetError(); 21 while(glerror!=GL_NO_ERROR) { 20 while(glerror!=GL_NO_ERROR) { 22 glerror = ::glGetError(); 21 glerror = ::glGetError(); 23 } 22 } 24 } 23 } 25 24 26 inline bool gl_dump_if_errors(std::ostream& a_ 25 inline bool gl_dump_if_errors(std::ostream& a_out,const std::string& a_head) { 27 bool retval = false; 26 bool retval = false; 28 GLenum glerror = ::glGetError(); 27 GLenum glerror = ::glGetError(); 29 if(glerror!=GL_NO_ERROR) { 28 if(glerror!=GL_NO_ERROR) { 30 a_out << a_head 29 a_out << a_head 31 << " we have gl errors :" 30 << " we have gl errors :" 32 << std::endl; 31 << std::endl; 33 retval = true; 32 retval = true; 34 } 33 } 35 while(glerror!=GL_NO_ERROR) { 34 while(glerror!=GL_NO_ERROR) { 36 //#define GL_NO_ERROR 35 //#define GL_NO_ERROR 0 37 //#define GL_INVALID_ENUM 36 //#define GL_INVALID_ENUM 0x0500 38 //#define GL_INVALID_VALUE 37 //#define GL_INVALID_VALUE 0x0501 39 //#define GL_INVALID_OPERATION 38 //#define GL_INVALID_OPERATION 0x0502 40 //#define GL_STACK_OVERFLOW 39 //#define GL_STACK_OVERFLOW 0x0503 41 //#define GL_STACK_UNDERFLOW 40 //#define GL_STACK_UNDERFLOW 0x0504 42 //#define GL_OUT_OF_MEMORY 41 //#define GL_OUT_OF_MEMORY 0x0505 43 42 44 //#define GL_INVALID_FRAMEBUFFER_OPERATION 43 //#define GL_INVALID_FRAMEBUFFER_OPERATION 0x0506 45 44 46 std::ostringstream oss; << 45 a_out << "0x" << std::hex << glerror << std::endl; 47 oss << "0x" << std::hex << glerror; << 48 a_out << oss.str() << std::endl; << 49 46 50 glerror = ::glGetError(); 47 glerror = ::glGetError(); 51 } 48 } 52 return retval; 49 return retval; 53 } 50 } 54 51 55 inline void gl_dump_infos(std::ostream& a_out) 52 inline void gl_dump_infos(std::ostream& a_out) { 56 std::string gl_version; 53 std::string gl_version; 57 {const char* _sv = (const char*)::glGetStri 54 {const char* _sv = (const char*)::glGetString(GL_VERSION); 58 if(_sv) gl_version = _sv;} 55 if(_sv) gl_version = _sv;} 59 56 60 std::string gl_vendor; 57 std::string gl_vendor; 61 {const char* _sv = (const char*)::glGetStri 58 {const char* _sv = (const char*)::glGetString(GL_VENDOR); 62 if(_sv) gl_vendor = _sv;} 59 if(_sv) gl_vendor = _sv;} 63 60 64 std::string gl_renderer; 61 std::string gl_renderer; 65 {const char* _sv = (const char*)::glGetStri 62 {const char* _sv = (const char*)::glGetString(GL_RENDERER); 66 if(_sv) gl_renderer = _sv;} 63 if(_sv) gl_renderer = _sv;} 67 64 68 std::string gl_extensions; 65 std::string gl_extensions; 69 {const char* _sv = (const char*)::glGetStri 66 {const char* _sv = (const char*)::glGetString(GL_EXTENSIONS); 70 if(_sv) gl_extensions = _sv;} 67 if(_sv) gl_extensions = _sv;} 71 68 72 GLint gl_texture_size; 69 GLint gl_texture_size; 73 ::glGetIntegerv(GL_MAX_TEXTURE_SIZE, &gl_t 70 ::glGetIntegerv(GL_MAX_TEXTURE_SIZE, &gl_texture_size); 74 71 75 //GLint gl_buffer_size; 72 //GLint gl_buffer_size; 76 //::glGetIntegerv(GL_BUFFER_SIZE, &gl_buff 73 //::glGetIntegerv(GL_BUFFER_SIZE, &gl_buffer_size); 77 74 78 a_out << "toolx::sg::gl::dump_infos :" << 75 a_out << "toolx::sg::gl::dump_infos :" << std::endl; 79 a_out << " GL_VERSION " << gl_version << s 76 a_out << " GL_VERSION " << gl_version << std::endl; 80 a_out << " GL_VENDOR " << gl_vendor << std 77 a_out << " GL_VENDOR " << gl_vendor << std::endl; 81 a_out << " GL_RENDERER " << gl_renderer << 78 a_out << " GL_RENDERER " << gl_renderer << std::endl; 82 a_out << " GL_EXTENSIONS " << gl_extension 79 a_out << " GL_EXTENSIONS " << gl_extensions << std::endl; 83 a_out << " GL_MAX_TEXTURE_SIZE " << gl_tex 80 a_out << " GL_MAX_TEXTURE_SIZE " << gl_texture_size << std::endl; 84 //a_out << " GL_BUFFER_SIZE " << gl_buffer 81 //a_out << " GL_BUFFER_SIZE " << gl_buffer_size << std::endl; 85 } 82 } 86 83 87 inline bool gl_tex_img(std::ostream& a_out,con 84 inline bool gl_tex_img(std::ostream& a_out,const tools::img_byte& a_img) { 88 if(a_img.bpp()==1) { 85 if(a_img.bpp()==1) { 89 //to pass eiffel-tower.png 86 //to pass eiffel-tower.png 90 #if defined(ANDROID) || TARGET_OS_IPHONE 87 #if defined(ANDROID) || TARGET_OS_IPHONE 91 tools::img_byte res; 88 tools::img_byte res; 92 if(!a_img.bw2x(3,res)) { 89 if(!a_img.bw2x(3,res)) { 93 a_out << "toolx::sg::gl::tex_img : too << 90 a_out << "toolx::sg::gl::tex_img : toolx::img.bw2x() failed." << std::endl; 94 return false; 91 return false; 95 } 92 } 96 ::glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,re 93 ::glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,res.width(),res.height(),0,GL_RGB,GL_UNSIGNED_BYTE,res.buffer()); 97 #else 94 #else 98 ::glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,a_ 95 ::glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,a_img.width(),a_img.height(),0,GL_LUMINANCE,GL_UNSIGNED_BYTE,a_img.buffer()); 99 #endif 96 #endif 100 } else if(a_img.bpp()==3) { 97 } else if(a_img.bpp()==3) { 101 ::glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,a_ 98 ::glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,a_img.width(),a_img.height(),0,GL_RGB,GL_UNSIGNED_BYTE,a_img.buffer()); 102 } else if(a_img.bpp()==4) { 99 } else if(a_img.bpp()==4) { 103 ::glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,a 100 ::glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,a_img.width(),a_img.height(),0,GL_RGBA,GL_UNSIGNED_BYTE,a_img.buffer()); 104 } else { 101 } else { 105 a_out << "toolx::sg::gl::tex_img : img.b 102 a_out << "toolx::sg::gl::tex_img : img.bpp() " << a_img.bpp() << " not treated." << std::endl; 106 return false; 103 return false; 107 } 104 } 108 return true; 105 return true; 109 } 106 } 110 107 111 }} 108 }} 112 << 113 109 114 #endif 110 #endif