Sophie

Sophie

distrib > Mandriva > 10.0 > i586 > media > contrib > by-pkgid > 9347541fe87a5ea3f3b8dbc50f660e8e > files > 150

libQGLViewer-devel-1.3.6-1mdk.i586.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 mouseGrabber example</title>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  <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>

<table class="banner">
  <tr>
     <td align="center"><a href="../index.html"><b>Home</b></a></td>
     <td align="center"><a href="../refManual/hierarchy.html"><b>Documentation</b></a></td>
     <td align="center"><a href="../download.html"><b>Download</b></a></td>
     <td align="center" class="qindexHL"><a href="index.html"><b>Screenshots</b></a></td>
     <td align="center"><a href="../developer.html"><b>Developer</b></a></td>
   </tr>
</table>

<h1>The mouseGrabber example</h1>
<center>
  <img src="../images/mouseGrabber.jpg" width="300" height="200" alt="mouseGrabber"/>
</center>

<p>
 Illustration of the <code>MouseGrabber</code> class.
</p>
<p>
 A <code>MouseGrabber</code> is an abstract class which defines objects that are sensitive to the mouse.
 When activated, they grab the mouse events. Possible applications are interactive 2D or 3D GUI,
 object auto-selection, auto drop-down menu and much more.
</p>
<p>
 In this example, MouseGrabbers are defined and associated with Camera keyFrame paths
 or position. Clicking a MouseGrabber will play (resp. restore) the Camera path (resp. position).
</p>


<h2>mouseGrabber.h</h2>
<pre>

<span class="dir">#include &lt;QGLViewer/qglviewer.h&gt;
</span>
<span class="key">class </span>CameraPathPlayer : <span class="key">public </span>qglviewer::MouseGrabber
{
<span class="key">public</span>:
  CameraPathPlayer(<span class="typ">int </span>nb) : pathNb(nb) {};
  <span class="typ">void </span>checkIfGrabsMouse(<span class="typ">int </span>x, <span class="typ">int </span>y, <span class="typ">const </span>qglviewer::Camera* <span class="typ">const </span>camera);
  <span class="typ">int </span>yPos() { <span class="key">return </span><span class="num">25</span>*pathNb + <span class="num">25</span>; };

<span class="key">protected</span>:
  <span class="typ">void </span>mousePressEvent(QMouseEvent* <span class="typ">const</span>, qglviewer::Camera* <span class="typ">const </span>camera) { camera-&gt;playKeyFramePath(pathNb); };

<span class="key">private</span>:
  <span class="typ">int </span>pathNb;
};


<span class="key">class </span>Viewer : <span class="key">public </span>QGLViewer
{
<span class="key">protected </span>:
  <span class="key">virtual </span><span class="typ">void </span>init();
  <span class="key">virtual </span><span class="typ">void </span>draw();
  <span class="key">virtual </span>QString helpString() <span class="typ">const</span>;

  <span class="typ">void </span>displayPlayers();
  <span class="typ">void </span>updatePlayers();

<span class="key">private</span>:
  CameraPathPlayer** player_;
};</pre>


<h2>mouseGrabber.cpp</h2>
<pre>

<span class="dir">#include </span><span class="dstr">&quot;mouseGrabber.h&quot;</span><span class="dir">
</span>
<span class="key">using namespace </span>qglviewer;
<span class="key">using namespace </span>std;

<span class="typ">void </span>CameraPathPlayer::checkIfGrabsMouse(<span class="typ">int </span>x, <span class="typ">int </span>y, <span class="typ">const </span>Camera* <span class="typ">const</span>)
{
  <span class="com">// Rectangular activation array - May have to be tune depending on your default font size
</span>  setGrabsMouse((x &lt; <span class="num">80</span>) &amp;&amp; (y&lt;yPos()) &amp;&amp; ((yPos()-y) &lt; <span class="num">16</span>));
}

<span class="typ">void </span>Viewer::displayPlayers()
{
  <span class="key">for </span>(<span class="typ">int </span>i=<span class="num">0</span>; i&lt;camera()-&gt;nbPaths(); ++i)
    {
      CameraPathPlayer* cpp = player_[i];
      <span class="key">if </span>(cpp)
	{
	  QString s;
	  <span class="key">if </span>(cpp-&gt;grabsMouse())
	    {
	      glColor3f(<span class="num">1</span>,<span class="num">1</span>,<span class="num">1</span>);
	      <span class="key">if </span>(camera()-&gt;keyFrameInterpolator(i)-&gt;numberOfKeyFrames() &gt; <span class="num">1</span>)
		s = <span class="str">&quot;Play path F&quot;</span> + QString::number(i+<span class="num">1</span>);
	      <span class="key">else
		</span>s = <span class="str">&quot;Restore pos F&quot;</span> + QString::number(i+<span class="num">1</span>);
	    }
	  <span class="key">else
	    </span>{
	      glColor3f(<span class="num">0.6</span>, <span class="num">0.6</span>, <span class="num">0.6</span>);
	      <span class="key">if </span>(camera()-&gt;keyFrameInterpolator(i)-&gt;numberOfKeyFrames() &gt; <span class="num">1</span>)
		s = <span class="str">&quot;Path F&quot;</span> + QString::number(i+<span class="num">1</span>);
	      <span class="key">else
		</span>s = <span class="str">&quot;Pos F&quot;</span> + QString::number(i+<span class="num">1</span>);
	    }
	  glDisable(GL_LIGHTING);
	  drawText(<span class="num">10</span>, cpp-&gt;yPos()<span class="num">-3</span>, s);
	}
    }
}


<span class="typ">void </span>Viewer::updatePlayers()
{
  <span class="key">for </span>(<span class="typ">int </span>i=<span class="num">0</span>; i&lt;camera()-&gt;nbPaths(); ++i)
    {
      <span class="com">// Check if CameraPathPlayer is still valid
</span>      <span class="key">if </span>((player_[i]) &amp;&amp; (!camera()-&gt;keyFrameInterpolator(i)))
	{
	  <span class="key">delete </span>player_[i];
	  player_[i] = NULL;
	}
      <span class="com">// Or add it if needed
</span>      <span class="key">if </span>((camera()-&gt;keyFrameInterpolator(i)) &amp;&amp; (!player_[i]))
	player_[i] = <span class="key">new </span>CameraPathPlayer(i);
    }
}


<span class="typ">void </span>Viewer::init()
{
  <span class="com">// Absolutely needed for MouseGrabber
</span>  setMouseTracking(<span class="key">true</span>);

  <span class="com">// In order to make the manipulatedFrame displacements clearer
</span>  setDrawAxis();

  <span class="com">// Initialize the CameraPathPlayer MouseGrabber array
</span>  player_ = <span class="key">new </span>CameraPathPlayer*[camera()-&gt;nbPaths()];
  <span class="key">for </span>(<span class="typ">int </span>i=<span class="num">0</span>; i&lt;camera()-&gt;nbPaths(); ++i)
    player_[i] = NULL;

  setManipulatedFrame(<span class="key">new </span>ManipulatedFrame());

  restoreFromFile();

  help();
}


<span class="typ">void </span>Viewer::draw()
{
  glMultMatrixd(manipulatedFrame()-&gt;matrix());

  <span class="com">// Visual feedback for the manipulatedFrame grab.
</span>  <span class="key">if </span>(manipulatedFrame()-&gt;grabsMouse())
    drawAxis(<span class="num">0.9</span>);
  <span class="key">else
    </span>drawAxis(<span class="num">0.7</span>);

  <span class="com">// Draw a spiral
</span>  <span class="typ">const float </span>nbSteps = <span class="num">500.0</span>;
  glBegin(GL_QUAD_STRIP);
  <span class="key">for </span>(<span class="typ">float </span>i=<span class="num">0</span>; i&lt;nbSteps; ++i)
    {
      <span class="typ">float </span>ratio = i/nbSteps;
      <span class="typ">float </span>angle = <span class="num">21.0</span>*ratio;
      <span class="typ">float </span>c = cos(angle);
      <span class="typ">float </span>s = sin(angle);
      <span class="typ">float </span>r1 = <span class="num">1.0 </span>- <span class="num">0.8</span>*ratio;
      <span class="typ">float </span>r2 = <span class="num">0.8 </span>- <span class="num">0.8</span>*ratio;
      <span class="typ">float </span>alt = ratio <span class="num">- 0.5</span>;
      <span class="typ">const float </span>nor = .<span class="num">5</span>;
      <span class="typ">const float </span>up = sqrt(<span class="num">1.0</span>-nor*nor);
      glColor3f(<span class="num">1</span>-ratio, .<span class="num">2 </span>, ratio);
      glNormal3f(nor*c, up, nor*s);
      glVertex3f(r1*c, alt, r1*s);
      glVertex3f(r2*c, alt+<span class="num">0.05</span>, r2*s);
    }
  glEnd();

  updatePlayers();
  displayPlayers();
}


QString Viewer::helpString() <span class="typ">const
</span>{
  QString text(<span class="str">&quot;&lt;h2&gt;M o u s e G r a b b e r &lt;/h2&gt;&quot;</span>);
  text += <span class="str">&quot;This example illustrates the use of &lt;i&gt;MouseGrabber&lt;/i&gt;, which is an abstract &quot;</span>;
  text += <span class="str">&quot;class for objects that react (usually when the mouse hovers over them).&lt;br&gt;&lt;br&gt;&quot;</span>;
  text += <span class="str">&quot;Define new camera paths (or positions) using &lt;b&gt;Alt&lt;/b&gt;+[&lt;b&gt;F1&lt;/b&gt;-&lt;b&gt;F12&lt;/b&gt;]. &quot;</span>;
  text += <span class="str">&quot;New &lt;i&gt;MouseGrabbers&lt;/i&gt; are created and displayed in the left corner. &quot;</span>;
  text += <span class="str">&quot;Note how they react to the mouse, and click them to play the associated path.&lt;br&gt;&lt;br&gt;&quot;</span>;
  text += <span class="str">&quot;&lt;i&gt;ManipulatedFrame&lt;/i&gt;, such as the one which defines the spiral position, are &quot;</span>;
  text += <span class="str">&quot;also &lt;i&gt;MouseGrabbers&lt;/i&gt;. When the mouse is close to the axis origin, the &lt;i&gt;ManipulatedFrame&lt;/i&gt; &quot;</span>;
  text += <span class="str">&quot;will react to mouse click, as if the &lt;b&gt;Control&lt;/b&gt; key was pressed. This is very convenient &quot;</span>;
  text += <span class="str">&quot;to intuitively move scene objects (such as lights) without any key or GUI interaction.&lt;br&gt;&lt;br&gt;&quot;</span>;
  text += <span class="str">&quot;Note that &lt;i&gt;setMouseTracking()&lt;/i&gt; must be enabled to enable &lt;i&gt;MouseGrabbers&lt;/i&gt;.&quot;</span>;
  <span class="key">return </span>text;
}</pre>


<h2>main.cpp</h2>
<pre>

<span class="dir">#include </span><span class="dstr">&quot;mouseGrabber.h&quot;</span><span class="dir">
</span><span class="dir">#include &lt;qapplication.h&gt;
</span>
<span class="typ">int </span>main(<span class="typ">int </span>argc, <span class="typ">char</span>** argv)
{
  <span class="com">// Read command lines arguments.
</span>  QApplication application(argc,argv);

  <span class="com">// Instantiate the viewer, show it on screen.
</span>  Viewer viewer;
  viewer.show();

  <span class="com">// Set the viewer as the application main widget.
</span>  application.setMainWidget(&amp;viewer);

  <span class="com">// Run main loop.
</span>  <span class="key">return </span>application.exec();
}</pre>



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

<p>
  <a href="http://validator.w3.org/check/referer"><img src="../images/xhtml.png" alt="Valid XHTML 1.0!" height="31" width="88" border="0"/></a>
  <a href="http://jigsaw.w3.org/css-validator/check/referer"><img src="../images/css.png" width="88" height="31" alt="Valid CSS!" border="0"/></a>
<i>Last modified on Thursday, February 5, 2004.</i>
</p>

</body>
</html>