Sophie

Sophie

distrib > Fedora > 13 > i386 > by-pkgid > cd34bbe24503efb80ebebb7e33511ba0 > files > 28

libQGLViewer-doc-2.3.1-10.fc12.noarch.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <title>libQGLViewer multiSelect example</title>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <link href="../qglviewer.css" rel="stylesheet" type="text/css" />
  <link rel="shortcut icon" href="../images/qglviewer.ico" type="image/x-icon" />
  <link rel="icon" href="../images/qglviewer.icon.png" type="image/png" />
</head>
<body>

<div class="banner">
 <a class="qindex" href="../index.html">Home</a>
 <a class="qindex" href="../refManual/hierarchy.html">Documentation</a>
 <a class="qindex" href="../download.html">Download</a>
 <a class="qindex highlight" href="index.html">Examples</a>
 <a class="qindex" href="../developer.html">Developer</a>
</div>

<h1>The multiSelect example</h1>

<center>
  <img src="../images/multiSelect.jpg" width="330" height="228" alt="multiSelect"/>
</center>

<p>
 Customized <code>select()</code> function that enables the selection of several objects.
</p>
<p>
 Object selection is preformed using the left mouse button. Press <b>Shift</b> to add objects to
 the selection, and <b>Alt</b> to remove objects from the selection.
</p>
<p>
 Individual objects (click on them) as well as rectangular regions (click and drag mouse) can be
 selected. To do this, the selection region size is modified and the <code>endSelection()</code>
 function has been overloaded so that <i>all</i> the objects of the region are taken into account
 (the default implementation only selects the closest object).
</p>
<p>
 The selected objects can then be manipulated by pressing the <b>Control</b> key. Other set
 operations (parameter edition, deletion...) can also easily be applied to the selected objects.
</p>
<h2>multiSelect.h</h2>
<!-- Generator: GNU source-highlight 2.4
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><b><font color="#000080">#include</font></b> <font color="#FF0000">"QGLViewer/qglviewer.h"</font>
<b><font color="#000080">#include</font></b> <font color="#FF0000">"object.h"</font>

<b><font color="#000080">#if</font></b> QT_VERSION <font color="#990000">&lt;</font> <font color="#993399">0x040000</font>
<b><font color="#000080"># include</font></b> <font color="#FF0000">"qptrvector.h"</font>
<b><font color="#000080">#endif</font></b>

<b><font color="#0000FF">class</font></b> Viewer <font color="#990000">:</font> <b><font color="#0000FF">public</font></b> QGLViewer
<font color="#FF0000">{</font>
<b><font color="#0000FF">public</font></b><font color="#990000">:</font>
  <b><font color="#000000">Viewer</font></b><font color="#990000">();</font>

<b><font color="#0000FF">protected</font></b> <font color="#990000">:</font>
  <b><font color="#0000FF">virtual</font></b> <font color="#009900">void</font> <b><font color="#000000">draw</font></b><font color="#990000">();</font>
  <b><font color="#0000FF">virtual</font></b> <font color="#009900">void</font> <b><font color="#000000">init</font></b><font color="#990000">();</font>
  <b><font color="#0000FF">virtual</font></b> QString <b><font color="#000000">helpString</font></b><font color="#990000">()</font> <b><font color="#0000FF">const</font></b><font color="#990000">;</font>

  <i><font color="#9A1900">// Selection functions</font></i>
  <b><font color="#0000FF">virtual</font></b> <font color="#009900">void</font> <b><font color="#000000">drawWithNames</font></b><font color="#990000">();</font>
  <b><font color="#0000FF">virtual</font></b> <font color="#009900">void</font> <b><font color="#000000">endSelection</font></b><font color="#990000">(</font><b><font color="#0000FF">const</font></b> QPoint<font color="#990000">&amp;);</font>

  <i><font color="#9A1900">// Mouse events functions</font></i>
  <b><font color="#0000FF">virtual</font></b> <font color="#009900">void</font> <b><font color="#000000">mousePressEvent</font></b><font color="#990000">(</font>QMouseEvent <font color="#990000">*</font>e<font color="#990000">);</font>
  <b><font color="#0000FF">virtual</font></b> <font color="#009900">void</font> <b><font color="#000000">mouseMoveEvent</font></b><font color="#990000">(</font>QMouseEvent <font color="#990000">*</font>e<font color="#990000">);</font>
  <b><font color="#0000FF">virtual</font></b> <font color="#009900">void</font> <b><font color="#000000">mouseReleaseEvent</font></b><font color="#990000">(</font>QMouseEvent <font color="#990000">*</font>e<font color="#990000">);</font>

<b><font color="#0000FF">private</font></b> <font color="#990000">:</font>
  <font color="#009900">void</font> <b><font color="#000000">startManipulation</font></b><font color="#990000">();</font>
  <font color="#009900">void</font> <b><font color="#000000">drawSelectionRectangle</font></b><font color="#990000">()</font> <b><font color="#0000FF">const</font></b><font color="#990000">;</font>
  <font color="#009900">void</font> <b><font color="#000000">addIdToSelection</font></b><font color="#990000">(</font><font color="#009900">int</font> id<font color="#990000">);</font>
  <font color="#009900">void</font> <b><font color="#000000">removeIdFromSelection</font></b><font color="#990000">(</font><font color="#009900">int</font> id<font color="#990000">);</font>

  <i><font color="#9A1900">// Current rectangular selection</font></i>
  QRect rectangle_<font color="#990000">;</font>

  <i><font color="#9A1900">// Different selection modes</font></i>
  <b><font color="#0000FF">enum</font></b> SelectionMode <font color="#FF0000">{</font> NONE<font color="#990000">,</font> ADD<font color="#990000">,</font> REMOVE <font color="#FF0000">}</font><font color="#990000">;</font>
  SelectionMode selectionMode_<font color="#990000">;</font>

<b><font color="#000080">#if</font></b> QT_VERSION <font color="#990000">&lt;</font> <font color="#993399">0x040000</font>
  <i><font color="#9A1900">// Objects of the scene</font></i>
  QPtrVector<font color="#990000">&lt;</font>Object<font color="#990000">&gt;</font> objects_<font color="#990000">;</font>
  <i><font color="#9A1900">// ids of the selected objects</font></i>
  QValueList<font color="#990000">&lt;</font><font color="#009900">int</font><font color="#990000">&gt;</font> selection_<font color="#990000">;</font>
<b><font color="#000080">#else</font></b>
  QList<font color="#990000">&lt;</font>Object<font color="#990000">*&gt;</font> objects_<font color="#990000">;</font>
  QList<font color="#990000">&lt;</font><font color="#009900">int</font><font color="#990000">&gt;</font> selection_<font color="#990000">;</font>
<b><font color="#000080">#endif</font></b>

<font color="#FF0000">}</font><font color="#990000">;</font>
</tt></pre>


<h2>multiSelect.cpp</h2>
<!-- Generator: GNU source-highlight 2.4
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><b><font color="#000080">#include</font></b> <font color="#FF0000">"multiSelect.h"</font>
<b><font color="#000080">#include</font></b> <font color="#FF0000">"manipulatedFrameSetConstraint.h"</font>

<b><font color="#000080">#if</font></b> QT_VERSION <font color="#990000">&gt;=</font> <font color="#993399">0x040000</font>
<b><font color="#000080"># include</font></b> <font color="#FF0000">&lt;QMouseEvent&gt;</font>
<b><font color="#000080">#endif</font></b>

<b><font color="#0000FF">using</font></b> <b><font color="#0000FF">namespace</font></b> qglviewer<font color="#990000">;</font>

Viewer<font color="#990000">::</font><b><font color="#000000">Viewer</font></b><font color="#990000">()</font>
<font color="#FF0000">{</font>
  selectionMode_ <font color="#990000">=</font> NONE<font color="#990000">;</font>

  <i><font color="#9A1900">// Fill the scene with objects positionned on a regular grid.</font></i>
  <i><font color="#9A1900">// Consider increasing selectBufferSize() if you use more objects.</font></i>
  <b><font color="#0000FF">const</font></b> <font color="#009900">int</font> nb <font color="#990000">=</font> <font color="#993399">10</font><font color="#990000">;</font>
  <b><font color="#0000FF">for</font></b> <font color="#990000">(</font><font color="#009900">int</font> i<font color="#990000">=-</font>nb<font color="#990000">;</font> i<font color="#990000">&lt;=</font>nb<font color="#990000">;</font> <font color="#990000">++</font>i<font color="#990000">)</font>
    <b><font color="#0000FF">for</font></b> <font color="#990000">(</font><font color="#009900">int</font> j<font color="#990000">=-</font>nb<font color="#990000">;</font> j<font color="#990000">&lt;=</font>nb<font color="#990000">;</font> <font color="#990000">++</font>j<font color="#990000">)</font>
      <font color="#FF0000">{</font>
	Object<font color="#990000">*</font> o <font color="#990000">=</font> <b><font color="#0000FF">new</font></b> <b><font color="#000000">Object</font></b><font color="#990000">();</font>
	o<font color="#990000">-&gt;</font>frame<font color="#990000">.</font><b><font color="#000000">setPosition</font></b><font color="#990000">(</font><b><font color="#000000">Vec</font></b><font color="#990000">(</font>i<font color="#990000">/</font><font color="#009900">float</font><font color="#990000">(</font>nb<font color="#990000">),</font> j<font color="#990000">/</font><font color="#009900">float</font><font color="#990000">(</font>nb<font color="#990000">),</font> <font color="#993399">0.0</font><font color="#990000">));</font>
<b><font color="#000080">#if</font></b> QT_VERSION <font color="#990000">&lt;</font> <font color="#993399">0x040000</font>
	<i><font color="#9A1900">// How could they sell this ?</font></i>
	objects_<font color="#990000">.</font><b><font color="#000000">resize</font></b><font color="#990000">(</font>objects_<font color="#990000">.</font><b><font color="#000000">size</font></b><font color="#990000">()+</font><font color="#993399">1</font><font color="#990000">);</font>
	objects_<font color="#990000">.</font><b><font color="#000000">insert</font></b><font color="#990000">(</font>objects_<font color="#990000">.</font><b><font color="#000000">size</font></b><font color="#990000">()-</font><font color="#993399">1</font><font color="#990000">,</font> o<font color="#990000">);</font>
<b><font color="#000080">#else</font></b>
	objects_<font color="#990000">.</font><b><font color="#000000">append</font></b><font color="#990000">(</font>o<font color="#990000">);</font>
<b><font color="#000080">#endif</font></b>	
      <font color="#FF0000">}</font>
<font color="#FF0000">}</font>

<font color="#009900">void</font> Viewer<font color="#990000">::</font><b><font color="#000000">init</font></b><font color="#990000">()</font>
<font color="#FF0000">{</font>
  <i><font color="#9A1900">// A ManipulatedFrameSetConstraint will apply displacements to the selection</font></i>
  <b><font color="#000000">setManipulatedFrame</font></b><font color="#990000">(</font><b><font color="#0000FF">new</font></b> <b><font color="#000000">ManipulatedFrame</font></b><font color="#990000">());</font>
  <b><font color="#000000">manipulatedFrame</font></b><font color="#990000">()-&gt;</font><b><font color="#000000">setConstraint</font></b><font color="#990000">(</font><b><font color="#0000FF">new</font></b> <b><font color="#000000">ManipulatedFrameSetConstraint</font></b><font color="#990000">());</font>
  
  <i><font color="#9A1900">// Used to display semi-transparent relection rectangle</font></i>
  <b><font color="#000000">glBlendFunc</font></b><font color="#990000">(</font>GL_ONE<font color="#990000">,</font> GL_ONE<font color="#990000">);</font>
  
  <b><font color="#000000">restoreStateFromFile</font></b><font color="#990000">();</font>
  <b><font color="#000000">help</font></b><font color="#990000">();</font>
<font color="#FF0000">}</font>

QString Viewer<font color="#990000">::</font><b><font color="#000000">helpString</font></b><font color="#990000">()</font> <b><font color="#0000FF">const</font></b>
<font color="#FF0000">{</font>
  QString <b><font color="#000000">text</font></b><font color="#990000">(</font><font color="#FF0000">"&lt;h2&gt;m u l t i S e l e c t &lt;/h2&gt;"</font><font color="#990000">);</font>
  text <font color="#990000">+=</font> <font color="#FF0000">"This example illustrates an application of the &lt;code&gt;select()&lt;/code&gt; function that "</font><font color="#990000">;</font>
  text <font color="#990000">+=</font> <font color="#FF0000">"enables the selection of several objects.&lt;br&gt;&lt;br&gt;"</font><font color="#990000">;</font>
  text <font color="#990000">+=</font> <font color="#FF0000">"Object selection is preformed using the left mouse button. Press &lt;b&gt;Shift&lt;/b&gt; to add objects "</font><font color="#990000">;</font>
  text <font color="#990000">+=</font> <font color="#FF0000">"to the selection, and &lt;b&gt;Alt&lt;/b&gt; to remove objects from the selection.&lt;br&gt;&lt;br&gt;"</font><font color="#990000">;</font>
  text <font color="#990000">+=</font> <font color="#FF0000">"Individual objects (click on them) as well as rectangular regions (click and drag mouse) can be selected. "</font><font color="#990000">;</font>
  text <font color="#990000">+=</font> <font color="#FF0000">"To do this, the selection region size is modified and the &lt;code&gt;endSelection()&lt;/code&gt; function "</font><font color="#990000">;</font>
  text <font color="#990000">+=</font> <font color="#FF0000">"has been overloaded so that &lt;i&gt;all&lt;/i&gt; the objects of the region are taken into account "</font><font color="#990000">;</font>
  text <font color="#990000">+=</font> <font color="#FF0000">"(the default implementation only selects the closest object).&lt;br&gt;&lt;br&gt;"</font><font color="#990000">;</font>
  text <font color="#990000">+=</font> <font color="#FF0000">"The selected objects can then be manipulated by pressing the &lt;b&gt;Control&lt;/b&gt; key. "</font><font color="#990000">;</font>
  text <font color="#990000">+=</font> <font color="#FF0000">"Other set operations (parameter edition, deletion...) can also easily be applied to the selected objects."</font><font color="#990000">;</font>
  <b><font color="#0000FF">return</font></b> text<font color="#990000">;</font>
<font color="#FF0000">}</font>


<i><font color="#9A1900">//  D r a w i n g   f u n c t i o n</font></i>

<font color="#009900">void</font> Viewer<font color="#990000">::</font><b><font color="#000000">draw</font></b><font color="#990000">()</font>
<font color="#FF0000">{</font>
  <i><font color="#9A1900">// Draws selected objects only.</font></i>
  <b><font color="#000000">glColor3f</font></b><font color="#990000">(</font><font color="#993399">0</font><font color="#990000">.</font>9f<font color="#990000">,</font> <font color="#993399">0</font><font color="#990000">.</font>3f<font color="#990000">,</font> <font color="#993399">0</font><font color="#990000">.</font>3f<font color="#990000">);</font>
<b><font color="#000080">#if</font></b> QT_VERSION <font color="#990000">&lt;</font> <font color="#993399">0x040000</font>
  <b><font color="#0000FF">for</font></b> <font color="#990000">(</font>QValueList<font color="#990000">&lt;</font><font color="#009900">int</font><font color="#990000">&gt;::</font>const_iterator it<font color="#990000">=</font>selection_<font color="#990000">.</font><b><font color="#000000">begin</font></b><font color="#990000">(),</font> end<font color="#990000">=</font>selection_<font color="#990000">.</font><b><font color="#000000">end</font></b><font color="#990000">();</font> it <font color="#990000">!=</font> end<font color="#990000">;</font> <font color="#990000">++</font>it<font color="#990000">)</font>
<b><font color="#000080">#else</font></b>
    <b><font color="#0000FF">for</font></b> <font color="#990000">(</font>QList<font color="#990000">&lt;</font><font color="#009900">int</font><font color="#990000">&gt;::</font>const_iterator it<font color="#990000">=</font>selection_<font color="#990000">.</font><b><font color="#000000">begin</font></b><font color="#990000">(),</font> end<font color="#990000">=</font>selection_<font color="#990000">.</font><b><font color="#000000">end</font></b><font color="#990000">();</font> it <font color="#990000">!=</font> end<font color="#990000">;</font> <font color="#990000">++</font>it<font color="#990000">)</font>
<b><font color="#000080">#endif</font></b>
      objects_<font color="#990000">.</font><b><font color="#000000">at</font></b><font color="#990000">(*</font>it<font color="#990000">)-&gt;</font><b><font color="#000000">draw</font></b><font color="#990000">();</font>

  <i><font color="#9A1900">// Draws all the objects. Selected ones are not repainted because of GL depth test.</font></i>
  <b><font color="#000000">glColor3f</font></b><font color="#990000">(</font><font color="#993399">0</font><font color="#990000">.</font>8f<font color="#990000">,</font> <font color="#993399">0</font><font color="#990000">.</font>8f<font color="#990000">,</font> <font color="#993399">0</font><font color="#990000">.</font>8f<font color="#990000">);</font>
  <b><font color="#0000FF">for</font></b> <font color="#990000">(</font><font color="#009900">int</font> i<font color="#990000">=</font><font color="#993399">0</font><font color="#990000">;</font> i<font color="#990000">&lt;</font><font color="#009900">int</font><font color="#990000">(</font>objects_<font color="#990000">.</font><b><font color="#000000">size</font></b><font color="#990000">());</font> i<font color="#990000">++)</font>
    objects_<font color="#990000">.</font><b><font color="#000000">at</font></b><font color="#990000">(</font>i<font color="#990000">)-&gt;</font><b><font color="#000000">draw</font></b><font color="#990000">();</font>

  <i><font color="#9A1900">// Draws manipulatedFrame (the set's rotation center)</font></i>
  <b><font color="#0000FF">if</font></b> <font color="#990000">(</font><b><font color="#000000">manipulatedFrame</font></b><font color="#990000">()-&gt;</font><b><font color="#000000">isManipulated</font></b><font color="#990000">())</font>
    <font color="#FF0000">{</font>
      <b><font color="#000000">glPushMatrix</font></b><font color="#990000">();</font>
      <b><font color="#000000">glMultMatrixd</font></b><font color="#990000">(</font><b><font color="#000000">manipulatedFrame</font></b><font color="#990000">()-&gt;</font><b><font color="#000000">matrix</font></b><font color="#990000">());</font>
      <b><font color="#000000">drawAxis</font></b><font color="#990000">(</font><font color="#993399">0.5</font><font color="#990000">);</font>
      <b><font color="#000000">glPopMatrix</font></b><font color="#990000">();</font>
    <font color="#FF0000">}</font>
  
  <i><font color="#9A1900">// Draws rectangular selection area. Could be done in postDraw() instead.</font></i>
  <b><font color="#0000FF">if</font></b> <font color="#990000">(</font>selectionMode_ <font color="#990000">!=</font> NONE<font color="#990000">)</font>
    <b><font color="#000000">drawSelectionRectangle</font></b><font color="#990000">();</font>
<font color="#FF0000">}</font>


<i><font color="#9A1900">//   C u s t o m i z e d   m o u s e   e v e n t s</font></i>

<font color="#009900">void</font> Viewer<font color="#990000">::</font><b><font color="#000000">mousePressEvent</font></b><font color="#990000">(</font>QMouseEvent<font color="#990000">*</font> e<font color="#990000">)</font>
<font color="#FF0000">{</font>
  <i><font color="#9A1900">// Start selection. Mode is ADD with Shift key and TOGGLE with Alt key.</font></i>
  rectangle_ <font color="#990000">=</font> <b><font color="#000000">QRect</font></b><font color="#990000">(</font>e<font color="#990000">-&gt;</font><b><font color="#000000">pos</font></b><font color="#990000">(),</font> e<font color="#990000">-&gt;</font><b><font color="#000000">pos</font></b><font color="#990000">());</font>

<b><font color="#000080">#if</font></b> QT_VERSION <font color="#990000">&lt;</font> <font color="#993399">0x040000</font>
  <b><font color="#0000FF">if</font></b> <font color="#990000">((</font>e<font color="#990000">-&gt;</font><b><font color="#000000">button</font></b><font color="#990000">()</font> <font color="#990000">==</font> Qt<font color="#990000">::</font>LeftButton<font color="#990000">)</font> <font color="#990000">&amp;&amp;</font> <font color="#990000">(</font>e<font color="#990000">-&gt;</font><b><font color="#000000">state</font></b><font color="#990000">()</font> <font color="#990000">==</font> Qt<font color="#990000">::</font>ShiftButton<font color="#990000">))</font>
    selectionMode_ <font color="#990000">=</font> ADD<font color="#990000">;</font>
  <b><font color="#0000FF">else</font></b>
    <b><font color="#0000FF">if</font></b> <font color="#990000">((</font>e<font color="#990000">-&gt;</font><b><font color="#000000">button</font></b><font color="#990000">()</font> <font color="#990000">==</font> Qt<font color="#990000">::</font>LeftButton<font color="#990000">)</font> <font color="#990000">&amp;&amp;</font> <font color="#990000">(</font>e<font color="#990000">-&gt;</font><b><font color="#000000">state</font></b><font color="#990000">()</font> <font color="#990000">==</font> Qt<font color="#990000">::</font>AltButton<font color="#990000">))</font>
      selectionMode_ <font color="#990000">=</font> REMOVE<font color="#990000">;</font>
    <b><font color="#0000FF">else</font></b>
      <font color="#FF0000">{</font>
	<b><font color="#0000FF">if</font></b> <font color="#990000">(</font>e<font color="#990000">-&gt;</font><b><font color="#000000">state</font></b><font color="#990000">()</font> <font color="#990000">==</font> Qt<font color="#990000">::</font>ControlButton<font color="#990000">)</font>

<b><font color="#000080">#else</font></b>
	
  <b><font color="#0000FF">if</font></b> <font color="#990000">((</font>e<font color="#990000">-&gt;</font><b><font color="#000000">button</font></b><font color="#990000">()</font> <font color="#990000">==</font> Qt<font color="#990000">::</font>LeftButton<font color="#990000">)</font> <font color="#990000">&amp;&amp;</font> <font color="#990000">(</font>e<font color="#990000">-&gt;</font><b><font color="#000000">modifiers</font></b><font color="#990000">()</font> <font color="#990000">==</font> Qt<font color="#990000">::</font>ShiftModifier<font color="#990000">))</font>
    selectionMode_ <font color="#990000">=</font> ADD<font color="#990000">;</font>
  <b><font color="#0000FF">else</font></b>
    <b><font color="#0000FF">if</font></b> <font color="#990000">((</font>e<font color="#990000">-&gt;</font><b><font color="#000000">button</font></b><font color="#990000">()</font> <font color="#990000">==</font> Qt<font color="#990000">::</font>LeftButton<font color="#990000">)</font> <font color="#990000">&amp;&amp;</font> <font color="#990000">(</font>e<font color="#990000">-&gt;</font><b><font color="#000000">modifiers</font></b><font color="#990000">()</font> <font color="#990000">==</font> Qt<font color="#990000">::</font>AltModifier<font color="#990000">))</font>
      selectionMode_ <font color="#990000">=</font> REMOVE<font color="#990000">;</font>
    <b><font color="#0000FF">else</font></b>
      <font color="#FF0000">{</font>
	<b><font color="#0000FF">if</font></b> <font color="#990000">(</font>e<font color="#990000">-&gt;</font><b><font color="#000000">modifiers</font></b><font color="#990000">()</font> <font color="#990000">==</font> Qt<font color="#990000">::</font>ControlModifier<font color="#990000">)</font>      
<b><font color="#000080">#endif</font></b>
	  <b><font color="#000000">startManipulation</font></b><font color="#990000">();</font>
        QGLViewer<font color="#990000">::</font><b><font color="#000000">mousePressEvent</font></b><font color="#990000">(</font>e<font color="#990000">);</font>
      <font color="#FF0000">}</font>
<font color="#FF0000">}</font>

<font color="#009900">void</font> Viewer<font color="#990000">::</font><b><font color="#000000">mouseMoveEvent</font></b><font color="#990000">(</font>QMouseEvent<font color="#990000">*</font> e<font color="#990000">)</font>
<font color="#FF0000">{</font>
  <b><font color="#0000FF">if</font></b> <font color="#990000">(</font>selectionMode_ <font color="#990000">!=</font> NONE<font color="#990000">)</font>
    <font color="#FF0000">{</font>
      <i><font color="#9A1900">// Updates rectangle_ coordinates and redraws rectangle</font></i>
<b><font color="#000080">#if</font></b> QT_VERSION <font color="#990000">&lt;</font> <font color="#993399">0x030000</font>
      rectangle_<font color="#990000">.</font><b><font color="#000000">setX</font></b><font color="#990000">(</font>e<font color="#990000">-&gt;</font><b><font color="#000000">x</font></b><font color="#990000">());</font>
      rectangle_<font color="#990000">.</font><b><font color="#000000">setY</font></b><font color="#990000">(</font>e<font color="#990000">-&gt;</font><b><font color="#000000">y</font></b><font color="#990000">());</font>
<b><font color="#000080">#else</font></b>
      rectangle_<font color="#990000">.</font><b><font color="#000000">setBottomRight</font></b><font color="#990000">(</font>e<font color="#990000">-&gt;</font><b><font color="#000000">pos</font></b><font color="#990000">());</font>
<b><font color="#000080">#endif</font></b>
      <b><font color="#000000">updateGL</font></b><font color="#990000">();</font>
    <font color="#FF0000">}</font>
  <b><font color="#0000FF">else</font></b>
    QGLViewer<font color="#990000">::</font><b><font color="#000000">mouseMoveEvent</font></b><font color="#990000">(</font>e<font color="#990000">);</font>
<font color="#FF0000">}</font>

<font color="#009900">void</font> Viewer<font color="#990000">::</font><b><font color="#000000">mouseReleaseEvent</font></b><font color="#990000">(</font>QMouseEvent<font color="#990000">*</font> e<font color="#990000">)</font>
<font color="#FF0000">{</font>
  <b><font color="#0000FF">if</font></b> <font color="#990000">(</font>selectionMode_ <font color="#990000">!=</font> NONE<font color="#990000">)</font>
    <font color="#FF0000">{</font>
      <i><font color="#9A1900">// Actual selection on the rectangular area.</font></i>
      <i><font color="#9A1900">// Possibly swap left/right and top/bottom to make rectangle_ valid.</font></i>
<b><font color="#000080">#if</font></b> QT_VERSION <font color="#990000">&lt;</font> <font color="#993399">0x040000</font>
      rectangle_ <font color="#990000">=</font> rectangle_<font color="#990000">.</font><b><font color="#000000">normalize</font></b><font color="#990000">();</font>
<b><font color="#000080">#else</font></b>
      rectangle_ <font color="#990000">=</font> rectangle_<font color="#990000">.</font><b><font color="#000000">normalized</font></b><font color="#990000">();</font>
<b><font color="#000080">#endif</font></b>
      <i><font color="#9A1900">// Define selection window dimensions</font></i>
      <b><font color="#000000">setSelectRegionWidth</font></b><font color="#990000">(</font>rectangle_<font color="#990000">.</font><b><font color="#000000">width</font></b><font color="#990000">());</font>
      <b><font color="#000000">setSelectRegionHeight</font></b><font color="#990000">(</font>rectangle_<font color="#990000">.</font><b><font color="#000000">height</font></b><font color="#990000">());</font>
      <i><font color="#9A1900">// Compute rectangle center and perform selection</font></i>
      <b><font color="#000000">select</font></b><font color="#990000">(</font>rectangle_<font color="#990000">.</font><b><font color="#000000">center</font></b><font color="#990000">());</font>
      <i><font color="#9A1900">// Update display to show new selected objects</font></i>
      <b><font color="#000000">updateGL</font></b><font color="#990000">();</font>
    <font color="#FF0000">}</font>
  <b><font color="#0000FF">else</font></b>
    QGLViewer<font color="#990000">::</font><b><font color="#000000">mouseReleaseEvent</font></b><font color="#990000">(</font>e<font color="#990000">);</font>
<font color="#FF0000">}</font>


<i><font color="#9A1900">//   C u s t o m i z e d   s e l e c t i o n   p r o c e s s</font></i>

<font color="#009900">void</font> Viewer<font color="#990000">::</font><b><font color="#000000">drawWithNames</font></b><font color="#990000">()</font>
<font color="#FF0000">{</font>
  <b><font color="#0000FF">for</font></b> <font color="#990000">(</font><font color="#009900">int</font> i<font color="#990000">=</font><font color="#993399">0</font><font color="#990000">;</font> i<font color="#990000">&lt;</font><font color="#009900">int</font><font color="#990000">(</font>objects_<font color="#990000">.</font><b><font color="#000000">size</font></b><font color="#990000">());</font> i<font color="#990000">++)</font>
    <font color="#FF0000">{</font>
      <b><font color="#000000">glPushName</font></b><font color="#990000">(</font>i<font color="#990000">);</font>
      objects_<font color="#990000">.</font><b><font color="#000000">at</font></b><font color="#990000">(</font>i<font color="#990000">)-&gt;</font><b><font color="#000000">draw</font></b><font color="#990000">();</font>
      <b><font color="#000000">glPopName</font></b><font color="#990000">();</font>
    <font color="#FF0000">}</font>
<font color="#FF0000">}</font>

<font color="#009900">void</font> Viewer<font color="#990000">::</font><b><font color="#000000">endSelection</font></b><font color="#990000">(</font><b><font color="#0000FF">const</font></b> QPoint<font color="#990000">&amp;)</font>
<font color="#FF0000">{</font>
  <i><font color="#9A1900">// Flush GL buffers</font></i>
  <b><font color="#000000">glFlush</font></b><font color="#990000">();</font>

  <i><font color="#9A1900">// Get the number of objects that were seen through the pick matrix frustum. Reset GL_RENDER mode.</font></i>
  GLint nbHits <font color="#990000">=</font> <b><font color="#000000">glRenderMode</font></b><font color="#990000">(</font>GL_RENDER<font color="#990000">);</font>

  <b><font color="#0000FF">if</font></b> <font color="#990000">(</font>nbHits <font color="#990000">&gt;</font> <font color="#993399">0</font><font color="#990000">)</font>
    <font color="#FF0000">{</font>
      <i><font color="#9A1900">// Interpret results : each object created 4 values in the selectBuffer().</font></i>
      <i><font color="#9A1900">// (selectBuffer())[4*i+3] is the id pushed on the stack.</font></i>
      <b><font color="#0000FF">for</font></b> <font color="#990000">(</font><font color="#009900">int</font> i<font color="#990000">=</font><font color="#993399">0</font><font color="#990000">;</font> i<font color="#990000">&lt;</font>nbHits<font color="#990000">;</font> <font color="#990000">++</font>i<font color="#990000">)</font>
	<b><font color="#0000FF">switch</font></b> <font color="#990000">(</font>selectionMode_<font color="#990000">)</font>
	  <font color="#FF0000">{</font>
	  <b><font color="#0000FF">case</font></b> ADD    <font color="#990000">:</font> <b><font color="#000000">addIdToSelection</font></b><font color="#990000">((</font><b><font color="#000000">selectBuffer</font></b><font color="#990000">())[</font><font color="#993399">4</font><font color="#990000">*</font>i<font color="#990000">+</font><font color="#993399">3</font><font color="#990000">]);</font> <b><font color="#0000FF">break</font></b><font color="#990000">;</font>
	  <b><font color="#0000FF">case</font></b> REMOVE <font color="#990000">:</font> <b><font color="#000000">removeIdFromSelection</font></b><font color="#990000">((</font><b><font color="#000000">selectBuffer</font></b><font color="#990000">())[</font><font color="#993399">4</font><font color="#990000">*</font>i<font color="#990000">+</font><font color="#993399">3</font><font color="#990000">]);</font>  <b><font color="#0000FF">break</font></b><font color="#990000">;</font>
	  <b><font color="#0000FF">default</font></b> <font color="#990000">:</font> <b><font color="#0000FF">break</font></b><font color="#990000">;</font>
	  <font color="#FF0000">}</font>
    <font color="#FF0000">}</font>
  selectionMode_ <font color="#990000">=</font> NONE<font color="#990000">;</font>
<font color="#FF0000">}</font>

<font color="#009900">void</font> Viewer<font color="#990000">::</font><b><font color="#000000">startManipulation</font></b><font color="#990000">()</font>
<font color="#FF0000">{</font>
  Vec averagePosition<font color="#990000">;</font>
  ManipulatedFrameSetConstraint<font color="#990000">*</font> mfsc <font color="#990000">=</font> <font color="#990000">(</font>ManipulatedFrameSetConstraint<font color="#990000">*)(</font><b><font color="#000000">manipulatedFrame</font></b><font color="#990000">()-&gt;</font><b><font color="#000000">constraint</font></b><font color="#990000">());</font>
  mfsc<font color="#990000">-&gt;</font><b><font color="#000000">clearSet</font></b><font color="#990000">();</font>

<b><font color="#000080">#if</font></b> QT_VERSION <font color="#990000">&lt;</font> <font color="#993399">0x040000</font>
  <b><font color="#0000FF">for</font></b> <font color="#990000">(</font>QValueList<font color="#990000">&lt;</font><font color="#009900">int</font><font color="#990000">&gt;::</font>const_iterator it<font color="#990000">=</font>selection_<font color="#990000">.</font><b><font color="#000000">begin</font></b><font color="#990000">(),</font> end<font color="#990000">=</font>selection_<font color="#990000">.</font><b><font color="#000000">end</font></b><font color="#990000">();</font> it <font color="#990000">!=</font> end<font color="#990000">;</font> <font color="#990000">++</font>it<font color="#990000">)</font>
<b><font color="#000080">#else</font></b>
  <b><font color="#0000FF">for</font></b> <font color="#990000">(</font>QList<font color="#990000">&lt;</font><font color="#009900">int</font><font color="#990000">&gt;::</font>const_iterator it<font color="#990000">=</font>selection_<font color="#990000">.</font><b><font color="#000000">begin</font></b><font color="#990000">(),</font> end<font color="#990000">=</font>selection_<font color="#990000">.</font><b><font color="#000000">end</font></b><font color="#990000">();</font> it <font color="#990000">!=</font> end<font color="#990000">;</font> <font color="#990000">++</font>it<font color="#990000">)</font>
<b><font color="#000080">#endif</font></b>
    <font color="#FF0000">{</font>
      mfsc<font color="#990000">-&gt;</font><b><font color="#000000">addObjectToSet</font></b><font color="#990000">(</font>objects_<font color="#990000">[*</font>it<font color="#990000">]);</font>
      averagePosition <font color="#990000">+=</font> objects_<font color="#990000">[*</font>it<font color="#990000">]-&gt;</font>frame<font color="#990000">.</font><b><font color="#000000">position</font></b><font color="#990000">();</font>
    <font color="#FF0000">}</font>

  <b><font color="#0000FF">if</font></b> <font color="#990000">(</font>selection_<font color="#990000">.</font><b><font color="#000000">size</font></b><font color="#990000">()</font> <font color="#990000">&gt;</font> <font color="#993399">0</font><font color="#990000">)</font>
    <b><font color="#000000">manipulatedFrame</font></b><font color="#990000">()-&gt;</font><b><font color="#000000">setPosition</font></b><font color="#990000">(</font>averagePosition <font color="#990000">/</font> selection_<font color="#990000">.</font><b><font color="#000000">size</font></b><font color="#990000">());</font>
<font color="#FF0000">}</font>


<i><font color="#9A1900">//   S e l e c t i o n   t o o l s</font></i>

<font color="#009900">void</font> Viewer<font color="#990000">::</font><b><font color="#000000">addIdToSelection</font></b><font color="#990000">(</font><font color="#009900">int</font> id<font color="#990000">)</font>
<font color="#FF0000">{</font>
  <b><font color="#0000FF">if</font></b> <font color="#990000">(!</font>selection_<font color="#990000">.</font><b><font color="#000000">contains</font></b><font color="#990000">(</font>id<font color="#990000">))</font>
    selection_<font color="#990000">.</font><b><font color="#000000">push_back</font></b><font color="#990000">(</font>id<font color="#990000">);</font>
<font color="#FF0000">}</font>

<font color="#009900">void</font> Viewer<font color="#990000">::</font><b><font color="#000000">removeIdFromSelection</font></b><font color="#990000">(</font><font color="#009900">int</font> id<font color="#990000">)</font>
<font color="#FF0000">{</font>
<b><font color="#000080">#if</font></b> QT_VERSION <font color="#990000">&lt;</font> <font color="#993399">0x040000</font>
  selection_<font color="#990000">.</font><b><font color="#000000">remove</font></b><font color="#990000">(</font>id<font color="#990000">);</font>
<b><font color="#000080">#else</font></b>
  selection_<font color="#990000">.</font><b><font color="#000000">removeAll</font></b><font color="#990000">(</font>id<font color="#990000">);</font>
<b><font color="#000080">#endif</font></b>
<font color="#FF0000">}</font>

<font color="#009900">void</font> Viewer<font color="#990000">::</font><b><font color="#000000">drawSelectionRectangle</font></b><font color="#990000">()</font> <b><font color="#0000FF">const</font></b>
<font color="#FF0000">{</font>
  <b><font color="#000000">startScreenCoordinatesSystem</font></b><font color="#990000">();</font>
  <b><font color="#000000">glDisable</font></b><font color="#990000">(</font>GL_LIGHTING<font color="#990000">);</font>
  <b><font color="#000000">glEnable</font></b><font color="#990000">(</font>GL_BLEND<font color="#990000">);</font>

  <b><font color="#000000">glColor4f</font></b><font color="#990000">(</font><font color="#993399">0.0</font><font color="#990000">,</font> <font color="#993399">0.0</font><font color="#990000">,</font> <font color="#993399">0</font><font color="#990000">.</font>3f<font color="#990000">,</font> <font color="#993399">0</font><font color="#990000">.</font>3f<font color="#990000">);</font>
  <b><font color="#000000">glBegin</font></b><font color="#990000">(</font>GL_QUADS<font color="#990000">);</font>
  <b><font color="#000000">glVertex2i</font></b><font color="#990000">(</font>rectangle_<font color="#990000">.</font><b><font color="#000000">left</font></b><font color="#990000">(),</font>  rectangle_<font color="#990000">.</font><b><font color="#000000">top</font></b><font color="#990000">());</font>
  <b><font color="#000000">glVertex2i</font></b><font color="#990000">(</font>rectangle_<font color="#990000">.</font><b><font color="#000000">right</font></b><font color="#990000">(),</font> rectangle_<font color="#990000">.</font><b><font color="#000000">top</font></b><font color="#990000">());</font>
  <b><font color="#000000">glVertex2i</font></b><font color="#990000">(</font>rectangle_<font color="#990000">.</font><b><font color="#000000">right</font></b><font color="#990000">(),</font> rectangle_<font color="#990000">.</font><b><font color="#000000">bottom</font></b><font color="#990000">());</font>
  <b><font color="#000000">glVertex2i</font></b><font color="#990000">(</font>rectangle_<font color="#990000">.</font><b><font color="#000000">left</font></b><font color="#990000">(),</font>  rectangle_<font color="#990000">.</font><b><font color="#000000">bottom</font></b><font color="#990000">());</font>
  <b><font color="#000000">glEnd</font></b><font color="#990000">();</font>

  <b><font color="#000000">glLineWidth</font></b><font color="#990000">(</font><font color="#993399">2.0</font><font color="#990000">);</font>
  <b><font color="#000000">glColor4f</font></b><font color="#990000">(</font><font color="#993399">0</font><font color="#990000">.</font>4f<font color="#990000">,</font> <font color="#993399">0</font><font color="#990000">.</font>4f<font color="#990000">,</font> <font color="#993399">0</font><font color="#990000">.</font>5f<font color="#990000">,</font> <font color="#993399">0</font><font color="#990000">.</font>5f<font color="#990000">);</font>
  <b><font color="#000000">glBegin</font></b><font color="#990000">(</font>GL_LINE_LOOP<font color="#990000">);</font>
  <b><font color="#000000">glVertex2i</font></b><font color="#990000">(</font>rectangle_<font color="#990000">.</font><b><font color="#000000">left</font></b><font color="#990000">(),</font>  rectangle_<font color="#990000">.</font><b><font color="#000000">top</font></b><font color="#990000">());</font>
  <b><font color="#000000">glVertex2i</font></b><font color="#990000">(</font>rectangle_<font color="#990000">.</font><b><font color="#000000">right</font></b><font color="#990000">(),</font> rectangle_<font color="#990000">.</font><b><font color="#000000">top</font></b><font color="#990000">());</font>
  <b><font color="#000000">glVertex2i</font></b><font color="#990000">(</font>rectangle_<font color="#990000">.</font><b><font color="#000000">right</font></b><font color="#990000">(),</font> rectangle_<font color="#990000">.</font><b><font color="#000000">bottom</font></b><font color="#990000">());</font>
  <b><font color="#000000">glVertex2i</font></b><font color="#990000">(</font>rectangle_<font color="#990000">.</font><b><font color="#000000">left</font></b><font color="#990000">(),</font>  rectangle_<font color="#990000">.</font><b><font color="#000000">bottom</font></b><font color="#990000">());</font>
  <b><font color="#000000">glEnd</font></b><font color="#990000">();</font>

  <b><font color="#000000">glDisable</font></b><font color="#990000">(</font>GL_BLEND<font color="#990000">);</font>
  <b><font color="#000000">glEnable</font></b><font color="#990000">(</font>GL_LIGHTING<font color="#990000">);</font>
  <b><font color="#000000">stopScreenCoordinatesSystem</font></b><font color="#990000">();</font>
<font color="#FF0000">}</font>
</tt></pre>


<h2>manipulatedFrameSetConstraint.h</h2>
<!-- Generator: GNU source-highlight 2.4
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><b><font color="#000080">#include</font></b> <font color="#FF0000">"QGLViewer/constraint.h"</font>
<b><font color="#000080">#include</font></b> <font color="#FF0000">"object.h"</font>

<b><font color="#000080">#if</font></b> QT_VERSION <font color="#990000">&lt;</font> <font color="#993399">0x040000</font>
<b><font color="#000080"># include</font></b> <font color="#FF0000">&lt;qptrlist.h&gt;</font> 
<b><font color="#000080">#endif</font></b>

<b><font color="#0000FF">class</font></b> ManipulatedFrameSetConstraint <font color="#990000">:</font> <b><font color="#0000FF">public</font></b> qglviewer<font color="#990000">::</font>Constraint
<font color="#FF0000">{</font>
<b><font color="#0000FF">public</font></b><font color="#990000">:</font>
  <font color="#009900">void</font> <b><font color="#000000">clearSet</font></b><font color="#990000">();</font>
  <font color="#009900">void</font> <b><font color="#000000">addObjectToSet</font></b><font color="#990000">(</font>Object<font color="#990000">*</font> o<font color="#990000">);</font>

  <b><font color="#0000FF">virtual</font></b> <font color="#009900">void</font> <b><font color="#000000">constrainTranslation</font></b><font color="#990000">(</font>qglviewer<font color="#990000">::</font>Vec <font color="#990000">&amp;</font>translation<font color="#990000">,</font> qglviewer<font color="#990000">::</font>Frame <font color="#990000">*</font><b><font color="#0000FF">const</font></b> frame<font color="#990000">);</font>
  <b><font color="#0000FF">virtual</font></b> <font color="#009900">void</font> <b><font color="#000000">constrainRotation</font></b><font color="#990000">(</font>qglviewer<font color="#990000">::</font>Quaternion <font color="#990000">&amp;</font>rotation<font color="#990000">,</font> qglviewer<font color="#990000">::</font>Frame <font color="#990000">*</font><b><font color="#0000FF">const</font></b> frame<font color="#990000">);</font>

<b><font color="#0000FF">private</font></b> <font color="#990000">:</font>
<b><font color="#000080">#if</font></b> QT_VERSION <font color="#990000">&lt;</font> <font color="#993399">0x040000</font>
  <i><font color="#9A1900">// Objects of the scene</font></i>
  QPtrList<font color="#990000">&lt;</font>Object<font color="#990000">&gt;</font> objects_<font color="#990000">;</font>
<b><font color="#000080">#else</font></b>
  QList<font color="#990000">&lt;</font>Object<font color="#990000">*&gt;</font> objects_<font color="#990000">;</font>
<b><font color="#000080">#endif</font></b>
<font color="#FF0000">}</font><font color="#990000">;</font>
</tt></pre>


<h2>object.h</h2>
<!-- Generator: GNU source-highlight 2.4
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><b><font color="#000080">#ifndef</font></b> OBJECT_H_
<b><font color="#000080">#define</font></b> OBJECT_H_

<b><font color="#000080">#include</font></b> <font color="#FF0000">"QGLViewer/frame.h"</font>

<b><font color="#0000FF">class</font></b> Object
<font color="#FF0000">{</font>
<b><font color="#0000FF">public</font></b> <font color="#990000">:</font>
  <font color="#009900">void</font> <b><font color="#000000">draw</font></b><font color="#990000">()</font> <b><font color="#0000FF">const</font></b><font color="#990000">;</font>
  qglviewer<font color="#990000">::</font>Frame frame<font color="#990000">;</font>
<font color="#FF0000">}</font><font color="#990000">;</font>

<b><font color="#000080">#endif</font></b> <i><font color="#9A1900">// OBJECT_H_</font></i>
</tt></pre>


<h2>main.cpp</h2>
<!-- Generator: GNU source-highlight 2.4
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><b><font color="#000080">#include</font></b> <font color="#FF0000">"multiSelect.h"</font>
<b><font color="#000080">#include</font></b> <font color="#FF0000">&lt;qapplication.h&gt;</font>

<font color="#009900">int</font> <b><font color="#000000">main</font></b><font color="#990000">(</font><font color="#009900">int</font> argc<font color="#990000">,</font> <font color="#009900">char</font><font color="#990000">**</font> argv<font color="#990000">)</font>
<font color="#FF0000">{</font>
  QApplication <b><font color="#000000">application</font></b><font color="#990000">(</font>argc<font color="#990000">,</font>argv<font color="#990000">);</font>

  Viewer viewer<font color="#990000">;</font>

<b><font color="#000080">#if</font></b> QT_VERSION <font color="#990000">&lt;</font> <font color="#993399">0x040000</font>
  application<font color="#990000">.</font><b><font color="#000000">setMainWidget</font></b><font color="#990000">(&amp;</font>viewer<font color="#990000">);</font>
<b><font color="#000080">#else</font></b>
  viewer<font color="#990000">.</font><b><font color="#000000">setWindowTitle</font></b><font color="#990000">(</font><font color="#FF0000">"multiSelect"</font><font color="#990000">);</font>
<b><font color="#000080">#endif</font></b>

  viewer<font color="#990000">.</font><b><font color="#000000">show</font></b><font color="#990000">();</font>

  <b><font color="#0000FF">return</font></b> application<font color="#990000">.</font><b><font color="#000000">exec</font></b><font color="#990000">();</font>
<font color="#FF0000">}</font>
</tt></pre>


<h2>manipulatedFrameSetConstraint.cpp</h2>
<!-- Generator: GNU source-highlight 2.4
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><b><font color="#000080">#include</font></b> <font color="#FF0000">"manipulatedFrameSetConstraint.h"</font>
<b><font color="#000080">#include</font></b> <font color="#FF0000">"QGLViewer/frame.h"</font>

<b><font color="#0000FF">using</font></b> <b><font color="#0000FF">namespace</font></b> qglviewer<font color="#990000">;</font>

<font color="#009900">void</font> ManipulatedFrameSetConstraint<font color="#990000">::</font><b><font color="#000000">clearSet</font></b><font color="#990000">()</font>
<font color="#FF0000">{</font>
  objects_<font color="#990000">.</font><b><font color="#000000">clear</font></b><font color="#990000">();</font>
<font color="#FF0000">}</font>

<font color="#009900">void</font> ManipulatedFrameSetConstraint<font color="#990000">::</font><b><font color="#000000">addObjectToSet</font></b><font color="#990000">(</font>Object<font color="#990000">*</font> o<font color="#990000">)</font>
<font color="#FF0000">{</font>
  objects_<font color="#990000">.</font><b><font color="#000000">append</font></b><font color="#990000">(</font>o<font color="#990000">);</font>
<font color="#FF0000">}</font>

<font color="#009900">void</font> ManipulatedFrameSetConstraint<font color="#990000">::</font><b><font color="#000000">constrainTranslation</font></b><font color="#990000">(</font>qglviewer<font color="#990000">::</font>Vec <font color="#990000">&amp;</font>translation<font color="#990000">,</font> Frame <font color="#990000">*</font><b><font color="#0000FF">const</font></b><font color="#990000">)</font>
<font color="#FF0000">{</font>
<b><font color="#000080">#if</font></b> QT_VERSION <font color="#990000">&lt;</font> <font color="#993399">0x040000</font>
  <b><font color="#0000FF">for</font></b> <font color="#990000">(</font>QPtrList<font color="#990000">&lt;</font>Object<font color="#990000">&gt;::</font>iterator it<font color="#990000">=</font>objects_<font color="#990000">.</font><b><font color="#000000">begin</font></b><font color="#990000">(),</font> end<font color="#990000">=</font>objects_<font color="#990000">.</font><b><font color="#000000">end</font></b><font color="#990000">();</font> it <font color="#990000">!=</font> end<font color="#990000">;</font> <font color="#990000">++</font>it<font color="#990000">)</font>
<b><font color="#000080">#else</font></b>
  <b><font color="#0000FF">for</font></b> <font color="#990000">(</font>QList<font color="#990000">&lt;</font>Object<font color="#990000">*&gt;::</font>iterator it<font color="#990000">=</font>objects_<font color="#990000">.</font><b><font color="#000000">begin</font></b><font color="#990000">(),</font> end<font color="#990000">=</font>objects_<font color="#990000">.</font><b><font color="#000000">end</font></b><font color="#990000">();</font> it <font color="#990000">!=</font> end<font color="#990000">;</font> <font color="#990000">++</font>it<font color="#990000">)</font>
<b><font color="#000080">#endif</font></b>
    <font color="#990000">(*</font>it<font color="#990000">)-&gt;</font>frame<font color="#990000">.</font><b><font color="#000000">translate</font></b><font color="#990000">(</font>translation<font color="#990000">);</font>
<font color="#FF0000">}</font>

<font color="#009900">void</font> ManipulatedFrameSetConstraint<font color="#990000">::</font><b><font color="#000000">constrainRotation</font></b><font color="#990000">(</font>qglviewer<font color="#990000">::</font>Quaternion <font color="#990000">&amp;</font>rotation<font color="#990000">,</font> Frame <font color="#990000">*</font><b><font color="#0000FF">const</font></b> frame<font color="#990000">)</font>
<font color="#FF0000">{</font>
  <i><font color="#9A1900">// A little bit of math. Easy to understand, hard to guess (tm).</font></i>
  <i><font color="#9A1900">// rotation is expressed in the frame local coordinates system. Convert it back to world coordinates.</font></i>
  <b><font color="#0000FF">const</font></b> Vec worldAxis <font color="#990000">=</font> frame<font color="#990000">-&gt;</font><b><font color="#000000">inverseTransformOf</font></b><font color="#990000">(</font>rotation<font color="#990000">.</font><b><font color="#000000">axis</font></b><font color="#990000">());</font>
  <b><font color="#0000FF">const</font></b> Vec pos <font color="#990000">=</font> frame<font color="#990000">-&gt;</font><b><font color="#000000">position</font></b><font color="#990000">();</font>
  <b><font color="#0000FF">const</font></b> <font color="#009900">float</font> angle <font color="#990000">=</font> rotation<font color="#990000">.</font><b><font color="#000000">angle</font></b><font color="#990000">();</font>

<b><font color="#000080">#if</font></b> QT_VERSION <font color="#990000">&lt;</font> <font color="#993399">0x040000</font>
  <b><font color="#0000FF">for</font></b> <font color="#990000">(</font>QPtrList<font color="#990000">&lt;</font>Object<font color="#990000">&gt;::</font>iterator it<font color="#990000">=</font>objects_<font color="#990000">.</font><b><font color="#000000">begin</font></b><font color="#990000">(),</font> end<font color="#990000">=</font>objects_<font color="#990000">.</font><b><font color="#000000">end</font></b><font color="#990000">();</font> it <font color="#990000">!=</font> end<font color="#990000">;</font> <font color="#990000">++</font>it<font color="#990000">)</font>
<b><font color="#000080">#else</font></b>
    <b><font color="#0000FF">for</font></b> <font color="#990000">(</font>QList<font color="#990000">&lt;</font>Object<font color="#990000">*&gt;::</font>iterator it<font color="#990000">=</font>objects_<font color="#990000">.</font><b><font color="#000000">begin</font></b><font color="#990000">(),</font> end<font color="#990000">=</font>objects_<font color="#990000">.</font><b><font color="#000000">end</font></b><font color="#990000">();</font> it <font color="#990000">!=</font> end<font color="#990000">;</font> <font color="#990000">++</font>it<font color="#990000">)</font>
<b><font color="#000080">#endif</font></b>
      <font color="#FF0000">{</font>
	<i><font color="#9A1900">// Rotation has to be expressed in the object local coordinates system.</font></i>
	Quaternion <b><font color="#000000">qObject</font></b><font color="#990000">((*</font>it<font color="#990000">)-&gt;</font>frame<font color="#990000">.</font><b><font color="#000000">transformOf</font></b><font color="#990000">(</font>worldAxis<font color="#990000">),</font> angle<font color="#990000">);</font>
	<font color="#990000">(*</font>it<font color="#990000">)-&gt;</font>frame<font color="#990000">.</font><b><font color="#000000">rotate</font></b><font color="#990000">(</font>qObject<font color="#990000">);</font>

	<i><font color="#9A1900">// Comment these lines only rotate the objects</font></i>
	Quaternion <b><font color="#000000">qWorld</font></b><font color="#990000">(</font>worldAxis<font color="#990000">,</font> angle<font color="#990000">);</font>
	<i><font color="#9A1900">// Rotation around frame world position (pos)</font></i>
	<font color="#990000">(*</font>it<font color="#990000">)-&gt;</font>frame<font color="#990000">.</font><b><font color="#000000">setPosition</font></b><font color="#990000">(</font>pos <font color="#990000">+</font> qWorld<font color="#990000">.</font><b><font color="#000000">rotate</font></b><font color="#990000">((*</font>it<font color="#990000">)-&gt;</font>frame<font color="#990000">.</font><b><font color="#000000">position</font></b><font color="#990000">()</font> <font color="#990000">-</font> pos<font color="#990000">));</font>
      <font color="#FF0000">}</font>
<font color="#FF0000">}</font>
</tt></pre>


<h2>object.cpp</h2>
<!-- Generator: GNU source-highlight 2.4
by Lorenzo Bettini
http://www.lorenzobettini.it
http://www.gnu.org/software/src-highlite -->
<pre><tt><b><font color="#000080">#include</font></b> <font color="#FF0000">&lt;qgl.h&gt;</font>
<b><font color="#000080">#include</font></b> <font color="#FF0000">"object.h"</font>

<b><font color="#0000FF">using</font></b> <b><font color="#0000FF">namespace</font></b> qglviewer<font color="#990000">;</font>

<font color="#009900">void</font> Object<font color="#990000">::</font><b><font color="#000000">draw</font></b><font color="#990000">()</font> <b><font color="#0000FF">const</font></b>
<font color="#FF0000">{</font>
  <b><font color="#0000FF">static</font></b> GLUquadric<font color="#990000">*</font> quad <font color="#990000">=</font> <b><font color="#000000">gluNewQuadric</font></b><font color="#990000">();</font>

  <b><font color="#000000">glPushMatrix</font></b><font color="#990000">();</font>
  <b><font color="#000000">glMultMatrixd</font></b><font color="#990000">(</font>frame<font color="#990000">.</font><b><font color="#000000">matrix</font></b><font color="#990000">());</font>
  <b><font color="#000000">gluSphere</font></b><font color="#990000">(</font>quad<font color="#990000">,</font> <font color="#993399">0.03</font><font color="#990000">,</font> <font color="#993399">10</font><font color="#990000">,</font> <font color="#993399">6</font><font color="#990000">);</font>
  <b><font color="#000000">gluCylinder</font></b><font color="#990000">(</font>quad<font color="#990000">,</font> <font color="#993399">0.03</font><font color="#990000">,</font> <font color="#993399">0.0</font><font color="#990000">,</font> <font color="#993399">0.09</font><font color="#990000">,</font> <font color="#993399">10</font><font color="#990000">,</font> <font color="#993399">1</font><font color="#990000">);</font>
  <b><font color="#000000">glPopMatrix</font></b><font color="#990000">();</font>
<font color="#FF0000">}</font>
</tt></pre>



<p>
  Back to the <a href="index.html">examples main page</a>.
</p>

<p>
  <a href="http://validator.w3.org/check/referer"><img src="../images/xhtml.png" alt="Valid XHTML 1.0!" height="31" width="88"/></a>
  <a href="http://jigsaw.w3.org/css-validator/check/referer"><img src="../images/css.png" width="88" height="31" alt="Valid CSS!"/></a>
<i>Last modified on Tuesday, September 30, 2008.</i>
</p>

</body>
</html>