Sophie

Sophie

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

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: 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&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>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  &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">// 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&lt;const Gdk::GL::Config&gt;&amp; 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&lt;const Gdk::GL::Config&gt;&amp; 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&lt;const Gdk::GL::Config&gt;&amp; 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-&gt;get_attrib(attrib, value))
    {
      std::cout &lt;&lt; attrib_str &lt;&lt; <span class="stringliteral">" = "</span>;
      <span class="keywordflow">if</span> (is_boolean)
        std::cout &lt;&lt; (value == <span class="keyword">true</span> ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>) &lt;&lt; std::endl;
      <span class="keywordflow">else</span>
        std::cout &lt;&lt; value &lt;&lt; std::endl;
    }
  <span class="keywordflow">else</span>
    {
      std::cout &lt;&lt; <span class="stringliteral">"*** Cannot get "</span>
                &lt;&lt; attrib_str
                &lt;&lt; <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&lt;const Gdk::GL::Config&gt;&amp; glconfig)
{
  std::cout &lt;&lt; <span class="stringliteral">"\nOpenGL visual configurations :\n\n"</span>;

  std::cout &lt;&lt; <span class="stringliteral">"glconfig-&gt;is_rgba() = "</span>
            &lt;&lt; (glconfig-&gt;is_rgba() ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>)
            &lt;&lt; std::endl;
  std::cout &lt;&lt; <span class="stringliteral">"glconfig-&gt;is_double_buffered() = "</span>
            &lt;&lt; (glconfig-&gt;is_double_buffered() ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>)
            &lt;&lt; std::endl;
  std::cout &lt;&lt; <span class="stringliteral">"glconfig-&gt;is_stereo() = "</span>
            &lt;&lt; (glconfig-&gt;is_stereo() ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>)
            &lt;&lt; std::endl;
  std::cout &lt;&lt; <span class="stringliteral">"glconfig-&gt;has_alpha() = "</span>
            &lt;&lt; (glconfig-&gt;has_alpha() ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>)
            &lt;&lt; std::endl;
  std::cout &lt;&lt; <span class="stringliteral">"glconfig-&gt;has_depth_buffer() = "</span>
            &lt;&lt; (glconfig-&gt;has_depth_buffer() ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>)
            &lt;&lt; std::endl;
  std::cout &lt;&lt; <span class="stringliteral">"glconfig-&gt;has_stencil_buffer() = "</span>
            &lt;&lt; (glconfig-&gt;has_stencil_buffer() ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>)
            &lt;&lt; std::endl;
  std::cout &lt;&lt; <span class="stringliteral">"glconfig-&gt;has_accum_buffer() = "</span>
            &lt;&lt; (glconfig-&gt;has_accum_buffer() ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>)
            &lt;&lt; std::endl;

  std::cout &lt;&lt; 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 &lt;&lt; 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&lt;SimpleGLScene&gt;
{
<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&lt;Gdk::GL::Config&gt; 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 &lt;&lt; <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&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>;

  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-&gt;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&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);

  <span class="comment">// Sync.</span>
  glwindow-&gt;wait_gl();

  <span class="comment">// GDK rendering.</span>
  glwindow-&gt;draw_rectangle(get_style()-&gt;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-&gt;wait_gdk();

  glCallList(1);

  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">// 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>, &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="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 &lt;&lt; <span class="stringliteral">"OpenGL extension version - "</span>
            &lt;&lt; major &lt;&lt; <span class="stringliteral">"."</span> &lt;&lt; minor &lt;&lt; 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&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>