<!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: share-lists.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>share-lists.cc</h1>Simple display list sharing example.<p> <div class="fragment"><pre class="fragment"><span class="comment">// -*- C++ -*-</span> <span class="comment">/*</span> <span class="comment"> * share-lists.cc:</span> <span class="comment"> * Simple display list sharing example.</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">// Simple OpenGL scene base class.</span> <span class="comment">//</span> <span class="comment"></span> <span class="keyword">class </span>SimpleGLScene : <span class="keyword">public</span> Gtk::GL::DrawingArea { <span class="keyword">public</span>: <span class="keyword">explicit</span> SimpleGLScene(<span class="keyword">const</span> Glib::RefPtr<const Gdk::GL::Config>& config); SimpleGLScene(<span class="keyword">const</span> Glib::RefPtr<const Gdk::GL::Config>& config, <span class="keyword">const</span> Glib::RefPtr<const Gdk::GL::Context>& share_list); <span class="keyword">virtual</span> ~SimpleGLScene(); <span class="keyword">protected</span>: <span class="keyword">virtual</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">public</span>: <span class="comment">// Gtk::Widget::realize() is protected, so that ...</span> <span class="keywordtype">void</span> realize() { Gtk::GL::DrawingArea::realize(); } <span class="keyword">public</span>: <span class="keywordtype">void</span> set_light_diffuse(GLfloat r, GLfloat g, GLfloat b, GLfloat a) { m_LightDiffuse[0] = r; m_LightDiffuse[1] = g; m_LightDiffuse[2] = b; m_LightDiffuse[3] = a; } <span class="keywordtype">void</span> set_light_position(GLfloat x, GLfloat y, GLfloat z, GLfloat w) { m_LightPosition[0] = x; m_LightPosition[1] = y; m_LightPosition[2] = z; m_LightPosition[3] = w; } <span class="keyword">protected</span>: GLfloat m_LightDiffuse[4]; GLfloat m_LightPosition[4]; }; SimpleGLScene::SimpleGLScene(<span class="keyword">const</span> Glib::RefPtr<const Gdk::GL::Config>& config) : Gtk::GL::DrawingArea(config) { set_light_diffuse(1.0, 1.0, 1.0, 1.0); set_light_position(1.0, 1.0, 1.0, 0.0); } SimpleGLScene::SimpleGLScene(<span class="keyword">const</span> Glib::RefPtr<const Gdk::GL::Config>& config, <span class="keyword">const</span> Glib::RefPtr<const Gdk::GL::Context>& share_list) : Gtk::GL::DrawingArea(config, share_list) { set_light_diffuse(1.0, 1.0, 1.0, 1.0); set_light_position(1.0, 1.0, 1.0, 0.0); } SimpleGLScene::~SimpleGLScene() { } <span class="keywordtype">void</span> SimpleGLScene::init_gl() { glLightfv(GL_LIGHT0, GL_DIFFUSE, m_LightDiffuse); glLightfv(GL_LIGHT0, GL_POSITION, m_LightPosition); 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> 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); glCallList(1); <span class="comment">// Swap buffers.</span> <span class="keywordflow">if</span> (glwindow->is_double_buffered()) glwindow->swap_buffers(); <span class="keywordflow">else</span> 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">// SimpleGLSceneMain (creates display lists)</span> <span class="comment">//</span> <span class="comment"></span> <span class="keyword">class </span>SimpleGLSceneMain : <span class="keyword">public</span> SimpleGLScene { <span class="keyword">public</span>: <span class="keyword">explicit</span> SimpleGLSceneMain(<span class="keyword">const</span> Glib::RefPtr<const Gdk::GL::Config>& config); <span class="keyword">virtual</span> ~SimpleGLSceneMain(); <span class="keyword">protected</span>: <span class="keyword">virtual</span> <span class="keywordtype">void</span> on_realize(); }; SimpleGLSceneMain::SimpleGLSceneMain(<span class="keyword">const</span> Glib::RefPtr<const Gdk::GL::Config>& config) : SimpleGLScene(config) { } SimpleGLSceneMain::~SimpleGLSceneMain() { } <span class="keywordtype">void</span> SimpleGLSceneMain::on_realize() { <span class="comment">// We need to call the base on_realize()</span> SimpleGLScene::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>; <span class="comment">// Create display list #1</span> GLUquadricObj* qobj = gluNewQuadric(); gluQuadricDrawStyle(qobj, GLU_FILL); glNewList(1, GL_COMPILE); gluSphere(qobj, 1.0, 20, 20); glEndList(); <span class="comment">// Initialize rendering context</span> init_gl(); glwindow->gl_end(); <span class="comment">// *** OpenGL END ***</span> } <span class="comment">//</span> <span class="comment">// SimpleGLSceneSub (shares display lists)</span> <span class="comment">//</span> <span class="comment"></span> <span class="keyword">class </span>SimpleGLSceneSub : <span class="keyword">public</span> SimpleGLScene { <span class="keyword">public</span>: SimpleGLSceneSub(<span class="keyword">const</span> Glib::RefPtr<const Gdk::GL::Config>& config, <span class="keyword">const</span> Glib::RefPtr<const Gdk::GL::Context>& share_list); <span class="keyword">virtual</span> ~SimpleGLSceneSub(); <span class="keyword">protected</span>: <span class="keyword">virtual</span> <span class="keywordtype">void</span> on_realize(); }; SimpleGLSceneSub::SimpleGLSceneSub(<span class="keyword">const</span> Glib::RefPtr<const Gdk::GL::Config>& config, <span class="keyword">const</span> Glib::RefPtr<const Gdk::GL::Context>& share_list) : SimpleGLScene(config, share_list) { } SimpleGLSceneSub::~SimpleGLSceneSub() { } <span class="keywordtype">void</span> SimpleGLSceneSub::on_realize() { <span class="comment">// We need to call the base on_realize()</span> SimpleGLScene::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>; <span class="comment">// Initialize rendering context</span> init_gl(); glwindow->gl_end(); <span class="comment">// *** OpenGL END ***</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>: <span class="keyword">explicit</span> Simple(<span class="keyword">const</span> Glib::RefPtr<const Gdk::GL::Config>& config); <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_GLScene1; SimpleGLScene *m_GLScene2; SimpleGLScene *m_GLScene3; Gtk::Button m_ButtonQuit; }; Simple::Simple(<span class="keyword">const</span> Glib::RefPtr<const Gdk::GL::Config>& config) : m_VBox(false, 10), 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">"share-lists"</span>); <span class="comment">// Get automatically redrawn if any of their children changed allocation.</span> set_reallocate_redraws(<span class="keyword">true</span>); <span class="comment">// Set border width.</span> set_border_width(10); add(m_VBox); <span class="comment">//</span> <span class="comment">// OpenGL scene #1 (SimpleGLSceneMain: creates display lists)</span> <span class="comment">//</span> m_GLScene1 = <span class="keyword">new</span> SimpleGLSceneMain(config); m_GLScene1->set_size_request(120, 120); m_GLScene1->set_light_diffuse(1.0, 0.0, 0.0, 0.0); <span class="comment">// red</span> m_VBox.pack_start(*m_GLScene1); <span class="comment">//</span> <span class="comment">// Get OpenGL rendering context.</span> <span class="comment">//</span> m_GLScene1->realize(); Glib::RefPtr<Gdk::GL::Context> glcontext = m_GLScene1->get_gl_context(); <span class="comment">//</span> <span class="comment">// OpenGL scene #2 (SimpleGLSceneSub: shares display lists)</span> <span class="comment">//</span> m_GLScene2 = <span class="keyword">new</span> SimpleGLSceneSub(config, glcontext); m_GLScene2->set_size_request(120, 120); m_GLScene2->set_light_diffuse(1.0, 1.0, 0.0, 0.0); <span class="comment">// yellow</span> m_VBox.pack_start(*m_GLScene2); <span class="comment">//</span> <span class="comment">// OpenGL scene #3 (SimpleGLSceneSub: shares display lists)</span> <span class="comment">//</span> m_GLScene3 = <span class="keyword">new</span> SimpleGLSceneSub(config, glcontext); m_GLScene3->set_size_request(120, 120); m_GLScene3->set_light_diffuse(0.0, 1.0, 0.0, 0.0); <span class="comment">// green</span> m_VBox.pack_start(*m_GLScene3); <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="keyword">delete</span> m_GLScene1; <span class="keyword">delete</span> m_GLScene2; <span class="keyword">delete</span> m_GLScene3; } <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="a142"></a><a class="code" href="namespaceGtk_1_1GL.html#a2">Gtk::GL::init</a>(argc, argv); <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="a143"></a><a class="code" href="classGdk_1_1GL_1_1Config.html#e0">Gdk::GL::Config::create</a>(<a name="a144"></a><a class="code" href="group__gdkmm__glEnums.html#gga35a0">Gdk::GL::MODE_RGB</a> | <a name="a145"></a><a class="code" href="group__gdkmm__glEnums.html#gga35a7">Gdk::GL::MODE_DEPTH</a> | <a name="a146"></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">//</span> <span class="comment">// Instantiate and run the application.</span> <span class="comment">//</span> Simple simple(glconfig); 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>