<!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>far_tutorial_2_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="far-tutorial-2-1-cpp"> <h1 class="title">far_tutorial_2_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">far_tutorial_2_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/far/tutorial_2_1/far_tutorial_2_1.cpp">https://github.com/PixarAnimationStudios/OpenSubdiv/blob/release/tutorials/far/tutorial_2_1/far_tutorial_2_1.cpp</a></p> <hr class="docutils" /> <pre class="code c++ literal-block"> <span class="comment single">//------------------------------------------------------------------------------ // Tutorial description: // // Building on tutorial 0, this example shows how to instantiate a simple mesh, // refine it uniformly and then interpolate additional sets of primvar data. // </span><span class="whitespace"> </span><span class="comment preproc">#include</span><span class="whitespace"> </span><span class="comment preprocfile"><opensubdiv/far/topologyDescriptor.h></span><span class="comment preproc"> #include</span><span class="whitespace"> </span><span class="comment preprocfile"><opensubdiv/far/primvarRefiner.h></span><span class="comment preproc"> </span><span class="whitespace"> </span><span class="comment preproc">#include</span><span class="whitespace"> </span><span class="comment preprocfile"><cstdio></span><span class="comment preproc"> </span><span class="whitespace"> </span><span class="comment single">//------------------------------------------------------------------------------ // Vertex container implementation. // // We are adding a per-vertex color attribute to our primvar data. While they // are separate properties and exist in separate buffers (as when read from an // Alembic file) they are both of the form float[3] and so we can use the same // underlying type. // // While color and position may be the same, we'll make the color a "varying" // primvar, e.g. it is constrained to being linearly interpolated between // vertices, rather than smoothly like position and other vertex data. // </span><span class="keyword">struct</span><span class="whitespace"> </span><span class="name class">Point3</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace"> </span><span class="comment single">// Minimal required interface ---------------------- </span><span class="whitespace"> </span><span class="name">Point3</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 type">void</span><span class="whitespace"> </span><span class="name">Clear</span><span class="punctuation">(</span><span class="whitespace"> </span><span class="keyword type">void</span><span class="whitespace"> </span><span class="operator">*</span><span class="whitespace"> </span><span class="operator">=</span><span class="literal number integer">0</span><span class="whitespace"> </span><span class="punctuation">)</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace"> </span><span class="name">_point</span><span class="punctuation">[</span><span class="literal number integer">0</span><span class="punctuation">]</span><span class="operator">=</span><span class="name">_point</span><span class="punctuation">[</span><span class="literal number integer">1</span><span class="punctuation">]</span><span class="operator">=</span><span class="name">_point</span><span class="punctuation">[</span><span class="literal number integer">2</span><span class="punctuation">]</span><span class="operator">=</span><span class="literal number float">0.0f</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="punctuation">}</span><span class="whitespace"> </span><span class="keyword type">void</span><span class="whitespace"> </span><span class="name">AddWithWeight</span><span class="punctuation">(</span><span class="name">Point3</span><span class="whitespace"> </span><span class="keyword">const</span><span class="whitespace"> </span><span class="operator">&</span><span class="whitespace"> </span><span class="name">src</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="keyword type">float</span><span class="whitespace"> </span><span class="name">weight</span><span class="punctuation">)</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace"> </span><span class="name">_point</span><span class="punctuation">[</span><span class="literal number integer">0</span><span class="punctuation">]</span><span class="operator">+=</span><span class="name">weight</span><span class="operator">*</span><span class="name">src</span><span class="punctuation">.</span><span class="name">_point</span><span class="punctuation">[</span><span class="literal number integer">0</span><span class="punctuation">];</span><span class="whitespace"> </span><span class="name">_point</span><span class="punctuation">[</span><span class="literal number integer">1</span><span class="punctuation">]</span><span class="operator">+=</span><span class="name">weight</span><span class="operator">*</span><span class="name">src</span><span class="punctuation">.</span><span class="name">_point</span><span class="punctuation">[</span><span class="literal number integer">1</span><span class="punctuation">];</span><span class="whitespace"> </span><span class="name">_point</span><span class="punctuation">[</span><span class="literal number integer">2</span><span class="punctuation">]</span><span class="operator">+=</span><span class="name">weight</span><span class="operator">*</span><span class="name">src</span><span class="punctuation">.</span><span class="name">_point</span><span class="punctuation">[</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="comment single">// Public interface ------------------------------------ </span><span class="whitespace"> </span><span class="keyword type">void</span><span class="whitespace"> </span><span class="name">SetPoint</span><span class="punctuation">(</span><span class="keyword type">float</span><span class="whitespace"> </span><span class="name">x</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="keyword type">float</span><span class="whitespace"> </span><span class="name">y</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="keyword type">float</span><span class="whitespace"> </span><span class="name">z</span><span class="punctuation">)</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace"> </span><span class="name">_point</span><span class="punctuation">[</span><span class="literal number integer">0</span><span class="punctuation">]</span><span class="operator">=</span><span class="name">x</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="name">_point</span><span class="punctuation">[</span><span class="literal number integer">1</span><span class="punctuation">]</span><span class="operator">=</span><span class="name">y</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="name">_point</span><span class="punctuation">[</span><span class="literal number integer">2</span><span class="punctuation">]</span><span class="operator">=</span><span class="name">z</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="punctuation">}</span><span class="whitespace"> </span><span class="keyword">const</span><span class="whitespace"> </span><span class="keyword type">float</span><span class="whitespace"> </span><span class="operator">*</span><span class="whitespace"> </span><span class="name">GetPoint</span><span class="punctuation">()</span><span class="whitespace"> </span><span class="keyword">const</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">_point</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="keyword type">float</span><span class="whitespace"> </span><span class="name">_point</span><span class="punctuation">[</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="keyword">typedef</span><span class="whitespace"> </span><span class="name">Point3</span><span class="whitespace"> </span><span class="name">VertexPosition</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="keyword">typedef</span><span class="whitespace"> </span><span class="name">Point3</span><span class="whitespace"> </span><span class="name">VertexColor</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="comment single">//------------------------------------------------------------------------------ // Cube geometry from catmark_cube.h </span><span class="keyword">static</span><span class="whitespace"> </span><span class="keyword type">float</span><span class="whitespace"> </span><span class="name">g_verts</span><span class="punctuation">[</span><span class="literal number integer">8</span><span class="punctuation">][</span><span class="literal number integer">3</span><span class="punctuation">]</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="punctuation">{{</span><span class="whitespace"> </span><span class="literal number float">-0.5f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">-0.5f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">0.5f</span><span class="whitespace"> </span><span class="punctuation">},</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace"> </span><span class="literal number float">0.5f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">-0.5f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">0.5f</span><span class="whitespace"> </span><span class="punctuation">},</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace"> </span><span class="literal number float">-0.5f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">0.5f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">0.5f</span><span class="whitespace"> </span><span class="punctuation">},</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace"> </span><span class="literal number float">0.5f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">0.5f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">0.5f</span><span class="whitespace"> </span><span class="punctuation">},</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace"> </span><span class="literal number float">-0.5f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">0.5f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">-0.5f</span><span class="whitespace"> </span><span class="punctuation">},</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace"> </span><span class="literal number float">0.5f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">0.5f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">-0.5f</span><span class="whitespace"> </span><span class="punctuation">},</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace"> </span><span class="literal number float">-0.5f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">-0.5f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">-0.5f</span><span class="whitespace"> </span><span class="punctuation">},</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace"> </span><span class="literal number float">0.5f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">-0.5f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">-0.5f</span><span class="whitespace"> </span><span class="punctuation">}};</span><span class="whitespace"> </span><span class="comment single">// Per-vertex RGB color data </span><span class="keyword">static</span><span class="whitespace"> </span><span class="keyword type">float</span><span class="whitespace"> </span><span class="name">g_colors</span><span class="punctuation">[</span><span class="literal number integer">8</span><span class="punctuation">][</span><span class="literal number integer">3</span><span class="punctuation">]</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="punctuation">{{</span><span class="whitespace"> </span><span class="literal number float">1.0f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">0.0f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">0.5f</span><span class="whitespace"> </span><span class="punctuation">},</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace"> </span><span class="literal number float">0.0f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">1.0f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">0.0f</span><span class="whitespace"> </span><span class="punctuation">},</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace"> </span><span class="literal number float">0.0f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">0.0f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">1.0f</span><span class="whitespace"> </span><span class="punctuation">},</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace"> </span><span class="literal number float">1.0f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">1.0f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">1.0f</span><span class="whitespace"> </span><span class="punctuation">},</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace"> </span><span class="literal number float">1.0f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">1.0f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">0.0f</span><span class="whitespace"> </span><span class="punctuation">},</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace"> </span><span class="literal number float">0.0f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">1.0f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">1.0f</span><span class="whitespace"> </span><span class="punctuation">},</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace"> </span><span class="literal number float">1.0f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">0.0f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">1.0f</span><span class="whitespace"> </span><span class="punctuation">},</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace"> </span><span class="literal number float">0.0f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">0.0f</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number float">0.0f</span><span class="whitespace"> </span><span class="punctuation">}};</span><span class="whitespace"> </span><span class="keyword">static</span><span class="whitespace"> </span><span class="keyword type">int</span><span class="whitespace"> </span><span class="name">g_nverts</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="literal number integer">8</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">g_nfaces</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="literal number integer">6</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="keyword">static</span><span class="whitespace"> </span><span class="keyword type">int</span><span class="whitespace"> </span><span class="name">g_vertsperface</span><span class="punctuation">[</span><span class="literal number integer">6</span><span class="punctuation">]</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace"> </span><span class="literal number integer">4</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number integer">4</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number integer">4</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number integer">4</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number integer">4</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number integer">4</span><span class="whitespace"> </span><span class="punctuation">};</span><span class="whitespace"> </span><span class="keyword">static</span><span class="whitespace"> </span><span class="keyword type">int</span><span class="whitespace"> </span><span class="name">g_vertIndices</span><span class="punctuation">[</span><span class="literal number integer">24</span><span class="punctuation">]</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace"> </span><span class="literal number integer">0</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number integer">1</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="literal number integer">2</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number integer">2</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="literal number integer">5</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number integer">4</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number integer">4</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number integer">5</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number integer">7</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number integer">6</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number integer">6</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number integer">7</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number integer">1</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number integer">0</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number integer">1</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number integer">7</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number integer">5</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="literal number integer">6</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number integer">0</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number integer">2</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="literal number integer">4</span><span class="whitespace"> </span><span class="punctuation">};</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="keyword">static</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 function">createFarTopologyRefiner</span><span class="punctuation">();</span><span class="whitespace"> </span><span class="comment single">//------------------------------------------------------------------------------ </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="punctuation">,</span><span class="whitespace"> </span><span class="keyword type">char</span><span class="whitespace"> </span><span class="operator">**</span><span class="punctuation">)</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace"> </span><span class="keyword type">int</span><span class="whitespace"> </span><span class="name">maxlevel</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="literal number integer">5</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">refiner</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">createFarTopologyRefiner</span><span class="punctuation">();</span><span class="whitespace"> </span><span class="comment single">// Uniformly refine the topology up to 'maxlevel' </span><span class="whitespace"> </span><span class="name">refiner</span><span class="operator">-></span><span class="name">RefineUniform</span><span class="punctuation">(</span><span class="name">Far</span><span class="operator">::</span><span class="name">TopologyRefiner</span><span class="operator">::</span><span class="name">UniformOptions</span><span class="punctuation">(</span><span class="name">maxlevel</span><span class="punctuation">));</span><span class="whitespace"> </span><span class="comment single">// Allocate buffers for vertex primvar data. </span><span class="whitespace"> </span><span class="comment single">// </span><span class="whitespace"> </span><span class="comment single">// We assume we received the coarse data for the mesh in separate buffers </span><span class="whitespace"> </span><span class="comment single">// from some other source, e.g. an Alembic file. Meanwhile, we want buffers </span><span class="whitespace"> </span><span class="comment single">// for the last/finest subdivision level to persist. We have no interest </span><span class="whitespace"> </span><span class="comment single">// in the intermediate levels. </span><span class="whitespace"> </span><span class="comment single">// </span><span class="whitespace"> </span><span class="comment single">// Determine the sizes for our needs: </span><span class="whitespace"> </span><span class="keyword type">int</span><span class="whitespace"> </span><span class="name">nCoarseVerts</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">g_nverts</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="keyword type">int</span><span class="whitespace"> </span><span class="name">nFineVerts</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">refiner</span><span class="operator">-></span><span class="name">GetLevel</span><span class="punctuation">(</span><span class="name">maxlevel</span><span class="punctuation">).</span><span class="name">GetNumVertices</span><span class="punctuation">();</span><span class="whitespace"> </span><span class="keyword type">int</span><span class="whitespace"> </span><span class="name">nTotalVerts</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">refiner</span><span class="operator">-></span><span class="name">GetNumVerticesTotal</span><span class="punctuation">();</span><span class="whitespace"> </span><span class="keyword type">int</span><span class="whitespace"> </span><span class="name">nTempVerts</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">nTotalVerts</span><span class="whitespace"> </span><span class="operator">-</span><span class="whitespace"> </span><span class="name">nCoarseVerts</span><span class="whitespace"> </span><span class="operator">-</span><span class="whitespace"> </span><span class="name">nFineVerts</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="comment single">// Allocate and initialize the primvar data for the original coarse vertices: </span><span class="whitespace"> </span><span class="name">std</span><span class="operator">::</span><span class="name">vector</span><span class="operator"><</span><span class="name">VertexPosition</span><span class="operator">></span><span class="whitespace"> </span><span class="name">coarsePosBuffer</span><span class="punctuation">(</span><span class="name">nCoarseVerts</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"><</span><span class="name">VertexColor</span><span class="operator">></span><span class="whitespace"> </span><span class="name">coarseClrBuffer</span><span class="punctuation">(</span><span class="name">nCoarseVerts</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"><</span><span class="whitespace"> </span><span class="name">nCoarseVerts</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">coarsePosBuffer</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">].</span><span class="name">SetPoint</span><span class="punctuation">(</span><span class="name">g_verts</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">][</span><span class="literal number integer">0</span><span class="punctuation">],</span><span class="whitespace"> </span><span class="name">g_verts</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">][</span><span class="literal number integer">1</span><span class="punctuation">],</span><span class="whitespace"> </span><span class="name">g_verts</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">][</span><span class="literal number integer">2</span><span class="punctuation">]);</span><span class="whitespace"> </span><span class="name">coarseClrBuffer</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">].</span><span class="name">SetPoint</span><span class="punctuation">(</span><span class="name">g_colors</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">][</span><span class="literal number integer">0</span><span class="punctuation">],</span><span class="whitespace"> </span><span class="name">g_colors</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">][</span><span class="literal number integer">1</span><span class="punctuation">],</span><span class="whitespace"> </span><span class="name">g_colors</span><span class="punctuation">[</span><span class="name">i</span><span class="punctuation">][</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="comment single">// Allocate intermediate and final storage to be populated: </span><span class="whitespace"> </span><span class="name">std</span><span class="operator">::</span><span class="name">vector</span><span class="operator"><</span><span class="name">VertexPosition</span><span class="operator">></span><span class="whitespace"> </span><span class="name">tempPosBuffer</span><span class="punctuation">(</span><span class="name">nTempVerts</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"><</span><span class="name">VertexPosition</span><span class="operator">></span><span class="whitespace"> </span><span class="name">finePosBuffer</span><span class="punctuation">(</span><span class="name">nFineVerts</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"><</span><span class="name">VertexColor</span><span class="operator">></span><span class="whitespace"> </span><span class="name">tempClrBuffer</span><span class="punctuation">(</span><span class="name">nTempVerts</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"><</span><span class="name">VertexColor</span><span class="operator">></span><span class="whitespace"> </span><span class="name">fineClrBuffer</span><span class="punctuation">(</span><span class="name">nFineVerts</span><span class="punctuation">);</span><span class="whitespace"> </span><span class="comment single">// Interpolate all primvar data -- separate buffers can be populated on </span><span class="whitespace"> </span><span class="comment single">// separate threads if desired: </span><span class="whitespace"> </span><span class="name">VertexPosition</span><span class="whitespace"> </span><span class="operator">*</span><span class="whitespace"> </span><span class="name">srcPos</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="operator">&</span><span class="name">coarsePosBuffer</span><span class="punctuation">[</span><span class="literal number integer">0</span><span class="punctuation">];</span><span class="whitespace"> </span><span class="name">VertexPosition</span><span class="whitespace"> </span><span class="operator">*</span><span class="whitespace"> </span><span class="name">dstPos</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="operator">&</span><span class="name">tempPosBuffer</span><span class="punctuation">[</span><span class="literal number integer">0</span><span class="punctuation">];</span><span class="whitespace"> </span><span class="name">VertexColor</span><span class="whitespace"> </span><span class="operator">*</span><span class="whitespace"> </span><span class="name">srcClr</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="operator">&</span><span class="name">coarseClrBuffer</span><span class="punctuation">[</span><span class="literal number integer">0</span><span class="punctuation">];</span><span class="whitespace"> </span><span class="name">VertexColor</span><span class="whitespace"> </span><span class="operator">*</span><span class="whitespace"> </span><span class="name">dstClr</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="operator">&</span><span class="name">tempClrBuffer</span><span class="punctuation">[</span><span class="literal number integer">0</span><span class="punctuation">];</span><span class="whitespace"> </span><span class="name">Far</span><span class="operator">::</span><span class="name">PrimvarRefiner</span><span class="whitespace"> </span><span class="name">primvarRefiner</span><span class="punctuation">(</span><span class="operator">*</span><span class="name">refiner</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">level</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">level</span><span class="whitespace"> </span><span class="operator"><</span><span class="whitespace"> </span><span class="name">maxlevel</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="operator">++</span><span class="name">level</span><span class="punctuation">)</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace"> </span><span class="name">primvarRefiner</span><span class="punctuation">.</span><span class="name">Interpolate</span><span class="punctuation">(</span><span class="whitespace"> </span><span class="name">level</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">srcPos</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">dstPos</span><span class="punctuation">);</span><span class="whitespace"> </span><span class="name">primvarRefiner</span><span class="punctuation">.</span><span class="name">InterpolateVarying</span><span class="punctuation">(</span><span class="name">level</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">srcClr</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">dstClr</span><span class="punctuation">);</span><span class="whitespace"> </span><span class="name">srcPos</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">dstPos</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">dstPos</span><span class="whitespace"> </span><span class="operator">+=</span><span class="whitespace"> </span><span class="name">refiner</span><span class="operator">-></span><span class="name">GetLevel</span><span class="punctuation">(</span><span class="name">level</span><span class="punctuation">).</span><span class="name">GetNumVertices</span><span class="punctuation">();</span><span class="whitespace"> </span><span class="name">srcClr</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">dstClr</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">dstClr</span><span class="whitespace"> </span><span class="operator">+=</span><span class="whitespace"> </span><span class="name">refiner</span><span class="operator">-></span><span class="name">GetLevel</span><span class="punctuation">(</span><span class="name">level</span><span class="punctuation">).</span><span class="name">GetNumVertices</span><span class="punctuation">();</span><span class="whitespace"> </span><span class="punctuation">}</span><span class="whitespace"> </span><span class="comment single">// Interpolate the last level into the separate buffers for our final data: </span><span class="whitespace"> </span><span class="name">primvarRefiner</span><span class="punctuation">.</span><span class="name">Interpolate</span><span class="punctuation">(</span><span class="whitespace"> </span><span class="name">maxlevel</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">srcPos</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">finePosBuffer</span><span class="punctuation">);</span><span class="whitespace"> </span><span class="name">primvarRefiner</span><span class="punctuation">.</span><span class="name">InterpolateVarying</span><span class="punctuation">(</span><span class="name">maxlevel</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">srcClr</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">fineClrBuffer</span><span class="punctuation">);</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace"> </span><span class="comment single">// Visualization with Maya : print a MEL script that generates colored </span><span class="whitespace"> </span><span class="comment single">// particles at the location of the refined vertices (don't forget to </span><span class="whitespace"> </span><span class="comment single">// turn shading on in the viewport to see the colors) </span><span class="whitespace"> </span><span class="keyword type">int</span><span class="whitespace"> </span><span class="name">nverts</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">nFineVerts</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="comment single">// Output particle positions </span><span class="whitespace"> </span><span class="name">printf</span><span class="punctuation">(</span><span class="literal string">"particle "</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">vert</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">vert</span><span class="whitespace"> </span><span class="operator"><</span><span class="whitespace"> </span><span class="name">nverts</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="operator">++</span><span class="name">vert</span><span class="punctuation">)</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace"> </span><span class="keyword type">float</span><span class="whitespace"> </span><span class="keyword">const</span><span class="whitespace"> </span><span class="operator">*</span><span class="whitespace"> </span><span class="name">pos</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">finePosBuffer</span><span class="punctuation">[</span><span class="name">vert</span><span class="punctuation">].</span><span class="name">GetPoint</span><span class="punctuation">();</span><span class="whitespace"> </span><span class="name">printf</span><span class="punctuation">(</span><span class="literal string">"-p %f %f %f</span><span class="literal string escape">\n</span><span class="literal string">"</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">pos</span><span class="punctuation">[</span><span class="literal number integer">0</span><span class="punctuation">],</span><span class="whitespace"> </span><span class="name">pos</span><span class="punctuation">[</span><span class="literal number integer">1</span><span class="punctuation">],</span><span class="whitespace"> </span><span class="name">pos</span><span class="punctuation">[</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">printf</span><span class="punctuation">(</span><span class="literal string">";</span><span class="literal string escape">\n</span><span class="literal string">"</span><span class="punctuation">);</span><span class="whitespace"> </span><span class="comment single">// Set particle point size (20 -- very large) </span><span class="whitespace"> </span><span class="name">printf</span><span class="punctuation">(</span><span class="literal string">"addAttr -is true -ln </span><span class="literal string escape">\"</span><span class="literal string">pointSize</span><span class="literal string escape">\"</span><span class="literal string"> -at long -dv 20 particleShape1;</span><span class="literal string escape">\n</span><span class="literal string">"</span><span class="punctuation">);</span><span class="whitespace"> </span><span class="comment single">// Add per-particle color attribute ('rgbPP') </span><span class="whitespace"> </span><span class="name">printf</span><span class="punctuation">(</span><span class="literal string">"addAttr -ln </span><span class="literal string escape">\"</span><span class="literal string">rgbPP</span><span class="literal string escape">\"</span><span class="literal string"> -dt vectorArray particleShape1;</span><span class="literal string escape">\n</span><span class="literal string">"</span><span class="punctuation">);</span><span class="whitespace"> </span><span class="comment single">// Set per-particle color values from our primvar data </span><span class="whitespace"> </span><span class="name">printf</span><span class="punctuation">(</span><span class="literal string">"setAttr </span><span class="literal string escape">\"</span><span class="literal string">particleShape1.rgbPP</span><span class="literal string escape">\"</span><span class="literal string"> -type </span><span class="literal string escape">\"</span><span class="literal string">vectorArray</span><span class="literal string escape">\"</span><span class="literal string"> %d "</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">nverts</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">vert</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">vert</span><span class="whitespace"> </span><span class="operator"><</span><span class="whitespace"> </span><span class="name">nverts</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="operator">++</span><span class="name">vert</span><span class="punctuation">)</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace"> </span><span class="keyword type">float</span><span class="whitespace"> </span><span class="keyword">const</span><span class="whitespace"> </span><span class="operator">*</span><span class="whitespace"> </span><span class="name">color</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">fineClrBuffer</span><span class="punctuation">[</span><span class="name">vert</span><span class="punctuation">].</span><span class="name">GetPoint</span><span class="punctuation">();</span><span class="whitespace"> </span><span class="name">printf</span><span class="punctuation">(</span><span class="literal string">"%f %f %f</span><span class="literal string escape">\n</span><span class="literal string">"</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">color</span><span class="punctuation">[</span><span class="literal number integer">0</span><span class="punctuation">],</span><span class="whitespace"> </span><span class="name">color</span><span class="punctuation">[</span><span class="literal number integer">1</span><span class="punctuation">],</span><span class="whitespace"> </span><span class="name">color</span><span class="punctuation">[</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">printf</span><span class="punctuation">(</span><span class="literal string">";</span><span class="literal string escape">\n</span><span class="literal string">"</span><span class="punctuation">);</span><span class="whitespace"> </span><span class="punctuation">}</span><span class="whitespace"> </span><span class="keyword">delete</span><span class="whitespace"> </span><span class="name">refiner</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">//------------------------------------------------------------------------------ // Creates Far::TopologyRefiner from raw geometry // // see tutorial_1_1 for more details // </span><span class="keyword">static</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 function">createFarTopologyRefiner</span><span class="punctuation">()</span><span class="whitespace"> </span><span class="punctuation">{</span><span class="whitespace"> </span><span class="comment single">// Populate a topology descriptor with our raw data </span><span class="whitespace"> </span><span class="keyword">typedef</span><span class="whitespace"> </span><span class="name">Far</span><span class="operator">::</span><span class="name">TopologyDescriptor</span><span class="whitespace"> </span><span class="name">Descriptor</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">type</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">OpenSubdiv</span><span class="operator">::</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="name">Sdc</span><span class="operator">::</span><span class="name">Options</span><span class="whitespace"> </span><span class="name">options</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="name">options</span><span class="punctuation">.</span><span class="name">SetVtxBoundaryInterpolation</span><span class="punctuation">(</span><span class="name">Sdc</span><span class="operator">::</span><span class="name">Options</span><span class="operator">::</span><span class="name">VTX_BOUNDARY_EDGE_ONLY</span><span class="punctuation">);</span><span class="whitespace"> </span><span class="name">Descriptor</span><span class="whitespace"> </span><span class="name">desc</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="name">desc</span><span class="punctuation">.</span><span class="name">numVertices</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">g_nverts</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="name">desc</span><span class="punctuation">.</span><span class="name">numFaces</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">g_nfaces</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="name">desc</span><span class="punctuation">.</span><span class="name">numVertsPerFace</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">g_vertsperface</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="name">desc</span><span class="punctuation">.</span><span class="name">vertIndicesPerFace</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">g_vertIndices</span><span class="punctuation">;</span><span class="whitespace"> </span><span class="comment single">// Instantiate a Far::TopologyRefiner from the descriptor </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">refiner</span><span class="whitespace"> </span><span class="operator">=</span><span class="whitespace"> </span><span class="name">Far</span><span class="operator">::</span><span class="name">TopologyRefinerFactory</span><span class="operator"><</span><span class="name">Descriptor</span><span class="operator">>::</span><span class="name">Create</span><span class="punctuation">(</span><span class="name">desc</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">Far</span><span class="operator">::</span><span class="name">TopologyRefinerFactory</span><span class="operator"><</span><span class="name">Descriptor</span><span class="operator">>::</span><span class="name">Options</span><span class="punctuation">(</span><span class="name">type</span><span class="punctuation">,</span><span class="whitespace"> </span><span class="name">options</span><span class="punctuation">));</span><span class="whitespace"> </span><span class="keyword">return</span><span class="whitespace"> </span><span class="name">refiner</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 & © 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>