Sophie

Sophie

distrib > Mageia > 7 > armv7hl > media > core-release > by-pkgid > 4385fe4d2beb794f6ab11a7801f18ad5 > files > 243

gtkglextmm-doc-1.2.0-11.mga7.noarch.rpm

<!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&nbsp;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&nbsp;Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical&nbsp;List</a> | <a class="qindex" href="annotated.html">Class&nbsp;List</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="namespacemembers.html">Namespace&nbsp;Members</a> | <a class="qindex" href="functions.html">Class&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;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  &lt;naofumi@users.sourceforge.net&gt;</span>
<span class="comment"> */</span>

<span class="preprocessor">#include &lt;iostream&gt;</span>
<span class="preprocessor">#include &lt;cstdlib&gt;</span>

<span class="preprocessor">#include &lt;gtkmm.h&gt;</span>

<span class="preprocessor">#include &lt;<a class="code" href="gtkglmm_8h.html">gtkglmm.h</a>&gt;</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 &lt;windows.h&gt;</span>
<span class="preprocessor">#endif</span>
<span class="preprocessor"></span>
<span class="preprocessor">#include &lt;GL/gl.h&gt;</span>
<span class="preprocessor">#include &lt;GL/glu.h&gt;</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&lt;const Gdk::GL::Config&gt;&amp; config);

  SimpleGLScene(<span class="keyword">const</span> Glib::RefPtr&lt;const Gdk::GL::Config&gt;&amp; config,
                <span class="keyword">const</span> Glib::RefPtr&lt;const Gdk::GL::Context&gt;&amp; 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&lt;const Gdk::GL::Config&gt;&amp; 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&lt;const Gdk::GL::Config&gt;&amp; config,
                             <span class="keyword">const</span> Glib::RefPtr&lt;const Gdk::GL::Context&gt;&amp; 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&lt;Gdk::GL::Window&gt; 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-&gt;gl_begin(get_gl_context()))
    <span class="keywordflow">return</span> <span class="keyword">false</span>;

  glViewport(0, 0, get_width(), get_height());

  glwindow-&gt;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&lt;Gdk::GL::Window&gt; 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-&gt;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-&gt;is_double_buffered())
    glwindow-&gt;swap_buffers();
  <span class="keywordflow">else</span>
    glFlush();

  glwindow-&gt;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&lt;const Gdk::GL::Config&gt;&amp; 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&lt;const Gdk::GL::Config&gt;&amp; 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&lt;Gdk::GL::Window&gt; 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-&gt;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-&gt;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&lt;const Gdk::GL::Config&gt;&amp; config,
                   <span class="keyword">const</span> Glib::RefPtr&lt;const Gdk::GL::Context&gt;&amp; 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&lt;const Gdk::GL::Config&gt;&amp; config,
                                   <span class="keyword">const</span> Glib::RefPtr&lt;const Gdk::GL::Context&gt;&amp; 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&lt;Gdk::GL::Window&gt; 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-&gt;gl_begin(get_gl_context()))
    <span class="keywordflow">return</span>;

  <span class="comment">// Initialize rendering context</span>
  init_gl();

  glwindow-&gt;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&lt;const Gdk::GL::Config&gt;&amp; 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&lt;const Gdk::GL::Config&gt;&amp; 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-&gt;set_size_request(120, 120);
  m_GLScene1-&gt;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-&gt;realize();
  Glib::RefPtr&lt;Gdk::GL::Context&gt; glcontext = m_GLScene1-&gt;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-&gt;set_size_request(120, 120);
  m_GLScene2-&gt;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-&gt;set_size_request(120, 120);
  m_GLScene3-&gt;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>, &amp;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&lt;Gdk::GL::Config&gt; 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 &lt;&lt; <span class="stringliteral">"*** Cannot find the double-buffered visual.\n"</span>
                &lt;&lt; <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 &lt;&lt; <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&nbsp;
<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>