<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> <title>gtkglextmm: pixmap-mixed.cc</title> <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> <!-- Generated by Doxygen 1.4.4 --> <div class="qindex"><a class="qindex" href="index.html">Main Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="namespaces.html">Namespace List</a> | <a class="qindex" href="hierarchy.html">Class Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical List</a> | <a class="qindex" href="annotated.html">Class List</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="namespacemembers.html">Namespace Members</a> | <a class="qindex" href="functions.html">Class Members</a> | <a class="qindex" href="globals.html">File Members</a> | <a class="qindex" href="examples.html">Examples</a></div> <h1>pixmap-mixed.cc</h1>Simple offscreen rendering example for mixing OpenGL and GDK rendering.<p> <div class="fragment"><pre class="fragment"><span class="comment">// -*- C++ -*-</span> <span class="comment">/*</span> <span class="comment"> * pixmap-mixed.cc:</span> <span class="comment"> * Simple off-screen rendering example for mixing OpenGL and GDK rendering.</span> <span class="comment"> *</span> <span class="comment"> * written by Naofumi Yasufuku <naofumi@users.sourceforge.net></span> <span class="comment"> */</span> <span class="preprocessor">#include <iostream></span> <span class="preprocessor">#include <cstdlib></span> <span class="preprocessor">#include <gtkmm.h></span> <span class="preprocessor">#include <<a class="code" href="gtkglmm_8h.html">gtkglmm.h</a>></span> <span class="preprocessor">#ifdef G_OS_WIN32</span> <span class="preprocessor"></span><span class="preprocessor">#define WIN32_LEAN_AND_MEAN 1</span> <span class="preprocessor"></span><span class="preprocessor">#include <windows.h></span> <span class="preprocessor">#endif</span> <span class="preprocessor"></span> <span class="preprocessor">#include <GL/gl.h></span> <span class="preprocessor">#include <GL/glu.h></span> <span class="comment">//</span> <span class="comment">// OpenGL frame buffer configuration utilities.</span> <span class="comment">//</span> <span class="comment"></span> <span class="keyword">struct </span>GLConfigUtil { <span class="keyword">static</span> <span class="keywordtype">void</span> print_gl_attrib(<span class="keyword">const</span> Glib::RefPtr<const Gdk::GL::Config>& glconfig, <span class="keyword">const</span> <span class="keywordtype">char</span>* attrib_str, <span class="keywordtype">int</span> attrib, <span class="keywordtype">bool</span> is_boolean); <span class="keyword">static</span> <span class="keywordtype">void</span> examine_gl_attrib(<span class="keyword">const</span> Glib::RefPtr<const Gdk::GL::Config>& glconfig); }; <span class="comment">//</span> <span class="comment">// Print a configuration attribute.</span> <span class="comment">//</span> <span class="keywordtype">void</span> GLConfigUtil::print_gl_attrib(<span class="keyword">const</span> Glib::RefPtr<const Gdk::GL::Config>& glconfig, <span class="keyword">const</span> <span class="keywordtype">char</span>* attrib_str, <span class="keywordtype">int</span> attrib, <span class="keywordtype">bool</span> is_boolean) { <span class="keywordtype">int</span> value; <span class="keywordflow">if</span> (glconfig->get_attrib(attrib, value)) { std::cout << attrib_str << <span class="stringliteral">" = "</span>; <span class="keywordflow">if</span> (is_boolean) std::cout << (value == <span class="keyword">true</span> ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>) << std::endl; <span class="keywordflow">else</span> std::cout << value << std::endl; } <span class="keywordflow">else</span> { std::cout << <span class="stringliteral">"*** Cannot get "</span> << attrib_str << <span class="stringliteral">" attribute value\n"</span>; } } <span class="comment">//</span> <span class="comment">// Print configuration attributes.</span> <span class="comment">//</span> <span class="keywordtype">void</span> GLConfigUtil::examine_gl_attrib(<span class="keyword">const</span> Glib::RefPtr<const Gdk::GL::Config>& glconfig) { std::cout << <span class="stringliteral">"\nOpenGL visual configurations :\n\n"</span>; std::cout << <span class="stringliteral">"glconfig->is_rgba() = "</span> << (glconfig->is_rgba() ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>) << std::endl; std::cout << <span class="stringliteral">"glconfig->is_double_buffered() = "</span> << (glconfig->is_double_buffered() ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>) << std::endl; std::cout << <span class="stringliteral">"glconfig->is_stereo() = "</span> << (glconfig->is_stereo() ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>) << std::endl; std::cout << <span class="stringliteral">"glconfig->has_alpha() = "</span> << (glconfig->has_alpha() ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>) << std::endl; std::cout << <span class="stringliteral">"glconfig->has_depth_buffer() = "</span> << (glconfig->has_depth_buffer() ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>) << std::endl; std::cout << <span class="stringliteral">"glconfig->has_stencil_buffer() = "</span> << (glconfig->has_stencil_buffer() ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>) << std::endl; std::cout << <span class="stringliteral">"glconfig->has_accum_buffer() = "</span> << (glconfig->has_accum_buffer() ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>) << std::endl; std::cout << std::endl; print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::USE_GL"</span>, <a name="a69"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a15">Gdk::GL::USE_GL</a>, <span class="keyword">true</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::BUFFER_SIZE"</span>, <a name="a70"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a16">Gdk::GL::BUFFER_SIZE</a>, <span class="keyword">false</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::LEVEL"</span>, <a name="a71"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a17">Gdk::GL::LEVEL</a>, <span class="keyword">false</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::RGBA"</span>, <a name="a72"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a18">Gdk::GL::RGBA</a>, <span class="keyword">true</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::DOUBLEBUFFER"</span>, <a name="a73"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a19">Gdk::GL::DOUBLEBUFFER</a>, <span class="keyword">true</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::STEREO"</span>, <a name="a74"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a20">Gdk::GL::STEREO</a>, <span class="keyword">true</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::AUX_BUFFERS"</span>, <a name="a75"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a21">Gdk::GL::AUX_BUFFERS</a>, <span class="keyword">false</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::RED_SIZE"</span>, <a name="a76"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a22">Gdk::GL::RED_SIZE</a>, <span class="keyword">false</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::GREEN_SIZE"</span>, <a name="a77"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a23">Gdk::GL::GREEN_SIZE</a>, <span class="keyword">false</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::BLUE_SIZE"</span>, <a name="a78"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a24">Gdk::GL::BLUE_SIZE</a>, <span class="keyword">false</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::ALPHA_SIZE"</span>, <a name="a79"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a25">Gdk::GL::ALPHA_SIZE</a>, <span class="keyword">false</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::DEPTH_SIZE"</span>, <a name="a80"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a26">Gdk::GL::DEPTH_SIZE</a>, <span class="keyword">false</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::STENCIL_SIZE"</span>, <a name="a81"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a27">Gdk::GL::STENCIL_SIZE</a>, <span class="keyword">false</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::ACCUM_RED_SIZE"</span>, <a name="a82"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a28">Gdk::GL::ACCUM_RED_SIZE</a>, <span class="keyword">false</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::ACCUM_GREEN_SIZE"</span>, <a name="a83"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a29">Gdk::GL::ACCUM_GREEN_SIZE</a>, <span class="keyword">false</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::ACCUM_BLUE_SIZE"</span>, <a name="a84"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a30">Gdk::GL::ACCUM_BLUE_SIZE</a>, <span class="keyword">false</span>); print_gl_attrib(glconfig, <span class="stringliteral">"Gdk::GL::ACCUM_ALPHA_SIZE"</span>, <a name="a85"></a><a class="code" href="group__gdkmm__glEnums.html#gga36a31">Gdk::GL::ACCUM_ALPHA_SIZE</a>, <span class="keyword">false</span>); std::cout << std::endl; } <span class="comment">//</span> <span class="comment">// Simple OpenGL scene using GL::Pixmap.</span> <span class="comment">//</span> <span class="comment"></span> <span class="keyword">class </span>PixmapGLScene : <span class="keyword">public</span> Gtk::DrawingArea { <span class="keyword">public</span>: PixmapGLScene(); <span class="keyword">virtual</span> ~PixmapGLScene(); <span class="keyword">protected</span>: <span class="comment">// init OpenGL context</span> <span class="keywordtype">void</span> init_gl(); <span class="keyword">protected</span>: <span class="keyword">virtual</span> <span class="keywordtype">bool</span> on_configure_event(GdkEventConfigure* event); <span class="keyword">virtual</span> <span class="keywordtype">bool</span> on_expose_event(GdkEventExpose* event); <span class="keyword">protected</span>: <span class="comment">// OpenGL rendering stuff:</span> Glib::RefPtr<Gdk::GL::Config> m_GLConfig; Glib::RefPtr<Gdk::GL::Context> m_GLContext; Glib::RefPtr<Gdk::Pixmap> m_Pixmap; }; PixmapGLScene::PixmapGLScene() : m_GLConfig(0), m_GLContext(0), m_Pixmap(0) { <span class="comment">//</span> <span class="comment">// Configure OpenGL-capable visual.</span> <span class="comment">//</span> <span class="comment">// Try single-buffered visual</span> m_GLConfig = <a name="a86"></a><a class="code" href="classGdk_1_1GL_1_1Config.html#e0">Gdk::GL::Config::create</a>(<a name="a87"></a><a class="code" href="group__gdkmm__glEnums.html#gga35a0">Gdk::GL::MODE_RGB</a> | <a name="a88"></a><a class="code" href="group__gdkmm__glEnums.html#gga35a7">Gdk::GL::MODE_DEPTH</a> | <a name="a89"></a><a class="code" href="group__gdkmm__glEnums.html#gga35a3">Gdk::GL::MODE_SINGLE</a>); <span class="keywordflow">if</span> (!m_GLConfig) { std::cerr << <span class="stringliteral">"*** Cannot find any OpenGL-capable visual.\n"</span>; std::exit(1); } <span class="comment">// print frame buffer attributes.</span> GLConfigUtil::examine_gl_attrib(m_GLConfig); <span class="comment">//</span> <span class="comment">// Set OpenGL-capable colormap.</span> <span class="comment">//</span> set_colormap(m_GLConfig->get_colormap()); } PixmapGLScene::~PixmapGLScene() { } <span class="keywordtype">void</span> PixmapGLScene::init_gl() { GLUquadricObj* qobj = gluNewQuadric(); gluQuadricDrawStyle(qobj, GLU_FILL); glNewList(1, GL_COMPILE); gluSphere(qobj, 1.0, 20, 20); glEndList(); <span class="keyword">static</span> GLfloat light_diffuse[] = {1.0, 0.0, 0.0, 1.0}; <span class="keyword">static</span> GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0}; glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); glLightfv(GL_LIGHT0, GL_POSITION, light_position); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST); glClearColor(1.0, 1.0, 1.0, 1.0); glClearDepth(1.0); glViewport(0, 0, get_width(), get_height()); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(40.0, 1.0, 1.0, 10.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0.0, 0.0, 3.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glTranslatef(0.0, 0.0, -3.0); } <span class="keywordtype">bool</span> PixmapGLScene::on_configure_event(GdkEventConfigure* event) { <span class="comment">//</span> <span class="comment">// Create an OpenGL off-screen rendering area.</span> <span class="comment">//</span> m_Pixmap = Gdk::Pixmap::create(get_window(), get_width(), get_height(), m_GLConfig->get_depth()); <span class="comment">//</span> <span class="comment">// Set OpenGL-capability to the pixmap (invoke extension method).</span> <span class="comment">//</span> Glib::RefPtr<Gdk::GL::Pixmap> glpixmap = <a name="a90"></a><a class="code" href="namespaceGdk_1_1GL.html#a112">Gdk::GL::ext</a>(m_Pixmap).set_gl_capability(m_GLConfig); <span class="comment">//</span> <span class="comment">// Create OpenGL rendering context (not direct).</span> <span class="comment">//</span> <span class="keywordflow">if</span> (!m_GLContext) m_GLContext = <a name="a91"></a><a class="code" href="classGdk_1_1GL_1_1Context.html#e0">Gdk::GL::Context::create</a>(glpixmap, <span class="keyword">false</span>); <span class="comment">//</span> <span class="comment">// GL calls.</span> <span class="comment">//</span> <span class="comment">// *** OpenGL BEGIN ***</span> <span class="keywordflow">if</span> (!glpixmap->gl_begin(m_GLContext)) <span class="keywordflow">return</span> <span class="keyword">false</span>; <span class="keyword">static</span> <span class="keywordtype">bool</span> is_initialized = <span class="keyword">false</span>; <span class="keywordflow">if</span> (!is_initialized) { init_gl(); is_initialized = <span class="keyword">true</span>; } glViewport(0, 0, get_width(), get_height()); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); <span class="comment">// Sync.</span> glpixmap->wait_gl(); <span class="comment">// GDK rendering.</span> glpixmap->draw_rectangle(get_style()->get_fg_gc(get_state()), <span class="keyword">true</span>, get_width()/10, get_height()/10, get_width()*8/10, get_height()*8/10); <span class="comment">// Sync.</span> glpixmap->wait_gdk(); glCallList(1); glFlush(); glpixmap->gl_end(); <span class="comment">// *** OpenGL END ***</span> <span class="keywordflow">return</span> <span class="keyword">true</span>; } <span class="keywordtype">bool</span> PixmapGLScene::on_expose_event(GdkEventExpose* event) { <span class="keywordflow">if</span> (!m_Pixmap) <span class="keywordflow">return</span> <span class="keyword">false</span>; get_window()->draw_drawable(get_style()->get_fg_gc(get_state()), m_Pixmap, event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height); <span class="keywordflow">return</span> <span class="keyword">true</span>; } <span class="comment">//</span> <span class="comment">// The application class.</span> <span class="comment">//</span> <span class="comment"></span> <span class="keyword">class </span>Pixmap : <span class="keyword">public</span> Gtk::Window { <span class="keyword">public</span>: Pixmap(); <span class="keyword">virtual</span> ~Pixmap(); <span class="keyword">protected</span>: <span class="comment">// signal handlers:</span> <span class="keywordtype">void</span> on_button_quit_clicked(); <span class="keyword">protected</span>: <span class="comment">// member widgets:</span> Gtk::VBox m_VBox; PixmapGLScene m_PixmapGLScene; Gtk::Button m_ButtonQuit; }; Pixmap::Pixmap() : m_VBox(false, 0), m_ButtonQuit(<span class="stringliteral">"Quit"</span>) { <span class="comment">//</span> <span class="comment">// Top-level window.</span> <span class="comment">//</span> set_title(<span class="stringliteral">"Pixmap"</span>); add(m_VBox); <span class="comment">//</span> <span class="comment">// Simple OpenGL scene using GL::Pixmap.</span> <span class="comment">//</span> m_PixmapGLScene.set_size_request(200, 200); m_VBox.pack_start(m_PixmapGLScene); <span class="comment">//</span> <span class="comment">// Simple quit button.</span> <span class="comment">//</span> m_ButtonQuit.signal_clicked().connect( sigc::mem_fun(*<span class="keyword">this</span>, &Pixmap::on_button_quit_clicked)); m_VBox.pack_start(m_ButtonQuit, Gtk::PACK_SHRINK, 0); <span class="comment">//</span> <span class="comment">// Show window.</span> <span class="comment">//</span> show_all(); } Pixmap::~Pixmap() {} <span class="keywordtype">void</span> Pixmap::on_button_quit_clicked() { Gtk::Main::quit(); } <span class="comment">//</span> <span class="comment">// Main.</span> <span class="comment">//</span> <span class="comment"></span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span>** argv) { Gtk::Main kit(argc, argv); <span class="comment">//</span> <span class="comment">// Init gtkglextmm.</span> <span class="comment">//</span> <a name="a92"></a><a class="code" href="namespaceGtk_1_1GL.html#a2">Gtk::GL::init</a>(argc, argv); <span class="comment">//</span> <span class="comment">// Query OpenGL extension version.</span> <span class="comment">//</span> <span class="keywordtype">int</span> major, minor; <a name="a93"></a><a class="code" href="namespaceGdk_1_1GL.html#a116">Gdk::GL::query_version</a>(major, minor); std::cout << <span class="stringliteral">"OpenGL extension version - "</span> << major << <span class="stringliteral">"."</span> << minor << std::endl; <span class="comment">//</span> <span class="comment">// Instantiate and run the application.</span> <span class="comment">//</span> Pixmap pixmap; kit.run(pixmap); <span class="keywordflow">return</span> 0; } </pre></div> <hr size="1"><address style="align: right;"><small>Generated on Mon Feb 27 18:46:52 2006 for gtkglextmm by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.4 </small></address> </body> </html>