Sophie

Sophie

distrib > PLD > th > x86_64 > by-pkgid > 3b87faceb47db01a011d04a86cccd880 > files > 5

OpenSubdiv-apidocs-3.5.1-1.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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.18.1: http://docutils.sourceforge.net/" />
<title>bfr_tutorial_1_1.cpp</title>
<link rel="icon" type="image/png" href="images/icon.png">
<link rel="stylesheet" href="css/rst.css" type="text/css" />
<link rel="stylesheet" href="css/default.css" type="text/css" />
<link rel="stylesheet" href="css/flavor.css" type="text/css" />
<link rel="stylesheet" href="css/renderman-university.css" type="text/css" />
<link rel="stylesheet" href="css/pygments.css" type="text/css" />
<style>
#mainContentContainer {
    left: 15px;
    margin-left: 255px;
}
ul.creatorFooterNav {
    margin-left: 250px;
}
.navigation {
    background-color: #333333;
    margin-top: 10px;
    margin-left: 10px;
}
ul.creatorMainNav li a {
    font-size: 12px !important;
}
.copyrightFooter {
    font-size: 11px;
    margin-top: 25px;
    text-align: center;
    float: none;
}
</style>
</head>
<body>

<div class="navigation">
    <br>
    <div class="searchBar">
        <form action="search.html">
            <input type="text" name="q" id="searchInput" />
            <input type="button" id="searchButton" onclick="this.form.submit();" value="Search" />
        </form>
    </div>
    <div class="quickLinks">
        <ul>
            <li><a href="intro.html">Introduction</a></li>
                <ul>
                    <li><a href="license.html">License</a></li>
                    <li><a href="getting_started.html">Getting Started</a></li>
                    <li><a href="contributing.html">Contributing</a></li>
                    <li><a href="cmake_build.html">Building OpenSubdiv</a></li>
                    <li><a href="code_examples.html">Code Examples</a></li>
                    <li><a href="references.html">References</a></li>
                </ul>
            <p></p>
            <li><a href="subdivision_surfaces.html">Subdivision Surfaces</a>
                <ul>
                    <li><a href="subdivision_surfaces.html#piecewise-parametric-surfaces">Piecewise Parametric Surfaces</a></li>
                    <li><a href="subdivision_surfaces.html#arbitrary-topology">Arbitrary Topology</a></li>
                    <li><a href="subdivision_surfaces.html#subdivision-versus-tessellation">Subdivision versus Tessellation</a></li>
                    <li><a href="subdivision_surfaces.html#mesh-data-and-topology">Mesh Data and Topology</a></li>
                    <li><a href="subdivision_surfaces.html#schemes-and-options">Schemes and Options</a></li>
                    <li><a href="mod_notes.html">Modeling Tips</a></li>
                </ul>
            </li>
            <p></p>
            <li><a href="api_overview.html">OpenSubdiv User Guide</a>
                <ul>
                    <li><a href="api_overview.html">API Overview</a>
                    <ul>
                        <li><a href="sdc_overview.html">Sdc</a></li>
                        <li><a href="vtr_overview.html">Vtr</a></li>
                        <li><a href="far_overview.html">Far</a></li>
                        <ul>
                            <li><a href="far_overview.html#far-topologyrefiner">Topology Refiner</a></li>
                            <li><a href="far_overview.html#far-topologyrefinerfactory">Topology Refiner Factory</a></li>
                            <li><a href="far_overview.html#far-primvarrefiner">Primvar Refiner</a></li>
                            <li><a href="far_overview.html#far-patchtable">Patch Table</a></li>
                            <li><a href="far_overview.html#far-stenciltable">Stencil Table</a></li>
                        </ul>
                        <li><a href="bfr_overview.html">Bfr</a></li>
                        <ul>
                            <li><a href="bfr_overview.html#bfr-navlink-evaluation">Evaluation</a></li>
                            <li><a href="bfr_overview.html#bfr-navlink-parameterization">Parameterization</a></li>
                            <li><a href="bfr_overview.html#bfr-navlink-tessellation">Tessellation</a></li>
                            <li><a href="bfr_overview.html#bfr-navlink-surfacefactory">More on Surface Factory</a></li>
                            <li><a href="bfr_overview.html#bfr-navlink-customizing">Custom Surface Factory</a></li>
                        </ul>
                        <li><a href="osd_overview.html">Osd</a></li>
                        <ul>
                            <li><a href="osd_shader_interface.html">Shader Interface</a></li>
                        </ul>
                    </ul>
                    </li>
                    <li><a href="tutorials.html">Tutorials</a>
                    <li><a href="hbr_overview.html">Historical But Relevant</a></li>
                    <ul>
                        <li><a href="hbr_overview.html">Hbr</a></li>
                        <ul>
                            <li><a href="using_osd_hbr.html">Using Hbr</a></li>
                        </ul>
                        <li><a href="hedits.html">Hierarchical Edits</a></li>
                    </ul>
                </ul>
            </li>
            <p></p>
            <li><a href="additional_resources.html">Additional Resources</a>
                <ul>
                    <li><a href="http://graphics.pixar.com/opensubdiv/forum.html">Forum</a>
                    <li><a href="additional_resources.html#links">Links</a>
                    <li><a href="additional_resources.html#videos">Videos</a>
                </ul>
            <p></p>
            <li><a href="release_notes.html">Releases</a>
                <ul>
                    <li><a href="release_35.html">Release 3.5</a></li>
                    <li><a href="release_34.html">Release 3.4</a></li>
                    <li><a href="release_33.html">Release 3.3</a></li>
                    <li><a href="release_32.html">Release 3.2</a></li>
                    <li><a href="release_31.html">Release 3.1</a></li>
                    <li><a href="release_30.html">Release 3.0</a></li>
                        <ul>
                            <li><a href="release_30.html">Overview</a></li>
                            <li><a href="porting.html">Porting Guide: 2.0 to 3.0</a></li>
                            <li><a href="compatibility.html">Subdivision Compatibility</a></li>
                        </ul>
                    <li><a href="release_notes.html">Release Notes</a></li>
                </ul>
            <p></p>
            <li><a href="doxy_html/index.html" target="_blank">Doxygen</a></li>
        </ul>
    </div>
    <br>
</div>

<div class="document" id="bfr-tutorial-1-1-cpp">
<h1 class="title">bfr_tutorial_1_1.cpp</h1>


    <div id="mainContentContainer">
        <div class="fullWidth headerColor">
            <div class="center">
                <div id="mainSiteNavigation">
                    <div class="homeRenderManLink">
                        <a href="http://graphics.pixar.com/opensubdiv/index.html"><img alt="OpenSubdiv Logo" src="images/opensubdiv_logo_header.png"></a>
                    </div>
          
					<!-- TOP NAVIGATION MENU -->
                    <ul class="creatorMainNav floatLeft" id="menu">
                        <li class="creatorMainNav">
                            <a href="release_notes.html">3.5.1</a>
                        </li>
                    </ul>
                    <ul class="creatorMainNav floatNav" id="menu">
                        <li class="mainSubNavigation marginR12 marginL12" id="navbarId-23704">
                            <a href="intro.html">User Docs</a>
                        </li>
                        <li class="mainSubNavigation marginR12 marginL12" id="navbarId-23887">
                            <a href="doxy_html/index.html">API Docs</a>
                        </li>
                        <li class="mainSubNavigation marginR12 marginL12" id="navbarId-23944">
                            <a href="release_notes.html">Release Notes</a>
                        </li>
                        <li class="mainSubNavigation marginR15 marginL12" id="navbarId-23703">
                            <a href="http://graphics.pixar.com/opensubdiv/forum.html">Forum</a>
                        </li>
                        <a class="blueButton marginR0 marginL0" style="width:70px" href="https://github.com/PixarAnimationStudios/OpenSubdiv">Github</a>
                    </ul>
                </div><!-- close mainSiteNavigation -->
            </div><!-- close center -->
        </div><!-- close fullWidth -->


        <div class="clearBoth"></div>
        
        <h1 class="articleContentTitle">bfr_tutorial_1_1.cpp</h1>
        
        <div class="clearBoth"></div>
        
        <hr>
        
        <div class="clearBoth"></div>
        
        <div class="coursewareBackground">

          <!-- <div class="topicLeftData-IntroPara"></div> -->
          <div class="topicLeftData-MainData">
<p><a class="reference external" href="https://github.com/PixarAnimationStudios/OpenSubdiv/blob/release/tutorials/bfr/tutorial_1_1/bfr_tutorial_1_1.cpp">https://github.com/PixarAnimationStudios/OpenSubdiv/blob/release/tutorials/bfr/tutorial_1_1/bfr_tutorial_1_1.cpp</a></p>
<hr class="docutils" />
<pre class="code c++ literal-block">
<span class="comment single">//------------------------------------------------------------------------------
//  Tutorial description:
//
//      This tutorial illustrates the use of the SurfaceFactory, Surface
//      and Parameterization classes for creating and evaluating the limit
//      surface associated with each base face of a mesh.
//
//      Following the creation of a connected mesh for a shape (using a
//      Far::TopologyRefiner, as illustrated in Far tutorials), an instance
//      of a SurfaceFactory is declared to process its faces.  Each face of
//      the mesh is evaluated and tessellated independently (with a simple
//      triangle fan), with results written out in Obj format for inspection.
//
//      These classes make it simple to evaluate and tessellate all faces
//      (quads, tris or others) while supporting the full set of subdivision
//      options. While a triangle fan may be a trivial tessellation (and so
//      not very useful) later examples using the Tessellation class provide
//      more useful results with the same simplicity.
//
</span><span class="whitespace">
</span><span class="comment preproc">#include</span><span class="whitespace"> </span><span class="comment preprocfile">&lt;opensubdiv/far/topologyRefiner.h&gt;</span><span class="comment preproc">
#include</span><span class="whitespace"> </span><span class="comment preprocfile">&lt;opensubdiv/bfr/refinerSurfaceFactory.h&gt;</span><span class="comment preproc">
#include</span><span class="whitespace"> </span><span class="comment preprocfile">&lt;opensubdiv/bfr/surface.h&gt;</span><span class="comment preproc">
</span><span class="whitespace">
</span><span class="comment preproc">#include</span><span class="whitespace"> </span><span class="comment preprocfile">&lt;vector&gt;</span><span class="comment preproc">
#include</span><span class="whitespace"> </span><span class="comment preprocfile">&lt;string&gt;</span><span class="comment preproc">
#include</span><span class="whitespace"> </span><span class="comment preprocfile">&lt;cstring&gt;</span><span class="comment preproc">
#include</span><span class="whitespace"> </span><span class="comment preprocfile">&lt;cstdio&gt;</span><span class="comment preproc">
</span><span class="whitespace">
</span><span class="comment single">//  Local headers with support for this tutorial in &quot;namespace tutorial&quot;
</span><span class="comment preproc">#include</span><span class="whitespace"> </span><span class="comment preprocfile">&quot;./meshLoader.h&quot;</span><span class="comment preproc">
#include</span><span class="whitespace"> </span><span class="comment preprocfile">&quot;./objWriter.h&quot;</span><span class="comment preproc">
</span><span class="whitespace">
</span><span class="keyword">using</span><span class="whitespace"> </span><span class="keyword">namespace</span><span class="whitespace"> </span><span class="name namespace">OpenSubdiv</span><span class="punctuation">;</span><span class="whitespace">

</span><span class="comment single">//
//  Simple command line arguments to provide input and run-time options:
//
</span><span class="keyword">class</span><span class="whitespace"> </span><span class="name class">Args</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace">
</span><span class="keyword">public</span><span class="operator">:</span><span class="whitespace">
    </span><span class="name">std</span><span class="operator">::</span><span class="name">string</span><span class="whitespace">     </span><span class="name">inputObjFile</span><span class="punctuation">;</span><span class="whitespace">
    </span><span class="name">std</span><span class="operator">::</span><span class="name">string</span><span class="whitespace">     </span><span class="name">outputObjFile</span><span class="punctuation">;</span><span class="whitespace">
    </span><span class="name">Sdc</span><span class="operator">::</span><span class="name">SchemeType</span><span class="whitespace"> </span><span class="name">schemeType</span><span class="punctuation">;</span><span class="whitespace">

</span><span class="keyword">public</span><span class="operator">:</span><span class="whitespace">
    </span><span class="name">Args</span><span class="punctuation">(</span><span class="keyword type">int</span><span class="whitespace"> </span><span class="name">argc</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="keyword type">char</span><span class="whitespace"> </span><span class="operator">*</span><span class="whitespace"> </span><span class="name">argv</span><span class="punctuation">[])</span><span class="whitespace"> </span><span class="operator">:</span><span class="whitespace">
        </span><span class="name">inputObjFile</span><span class="punctuation">(),</span><span class="whitespace">
        </span><span class="name">outputObjFile</span><span class="punctuation">(),</span><span class="whitespace">
        </span><span class="name">schemeType</span><span class="punctuation">(</span><span class="name">Sdc</span><span class="operator">::</span><span class="name">SCHEME_CATMARK</span><span class="punctuation">)</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace">

        </span><span class="keyword">for</span><span class="whitespace"> </span><span class="punctuation">(</span><span class="keyword type">int</span><span class="whitespace"> </span><span class="name">i</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="literal number integer">1</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="name">i</span><span class="whitespace"> </span><span class="operator">&lt;</span><span class="whitespace"> </span><span class="name">argc</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="operator">++</span><span class="name">i</span><span class="punctuation">)</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace">
            </span><span class="keyword">if</span><span class="whitespace"> </span><span class="punctuation">(</span><span class="name">strstr</span><span class="punctuation">(</span><span class="name">argv</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">],</span><span class="whitespace"> </span><span class="literal string">&quot;.obj&quot;</span><span class="punctuation">))</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace">
                </span><span class="keyword">if</span><span class="whitespace"> </span><span class="punctuation">(</span><span class="name">inputObjFile</span><span class="punctuation">.</span><span class="name">empty</span><span class="punctuation">())</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace">
                    </span><span class="name">inputObjFile</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">std</span><span class="operator">::</span><span class="name">string</span><span class="punctuation">(</span><span class="name">argv</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">]);</span><span class="whitespace">
                </span><span class="punctuation">}</span><span class="whitespace"> </span><span class="keyword">else</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace">
                    </span><span class="name">fprintf</span><span class="punctuation">(</span><span class="name">stderr</span><span class="punctuation">,</span><span class="whitespace">
                        </span><span class="literal string">&quot;Warning: Extra Obj file '%s' ignored</span><span class="literal string escape">\n</span><span class="literal string">&quot;</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">argv</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">]);</span><span class="whitespace">
                </span><span class="punctuation">}</span><span class="whitespace">
            </span><span class="punctuation">}</span><span class="whitespace"> </span><span class="keyword">else</span><span class="whitespace"> </span><span class="keyword">if</span><span class="whitespace"> </span><span class="punctuation">(</span><span class="operator">!</span><span class="name">strcmp</span><span class="punctuation">(</span><span class="name">argv</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">],</span><span class="whitespace"> </span><span class="literal string">&quot;-o&quot;</span><span class="punctuation">))</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace">
                </span><span class="keyword">if</span><span class="whitespace"> </span><span class="punctuation">(</span><span class="operator">++</span><span class="name">i</span><span class="whitespace"> </span><span class="operator">&lt;</span><span class="whitespace"> </span><span class="name">argc</span><span class="punctuation">)</span><span class="whitespace"> </span><span class="name">outputObjFile</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">std</span><span class="operator">::</span><span class="name">string</span><span class="punctuation">(</span><span class="name">argv</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">]);</span><span class="whitespace">
            </span><span class="punctuation">}</span><span class="whitespace"> </span><span class="keyword">else</span><span class="whitespace"> </span><span class="keyword">if</span><span class="whitespace"> </span><span class="punctuation">(</span><span class="operator">!</span><span class="name">strcmp</span><span class="punctuation">(</span><span class="name">argv</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">],</span><span class="whitespace"> </span><span class="literal string">&quot;-bilinear&quot;</span><span class="punctuation">))</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace">
                </span><span class="name">schemeType</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">Sdc</span><span class="operator">::</span><span class="name">SCHEME_BILINEAR</span><span class="punctuation">;</span><span class="whitespace">
            </span><span class="punctuation">}</span><span class="whitespace"> </span><span class="keyword">else</span><span class="whitespace"> </span><span class="keyword">if</span><span class="whitespace"> </span><span class="punctuation">(</span><span class="operator">!</span><span class="name">strcmp</span><span class="punctuation">(</span><span class="name">argv</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">],</span><span class="whitespace"> </span><span class="literal string">&quot;-catmark&quot;</span><span class="punctuation">))</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace">
                </span><span class="name">schemeType</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">Sdc</span><span class="operator">::</span><span class="name">SCHEME_CATMARK</span><span class="punctuation">;</span><span class="whitespace">
            </span><span class="punctuation">}</span><span class="whitespace"> </span><span class="keyword">else</span><span class="whitespace"> </span><span class="keyword">if</span><span class="whitespace"> </span><span class="punctuation">(</span><span class="operator">!</span><span class="name">strcmp</span><span class="punctuation">(</span><span class="name">argv</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">],</span><span class="whitespace"> </span><span class="literal string">&quot;-loop&quot;</span><span class="punctuation">))</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace">
                </span><span class="name">schemeType</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">Sdc</span><span class="operator">::</span><span class="name">SCHEME_LOOP</span><span class="punctuation">;</span><span class="whitespace">
            </span><span class="punctuation">}</span><span class="whitespace"> </span><span class="keyword">else</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace">
                </span><span class="name">fprintf</span><span class="punctuation">(</span><span class="name">stderr</span><span class="punctuation">,</span><span class="whitespace">
                    </span><span class="literal string">&quot;Warning: Unrecognized argument '%s' ignored</span><span class="literal string escape">\n</span><span class="literal string">&quot;</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">argv</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">]);</span><span class="whitespace">
            </span><span class="punctuation">}</span><span class="whitespace">
        </span><span class="punctuation">}</span><span class="whitespace">
    </span><span class="punctuation">}</span><span class="whitespace">

</span><span class="keyword">private</span><span class="operator">:</span><span class="whitespace">
    </span><span class="name">Args</span><span class="punctuation">()</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace"> </span><span class="punctuation">}</span><span class="whitespace">
</span><span class="punctuation">};</span><span class="whitespace">

</span><span class="comment single">//
//  The main tessellation function:  given a mesh and vertex positions,
//  tessellate each face -- writing results in Obj format.
//
</span><span class="keyword type">void</span><span class="whitespace">
</span><span class="name function">tessellateToObj</span><span class="punctuation">(</span><span class="name">Far</span><span class="operator">::</span><span class="name">TopologyRefiner</span><span class="whitespace"> </span><span class="keyword">const</span><span class="whitespace"> </span><span class="operator">&amp;</span><span class="whitespace"> </span><span class="name">meshTopology</span><span class="punctuation">,</span><span class="whitespace">
                </span><span class="name">std</span><span class="operator">::</span><span class="name">vector</span><span class="operator">&lt;</span><span class="keyword type">float</span><span class="operator">&gt;</span><span class="whitespace">   </span><span class="keyword">const</span><span class="whitespace"> </span><span class="operator">&amp;</span><span class="whitespace"> </span><span class="name">meshVertexPositions</span><span class="punctuation">,</span><span class="whitespace">
                </span><span class="name">Args</span><span class="whitespace">                 </span><span class="keyword">const</span><span class="whitespace"> </span><span class="operator">&amp;</span><span class="whitespace"> </span><span class="name">options</span><span class="punctuation">)</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace">

    </span><span class="comment single">//
</span><span class="whitespace">    </span><span class="comment single">//  Use simpler local type names for the Surface and its factory:
</span><span class="whitespace">    </span><span class="comment single">//
</span><span class="whitespace">    </span><span class="keyword">typedef</span><span class="whitespace"> </span><span class="name">Bfr</span><span class="operator">::</span><span class="name">RefinerSurfaceFactory</span><span class="operator">&lt;&gt;</span><span class="whitespace"> </span><span class="name">SurfaceFactory</span><span class="punctuation">;</span><span class="whitespace">
    </span><span class="keyword">typedef</span><span class="whitespace"> </span><span class="name">Bfr</span><span class="operator">::</span><span class="name">Surface</span><span class="operator">&lt;</span><span class="keyword type">float</span><span class="operator">&gt;</span><span class="whitespace">          </span><span class="name">Surface</span><span class="punctuation">;</span><span class="whitespace">

    </span><span class="comment single">//
</span><span class="whitespace">    </span><span class="comment single">//  Initialize the SurfaceFactory for the given base mesh (very low
</span><span class="whitespace">    </span><span class="comment single">//  cost in terms of both time and space) and tessellate each face
</span><span class="whitespace">    </span><span class="comment single">//  independently (i.e. no shared vertices):
</span><span class="whitespace">    </span><span class="comment single">//
</span><span class="whitespace">    </span><span class="comment single">//  Note that the SurfaceFactory is not thread-safe by default due to
</span><span class="whitespace">    </span><span class="comment single">//  use of an internal cache.  Creating a separate instance of the
</span><span class="whitespace">    </span><span class="comment single">//  SurfaceFactory for each thread is one way to safely parallelize
</span><span class="whitespace">    </span><span class="comment single">//  this loop.  Another (preferred) is to assign a thread-safe cache
</span><span class="whitespace">    </span><span class="comment single">//  to the single instance.
</span><span class="whitespace">    </span><span class="comment single">//
</span><span class="whitespace">    </span><span class="comment single">//  First declare any evaluation options when initializing (though
</span><span class="whitespace">    </span><span class="comment single">//  none are used in this simple case):
</span><span class="whitespace">    </span><span class="comment single">//
</span><span class="whitespace">    </span><span class="name">SurfaceFactory</span><span class="operator">::</span><span class="name">Options</span><span class="whitespace"> </span><span class="name">surfaceOptions</span><span class="punctuation">;</span><span class="whitespace">

    </span><span class="name">SurfaceFactory</span><span class="whitespace"> </span><span class="name">meshSurfaceFactory</span><span class="punctuation">(</span><span class="name">meshTopology</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">surfaceOptions</span><span class="punctuation">);</span><span class="whitespace">

    </span><span class="comment single">//
</span><span class="whitespace">    </span><span class="comment single">//  The Surface to be constructed and evaluated for each face -- as
</span><span class="whitespace">    </span><span class="comment single">//  well as the intermediate and output data associated with it -- can
</span><span class="whitespace">    </span><span class="comment single">//  be declared in the scope local to each face. But since dynamic
</span><span class="whitespace">    </span><span class="comment single">//  memory is involved with these variables, it is preferred to declare
</span><span class="whitespace">    </span><span class="comment single">//  them outside that loop to preserve and reuse that dynamic memory.
</span><span class="whitespace">    </span><span class="comment single">//
</span><span class="whitespace">    </span><span class="name">Surface</span><span class="whitespace"> </span><span class="name">faceSurface</span><span class="punctuation">;</span><span class="whitespace">

    </span><span class="name">std</span><span class="operator">::</span><span class="name">vector</span><span class="operator">&lt;</span><span class="keyword type">float</span><span class="operator">&gt;</span><span class="whitespace"> </span><span class="name">facePatchPoints</span><span class="punctuation">;</span><span class="whitespace">

    </span><span class="name">std</span><span class="operator">::</span><span class="name">vector</span><span class="operator">&lt;</span><span class="keyword type">float</span><span class="operator">&gt;</span><span class="whitespace"> </span><span class="name">outCoords</span><span class="punctuation">;</span><span class="whitespace">
    </span><span class="name">std</span><span class="operator">::</span><span class="name">vector</span><span class="operator">&lt;</span><span class="keyword type">float</span><span class="operator">&gt;</span><span class="whitespace"> </span><span class="name">outPos</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">outDu</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">outDv</span><span class="punctuation">;</span><span class="whitespace">
    </span><span class="name">std</span><span class="operator">::</span><span class="name">vector</span><span class="operator">&lt;</span><span class="keyword type">int</span><span class="operator">&gt;</span><span class="whitespace">   </span><span class="name">outTriangles</span><span class="punctuation">;</span><span class="whitespace">

    </span><span class="comment single">//
</span><span class="whitespace">    </span><span class="comment single">//  Process each face, writing the output of each in Obj format:
</span><span class="whitespace">    </span><span class="comment single">//
</span><span class="whitespace">    </span><span class="name">tutorial</span><span class="operator">::</span><span class="name">ObjWriter</span><span class="whitespace"> </span><span class="name">objWriter</span><span class="punctuation">(</span><span class="name">options</span><span class="punctuation">.</span><span class="name">outputObjFile</span><span class="punctuation">);</span><span class="whitespace">

    </span><span class="keyword type">int</span><span class="whitespace"> </span><span class="name">numFaces</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">meshSurfaceFactory</span><span class="punctuation">.</span><span class="name">GetNumFaces</span><span class="punctuation">();</span><span class="whitespace">
    </span><span class="keyword">for</span><span class="whitespace"> </span><span class="punctuation">(</span><span class="keyword type">int</span><span class="whitespace"> </span><span class="name">faceIndex</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="literal number integer">0</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="name">faceIndex</span><span class="whitespace"> </span><span class="operator">&lt;</span><span class="whitespace"> </span><span class="name">numFaces</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="operator">++</span><span class="name">faceIndex</span><span class="punctuation">)</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace">
        </span><span class="comment single">//
</span><span class="whitespace">        </span><span class="comment single">//  Initialize the Surface for this face -- if valid (skipping
</span><span class="whitespace">        </span><span class="comment single">//  holes and boundary faces in some rare cases):
</span><span class="whitespace">        </span><span class="comment single">//
</span><span class="whitespace">        </span><span class="keyword">if</span><span class="whitespace"> </span><span class="punctuation">(</span><span class="operator">!</span><span class="name">meshSurfaceFactory</span><span class="punctuation">.</span><span class="name">InitVertexSurface</span><span class="punctuation">(</span><span class="name">faceIndex</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="operator">&amp;</span><span class="name">faceSurface</span><span class="punctuation">))</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace">
            </span><span class="keyword">continue</span><span class="punctuation">;</span><span class="whitespace">
        </span><span class="punctuation">}</span><span class="whitespace">

        </span><span class="comment single">//
</span><span class="whitespace">        </span><span class="comment single">//  Get the Parameterization of the Surface and use it to identify
</span><span class="whitespace">        </span><span class="comment single">//  coordinates for evaluation -- in this case, at the vertices
</span><span class="whitespace">        </span><span class="comment single">//  and center of the face to create a fan of triangles:
</span><span class="whitespace">        </span><span class="comment single">//
</span><span class="whitespace">        </span><span class="name">Bfr</span><span class="operator">::</span><span class="name">Parameterization</span><span class="whitespace"> </span><span class="name">faceParam</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">faceSurface</span><span class="punctuation">.</span><span class="name">GetParameterization</span><span class="punctuation">();</span><span class="whitespace">

        </span><span class="keyword type">int</span><span class="whitespace"> </span><span class="name">faceSize</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">faceParam</span><span class="punctuation">.</span><span class="name">GetFaceSize</span><span class="punctuation">();</span><span class="whitespace">

        </span><span class="keyword type">int</span><span class="whitespace"> </span><span class="name">numOutCoords</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">faceSize</span><span class="whitespace"> </span><span class="operator">+</span><span class="whitespace"> </span><span class="literal number integer">1</span><span class="punctuation">;</span><span class="whitespace">
        </span><span class="name">outCoords</span><span class="punctuation">.</span><span class="name">resize</span><span class="punctuation">(</span><span class="name">numOutCoords</span><span class="whitespace"> </span><span class="operator">*</span><span class="whitespace"> </span><span class="literal number integer">2</span><span class="punctuation">);</span><span class="whitespace">

        </span><span class="keyword">for</span><span class="whitespace"> </span><span class="punctuation">(</span><span class="keyword type">int</span><span class="whitespace"> </span><span class="name">i</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="literal number integer">0</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="name">i</span><span class="whitespace"> </span><span class="operator">&lt;</span><span class="whitespace"> </span><span class="name">faceSize</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="operator">++</span><span class="name">i</span><span class="punctuation">)</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace">
            </span><span class="name">faceParam</span><span class="punctuation">.</span><span class="name">GetVertexCoord</span><span class="punctuation">(</span><span class="name">i</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="operator">&amp;</span><span class="name">outCoords</span><span class="punctuation">[</span><span class="name">i</span><span class="operator">*</span><span class="literal number integer">2</span><span class="punctuation">]);</span><span class="whitespace">
        </span><span class="punctuation">}</span><span class="whitespace">
        </span><span class="name">faceParam</span><span class="punctuation">.</span><span class="name">GetCenterCoord</span><span class="punctuation">(</span><span class="operator">&amp;</span><span class="name">outCoords</span><span class="punctuation">[</span><span class="name">faceSize</span><span class="operator">*</span><span class="literal number integer">2</span><span class="punctuation">]);</span><span class="whitespace">

        </span><span class="comment single">//
</span><span class="whitespace">        </span><span class="comment single">//  Prepare the patch points for the Surface, then use them to
</span><span class="whitespace">        </span><span class="comment single">//  evaluate output points for all identified coordinates:
</span><span class="whitespace">        </span><span class="comment single">//
</span><span class="whitespace">        </span><span class="comment single">//  Resize patch point and output arrays:
</span><span class="whitespace">        </span><span class="keyword type">int</span><span class="whitespace"> </span><span class="name">pointSize</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="literal number integer">3</span><span class="punctuation">;</span><span class="whitespace">

        </span><span class="name">facePatchPoints</span><span class="punctuation">.</span><span class="name">resize</span><span class="punctuation">(</span><span class="name">faceSurface</span><span class="punctuation">.</span><span class="name">GetNumPatchPoints</span><span class="punctuation">()</span><span class="whitespace"> </span><span class="operator">*</span><span class="whitespace"> </span><span class="name">pointSize</span><span class="punctuation">);</span><span class="whitespace">

        </span><span class="name">outPos</span><span class="punctuation">.</span><span class="name">resize</span><span class="punctuation">(</span><span class="name">numOutCoords</span><span class="whitespace"> </span><span class="operator">*</span><span class="whitespace"> </span><span class="name">pointSize</span><span class="punctuation">);</span><span class="whitespace">
        </span><span class="name">outDu</span><span class="punctuation">.</span><span class="name">resize</span><span class="punctuation">(</span><span class="name">numOutCoords</span><span class="whitespace"> </span><span class="operator">*</span><span class="whitespace"> </span><span class="name">pointSize</span><span class="punctuation">);</span><span class="whitespace">
        </span><span class="name">outDv</span><span class="punctuation">.</span><span class="name">resize</span><span class="punctuation">(</span><span class="name">numOutCoords</span><span class="whitespace"> </span><span class="operator">*</span><span class="whitespace"> </span><span class="name">pointSize</span><span class="punctuation">);</span><span class="whitespace">

        </span><span class="comment single">//  Populate patch point and output arrays:
</span><span class="whitespace">        </span><span class="name">faceSurface</span><span class="punctuation">.</span><span class="name">PreparePatchPoints</span><span class="punctuation">(</span><span class="name">meshVertexPositions</span><span class="punctuation">.</span><span class="name">data</span><span class="punctuation">(),</span><span class="whitespace"> </span><span class="name">pointSize</span><span class="punctuation">,</span><span class="whitespace">
                                       </span><span class="name">facePatchPoints</span><span class="punctuation">.</span><span class="name">data</span><span class="punctuation">(),</span><span class="whitespace"> </span><span class="name">pointSize</span><span class="punctuation">);</span><span class="whitespace">

        </span><span class="keyword">for</span><span class="whitespace"> </span><span class="punctuation">(</span><span class="keyword type">int</span><span class="whitespace"> </span><span class="name">i</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="literal number integer">0</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">j</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="literal number integer">0</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="name">i</span><span class="whitespace"> </span><span class="operator">&lt;</span><span class="whitespace"> </span><span class="name">numOutCoords</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="operator">++</span><span class="name">i</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">j</span><span class="whitespace"> </span><span class="operator">+=</span><span class="whitespace"> </span><span class="name">pointSize</span><span class="punctuation">)</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace">
            </span><span class="name">faceSurface</span><span class="punctuation">.</span><span class="name">Evaluate</span><span class="punctuation">(</span><span class="operator">&amp;</span><span class="name">outCoords</span><span class="punctuation">[</span><span class="name">i</span><span class="operator">*</span><span class="literal number integer">2</span><span class="punctuation">],</span><span class="whitespace">
                                 </span><span class="name">facePatchPoints</span><span class="punctuation">.</span><span class="name">data</span><span class="punctuation">(),</span><span class="whitespace"> </span><span class="name">pointSize</span><span class="punctuation">,</span><span class="whitespace">
                                 </span><span class="operator">&amp;</span><span class="name">outPos</span><span class="punctuation">[</span><span class="name">j</span><span class="punctuation">],</span><span class="whitespace"> </span><span class="operator">&amp;</span><span class="name">outDu</span><span class="punctuation">[</span><span class="name">j</span><span class="punctuation">],</span><span class="whitespace"> </span><span class="operator">&amp;</span><span class="name">outDv</span><span class="punctuation">[</span><span class="name">j</span><span class="punctuation">]);</span><span class="whitespace">
        </span><span class="punctuation">}</span><span class="whitespace">

        </span><span class="comment single">//
</span><span class="whitespace">        </span><span class="comment single">//  Identify the faces of the tessellation, i.e. the triangle fan
</span><span class="whitespace">        </span><span class="comment single">//  connecting points at the vertices to the center (last) point:
</span><span class="whitespace">        </span><span class="comment single">//
</span><span class="whitespace">        </span><span class="comment single">//  Note the need to offset vertex indices for the output faces --
</span><span class="whitespace">        </span><span class="comment single">//  using the number of vertices generated prior to this face.
</span><span class="whitespace">        </span><span class="comment single">//
</span><span class="whitespace">        </span><span class="keyword type">int</span><span class="whitespace"> </span><span class="name">objVertexIndexOffset</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">objWriter</span><span class="punctuation">.</span><span class="name">GetNumVertices</span><span class="punctuation">();</span><span class="whitespace">

        </span><span class="name">outTriangles</span><span class="punctuation">.</span><span class="name">resize</span><span class="punctuation">(</span><span class="name">faceSize</span><span class="whitespace"> </span><span class="operator">*</span><span class="whitespace"> </span><span class="literal number integer">3</span><span class="punctuation">);</span><span class="whitespace">

        </span><span class="keyword type">int</span><span class="whitespace"> </span><span class="operator">*</span><span class="whitespace"> </span><span class="name">outTriangle</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">outTriangles</span><span class="punctuation">.</span><span class="name">data</span><span class="punctuation">();</span><span class="whitespace">
        </span><span class="keyword">for</span><span class="whitespace"> </span><span class="punctuation">(</span><span class="keyword type">int</span><span class="whitespace"> </span><span class="name">i</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="literal number integer">0</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="name">i</span><span class="whitespace"> </span><span class="operator">&lt;</span><span class="whitespace"> </span><span class="name">faceSize</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="operator">++</span><span class="name">i</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">outTriangle</span><span class="whitespace"> </span><span class="operator">+=</span><span class="whitespace"> </span><span class="literal number integer">3</span><span class="punctuation">)</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace">
            </span><span class="name">outTriangle</span><span class="punctuation">[</span><span class="literal number integer">0</span><span class="punctuation">]</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">objVertexIndexOffset</span><span class="whitespace"> </span><span class="operator">+</span><span class="whitespace"> </span><span class="name">i</span><span class="punctuation">;</span><span class="whitespace">
            </span><span class="name">outTriangle</span><span class="punctuation">[</span><span class="literal number integer">1</span><span class="punctuation">]</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">objVertexIndexOffset</span><span class="whitespace"> </span><span class="operator">+</span><span class="whitespace"> </span><span class="punctuation">(</span><span class="name">i</span><span class="whitespace"> </span><span class="operator">+</span><span class="whitespace"> </span><span class="literal number integer">1</span><span class="punctuation">)</span><span class="whitespace"> </span><span class="operator">%</span><span class="whitespace"> </span><span class="name">faceSize</span><span class="punctuation">;</span><span class="whitespace">
            </span><span class="name">outTriangle</span><span class="punctuation">[</span><span class="literal number integer">2</span><span class="punctuation">]</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">objVertexIndexOffset</span><span class="whitespace"> </span><span class="operator">+</span><span class="whitespace"> </span><span class="name">faceSize</span><span class="punctuation">;</span><span class="whitespace">
        </span><span class="punctuation">}</span><span class="whitespace">

        </span><span class="comment single">//
</span><span class="whitespace">        </span><span class="comment single">//  Write the evaluated points and faces connecting them as Obj:
</span><span class="whitespace">        </span><span class="comment single">//
</span><span class="whitespace">        </span><span class="name">objWriter</span><span class="punctuation">.</span><span class="name">WriteGroupName</span><span class="punctuation">(</span><span class="literal string">&quot;baseFace_&quot;</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">faceIndex</span><span class="punctuation">);</span><span class="whitespace">

        </span><span class="name">objWriter</span><span class="punctuation">.</span><span class="name">WriteVertexPositions</span><span class="punctuation">(</span><span class="name">outPos</span><span class="punctuation">);</span><span class="whitespace">
        </span><span class="name">objWriter</span><span class="punctuation">.</span><span class="name">WriteVertexNormals</span><span class="punctuation">(</span><span class="name">outDu</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">outDv</span><span class="punctuation">);</span><span class="whitespace">

        </span><span class="name">objWriter</span><span class="punctuation">.</span><span class="name">WriteFaces</span><span class="punctuation">(</span><span class="name">outTriangles</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number integer">3</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name builtin">true</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name builtin">false</span><span class="punctuation">);</span><span class="whitespace">
    </span><span class="punctuation">}</span><span class="whitespace">
</span><span class="punctuation">}</span><span class="whitespace">

</span><span class="comment single">//
//  Load command line arguments, specified or default geometry and process:
//
</span><span class="keyword type">int</span><span class="whitespace">
</span><span class="name function">main</span><span class="punctuation">(</span><span class="keyword type">int</span><span class="whitespace"> </span><span class="name">argc</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="keyword type">char</span><span class="whitespace"> </span><span class="operator">*</span><span class="whitespace"> </span><span class="name">argv</span><span class="punctuation">[])</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace">

    </span><span class="name">Args</span><span class="whitespace"> </span><span class="name">args</span><span class="punctuation">(</span><span class="name">argc</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">argv</span><span class="punctuation">);</span><span class="whitespace">

    </span><span class="name">Far</span><span class="operator">::</span><span class="name">TopologyRefiner</span><span class="whitespace"> </span><span class="operator">*</span><span class="whitespace"> </span><span class="name">meshTopology</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="literal number integer">0</span><span class="punctuation">;</span><span class="whitespace">
    </span><span class="name">std</span><span class="operator">::</span><span class="name">vector</span><span class="operator">&lt;</span><span class="keyword type">float</span><span class="operator">&gt;</span><span class="whitespace">     </span><span class="name">meshVtxPositions</span><span class="punctuation">;</span><span class="whitespace">
    </span><span class="name">std</span><span class="operator">::</span><span class="name">vector</span><span class="operator">&lt;</span><span class="keyword type">float</span><span class="operator">&gt;</span><span class="whitespace">     </span><span class="name">meshFVarUVs</span><span class="punctuation">;</span><span class="whitespace">

    </span><span class="name">meshTopology</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">tutorial</span><span class="operator">::</span><span class="name">createTopologyRefiner</span><span class="punctuation">(</span><span class="whitespace">
            </span><span class="name">args</span><span class="punctuation">.</span><span class="name">inputObjFile</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">args</span><span class="punctuation">.</span><span class="name">schemeType</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">meshVtxPositions</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">meshFVarUVs</span><span class="punctuation">);</span><span class="whitespace">
    </span><span class="keyword">if</span><span class="whitespace"> </span><span class="punctuation">(</span><span class="name">meshTopology</span><span class="whitespace"> </span><span class="operator">==</span><span class="whitespace"> </span><span class="literal number integer">0</span><span class="punctuation">)</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace">
        </span><span class="keyword">return</span><span class="whitespace"> </span><span class="name">EXIT_FAILURE</span><span class="punctuation">;</span><span class="whitespace">
    </span><span class="punctuation">}</span><span class="whitespace">

    </span><span class="name">tessellateToObj</span><span class="punctuation">(</span><span class="operator">*</span><span class="name">meshTopology</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">meshVtxPositions</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">args</span><span class="punctuation">);</span><span class="whitespace">

    </span><span class="keyword">delete</span><span class="whitespace"> </span><span class="name">meshTopology</span><span class="punctuation">;</span><span class="whitespace">
    </span><span class="keyword">return</span><span class="whitespace"> </span><span class="name">EXIT_SUCCESS</span><span class="punctuation">;</span><span class="whitespace">
</span><span class="punctuation">}</span><span class="whitespace">

</span><span class="comment single">//------------------------------------------------------------------------------</span>
</pre>
</div>
<div class="footer">
<hr class="footer" />
Generated on: 2023-09-06 15:35 UTC.

</div>
</body>
</html>

          </div><!-- close topicLeftData-MainData -->
        </div><!-- close coursewareBackground -->
    </div> <!-- close mainContentContainer -->
</div> <!-- close center -->

<!-- BOTTOM NAVIGATION MENU -->
    <ul class="creatorFooterNav">
        <li class="" id="navbarId-23704">
            <a href="intro.html">User Docs</a>
        </li>
        <li class="" id="navbarId-23887">
            <a href="doxy_html/index.html">API Docs</a>
        </li>
        <li class="" id="navbarId-23944">
            <a href="release_notes.html">Release Notes</a>
        </li>
        <li class="" id="navbarId-23703">
            <a href="http://graphics.pixar.com/opensubdiv/forum.html">Forum</a>
        </li>
    </ul><!-- end bottom navigation menu -->

<div class="clearBoth"></div>

<div class="center">
    <div class="copyrightFooter">
    TM &amp; &#169; 1986 - 2017 PIXAR. ALL RIGHTS RESERVED. <a class="copyrightFooter" target="_blank" href="https://www.pixar.com/terms-of-use#terms-of-use-1">Terms of Use</a>
    </div>
</div>

<div class="clearBoth"></div>