<!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: gears.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>gears.cc</h1>3-D gear wheels demo.<p> <div class="fragment"><pre class="fragment"><span class="comment">// -*- C++ -*-</span> <span class="comment">/*</span> <span class="comment"> * 3-D gear wheels. This program is in the public domain.</span> <span class="comment"> *</span> <span class="comment"> * Brian Paul</span> <span class="comment"> */</span> <span class="comment">/* Conversion to gtkglextmm by Naofumi Yasufuku */</span> <span class="preprocessor">#include <iostream></span> <span class="preprocessor">#include <cstdlib></span> <span class="preprocessor">#include <cmath></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="a24"></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="a25"></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="a26"></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="a27"></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="a28"></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="a29"></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="a30"></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="a31"></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="a32"></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="a33"></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="a34"></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="a35"></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="a36"></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="a37"></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="a38"></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="a39"></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="a40"></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">// Gears scene.</span> <span class="comment">//</span> <span class="comment"></span> <span class="keyword">class </span>GearsScene : <span class="keyword">public</span> Gtk::GL::DrawingArea { <span class="keyword">public</span>: <span class="keyword">explicit</span> GearsScene(<span class="keywordtype">bool</span> is_sync = <span class="keyword">true</span>); <span class="keyword">virtual</span> ~GearsScene(); <span class="keyword">protected</span>: <span class="keywordtype">void</span> gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width, GLint teeth, GLfloat tooth_depth); <span class="keyword">protected</span>: <span class="comment">// signal handlers:</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); <span class="keyword">virtual</span> <span class="keywordtype">bool</span> on_map_event(GdkEventAny* event); <span class="keyword">virtual</span> <span class="keywordtype">bool</span> on_unmap_event(GdkEventAny* event); <span class="keyword">virtual</span> <span class="keywordtype">bool</span> on_visibility_notify_event(GdkEventVisibility* event); <span class="keyword">virtual</span> <span class="keywordtype">bool</span> on_idle(); <span class="keyword">public</span>: <span class="comment">// Invalidate whole window.</span> <span class="keywordtype">void</span> invalidate() { get_window()->invalidate_rect(get_allocation(), <span class="keyword">false</span>); } <span class="comment">// Update window synchronously (fast).</span> <span class="keywordtype">void</span> update() { get_window()->process_updates(<span class="keyword">false</span>); } <span class="keyword">protected</span>: <span class="comment">// idle signal connection:</span> sigc::connection m_ConnectionIdle; <span class="keyword">public</span>: <span class="comment">// get & set view rotation values.</span> <span class="keywordtype">void</span> get_view_rot(GLfloat& x, GLfloat& y, GLfloat& z) { x = m_ViewRotX; y = m_ViewRotY; z = m_ViewRotZ; } <span class="keywordtype">void</span> set_view_rot(GLfloat x, GLfloat y, GLfloat z) { m_ViewRotX = x; m_ViewRotY = y; m_ViewRotZ = z; } <span class="keyword">protected</span>: <span class="comment">// OpenGL scene related variables:</span> GLint m_Gear1; GLint m_Gear2; GLint m_Gear3; GLfloat m_ViewRotX; GLfloat m_ViewRotY; GLfloat m_ViewRotZ; GLfloat m_Angle; <span class="keywordtype">bool</span> m_IsSync; <span class="keyword">protected</span>: <span class="comment">// frame rate evaluation stuff:</span> Glib::Timer m_Timer; <span class="keywordtype">int</span> m_Frames; }; GearsScene::GearsScene(<span class="keywordtype">bool</span> is_sync) : m_Gear1(0), m_Gear2(0), m_Gear3(0), m_ViewRotX(20.0), m_ViewRotY(30.0), m_ViewRotZ(0.0), m_Angle(0.0), m_IsSync(is_sync), m_Frames(0) { <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 double-buffered visual</span> glconfig = <a name="a41"></a><a class="code" href="classGdk_1_1GL_1_1Config.html#e0">Gdk::GL::Config::create</a>(<a name="a42"></a><a class="code" href="group__gdkmm__glEnums.html#gga35a0">Gdk::GL::MODE_RGB</a> | <a name="a43"></a><a class="code" href="group__gdkmm__glEnums.html#gga35a7">Gdk::GL::MODE_DEPTH</a> | <a name="a44"></a><a class="code" href="group__gdkmm__glEnums.html#gga35a4">Gdk::GL::MODE_DOUBLE</a>); <span class="keywordflow">if</span> (!glconfig) { std::cerr << <span class="stringliteral">"*** Cannot find the double-buffered visual.\n"</span> << <span class="stringliteral">"*** Trying single-buffered visual.\n"</span>; <span class="comment">// Try single-buffered visual</span> glconfig = <a class="code" href="classGdk_1_1GL_1_1Config.html#e0">Gdk::GL::Config::create</a>(<a class="code" href="group__gdkmm__glEnums.html#gga35a0">Gdk::GL::MODE_RGB</a> | <a class="code" href="group__gdkmm__glEnums.html#gga35a7">Gdk::GL::MODE_DEPTH</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); <span class="comment">// Add events.</span> add_events(Gdk::VISIBILITY_NOTIFY_MASK); } GearsScene::~GearsScene() { } <span class="comment">/*</span> <span class="comment"> * Draw a gear wheel. You'll probably want to call this function when</span> <span class="comment"> * building a display list since we do a lot of trig here.</span> <span class="comment"> *</span> <span class="comment"> * Input: inner_radius - radius of hole at center</span> <span class="comment"> * outer_radius - radius at center of teeth</span> <span class="comment"> * width - width of gear</span> <span class="comment"> * teeth - number of teeth</span> <span class="comment"> * tooth_depth - depth of tooth</span> <span class="comment"> */</span> <span class="keywordtype">void</span> GearsScene::gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width, GLint teeth, GLfloat tooth_depth) { GLint i; GLfloat r0, r1, r2; GLfloat angle, da; GLfloat u, v, len; r0 = inner_radius; r1 = outer_radius - tooth_depth / 2.0; r2 = outer_radius + tooth_depth / 2.0; da = 2.0 * G_PI / teeth / 4.0; glShadeModel(GL_FLAT); glNormal3f(0.0, 0.0, 1.0); <span class="comment">/* draw front face */</span> glBegin(GL_QUAD_STRIP); <span class="keywordflow">for</span> (i = 0; i <= teeth; i++) { angle = i * 2.0 * G_PI / teeth; glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5); glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5); <span class="keywordflow">if</span> (i < teeth) { glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5); glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5); } } glEnd(); <span class="comment">/* draw front sides of teeth */</span> glBegin(GL_QUADS); da = 2.0 * G_PI / teeth / 4.0; <span class="keywordflow">for</span> (i = 0; i < teeth; i++) { angle = i * 2.0 * G_PI / teeth; glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5); glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5); glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5); glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5); } glEnd(); glNormal3f(0.0, 0.0, -1.0); <span class="comment">/* draw back face */</span> glBegin(GL_QUAD_STRIP); <span class="keywordflow">for</span> (i = 0; i <= teeth; i++) { angle = i * 2.0 * G_PI / teeth; glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5); glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5); <span class="keywordflow">if</span> (i < teeth) { glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5); glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5); } } glEnd(); <span class="comment">/* draw back sides of teeth */</span> glBegin(GL_QUADS); da = 2.0 * G_PI / teeth / 4.0; <span class="keywordflow">for</span> (i = 0; i < teeth; i++) { angle = i * 2.0 * G_PI / teeth; glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5); glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5); glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5); glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5); } glEnd(); <span class="comment">/* draw outward faces of teeth */</span> glBegin(GL_QUAD_STRIP); <span class="keywordflow">for</span> (i = 0; i < teeth; i++) { angle = i * 2.0 * G_PI / teeth; glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5); glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5); u = r2 * cos(angle + da) - r1 * cos(angle); v = r2 * sin(angle + da) - r1 * sin(angle); len = sqrt(u * u + v * v); u /= len; v /= len; glNormal3f(v, -u, 0.0); glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5); glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5); glNormal3f(cos(angle), sin(angle), 0.0); glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5); glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5); u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da); v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da); glNormal3f(v, -u, 0.0); glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5); glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5); glNormal3f(cos(angle), sin(angle), 0.0); } glVertex3f(r1 * cos(0), r1 * sin(0), width * 0.5); glVertex3f(r1 * cos(0), r1 * sin(0), -width * 0.5); glEnd(); glShadeModel(GL_SMOOTH); <span class="comment">/* draw inside radius cylinder */</span> glBegin(GL_QUAD_STRIP); <span class="keywordflow">for</span> (i = 0; i <= teeth; i++) { angle = i * 2.0 * G_PI / teeth; glNormal3f(-cos(angle), -sin(angle), 0.0); glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5); glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5); } glEnd(); } <span class="keywordtype">void</span> GearsScene::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::Drawable.</span> <span class="comment">//</span> Glib::RefPtr<Gdk::GL::Drawable> gldrawable = get_gl_drawable(); <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> (!gldrawable->gl_begin(get_gl_context())) <span class="keywordflow">return</span>; <span class="keyword">static</span> GLfloat pos[4] = {5.0, 5.0, 10.0, 0.0}; <span class="keyword">static</span> GLfloat red[4] = {0.8, 0.1, 0.0, 1.0}; <span class="keyword">static</span> GLfloat green[4] = {0.0, 0.8, 0.2, 1.0}; <span class="keyword">static</span> GLfloat blue[4] = {0.2, 0.2, 1.0, 1.0}; glLightfv(GL_LIGHT0, GL_POSITION, pos); glEnable(GL_CULL_FACE); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST); <span class="comment">// Make the gears.</span> m_Gear1 = glGenLists(1); glNewList(m_Gear1, GL_COMPILE); glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red); gear(1.0, 4.0, 1.0, 20, 0.7); glEndList(); m_Gear2 = glGenLists(1); glNewList(m_Gear2, GL_COMPILE); glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green); gear(0.5, 2.0, 2.0, 10, 0.7); glEndList(); m_Gear3 = glGenLists(1); glNewList(m_Gear3, GL_COMPILE); glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue); gear(1.3, 2.0, 0.5, 10, 0.7); glEndList(); glEnable(GL_NORMALIZE); std::cout << <span class="stringliteral">"GL_RENDERER = "</span> << glGetString(GL_RENDERER) << std::endl; std::cout << <span class="stringliteral">"GL_VERSION = "</span> << glGetString(GL_VERSION) << std::endl; std::cout << <span class="stringliteral">"GL_VENDOR = "</span> << glGetString(GL_VENDOR) << std::endl; std::cout << <span class="stringliteral">"GL_EXTENSIONS = "</span> << glGetString(GL_EXTENSIONS) << std::endl; std::cout << std::endl; gldrawable->gl_end(); <span class="comment">// *** OpenGL END ***</span> <span class="comment">// Start timer.</span> m_Timer.start(); } <span class="keywordtype">bool</span> GearsScene::on_configure_event(GdkEventConfigure* event) { <span class="comment">//</span> <span class="comment">// Get GL::Drawable.</span> <span class="comment">//</span> Glib::RefPtr<Gdk::GL::Drawable> gldrawable = get_gl_drawable(); <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> (!gldrawable->gl_begin(get_gl_context())) <span class="keywordflow">return</span> <span class="keyword">false</span>; GLfloat h = (GLfloat)(get_height()) / (GLfloat)(get_width()); glViewport(0, 0, get_width(), get_height()); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(-1.0, 1.0, -h, h, 5.0, 60.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0, 0.0, -40.0); gldrawable->gl_end(); <span class="comment">// *** OpenGL END ***</span> <span class="keywordflow">return</span> <span class="keyword">true</span>; } <span class="keywordtype">bool</span> GearsScene::on_expose_event(GdkEventExpose* event) { <span class="comment">//</span> <span class="comment">// Get GL::Drawable.</span> <span class="comment">//</span> Glib::RefPtr<Gdk::GL::Drawable> gldrawable = get_gl_drawable(); <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> (!gldrawable->gl_begin(get_gl_context())) <span class="keywordflow">return</span> <span class="keyword">false</span>; glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glRotatef(m_ViewRotX, 1.0, 0.0, 0.0); glRotatef(m_ViewRotY, 0.0, 1.0, 0.0); glRotatef(m_ViewRotZ, 0.0, 0.0, 1.0); glPushMatrix(); glTranslatef(-3.0, -2.0, 0.0); glRotatef(m_Angle, 0.0, 0.0, 1.0); glCallList(m_Gear1); glPopMatrix(); glPushMatrix(); glTranslatef(3.1, -2.0, 0.0); glRotatef(-2.0 * m_Angle - 9.0, 0.0, 0.0, 1.0); glCallList(m_Gear2); glPopMatrix(); glPushMatrix(); glTranslatef(-3.1, 4.2, 0.0); glRotatef(-2.0 * m_Angle - 25.0, 0.0, 0.0, 1.0); glCallList(m_Gear3); glPopMatrix(); glPopMatrix(); <span class="comment">// Swap buffers.</span> <span class="keywordflow">if</span> (gldrawable->is_double_buffered()) gldrawable->swap_buffers(); <span class="keywordflow">else</span> glFlush(); gldrawable->gl_end(); <span class="comment">// *** OpenGL END ***</span> <span class="comment">//</span> <span class="comment">// Print frame rate.</span> <span class="comment">//</span> ++m_Frames; <span class="keywordtype">double</span> seconds = m_Timer.elapsed(); <span class="keywordflow">if</span> (seconds >= 5.0) { <span class="comment">// std::cout.setf(std::ios_base::fixed, std::ios_base::floatfield);</span> std::cout.setf(std::ios::fixed, std::ios::floatfield); std::cout.precision(3); std::cout << m_Frames << <span class="stringliteral">" frames in "</span> << seconds << <span class="stringliteral">" seconds = "</span> << (m_Frames / seconds) << <span class="stringliteral">" FPS\n"</span>; m_Timer.reset(); m_Frames = 0; } <span class="keywordflow">return</span> <span class="keyword">true</span>; } <span class="keywordtype">bool</span> GearsScene::on_map_event(GdkEventAny* event) { <span class="keywordflow">if</span> (!m_ConnectionIdle.connected()) m_ConnectionIdle = Glib::signal_idle().connect( sigc::mem_fun(*<span class="keyword">this</span>, &GearsScene::on_idle), GDK_PRIORITY_REDRAW); <span class="keywordflow">return</span> <span class="keyword">true</span>; } <span class="keywordtype">bool</span> GearsScene::on_unmap_event(GdkEventAny* event) { <span class="keywordflow">if</span> (m_ConnectionIdle.connected()) m_ConnectionIdle.disconnect(); <span class="keywordflow">return</span> <span class="keyword">true</span>; } <span class="keywordtype">bool</span> GearsScene::on_visibility_notify_event(GdkEventVisibility* event) { <span class="keywordflow">if</span> (event->state == GDK_VISIBILITY_FULLY_OBSCURED) { <span class="keywordflow">if</span> (m_ConnectionIdle.connected()) m_ConnectionIdle.disconnect(); } <span class="keywordflow">else</span> { <span class="keywordflow">if</span> (!m_ConnectionIdle.connected()) m_ConnectionIdle = Glib::signal_idle().connect( sigc::mem_fun(*<span class="keyword">this</span>, &GearsScene::on_idle), GDK_PRIORITY_REDRAW); } <span class="keywordflow">return</span> <span class="keyword">true</span>; } <span class="keywordtype">bool</span> GearsScene::on_idle() { m_Angle += 2.0; <span class="comment">// Invalidate the whole window.</span> invalidate(); <span class="comment">// Update window synchronously (fast).</span> <span class="keywordflow">if</span> (m_IsSync) update(); <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>Gears : <span class="keyword">public</span> Gtk::Window { <span class="keyword">public</span>: <span class="keyword">explicit</span> Gears(<span class="keywordtype">bool</span> is_sync = <span class="keyword">true</span>); <span class="keyword">virtual</span> ~Gears(); <span class="keyword">protected</span>: <span class="comment">// signal handlers:</span> <span class="keywordtype">void</span> on_button_quit_clicked(); <span class="keyword">virtual</span> <span class="keywordtype">bool</span> on_key_press_event(GdkEventKey* event); <span class="keyword">protected</span>: <span class="comment">// member widgets:</span> Gtk::VBox m_VBox; GearsScene m_GearsScene; Gtk::Button m_ButtonQuit; }; Gears::Gears(<span class="keywordtype">bool</span> is_sync) : m_VBox(false, 0), m_GearsScene(is_sync), 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">"Gears"</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">// Gears scene.</span> <span class="comment">//</span> m_GearsScene.set_size_request(300, 300); m_VBox.pack_start(m_GearsScene); <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>, &Gears::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(); } Gears::~Gears() { } <span class="keywordtype">void</span> Gears::on_button_quit_clicked() { Gtk::Main::quit(); } <span class="keywordtype">bool</span> Gears::on_key_press_event(GdkEventKey* event) { GLfloat x, y, z; m_GearsScene.get_view_rot(x, y, z); <span class="keywordflow">switch</span> (event->keyval) { <span class="keywordflow">case</span> GDK_z: z += 5.0; <span class="keywordflow">break</span>; <span class="keywordflow">case</span> GDK_Z: z -= 5.0; <span class="keywordflow">break</span>; <span class="keywordflow">case</span> GDK_Up: x += 5.0; <span class="keywordflow">break</span>; <span class="keywordflow">case</span> GDK_Down: x -= 5.0; <span class="keywordflow">break</span>; <span class="keywordflow">case</span> GDK_Left: y += 5.0; <span class="keywordflow">break</span>; <span class="keywordflow">case</span> GDK_Right: y -= 5.0; <span class="keywordflow">break</span>; <span class="keywordflow">case</span> GDK_Escape: Gtk::Main::quit(); <span class="keywordflow">break</span>; <span class="keywordflow">default</span>: <span class="keywordflow">return</span> <span class="keyword">true</span>; } m_GearsScene.set_view_rot(x, y, z); m_GearsScene.invalidate(); <span class="keywordflow">return</span> <span class="keyword">true</span>; } <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="a45"></a><a class="code" href="namespaceGtk_1_1GL.html#a2">Gtk::GL::init</a>(argc, argv); <span class="comment">//</span> <span class="comment">// Parse arguments.</span> <span class="comment">//</span> <span class="keywordtype">bool</span> is_sync = <span class="keyword">true</span>; <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 1; i < argc; ++i) { <span class="keywordflow">if</span> (std::strcmp(argv[i], <span class="stringliteral">"--async"</span>) == 0) is_sync = <span class="keyword">false</span>; } <span class="comment">//</span> <span class="comment">// Instantiate and run the application.</span> <span class="comment">//</span> Gears gears(is_sync); kit.run(gears); <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>