<!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"><</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">&);</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"><</font> <font color="#993399">0x040000</font> <i><font color="#9A1900">// Objects of the scene</font></i> QPtrVector<font color="#990000"><</font>Object<font color="#990000">></font> objects_<font color="#990000">;</font> <i><font color="#9A1900">// ids of the selected objects</font></i> QValueList<font color="#990000"><</font><font color="#009900">int</font><font color="#990000">></font> selection_<font color="#990000">;</font> <b><font color="#000080">#else</font></b> QList<font color="#990000"><</font>Object<font color="#990000">*></font> objects_<font color="#990000">;</font> QList<font color="#990000"><</font><font color="#009900">int</font><font color="#990000">></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">>=</font> <font color="#993399">0x040000</font> <b><font color="#000080"># include</font></b> <font color="#FF0000"><QMouseEvent></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"><=</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"><=</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">-></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"><</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">()-></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">"<h2>m u l t i S e l e c t </h2>"</font><font color="#990000">);</font> text <font color="#990000">+=</font> <font color="#FF0000">"This example illustrates an application of the <code>select()</code> function that "</font><font color="#990000">;</font> text <font color="#990000">+=</font> <font color="#FF0000">"enables the selection of several objects.<br><br>"</font><font color="#990000">;</font> text <font color="#990000">+=</font> <font color="#FF0000">"Object selection is preformed using the left mouse button. Press <b>Shift</b> to add objects "</font><font color="#990000">;</font> text <font color="#990000">+=</font> <font color="#FF0000">"to the selection, and <b>Alt</b> to remove objects from the selection.<br><br>"</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 <code>endSelection()</code> function "</font><font color="#990000">;</font> text <font color="#990000">+=</font> <font color="#FF0000">"has been overloaded so that <i>all</i> 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).<br><br>"</font><font color="#990000">;</font> text <font color="#990000">+=</font> <font color="#FF0000">"The selected objects can then be manipulated by pressing the <b>Control</b> 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"><</font> <font color="#993399">0x040000</font> <b><font color="#0000FF">for</font></b> <font color="#990000">(</font>QValueList<font color="#990000"><</font><font color="#009900">int</font><font color="#990000">>::</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"><</font><font color="#009900">int</font><font color="#990000">>::</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">)-></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"><</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">)-></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">()-></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">()-></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">-></font><b><font color="#000000">pos</font></b><font color="#990000">(),</font> e<font color="#990000">-></font><b><font color="#000000">pos</font></b><font color="#990000">());</font> <b><font color="#000080">#if</font></b> QT_VERSION <font color="#990000"><</font> <font color="#993399">0x040000</font> <b><font color="#0000FF">if</font></b> <font color="#990000">((</font>e<font color="#990000">-></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">&&</font> <font color="#990000">(</font>e<font color="#990000">-></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">-></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">&&</font> <font color="#990000">(</font>e<font color="#990000">-></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">-></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">-></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">&&</font> <font color="#990000">(</font>e<font color="#990000">-></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">-></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">&&</font> <font color="#990000">(</font>e<font color="#990000">-></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">-></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"><</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">-></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">-></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">-></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"><</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"><</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">)-></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">&)</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">></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"><</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">()-></font><b><font color="#000000">constraint</font></b><font color="#990000">());</font> mfsc<font color="#990000">-></font><b><font color="#000000">clearSet</font></b><font color="#990000">();</font> <b><font color="#000080">#if</font></b> QT_VERSION <font color="#990000"><</font> <font color="#993399">0x040000</font> <b><font color="#0000FF">for</font></b> <font color="#990000">(</font>QValueList<font color="#990000"><</font><font color="#009900">int</font><font color="#990000">>::</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"><</font><font color="#009900">int</font><font color="#990000">>::</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">-></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">]-></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">></font> <font color="#993399">0</font><font color="#990000">)</font> <b><font color="#000000">manipulatedFrame</font></b><font color="#990000">()-></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"><</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"><</font> <font color="#993399">0x040000</font> <b><font color="#000080"># include</font></b> <font color="#FF0000"><qptrlist.h></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">&</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">&</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"><</font> <font color="#993399">0x040000</font> <i><font color="#9A1900">// Objects of the scene</font></i> QPtrList<font color="#990000"><</font>Object<font color="#990000">></font> objects_<font color="#990000">;</font> <b><font color="#000080">#else</font></b> QList<font color="#990000"><</font>Object<font color="#990000">*></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"><qapplication.h></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"><</font> <font color="#993399">0x040000</font> application<font color="#990000">.</font><b><font color="#000000">setMainWidget</font></b><font color="#990000">(&</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">&</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"><</font> <font color="#993399">0x040000</font> <b><font color="#0000FF">for</font></b> <font color="#990000">(</font>QPtrList<font color="#990000"><</font>Object<font color="#990000">>::</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"><</font>Object<font color="#990000">*>::</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">)-></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">&</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">-></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">-></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"><</font> <font color="#993399">0x040000</font> <b><font color="#0000FF">for</font></b> <font color="#990000">(</font>QPtrList<font color="#990000"><</font>Object<font color="#990000">>::</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"><</font>Object<font color="#990000">*>::</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">)-></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">)-></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">)-></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">)-></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"><qgl.h></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>