Sophie

Sophie

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

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 frustumCulling 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 frustumCulling example</h1>

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

<p>
 Frustum culling using <code>getFrustumPlanesCoefficients</code>.
</p>
<p>
 A hierarchical octree structure is clipped against a camera's frustum clipping planes, obtained
 using <code>getFrustumPlanesCoefficients</code>. A second viewer displays an external view of the
 scene that exhibits the clipping (using <code>drawCamera()</code> to display the frustum).
</p>
<p>
 This frustum culling implementation is quite naive. Many optimisation techniques are available in
 the litterature.
</p>
<h2>frustumCulling.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">&lt;QGLViewer/qglviewer.h&gt;</font>

<b><font color="#0000FF">class</font></b> CullingCamera<font color="#990000">;</font>

<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>
  <font color="#009900">void</font> <b><font color="#000000">setCullingCamera</font></b><font color="#990000">(</font><b><font color="#0000FF">const</font></b> CullingCamera<font color="#990000">*</font> <b><font color="#0000FF">const</font></b> cc<font color="#990000">)</font> <font color="#FF0000">{</font> cullingCamera <font color="#990000">=</font> cc<font color="#990000">;</font> <font color="#FF0000">}</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>

<b><font color="#0000FF">private</font></b><font color="#990000">:</font>
  <b><font color="#0000FF">const</font></b> CullingCamera<font color="#990000">*</font> cullingCamera<font color="#990000">;</font>
<font color="#FF0000">}</font><font color="#990000">;</font>
</tt></pre>


<h2>frustumCulling.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">"frustumCulling.h"</font>
<b><font color="#000080">#include</font></b> <font color="#FF0000">"cullingCamera.h"</font>
<b><font color="#000080">#include</font></b> <font color="#FF0000">"box.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> Viewer<font color="#990000">::</font><b><font color="#000000">draw</font></b><font color="#990000">()</font>
<font color="#FF0000">{</font>
  Box<font color="#990000">::</font>Root<font color="#990000">-&gt;</font><b><font color="#000000">drawIfAllChildrenAreVisible</font></b><font color="#990000">(</font>cullingCamera<font color="#990000">);</font>

  <b><font color="#0000FF">if</font></b> <font color="#990000">(</font>cullingCamera <font color="#990000">==</font> <b><font color="#000000">camera</font></b><font color="#990000">())</font>
    <i><font color="#9A1900">// Main viewer computes its plane equation</font></i>
    cullingCamera<font color="#990000">-&gt;</font><b><font color="#000000">computeFrustumPlanesEquations</font></b><font color="#990000">();</font>
  <b><font color="#0000FF">else</font></b>
    <font color="#FF0000">{</font>
      <i><font color="#9A1900">// Observer viewer draws cullingCamera</font></i>
      <b><font color="#000000">glLineWidth</font></b><font color="#990000">(</font><font color="#993399">4.0</font><font color="#990000">);</font>
      <b><font color="#000000">glColor4f</font></b><font color="#990000">(</font><font color="#993399">1.0</font><font color="#990000">,</font> <font color="#993399">1.0</font><font color="#990000">,</font> <font color="#993399">1.0</font><font color="#990000">,</font> <font color="#993399">0.5</font><font color="#990000">);</font>
      cullingCamera<font color="#990000">-&gt;</font><b><font color="#000000">draw</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">init</font></b><font color="#990000">()</font>
<font color="#FF0000">{</font>
  <i><font color="#9A1900">// Restore previous viewer state.</font></i>
  <b><font color="#000000">restoreStateFromFile</font></b><font color="#990000">();</font>

  <b><font color="#0000FF">if</font></b> <font color="#990000">(</font>cullingCamera <font color="#990000">!=</font> <b><font color="#000000">camera</font></b><font color="#990000">())</font>
    <font color="#FF0000">{</font>
      <i><font color="#9A1900">// Observer viewer configuration</font></i>
      <b><font color="#000000">glEnable</font></b><font color="#990000">(</font>GL_BLEND<font color="#990000">);</font>
      <b><font color="#000000">glBlendFunc</font></b><font color="#990000">(</font>GL_SRC_ALPHA<font color="#990000">,</font> GL_ONE_MINUS_SRC_ALPHA<font color="#990000">);</font>
      <b><font color="#000000">help</font></b><font color="#990000">();</font>
    <font color="#FF0000">}</font>
  
  <b><font color="#000000">glDisable</font></b><font color="#990000">(</font>GL_LIGHTING<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;F r u s t u m C u l l i n g&lt;/h2&gt;"</font><font color="#990000">);</font>

  text <font color="#990000">+=</font> <font color="#FF0000">"A hierarchical octree structure is clipped against the camera's frustum clipping planes, obtained "</font><font color="#990000">;</font>
  text <font color="#990000">+=</font> <font color="#FF0000">"using &lt;code&gt;getFrustumPlanesCoefficients&lt;/code&gt;. A second viewer uses &lt;code&gt;drawCamera()&lt;/code&gt; to "</font><font color="#990000">;</font>
  text <font color="#990000">+=</font> <font color="#FF0000">"display an external view of the first viewer's camera.&lt;br&gt;&lt;br&gt;"</font><font color="#990000">;</font>

  text <font color="#990000">+=</font> <font color="#FF0000">"This frustum culling implementation is quite naive. Many optimisation techniques are available in "</font><font color="#990000">;</font>
  text <font color="#990000">+=</font> <font color="#FF0000">"the litterature."</font><font color="#990000">;</font>

  <b><font color="#0000FF">return</font></b> text<font color="#990000">;</font>
<font color="#FF0000">}</font>
</tt></pre>


<h2>box.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">&lt;QGLViewer/camera.h&gt;</font>

<b><font color="#0000FF">class</font></b> CullingCamera<font color="#990000">;</font>

<i><font color="#9A1900">// An Axis Aligned Bounding Box octree hierarchy element.</font></i>
<b><font color="#0000FF">class</font></b> Box
<font color="#FF0000">{</font>
<b><font color="#0000FF">public</font></b><font color="#990000">:</font>
  <b><font color="#000000">Box</font></b><font color="#990000">(</font><b><font color="#0000FF">const</font></b> qglviewer<font color="#990000">::</font>Vec<font color="#990000">&amp;</font> P1<font color="#990000">,</font> <b><font color="#0000FF">const</font></b> qglviewer<font color="#990000">::</font>Vec<font color="#990000">&amp;</font> P2<font color="#990000">)</font> <font color="#990000">:</font> <b><font color="#000000">p1</font></b><font color="#990000">(</font>P1<font color="#990000">),</font> <b><font color="#000000">p2</font></b><font color="#990000">(</font>P2<font color="#990000">)</font> <font color="#FF0000">{}</font><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>
  <font color="#009900">void</font> <b><font color="#000000">drawIfAllChildrenAreVisible</font></b><font color="#990000">(</font><b><font color="#0000FF">const</font></b> CullingCamera<font color="#990000">*</font> camera<font color="#990000">)</font> <b><font color="#0000FF">const</font></b><font color="#990000">;</font>
  <font color="#009900">void</font> <b><font color="#000000">buildBoxHierarchy</font></b><font color="#990000">(</font><font color="#009900">int</font> l<font color="#990000">);</font>

  <i><font color="#9A1900">// Lazy static member, so that it is shared by viewers</font></i>
  <b><font color="#0000FF">static</font></b> Box<font color="#990000">*</font> Root<font color="#990000">;</font>
  
<b><font color="#0000FF">private</font></b><font color="#990000">:</font>
  qglviewer<font color="#990000">::</font>Vec p1<font color="#990000">,</font> p2<font color="#990000">;</font>
  Box<font color="#990000">*</font> child<font color="#990000">[</font><font color="#993399">8</font><font color="#990000">];</font>
  <font color="#009900">int</font> level<font color="#990000">;</font>
<font color="#FF0000">}</font><font color="#990000">;</font>
</tt></pre>


<h2>cullingCamera.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">&lt;QGLViewer/camera.h&gt;</font>

<b><font color="#0000FF">class</font></b> CullingCamera <font color="#990000">:</font> <b><font color="#0000FF">public</font></b> qglviewer<font color="#990000">::</font>Camera
<font color="#FF0000">{</font>
<b><font color="#0000FF">public</font></b><font color="#990000">:</font>

  <font color="#009900">void</font> <b><font color="#000000">computeFrustumPlanesEquations</font></b><font color="#990000">()</font> <b><font color="#0000FF">const</font></b> <font color="#FF0000">{</font> <b><font color="#000000">getFrustumPlanesCoefficients</font></b><font color="#990000">(</font>planeCoefficients<font color="#990000">);</font> <font color="#FF0000">}</font>

  <font color="#009900">float</font> <b><font color="#000000">distanceToFrustumPlane</font></b><font color="#990000">(</font><font color="#009900">int</font> index<font color="#990000">,</font> <b><font color="#0000FF">const</font></b> qglviewer<font color="#990000">::</font>Vec<font color="#990000">&amp;</font> pos<font color="#990000">)</font> <b><font color="#0000FF">const</font></b><font color="#990000">;</font>
  <font color="#009900">bool</font> <b><font color="#000000">sphereIsVisible</font></b><font color="#990000">(</font><b><font color="#0000FF">const</font></b> qglviewer<font color="#990000">::</font>Vec<font color="#990000">&amp;</font> center<font color="#990000">,</font> <font color="#009900">float</font> radius<font color="#990000">)</font> <b><font color="#0000FF">const</font></b><font color="#990000">;</font>
  <font color="#009900">bool</font> <b><font color="#000000">aaBoxIsVisible</font></b><font color="#990000">(</font><b><font color="#0000FF">const</font></b> qglviewer<font color="#990000">::</font>Vec<font color="#990000">&amp;</font> p1<font color="#990000">,</font> <b><font color="#0000FF">const</font></b> qglviewer<font color="#990000">::</font>Vec<font color="#990000">&amp;</font> p2<font color="#990000">,</font> <font color="#009900">bool</font><font color="#990000">*</font> entirely<font color="#990000">=</font>NULL<font color="#990000">)</font> <b><font color="#0000FF">const</font></b><font color="#990000">;</font>
  
<b><font color="#0000FF">private</font></b><font color="#990000">:</font>
  <i><font color="#9A1900">// F r u s t u m   p l a n e s</font></i>
  <b><font color="#0000FF">mutable</font></b> GLdouble planeCoefficients<font color="#990000">[</font><font color="#993399">6</font><font color="#990000">][</font><font color="#993399">4</font><font color="#990000">];</font>
<font color="#FF0000">}</font><font color="#990000">;</font>
</tt></pre>


<h2>box.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">"box.h"</font>
<b><font color="#000080">#include</font></b> <font color="#FF0000">"cullingCamera.h"</font>

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

<i><font color="#9A1900">// Static member initialization</font></i>
Box<font color="#990000">*</font> Box<font color="#990000">::</font>Root<font color="#990000">;</font>

<font color="#009900">void</font> Box<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="#000000">glColor3f</font></b><font color="#990000">(</font><font color="#993399">0.3</font><font color="#990000">*</font>level<font color="#990000">,</font> <font color="#993399">0</font><font color="#990000">.</font>2f<font color="#990000">,</font> <font color="#993399">1.0</font><font color="#990000">-</font><font color="#993399">0.3</font><font color="#990000">*</font>level<font color="#990000">);</font>
  <b><font color="#000000">glLineWidth</font></b><font color="#990000">(</font>level<font color="#990000">+</font><font color="#993399">1</font><font color="#990000">);</font>

  <b><font color="#000000">glBegin</font></b><font color="#990000">(</font>GL_LINE_STRIP<font color="#990000">);</font>
  <b><font color="#000000">glVertex3fv</font></b><font color="#990000">(</font><b><font color="#000000">Vec</font></b><font color="#990000">(</font>p1<font color="#990000">.</font>x<font color="#990000">,</font> p1<font color="#990000">.</font>y<font color="#990000">,</font> p1<font color="#990000">.</font>z<font color="#990000">));</font>
  <b><font color="#000000">glVertex3fv</font></b><font color="#990000">(</font><b><font color="#000000">Vec</font></b><font color="#990000">(</font>p1<font color="#990000">.</font>x<font color="#990000">,</font> p2<font color="#990000">.</font>y<font color="#990000">,</font> p1<font color="#990000">.</font>z<font color="#990000">));</font>
  <b><font color="#000000">glVertex3fv</font></b><font color="#990000">(</font><b><font color="#000000">Vec</font></b><font color="#990000">(</font>p2<font color="#990000">.</font>x<font color="#990000">,</font> p2<font color="#990000">.</font>y<font color="#990000">,</font> p1<font color="#990000">.</font>z<font color="#990000">));</font>
  <b><font color="#000000">glVertex3fv</font></b><font color="#990000">(</font><b><font color="#000000">Vec</font></b><font color="#990000">(</font>p2<font color="#990000">.</font>x<font color="#990000">,</font> p1<font color="#990000">.</font>y<font color="#990000">,</font> p1<font color="#990000">.</font>z<font color="#990000">));</font>
  <b><font color="#000000">glVertex3fv</font></b><font color="#990000">(</font><b><font color="#000000">Vec</font></b><font color="#990000">(</font>p1<font color="#990000">.</font>x<font color="#990000">,</font> p1<font color="#990000">.</font>y<font color="#990000">,</font> p1<font color="#990000">.</font>z<font color="#990000">));</font>
  <b><font color="#000000">glVertex3fv</font></b><font color="#990000">(</font><b><font color="#000000">Vec</font></b><font color="#990000">(</font>p1<font color="#990000">.</font>x<font color="#990000">,</font> p1<font color="#990000">.</font>y<font color="#990000">,</font> p2<font color="#990000">.</font>z<font color="#990000">));</font>
  <b><font color="#000000">glVertex3fv</font></b><font color="#990000">(</font><b><font color="#000000">Vec</font></b><font color="#990000">(</font>p1<font color="#990000">.</font>x<font color="#990000">,</font> p2<font color="#990000">.</font>y<font color="#990000">,</font> p2<font color="#990000">.</font>z<font color="#990000">));</font>
  <b><font color="#000000">glVertex3fv</font></b><font color="#990000">(</font><b><font color="#000000">Vec</font></b><font color="#990000">(</font>p2<font color="#990000">.</font>x<font color="#990000">,</font> p2<font color="#990000">.</font>y<font color="#990000">,</font> p2<font color="#990000">.</font>z<font color="#990000">));</font>
  <b><font color="#000000">glVertex3fv</font></b><font color="#990000">(</font><b><font color="#000000">Vec</font></b><font color="#990000">(</font>p2<font color="#990000">.</font>x<font color="#990000">,</font> p1<font color="#990000">.</font>y<font color="#990000">,</font> p2<font color="#990000">.</font>z<font color="#990000">));</font>
  <b><font color="#000000">glVertex3fv</font></b><font color="#990000">(</font><b><font color="#000000">Vec</font></b><font color="#990000">(</font>p1<font color="#990000">.</font>x<font color="#990000">,</font> p1<font color="#990000">.</font>y<font color="#990000">,</font> p2<font color="#990000">.</font>z<font color="#990000">));</font>
  <b><font color="#000000">glEnd</font></b><font color="#990000">();</font>

  <b><font color="#000000">glBegin</font></b><font color="#990000">(</font>GL_LINES<font color="#990000">);</font>
  <b><font color="#000000">glVertex3fv</font></b><font color="#990000">(</font><b><font color="#000000">Vec</font></b><font color="#990000">(</font>p1<font color="#990000">.</font>x<font color="#990000">,</font> p2<font color="#990000">.</font>y<font color="#990000">,</font> p1<font color="#990000">.</font>z<font color="#990000">));</font>
  <b><font color="#000000">glVertex3fv</font></b><font color="#990000">(</font><b><font color="#000000">Vec</font></b><font color="#990000">(</font>p1<font color="#990000">.</font>x<font color="#990000">,</font> p2<font color="#990000">.</font>y<font color="#990000">,</font> p2<font color="#990000">.</font>z<font color="#990000">));</font>
  <b><font color="#000000">glVertex3fv</font></b><font color="#990000">(</font><b><font color="#000000">Vec</font></b><font color="#990000">(</font>p2<font color="#990000">.</font>x<font color="#990000">,</font> p2<font color="#990000">.</font>y<font color="#990000">,</font> p1<font color="#990000">.</font>z<font color="#990000">));</font>
  <b><font color="#000000">glVertex3fv</font></b><font color="#990000">(</font><b><font color="#000000">Vec</font></b><font color="#990000">(</font>p2<font color="#990000">.</font>x<font color="#990000">,</font> p2<font color="#990000">.</font>y<font color="#990000">,</font> p2<font color="#990000">.</font>z<font color="#990000">));</font>
  <b><font color="#000000">glVertex3fv</font></b><font color="#990000">(</font><b><font color="#000000">Vec</font></b><font color="#990000">(</font>p2<font color="#990000">.</font>x<font color="#990000">,</font> p1<font color="#990000">.</font>y<font color="#990000">,</font> p1<font color="#990000">.</font>z<font color="#990000">));</font>
  <b><font color="#000000">glVertex3fv</font></b><font color="#990000">(</font><b><font color="#000000">Vec</font></b><font color="#990000">(</font>p2<font color="#990000">.</font>x<font color="#990000">,</font> p1<font color="#990000">.</font>y<font color="#990000">,</font> p2<font color="#990000">.</font>z<font color="#990000">));</font>
  <b><font color="#000000">glEnd</font></b><font color="#990000">();</font>
<font color="#FF0000">}</font>

<font color="#009900">void</font> Box<font color="#990000">::</font><b><font color="#000000">buildBoxHierarchy</font></b><font color="#990000">(</font><font color="#009900">int</font> l<font color="#990000">)</font>
<font color="#FF0000">{</font>
  level <font color="#990000">=</font> l<font color="#990000">;</font>
  <b><font color="#0000FF">const</font></b> Vec middle <font color="#990000">=</font> <font color="#990000">(</font>p1<font color="#990000">+</font>p2<font color="#990000">)</font> <font color="#990000">/</font> <font color="#993399">2.0</font><font color="#990000">;</font>
  <b><font color="#0000FF">for</font></b> <font color="#990000">(</font><font color="#009900">unsigned</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="#993399">8</font><font color="#990000">;</font> <font color="#990000">++</font>i<font color="#990000">)</font>
    <font color="#FF0000">{</font>
      <i><font color="#9A1900">// point in one of the 8 box corners</font></i>
      <b><font color="#0000FF">const</font></b> Vec <b><font color="#000000">point</font></b><font color="#990000">((</font>i<font color="#990000">&amp;</font><font color="#993399">4</font><font color="#990000">)?</font>p1<font color="#990000">.</font>x<font color="#990000">:</font>p2<font color="#990000">.</font>x<font color="#990000">,</font> <font color="#990000">(</font>i<font color="#990000">&amp;</font><font color="#993399">2</font><font color="#990000">)?</font>p1<font color="#990000">.</font>y<font color="#990000">:</font>p2<font color="#990000">.</font>y<font color="#990000">,</font> <font color="#990000">(</font>i<font color="#990000">&amp;</font><font color="#993399">1</font><font color="#990000">)?</font>p1<font color="#990000">.</font>z<font color="#990000">:</font>p2<font color="#990000">.</font>z<font color="#990000">);</font>
      <b><font color="#0000FF">if</font></b> <font color="#990000">(</font>level <font color="#990000">&gt;</font> <font color="#993399">0</font><font color="#990000">)</font>
	<font color="#FF0000">{</font>
	  child<font color="#990000">[</font>i<font color="#990000">]</font> <font color="#990000">=</font> <b><font color="#0000FF">new</font></b> <b><font color="#000000">Box</font></b><font color="#990000">(</font>point<font color="#990000">,</font> middle<font color="#990000">);</font>
	  child<font color="#990000">[</font>i<font color="#990000">]-&gt;</font><b><font color="#000000">buildBoxHierarchy</font></b><font color="#990000">(</font>level<font color="#990000">-</font><font color="#993399">1</font><font color="#990000">);</font>
	<font color="#FF0000">}</font>
      <b><font color="#0000FF">else</font></b>
	child<font color="#990000">[</font>i<font color="#990000">]</font> <font color="#990000">=</font> NULL<font color="#990000">;</font>
    <font color="#FF0000">}</font>
<font color="#FF0000">}</font>

<font color="#009900">void</font> Box<font color="#990000">::</font><b><font color="#000000">drawIfAllChildrenAreVisible</font></b><font color="#990000">(</font><b><font color="#0000FF">const</font></b> CullingCamera<font color="#990000">*</font> camera<font color="#990000">)</font> <b><font color="#0000FF">const</font></b>
<font color="#FF0000">{</font>
  <b><font color="#0000FF">static</font></b> <font color="#009900">bool</font><font color="#990000">*</font> entirely <font color="#990000">=</font> <b><font color="#0000FF">new</font></b> <font color="#009900">bool</font><font color="#990000">;</font>

  <b><font color="#0000FF">if</font></b> <font color="#990000">(</font>camera<font color="#990000">-&gt;</font><b><font color="#000000">aaBoxIsVisible</font></b><font color="#990000">(</font>p1<font color="#990000">,</font> p2<font color="#990000">,</font> entirely<font color="#990000">))</font>
    <b><font color="#0000FF">if</font></b> <font color="#990000">(*</font>entirely<font color="#990000">)</font>
      <b><font color="#000000">draw</font></b><font color="#990000">();</font>
    <b><font color="#0000FF">else</font></b>
      <b><font color="#0000FF">if</font></b> <font color="#990000">(</font>child<font color="#990000">[</font><font color="#993399">0</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><font color="#993399">0</font><font color="#990000">;</font> i<font color="#990000">&lt;</font><font color="#993399">8</font><font color="#990000">;</font> <font color="#990000">++</font>i<font color="#990000">)</font>
	  child<font color="#990000">[</font>i<font color="#990000">]-&gt;</font><b><font color="#000000">drawIfAllChildrenAreVisible</font></b><font color="#990000">(</font>camera<font color="#990000">);</font>
      <b><font color="#0000FF">else</font></b>
	<b><font color="#000000">draw</font></b><font color="#990000">();</font>
<font color="#FF0000">}</font>
</tt></pre>


<h2>cullingCamera.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">"cullingCamera.h"</font>

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

<font color="#009900">float</font> CullingCamera<font color="#990000">::</font><b><font color="#000000">distanceToFrustumPlane</font></b><font color="#990000">(</font><font color="#009900">int</font> index<font color="#990000">,</font> <b><font color="#0000FF">const</font></b> Vec<font color="#990000">&amp;</font> pos<font color="#990000">)</font> <b><font color="#0000FF">const</font></b>
<font color="#FF0000">{</font>
  <b><font color="#0000FF">return</font></b> pos <font color="#990000">*</font> <b><font color="#000000">Vec</font></b><font color="#990000">(</font>planeCoefficients<font color="#990000">[</font>index<font color="#990000">])</font> <font color="#990000">-</font> planeCoefficients<font color="#990000">[</font>index<font color="#990000">][</font><font color="#993399">3</font><font color="#990000">];</font>
<font color="#FF0000">}</font>

<font color="#009900">bool</font> CullingCamera<font color="#990000">::</font><b><font color="#000000">sphereIsVisible</font></b><font color="#990000">(</font><b><font color="#0000FF">const</font></b> Vec<font color="#990000">&amp;</font> center<font color="#990000">,</font> <font color="#009900">float</font> radius<font color="#990000">)</font> <b><font color="#0000FF">const</font></b>
<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="#993399">6</font><font color="#990000">;</font> <font color="#990000">++</font>i<font color="#990000">)</font>
    <b><font color="#0000FF">if</font></b> <font color="#990000">(</font><b><font color="#000000">distanceToFrustumPlane</font></b><font color="#990000">(</font>i<font color="#990000">,</font> center<font color="#990000">)</font> <font color="#990000">&gt;</font> radius<font color="#990000">)</font>
      <b><font color="#0000FF">return</font></b> <b><font color="#0000FF">false</font></b><font color="#990000">;</font>
  <b><font color="#0000FF">return</font></b> <b><font color="#0000FF">true</font></b><font color="#990000">;</font>
<font color="#FF0000">}</font>

<font color="#009900">bool</font> CullingCamera<font color="#990000">::</font><b><font color="#000000">aaBoxIsVisible</font></b><font color="#990000">(</font><b><font color="#0000FF">const</font></b> Vec<font color="#990000">&amp;</font> p1<font color="#990000">,</font> <b><font color="#0000FF">const</font></b> Vec<font color="#990000">&amp;</font> p2<font color="#990000">,</font> <font color="#009900">bool</font><font color="#990000">*</font> entirely<font color="#990000">)</font> <b><font color="#0000FF">const</font></b>
<font color="#FF0000">{</font>
  <font color="#009900">bool</font> allInForAllPlanes <font color="#990000">=</font> <b><font color="#0000FF">true</font></b><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="#993399">6</font><font color="#990000">;</font> <font color="#990000">++</font>i<font color="#990000">)</font>
    <font color="#FF0000">{</font>
      <font color="#009900">bool</font> allOut <font color="#990000">=</font> <b><font color="#0000FF">true</font></b><font color="#990000">;</font>
      <b><font color="#0000FF">for</font></b> <font color="#990000">(</font><font color="#009900">unsigned</font> <font color="#009900">int</font> c<font color="#990000">=</font><font color="#993399">0</font><font color="#990000">;</font> c<font color="#990000">&lt;</font><font color="#993399">8</font><font color="#990000">;</font> <font color="#990000">++</font>c<font color="#990000">)</font>
	<font color="#FF0000">{</font>
	  <b><font color="#0000FF">const</font></b> Vec <b><font color="#000000">pos</font></b><font color="#990000">((</font>c<font color="#990000">&amp;</font><font color="#993399">4</font><font color="#990000">)?</font>p1<font color="#990000">.</font>x<font color="#990000">:</font>p2<font color="#990000">.</font>x<font color="#990000">,</font> <font color="#990000">(</font>c<font color="#990000">&amp;</font><font color="#993399">2</font><font color="#990000">)?</font>p1<font color="#990000">.</font>y<font color="#990000">:</font>p2<font color="#990000">.</font>y<font color="#990000">,</font> <font color="#990000">(</font>c<font color="#990000">&amp;</font><font color="#993399">1</font><font color="#990000">)?</font>p1<font color="#990000">.</font>z<font color="#990000">:</font>p2<font color="#990000">.</font>z<font color="#990000">);</font>
	  <b><font color="#0000FF">if</font></b> <font color="#990000">(</font><b><font color="#000000">distanceToFrustumPlane</font></b><font color="#990000">(</font>i<font color="#990000">,</font> pos<font color="#990000">)</font> <font color="#990000">&gt;</font> <font color="#993399">0.0</font><font color="#990000">)</font>
	    allInForAllPlanes <font color="#990000">=</font> <b><font color="#0000FF">false</font></b><font color="#990000">;</font>
	  <b><font color="#0000FF">else</font></b>
	    allOut <font color="#990000">=</font> <b><font color="#0000FF">false</font></b><font color="#990000">;</font>
	<font color="#FF0000">}</font>

      <i><font color="#9A1900">// The eight points are on the outside side of this plane</font></i>
      <b><font color="#0000FF">if</font></b> <font color="#990000">(</font>allOut<font color="#990000">)</font>
	<b><font color="#0000FF">return</font></b> <b><font color="#0000FF">false</font></b><font color="#990000">;</font>
    <font color="#FF0000">}</font>

  <b><font color="#0000FF">if</font></b> <font color="#990000">(</font>entirely<font color="#990000">)</font>
    <i><font color="#9A1900">// Entirely visible : the eight points are on the inside side of the 6 planes</font></i>
    <font color="#990000">*</font>entirely <font color="#990000">=</font> allInForAllPlanes<font color="#990000">;</font>

  <i><font color="#9A1900">// Too conservative, but tangent cases are too expensive to detect</font></i>
  <b><font color="#0000FF">return</font></b> <b><font color="#0000FF">true</font></b><font color="#990000">;</font>
<font color="#FF0000">}</font>
</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">"frustumCulling.h"</font>
<b><font color="#000080">#include</font></b> <font color="#FF0000">"cullingCamera.h"</font>
<b><font color="#000080">#include</font></b> <font color="#FF0000">"box.h"</font>
<b><font color="#000080">#include</font></b> <font color="#FF0000">&lt;qapplication.h&gt;</font>

<b><font color="#0000FF">using</font></b> <b><font color="#0000FF">namespace</font></b> qglviewer<font color="#990000">;</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>

  <i><font color="#9A1900">// Create octree AABBox hierarchy</font></i>
  <b><font color="#0000FF">const</font></b> qglviewer<font color="#990000">::</font>Vec <b><font color="#000000">p</font></b><font color="#990000">(</font><font color="#993399">1.0</font><font color="#990000">,</font> <font color="#993399">0</font><font color="#990000">.</font>7f<font color="#990000">,</font> <font color="#993399">1</font><font color="#990000">.</font>3f<font color="#990000">);</font>
  Box<font color="#990000">::</font>Root <font color="#990000">=</font> <b><font color="#0000FF">new</font></b> <b><font color="#000000">Box</font></b><font color="#990000">(-</font>p<font color="#990000">,</font> p<font color="#990000">);</font>
  Box<font color="#990000">::</font>Root<font color="#990000">-&gt;</font><b><font color="#000000">buildBoxHierarchy</font></b><font color="#990000">(</font><font color="#993399">4</font><font color="#990000">);</font>

  <i><font color="#9A1900">// Instantiate the two viewers.</font></i>
  Viewer viewer<font color="#990000">,</font> observer<font color="#990000">;</font>

  <i><font color="#9A1900">// Give v a cullingCamera;</font></i>
  Camera<font color="#990000">*</font> c <font color="#990000">=</font> viewer<font color="#990000">.</font><b><font color="#000000">camera</font></b><font color="#990000">();</font>
  CullingCamera<font color="#990000">*</font> cc <font color="#990000">=</font> <b><font color="#0000FF">new</font></b> <b><font color="#000000">CullingCamera</font></b><font color="#990000">();</font>
  viewer<font color="#990000">.</font><b><font color="#000000">setCamera</font></b><font color="#990000">(</font>cc<font color="#990000">);</font>
  <b><font color="#0000FF">delete</font></b> c<font color="#990000">;</font>
  
  <i><font color="#9A1900">// Both viewers share the culling camera</font></i>
  viewer<font color="#990000">.</font><b><font color="#000000">setCullingCamera</font></b><font color="#990000">(</font>cc<font color="#990000">);</font>
  observer<font color="#990000">.</font><b><font color="#000000">setCullingCamera</font></b><font color="#990000">(</font>cc<font color="#990000">);</font>

  <i><font color="#9A1900">// Place observer </font></i>
  observer<font color="#990000">.</font><b><font color="#000000">setSceneRadius</font></b><font color="#990000">(</font><font color="#993399">10.0</font><font color="#990000">);</font>
  observer<font color="#990000">.</font><b><font color="#000000">camera</font></b><font color="#990000">()-&gt;</font><b><font color="#000000">setViewDirection</font></b><font color="#990000">(</font>qglviewer<font color="#990000">::</font><b><font color="#000000">Vec</font></b><font color="#990000">(</font><font color="#993399">0.0</font><font color="#990000">,</font> <font color="#990000">-</font><font color="#993399">1.0</font><font color="#990000">,</font> <font color="#993399">0.0</font><font color="#990000">));</font>
  observer<font color="#990000">.</font><b><font color="#000000">showEntireScene</font></b><font color="#990000">();</font>

  <i><font color="#9A1900">// Make sure every culling Camera movement updates the outer viewer</font></i>
  QObject<font color="#990000">::</font><b><font color="#000000">connect</font></b><font color="#990000">(</font>viewer<font color="#990000">.</font><b><font color="#000000">camera</font></b><font color="#990000">()-&gt;</font><b><font color="#000000">frame</font></b><font color="#990000">(),</font> <b><font color="#000000">SIGNAL</font></b><font color="#990000">(</font><b><font color="#000000">manipulated</font></b><font color="#990000">()),</font> <font color="#990000">&amp;</font>observer<font color="#990000">,</font> <b><font color="#000000">SLOT</font></b><font color="#990000">(</font><b><font color="#000000">updateGL</font></b><font color="#990000">()));</font>
  QObject<font color="#990000">::</font><b><font color="#000000">connect</font></b><font color="#990000">(</font>viewer<font color="#990000">.</font><b><font color="#000000">camera</font></b><font color="#990000">()-&gt;</font><b><font color="#000000">frame</font></b><font color="#990000">(),</font> <b><font color="#000000">SIGNAL</font></b><font color="#990000">(</font><b><font color="#000000">spun</font></b><font color="#990000">()),</font> <font color="#990000">&amp;</font>observer<font color="#990000">,</font> <b><font color="#000000">SLOT</font></b><font color="#990000">(</font><b><font color="#000000">updateGL</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">// Set the viewer as the application main widget.</font></i>
  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">"frustumCulling"</font><font color="#990000">);</font>
  observer<font color="#990000">.</font><b><font color="#000000">setWindowTitle</font></b><font color="#990000">(</font><font color="#FF0000">"scene observer"</font><font color="#990000">);</font>
<b><font color="#000080">#endif</font></b>

  <i><font color="#9A1900">// Show the viewers' windows.</font></i>
  viewer<font color="#990000">.</font><b><font color="#000000">show</font></b><font color="#990000">();</font>
  observer<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>



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