forked from windystrife/UnrealEngine_NVIDIAGameWorks
-
Notifications
You must be signed in to change notification settings - Fork 0
/
FLEXUe4_Assets.html
323 lines (308 loc) · 26.6 KB
/
FLEXUe4_Assets.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
<!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">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="x-ua-compatible" content="IE=Edge"/>
<title>Assets — Flex Artist Tools 1.0 documentation</title>
<link rel="stylesheet" href="_static/flex.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" href="_static/breathe.css" type="text/css" />
<link rel="stylesheet" href="_static/application.css" type="text/css" />
<link rel="stylesheet" href="_static/styleguide.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: './',
VERSION: '1.0',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
<script type="text/javascript" src="_static/bootstrap.js"></script>
<script type="text/javascript" src="_static/jquery.cookie.js"></script>
<script type="text/javascript" src="_static/jquery.storageapi.js"></script>
<link rel="top" title="Flex Artist Tools 1.0 documentation" href="index.html" />
<link rel="next" title="Actors" href="FLEXUe4_Actors.html" />
<link rel="prev" title="Containers" href="FLEXUe4_Containers.html" />
</head>
<body>
<nav class="navbar navbar-inverse navbar-default">
<div class="row">
<div class="navbar-brand">
<img class="logo" src="_static/developerzone_gameworks_logo.png" alt="Logo"/>
</div>
<div id="searchbox" style="display: none; float:right; padding-top:4px; padding-right:4px">
<form class="search form-inline" action="search.html" method="get">
<div class="form-group">
<input type="text" name="q" class="form-control" />
<input type="submit" value="Search" class="btn btn-primary" />
</div>
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</nav>
<div class="masthead">
<div class="row">
<ul class="breadcrumb">
<li><a href="index.html">Flex Artist Tools 1.0 documentation</a></li>
</ul>
</div>
</div>
<div class="row">
<div class="col-md-3 bs-sidenav" style="white-space: nowrap; overflow: auto;">
<div class="bs-sidebar">
<div id="sidebar_toc">
<h4>Table Of Contents</h4>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="FLEXUe4_Intro.html">Introduction</a></li>
<li class="toctree-l1"><a class="reference internal" href="FLEXUe4_Intro.html#prerequisites">Prerequisites</a></li>
<li class="toctree-l1"><a class="reference internal" href="FLEXUe4_Phases.html">Particles</a><ul>
<li class="toctree-l2"><a class="reference internal" href="FLEXUe4_Phases.html#radius">Radius</a></li>
<li class="toctree-l2"><a class="reference internal" href="FLEXUe4_Phases.html#phases">Phases</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="FLEXUe4_Containers.html">Containers</a><ul>
<li class="toctree-l2"><a class="reference internal" href="FLEXUe4_Containers.html#flex-container">Flex Container</a><ul>
<li class="toctree-l3"><a class="reference internal" href="FLEXUe4_Containers.html#simulation">Simulation</a></li>
<li class="toctree-l3"><a class="reference internal" href="FLEXUe4_Containers.html#collision">Collision</a></li>
<li class="toctree-l3"><a class="reference internal" href="FLEXUe4_Containers.html#cloth">Cloth</a></li>
<li class="toctree-l3"><a class="reference internal" href="FLEXUe4_Containers.html#fluid">Fluid</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1 current"><a class="current reference internal" href="">Assets</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#soft-bodies">Soft Bodies</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#flex-soft-asset">Flex Soft Asset</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#cloth">Cloth</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#flex-cloth-asset">Flex Cloth Asset</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#rigids">Rigids</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#flex-solid-asset">Flex Solid Asset</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="FLEXUe4_Actors.html">Actors</a></li>
<li class="toctree-l1"><a class="reference internal" href="FLEXUe4_Particles.html">Emitters</a><ul>
<li class="toctree-l2"><a class="reference internal" href="FLEXUe4_Particles.html#particle-emitter">Particle Emitter</a></li>
<li class="toctree-l2"><a class="reference internal" href="FLEXUe4_Particles.html#particle-modules">Particle Modules</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="FLEXUe4_Ropes.html">Ropes</a></li>
<li class="toctree-l1"><a class="reference internal" href="FLEXUe4_Forces.html">Forces</a><ul>
<li class="toctree-l2"><a class="reference internal" href="FLEXUe4_Forces.html#radial-force-component">Radial Force Component</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="FLEXUe4_DrainsAndCounting.html">Counting and Draining</a><ul>
<li class="toctree-l2"><a class="reference internal" href="FLEXUe4_DrainsAndCounting.html#creating-a-drain">Creating a Drain</a></li>
<li class="toctree-l2"><a class="reference internal" href="FLEXUe4_DrainsAndCounting.html#counting-particles">Counting Particles</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="FLEXUe4_FluidSurfaceRendering.html">Fluid Rendering</a><ul>
<li class="toctree-l2"><a class="reference internal" href="FLEXUe4_FluidSurfaceRendering.html#creating-a-flex-fluid-surface">Creating a Flex Fluid Surface</a></li>
<li class="toctree-l2"><a class="reference internal" href="FLEXUe4_FluidSurfaceRendering.html#fluid-surface-properties">Fluid Surface Properties</a></li>
<li class="toctree-l2"><a class="reference internal" href="FLEXUe4_FluidSurfaceRendering.html#emitter-settings">Emitter Settings</a></li>
<li class="toctree-l2"><a class="reference internal" href="FLEXUe4_FluidSurfaceRendering.html#surface-material">Surface Material</a></li>
<li class="toctree-l2"><a class="reference internal" href="FLEXUe4_FluidSurfaceRendering.html#container">Container</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="FLEXUe4_LocalSpace.html">Local Space Simulation</a></li>
<li class="toctree-l1"><a class="reference internal" href="FLEXUe4_Debug.html">Debug Commands</a><ul>
<li class="toctree-l2"><a class="reference internal" href="FLEXUe4_Debug.html#console-commands">Console Commands</a></li>
<li class="toctree-l2"><a class="reference internal" href="FLEXUe4_Debug.html#stats">Stats</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="releasenotes.html">Release Notes</a><ul>
<li class="toctree-l2"><a class="reference internal" href="releasenotes.html#what-s-new">What’s New</a></li>
<li class="toctree-l2"><a class="reference internal" href="releasenotes.html#known-limitations">Known Limitations</a></li>
</ul>
</li>
</ul>
</div>
<h4>Previous topic</h4>
<p class="topless"><a href="FLEXUe4_Containers.html"
title="previous chapter">Containers</a></p>
<h4>Next topic</h4>
<p class="topless"><a href="FLEXUe4_Actors.html"
title="next chapter">Actors</a></p>
<div id="searchbox" style="display: none">
<h4>Quick search</h4>
<form class="search form-inline" action="search.html" method="get">
<div class="form-group">
<input type="text" name="q" class="form-control" />
<input type="submit" value="Search" class="btn btn-primary" />
</div>
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
<p class="searchtip" style="font-size: 90%">
Enter search terms or a module, class or function name.
</p>
</div>
<script type="text/javascript">$('#searchbox').show(0);</script>
</div>
</div>
<div class="document col-md-8">
<div class="body">
<div class="section" id="assets">
<span id="flexue4-assets"></span><h1>Assets<a class="headerlink" href="#assets" title="Permalink to this headline">¶</a></h1>
<p>The Flex UE4 integration adds a new property to the StaticMesh asset which allows you to turn the mesh into a simulated asset directly. When you click on the FlexAsset property a drop-down will appear that lets you choose between three different asset types:</p>
<ol class="arabic simple">
<li><a class="reference internal" href="#label-soft-bodies"><em>Soft Bodies</em></a></li>
<li><a class="reference internal" href="#label-cloth-assets"><em>Cloth</em></a></li>
<li><a class="reference internal" href="#label-rigid-bodies"><em>Rigids</em></a></li>
</ol>
<div class="section" id="soft-bodies">
<span id="label-soft-bodies"></span><h2>Soft Bodies<a class="headerlink" href="#soft-bodies" title="Permalink to this headline">¶</a></h2>
<a class="reference internal image-reference" href="_images/softbodieslevel.jpg"><img alt="_images/softbodieslevel.jpg" src="_images/softbodieslevel.jpg" style="width: 600px;" /></a>
<p>Flex soft bodies are created by sampling a Static Mesh with particles, generating shape-matching clusters, and optional direct links between near by particles.</p>
<p>Flex soft bodies work by sampling the interior (and optionally) the surface of the mesh with points. These points are then clustered into particles, which are then clustered into “shape matching groups”. Each cluster adds a constraint to the solver, and the clusters are used to drive regular linear blend skinning.</p>
<p>Clusters behave in way that is similiar to bones in a regular animated skeleton - however they are not hierarchical, and are driven instead by the deformation of their attached particles. The clusters and skin weights are generated automatically, so there is no need to manually skin the mesh in a DCC tool.</p>
<p>To create a soft body add a <strong>Flex Soft Asset</strong> to the <strong>Static Mesh</strong>.</p>
<p>Once you have created the Soft Asset and assigned a container, the particle sampling and clustering will be automatically generated and updated whenever you modify a property. If you enable the Flex visualization you will be able to see the particles (in red), the clusters (and RGB basis), and a count of each in the upper left hand corner:</p>
<a class="reference internal image-reference" href="_images/newasset.jpg"><img alt="_images/newasset.jpg" src="_images/newasset.jpg" style="width: 600px;" /></a>
<a class="reference internal image-reference" href="_images/baconasset.jpg"><img alt="_images/baconasset.jpg" src="_images/baconasset.jpg" style="width: 600px;" /></a>
<div class="section" id="flex-soft-asset">
<h3>Flex Soft Asset<a class="headerlink" href="#flex-soft-asset" title="Permalink to this headline">¶</a></h3>
<ul class="simple">
<li><strong>Particle Spacing</strong> The spacing to use when creating particles, this should generally be the same or less than the container radius. It should be set so that there is some overlap between neighboring particles, as this will help make collision detection robust.</li>
<li><strong>Volume Sampling</strong> Control the resolution the mesh is voxelized at in order to generate interior sampling. Note that this does not increase the number of particles, but it controls where particles will be placed. The volume sampling resolution needs to be high enough to capture all the features where particles should be located. If the mesh is not closed then this should be set to zero and surface sampling should be used instead (see below).</li>
<li><strong>Surface Sampling</strong> Controls how many samples are taken of the mesh surface, again this does not directly control the number of particles, but rather it affects where they are placed. For meshes which are one-sided, or not closed the surface sampling can be used to ensure all parts of the surface have a particle covering them.</li>
<li><strong>Cluster Spacing</strong> The spacing for shape-matching clusters, should be at least the particle spacing.</li>
<li><strong>Cluster Radius</strong> Controls the overall size of the clusters, this controls how much overlap the clusters have which affects how smooth the final deformation is, if parts of the body are detaching then it means the clusters are not overlapping sufficiently to form a fully connected set of clusters.</li>
<li><strong>Cluster Stiffness</strong> Controls the stiffness of the resulting clusters.</li>
<li><strong>Link Radius</strong> Any particles below this distance will have additional distance constraints created between them.</li>
<li><strong>Link Stiffness</strong> The stiffness of distance links.</li>
<li><strong>Skinning Falloff</strong> Skinning weights for the mesh vertices will be generated with the falloff inversely with distance to cluster according to this parameter.</li>
<li><strong>Skinning Max Distance</strong> Any clusters greater than this distance from a particle won’t contribute to the skinning.</li>
<li><strong>Container Template</strong> The Flex container to use for simulation of this asset.</li>
<li><strong>Phase</strong> The phase that is used for all particles belonging to this asset. Self-collision can be enabled here, but note that if particles in the rest shape of the cloth are closer together than the radius on the container then it may cause artifacts in the cloth as the distance constraints fight the collision. The best way to set up cloth for self-collision is to ensure all the length of all the edges in the mesh are consistently close to the radius on the container.</li>
<li><strong>Attach To Rigids</strong> If enabled the particles will check to see if they overlap any shapes in the level when they are spawned. Any overlaps will create an attachment between the particle and the shape. This allows for example attaching some particles in the Flex cloth to an actor that is simulated with PhysX. This can be useful for example to create streamers, or cloth ‘accessories’ for a rigid body actor.</li>
<li><strong>Mass</strong> The mass of each particle in the shape. This property can be used to configure how different Flex actors interact with each other on collision. Actors with higher masses have a larger impact on the motion of actors with lower masses than vice versa.</li>
</ul>
</div>
</div>
<div class="section" id="cloth">
<span id="label-cloth-assets"></span><h2>Cloth<a class="headerlink" href="#cloth" title="Permalink to this headline">¶</a></h2>
<div class="float-right container">
<a class="reference internal image-reference" href="_images/clothasset.jpg"><img alt="_images/clothasset.jpg" src="_images/clothasset.jpg" style="width: 400px;" /></a>
</div>
<p>In addition to the soft body asset there is a simple cloth asset type that can be used to add dynamics to meshes. The Flex Cloth Asset will create one particle per-graphics vertex, so the artist has direct control over where particles are placed. Distance constraints are placed along edges of the mesh to model stretching and bending. This type of asset is generally more efficent to simulate than a full soft-body assset, it is often the best choice for environmental cloth such as leaves, feathers, flags, banners etc.</p>
<p><strong>Note: because there is a one to one correspondence between particles and vertices this type of asset is best suited for single-sided meshes, i.e.: ones without thickness</strong></p>
<p>Click the Container Template drop down to bring up the asset browser and assign a FlexContainer to the asset:</p>
<img alt="_images/AssetContainerSelect.jpg" src="_images/AssetContainerSelect.jpg" />
<p>You will now see the Flex particles visualized in the Static Mesh editor window, each particle is drawn with the radius specified on the container (ensure that the Flex visualization button is enabled):</p>
<a class="reference internal image-reference" href="_images/assetparticleview.jpg"><img alt="_images/assetparticleview.jpg" src="_images/assetparticleview.jpg" style="width: 400px;" /></a>
<div class="section" id="flex-cloth-asset">
<h3>Flex Cloth Asset<a class="headerlink" href="#flex-cloth-asset" title="Permalink to this headline">¶</a></h3>
<ul class="simple">
<li><strong>Stretch Stiffness</strong> Controls the overall resistance to stretching of the cloth. Specifically for the distance constraints created along edges of the triangle mesh.</li>
<li><strong>Bend Stiffness</strong> Controls the overall resistance to bending of the cloth, bending is handled in Flex by placing edge constraints across edges between adjacent triangles. This limits bending between the two faces.</li>
<li><strong>Tether Stiffness</strong> Tether constraints are special types of constraints that resist stretching very strongly. They will only be created when the cloth has some fixed particles, with an inverse mass of zero. If you have hanging cloth then paint the fixed vertices to black (this will give them infinite mass), and set the tether stiffness to 0.5-1.0 to greatly reduce stretching even at low iteration counts.</li>
<li><strong>Tether Give</strong> Because the tether constraints are so effective at resisting stretching they cause the cloth to appear too stiff. Allowing a small fraction of give will allow the cloth to still move freely. The tether constraints will not become active unless the cloth has stretched beyond this value past the rest-length.</li>
<li><strong>Enable Inflatable</strong> If enabled, then an additional volume constraint will be created for the body which tries to preserve the rest volume of the shape. This creates an “Inflatable” type object which can be inflated or deflated, for good results the mesh should be closed.</li>
<li><strong>Over Pressure</strong> Controls the proportion of the rest volume the simulation is trying to maintain. For values < 1.0, the object will appear deflated, for values > 1.0 the object will appear to be over-inflated. Note that the level of inflation is also somewhat dependent on the iteration count in the container. To have very “stiff”, or highly-over inflated objects may require more solver iterations.</li>
<li><strong>Tearing Enabled</strong> If true then cloth can be torn. This will break constraints and create new particles in response to stretching along triangle edges.</li>
<li><strong>Tearing Max Strain</strong> The maximum edge strain before a tearing even occurs, a value of 2.0 means the edge can be stretched to twice its rest length before breaking</li>
<li><strong>Tearing Max Break Rate</strong> The maximum number of edges to break in a single simulation step. Larger values mean cloth will tear faster and appear more like a fracture event. Lower values will limit tearing and appear as slower progressive breaking.</li>
<li><strong>Tearing Vertex Alpha</strong> When vertices are torn their vertex color alpha channel will be set to this value, this can be used to mix in a torn cloth texture mask for example.</li>
<li><strong>Rigid Stiffness</strong> When this is set >0.0 the cloth will also have a rigid shape-matching constraint added to it. This makes the cloth behave like a mixture between rigid and deformable and can be really useful for creating cloth that strongly resists bending.</li>
<li><strong>Container Template</strong> The Flex container to use for simulation of this asset.</li>
<li><strong>Phase</strong> The phase that is used for all particles belonging to this asset. Self-collision can be enabled here, but note that if particles in the rest shape of the cloth are closer together than the radius on the container then it may cause artifacts in the cloth as the distance constraints fight the collision. The best way to set up cloth for self-collision is to ensure all the length of all the edges in the mesh are consistently close to the radius on the container.</li>
<li><strong>Attach To Rigids</strong> If enabled the particles will check to see if they overlap any shapes in the level when they are spawned. Any overlaps will create an attachment between the particle and the shape. This allows for example attaching some particles in the Flex cloth to an actor that is simulated with PhysX. This can be useful for example to create streamers, or cloth ‘accessories’ for a rigid body actor.</li>
<li><strong>Mass</strong> The mass of each particle in the shape. This property can be used to configure how different Flex actors interact with each other on collision. Actors with higher masses have a larger impact on the motion of actors with lower masses than vice versa.</li>
</ul>
</div>
</div>
<div class="section" id="rigids">
<span id="label-rigid-bodies"></span><h2>Rigids<a class="headerlink" href="#rigids" title="Permalink to this headline">¶</a></h2>
<p>To create a Flex rigid body from a Static Mesh, add a Flex Solid Asset to the Static Mesh:</p>
<img alt="_images/rigidasset.jpg" src="_images/rigidasset.jpg" />
<div class="section" id="flex-solid-asset">
<h3>Flex Solid Asset<a class="headerlink" href="#flex-solid-asset" title="Permalink to this headline">¶</a></h3>
<ul class="simple">
<li><strong>Sampling Distance</strong> Determines the distance that particles are spaced when sampling the mesh. For a rectangular box that is 100 units wide, 100 units tall, and 50 units tall, the default value of 10 would create a sampling of 10x10x5 particles (500 in total). The more particles a shape has in Flex the slower “convergence” will be, this means that shapes with a large number of particles will require many iterations on the container to appear “stiff” and not bouncy. A good rule of thumb is that a shape should not have more than ~64 particles in total. Note also that the sampling distance has an effect on collision detection, if particles are too sparsely sampled then some interpenetration may occur. To avoid this, the sampling distance should be set < the radius on the containers this object is used with.</li>
<li><strong>Stiffness</strong> The stiffness parameter for the shape-matching constraint. For solid assets this should typically be set to 1.0.</li>
<li><strong>Container Template</strong> The Flex container to use for simulation of this asset.</li>
<li><strong>Phase</strong> The phase that is used for all particles belonging to this asset. Self-collision should generally be disabled for rigid bodies.</li>
<li><strong>Attach To Rigids</strong> If enabled the particles will check to see if they overlap any shapes in the level when they are spawned. Any overlaps will create an attachment between the particle and the shape. This allows for example attaching some particles in the Flex solid to an actor that is static or simulated with PhysX. This can be useful for example to create a hinge like mechanism. Be careful when embedding Flex particles inside rigid actors though, if the surrounding particles are half-intersecting the actor collision geometry they will probably collide badly.</li>
<li><strong>Mass</strong> The mass of each particle in the shape. This property can be used to configure how different Flex actors interact with each other on collision. Actors with higher masses have a larger impact on the motion of actors with lower masses than vice versa. Sometimes rigid bodies in Flex can behave “squishy”, even when the stiffness is set to 1.0. Our real-world intuition tells us that heavier objects are stiffer, e.g.: a boulder versus a piece of sponge. However, in physics engines, the mass will typically not affect how stiff the object appears, the way to make objects appear harder in Flex is to increase the number of constraint iterations on the container.</li>
</ul>
</div>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="col-md-1"></div>
</div>
<div class="masthead">
<div class="row">
<ul class="breadcrumb">
<li><a href="index.html">Flex Artist Tools 1.0 documentation</a></li>
</ul>
</div>
</div>
<footer>
<div class="footer-boilerplate">
<div class="row">
<div class="boilerplate">
Copyright © 2014-2016, NVIDIA Corporation | <a href="http://www.nvidia.com/object/about-nvidia.html" onclick="s_objectID="http://www.nvidia.com/object/about-nvidia.html_1";return this.s_oc?this.s_oc(e):true">About NVIDIA </a> | <a href="http://www.nvidia.com/object/legal_info.html" onclick="s_objectID="http://www.nvidia.com/object/legal_info.html_1";return this.s_oc?this.s_oc(e):true">Legal Information </a> | <a href="http://www.nvidia.com/object/privacy_policy.html" onclick="s_objectID="http://www.nvidia.com/object/privacy_policy.html_1";return this.s_oc?this.s_oc(e):true">Privacy Policy </a>
</div>
</div>
</div>
</div>
</footer>
<script>
var treestatename = 'GWDocsTreeState';
var protocol = location.href.split('/')[0].toLowerCase();
var storage;
if (protocol.substring(0,4) == 'http') {
storage = $.cookieStorage;
storage.setPath('/');
} else {
storage = $.localStorage;
}
if (storage.isEmpty(treestatename)) {
storage.set(treestatename, {});
}
var treestate = storage.get(treestatename);
$.each($("#sidebar_toc ul li"), toc_walker);
function toc_walker(key, value) {
var handleSpan = $("<span></span>")
.addClass("toc_handle").prependTo(value);
handleSpan.attr("id", $(value).closest("div").attr("id") + "." + key);
if($(value).has("ul li").size() > 0) {
var id = handleSpan.attr("id");
if (!(id in treestate)) {
treestate[id] = false;
}
handleSpan.addClass("toc_expanded").click(function() {
$(this).toggleClass("toc_expanded toc_collapsed").siblings("ul").toggle();
treestate[$(this).attr('id')] = $(this).hasClass('toc_expanded');
storage.set(treestatename, treestate);
});
if(!($(this).hasClass('current') || treestate[id])) {
handleSpan.click();
}
if($(this).hasClass('current')) {
treestate[handleSpan.attr('id')] = handleSpan.hasClass('toc_expanded');
storage.set(treestatename, treestate);
}
}
}
</script>
</body>
</html>