Sophie

Sophie

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

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: pixmap.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>pixmap.cc</h1>Simple offscreen OpenGL rendering example.<p>
<div class="fragment"><pre class="fragment"><span class="comment">// -*- C++ -*-</span>
<span class="comment">/*</span>
<span class="comment"> * pixmap.cc:</span>
<span class="comment"> * Simple off-screen OpenGL rendering 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">// 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="a94"></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="a95"></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="a96"></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="a97"></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="a98"></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="a99"></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="a100"></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="a101"></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="a102"></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="a103"></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="a104"></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="a105"></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="a106"></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="a107"></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="a108"></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="a109"></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="a110"></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 using GL::Pixmap.</span>
<span class="comment">//</span>
<span class="comment"></span>
<span class="keyword">class </span>PixmapGLScene : <span class="keyword">public</span> Gtk::DrawingArea
{
<span class="keyword">public</span>:
  PixmapGLScene();
  <span class="keyword">virtual</span> ~PixmapGLScene();

<span class="keyword">protected</span>:
  <span class="comment">// init OpenGL context</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">protected</span>:
  <span class="comment">// OpenGL rendering stuff:</span>
  Glib::RefPtr&lt;Gdk::GL::Config&gt; m_GLConfig;
  Glib::RefPtr&lt;Gdk::GL::Context&gt; m_GLContext;
  Glib::RefPtr&lt;Gdk::Pixmap&gt; m_Pixmap;
};

PixmapGLScene::PixmapGLScene()
  : m_GLConfig(0), m_GLContext(0), m_Pixmap(0)
{
  <span class="comment">//</span>
  <span class="comment">// Configure OpenGL-capable visual.</span>
  <span class="comment">//</span>

  <span class="comment">// Try single-buffered visual</span>
  m_GLConfig = <a name="a111"></a><a class="code" href="classGdk_1_1GL_1_1Config.html#e0">Gdk::GL::Config::create</a>(<a name="a112"></a><a class="code" href="group__gdkmm__glEnums.html#gga35a0">Gdk::GL::MODE_RGB</a>    |
                                       <a name="a113"></a><a class="code" href="group__gdkmm__glEnums.html#gga35a7">Gdk::GL::MODE_DEPTH</a>  |
                                       <a name="a114"></a><a class="code" href="group__gdkmm__glEnums.html#gga35a3">Gdk::GL::MODE_SINGLE</a>);
  <span class="keywordflow">if</span> (!m_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(m_GLConfig);

  <span class="comment">//</span>
  <span class="comment">// Set OpenGL-capable colormap.</span>
  <span class="comment">//</span>

  set_colormap(m_GLConfig-&gt;get_colormap());
}

PixmapGLScene::~PixmapGLScene()
{
}

<span class="keywordtype">void</span> PixmapGLScene::init_gl()
{
  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);
}

<span class="keywordtype">bool</span> PixmapGLScene::on_configure_event(GdkEventConfigure* event)
{
  <span class="comment">//</span>
  <span class="comment">// Create an OpenGL off-screen rendering area.</span>
  <span class="comment">//</span>

  m_Pixmap = Gdk::Pixmap::create(get_window(),
                                 get_width(), get_height(),
                                 m_GLConfig-&gt;get_depth());

  <span class="comment">//</span>
  <span class="comment">// Set OpenGL-capability to the pixmap (invoke extension method).</span>
  <span class="comment">//</span>

  Glib::RefPtr&lt;Gdk::GL::Pixmap&gt; glpixmap =
    <a name="a115"></a><a class="code" href="namespaceGdk_1_1GL.html#a112">Gdk::GL::ext</a>(m_Pixmap).set_gl_capability(m_GLConfig);

  <span class="comment">//</span>
  <span class="comment">// Create OpenGL rendering context (not direct).</span>
  <span class="comment">//</span>

  <span class="keywordflow">if</span> (!m_GLContext)
    m_GLContext = <a name="a116"></a><a class="code" href="classGdk_1_1GL_1_1Context.html#e0">Gdk::GL::Context::create</a>(glpixmap, <span class="keyword">false</span>);

  <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> (!glpixmap-&gt;gl_begin(m_GLContext))
    <span class="keywordflow">return</span> <span class="keyword">false</span>;

  <span class="keyword">static</span> <span class="keywordtype">bool</span> is_initialized = <span class="keyword">false</span>;
  <span class="keywordflow">if</span> (!is_initialized)
    {
      init_gl();
      is_initialized = <span class="keyword">true</span>;
    }

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

  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  glCallList(1);

  glFlush();

  glpixmap-&gt;gl_end();
  <span class="comment">// *** OpenGL END ***</span>

  <span class="keywordflow">return</span> <span class="keyword">true</span>;
}

<span class="keywordtype">bool</span> PixmapGLScene::on_expose_event(GdkEventExpose* event)
{
  <span class="keywordflow">if</span> (!m_Pixmap)
    <span class="keywordflow">return</span> <span class="keyword">false</span>;

  get_window()-&gt;draw_drawable(get_style()-&gt;get_fg_gc(get_state()),
                              m_Pixmap,
                              event-&gt;area.x, event-&gt;area.y,
                              event-&gt;area.x, event-&gt;area.y,
                              event-&gt;area.width, event-&gt;area.height);

  <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>Pixmap : <span class="keyword">public</span> Gtk::Window
{
<span class="keyword">public</span>:
  Pixmap();
  <span class="keyword">virtual</span> ~Pixmap();

<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;
  PixmapGLScene m_PixmapGLScene;
  Gtk::Button m_ButtonQuit;
};

Pixmap::Pixmap()
  : 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">"Pixmap"</span>);

  add(m_VBox);

  <span class="comment">//</span>
  <span class="comment">// Simple OpenGL scene using GL::Pixmap.</span>
  <span class="comment">//</span>

  m_PixmapGLScene.set_size_request(200, 200);

  m_VBox.pack_start(m_PixmapGLScene);

  <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;Pixmap::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();
}

Pixmap::~Pixmap()
{}

<span class="keywordtype">void</span> Pixmap::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="a117"></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="a118"></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>

  Pixmap pixmap;

  kit.run(pixmap);

  <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&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>