<!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: simple-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>simple-mixed.cc</h1>Simple gtkglextmm 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"> * simple-mixed.cc:</span> <span class="comment"> * Simple gtkglextmm 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="a170"></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="a171"></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="a172"></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="a173"></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="a174"></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="a175"></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="a176"></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="a177"></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="a178"></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="a179"></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="a180"></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="a181"></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="a182"></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="a183"></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="a184"></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="a185"></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="a186"></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.</span> <span class="comment">//</span> <span class="comment"></span> <span class="keyword">class </span>SimpleGLScene : <span class="keyword">public</span> Gtk::DrawingArea, <span class="keyword">public</span> Gtk::GL::Widget<SimpleGLScene> { <span class="keyword">public</span>: SimpleGLScene(); <span class="keyword">virtual</span> ~SimpleGLScene(); <span class="keyword">protected</span>: <span class="keyword">virtual</span> <span class="keywordtype">void</span> on_realize(); <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); }; SimpleGLScene::SimpleGLScene() { <span class="comment">//</span> <span class="comment">// Configure OpenGL-capable visual.</span> <span class="comment">//</span> Glib::RefPtr<Gdk::GL::Config> glconfig; <span class="comment">// Try single-buffered visual</span> glconfig = <a name="a187"></a><a class="code" href="classGdk_1_1GL_1_1Config.html#e0">Gdk::GL::Config::create</a>(<a name="a188"></a><a class="code" href="group__gdkmm__glEnums.html#gga35a0">Gdk::GL::MODE_RGB</a> | <a name="a189"></a><a class="code" href="group__gdkmm__glEnums.html#gga35a7">Gdk::GL::MODE_DEPTH</a> | <a name="a190"></a><a class="code" href="group__gdkmm__glEnums.html#gga35a3">Gdk::GL::MODE_SINGLE</a>); <span class="keywordflow">if</span> (!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(glconfig); <span class="comment">//</span> <span class="comment">// Set OpenGL-capability to the widget.</span> <span class="comment">//</span> set_gl_capability(glconfig); } SimpleGLScene::~SimpleGLScene() { } <span class="keywordtype">void</span> SimpleGLScene::on_realize() { <span class="comment">// We need to call the base on_realize()</span> Gtk::DrawingArea::on_realize(); <span class="comment">//</span> <span class="comment">// Get GL::Window.</span> <span class="comment">//</span> Glib::RefPtr<Gdk::GL::Window> glwindow = get_gl_window(); <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> (!glwindow->gl_begin(get_gl_context())) <span class="keywordflow">return</span>; 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); glwindow->gl_end(); <span class="comment">// *** OpenGL END ***</span> } <span class="keywordtype">bool</span> SimpleGLScene::on_configure_event(GdkEventConfigure* event) { <span class="comment">//</span> <span class="comment">// Get GL::Window.</span> <span class="comment">//</span> Glib::RefPtr<Gdk::GL::Window> glwindow = get_gl_window(); <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> (!glwindow->gl_begin(get_gl_context())) <span class="keywordflow">return</span> <span class="keyword">false</span>; glViewport(0, 0, get_width(), get_height()); glwindow->gl_end(); <span class="comment">// *** OpenGL END ***</span> <span class="keywordflow">return</span> <span class="keyword">true</span>; } <span class="keywordtype">bool</span> SimpleGLScene::on_expose_event(GdkEventExpose* event) { <span class="comment">//</span> <span class="comment">// Get GL::Window.</span> <span class="comment">//</span> Glib::RefPtr<Gdk::GL::Window> glwindow = get_gl_window(); <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> (!glwindow->gl_begin(get_gl_context())) <span class="keywordflow">return</span> <span class="keyword">false</span>; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); <span class="comment">// Sync.</span> glwindow->wait_gl(); <span class="comment">// GDK rendering.</span> glwindow->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> glwindow->wait_gdk(); glCallList(1); glFlush(); glwindow->gl_end(); <span class="comment">// *** OpenGL END ***</span> <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>Simple : <span class="keyword">public</span> Gtk::Window { <span class="keyword">public</span>: Simple(); <span class="keyword">virtual</span> ~Simple(); <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; SimpleGLScene m_SimpleGLScene; Gtk::Button m_ButtonQuit; }; Simple::Simple() : 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">"Simple"</span>); <span class="comment">// Get automatically redrawn if any of their children changed allocation.</span> set_reallocate_redraws(<span class="keyword">true</span>); add(m_VBox); <span class="comment">//</span> <span class="comment">// Simple OpenGL scene.</span> <span class="comment">//</span> m_SimpleGLScene.set_size_request(200, 200); m_VBox.pack_start(m_SimpleGLScene); <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>, &Simple::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(); } Simple::~Simple() {} <span class="keywordtype">void</span> Simple::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="a191"></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="a192"></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> Simple simple; kit.run(simple); <span class="keywordflow">return</span> 0; } </pre></div> <hr size="1"><address style="align: right;"><small>Generated on Mon Feb 27 18:46:53 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>