1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"[]>
2<html xml:lang="en-US" lang="en-US">
3  <head>
4    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5    <meta http-equiv="Content-Style-Type" content="text/css" />
6    <link rel="stylesheet" href="../../css/document.css" type="text/css" />
7    <title>About Binary Resources</title>
8  </head>
9  <body>
10    <h1>About Binary Resources</h1>
11
12    <h2>Setup and Cleanup</h2>
13    <div class="section">
14      <p>
15        Binary resources are loaded from their files as <a href="../../nw/gfx/res/ResGraphicsFile/Overview.html"><CODE>ResGraphicsFile</CODE></a> objects. You must run <CODE>Setup</CODE> before creating instances of the <CODE>Model</CODE> or other items from the loaded <CODE>ResGraphicsFile</CODE>. For the setup, use the <a href="../../nw/gfx/res/ResGraphicsFile/Setup.html"><CODE>Setup</CODE></a> for <CODE>ResGraphicsFile</CODE>, or the <a href="../../nw/gfx/res/ResModel/Setup.html"><CODE>Setup</CODE></a> for <CODE>ResModel</CODE>. The main setup processes are as follows.
16        <ol>
17            <li>Resolving references to shaders, textures, and lookup tables</li>
18            <li>VRAM transfer for textures and vertex streams</li>
19            <li>Generating rendering and shader commands</li>
20            <li>Checking for data errors</li>
21        </ol>
22
23        <p class="info">
24            After a properly setup binary resource is no longer needed, you must run <CODE>Cleanup</CODE> and then release it.
25        </p>
26      </p>
27    </div>
28
29    <h2>Process According to Setup Results</h2>
30    <div class="section">
31      <p>
32        Running <CODE>Setup</CODE> on a binary resource returns a <a href="../../nw/gfx/Result/Overview.html"><CODE>Result</CODE></a>. The <CODE>Result</CODE> from <CODE>Setup</CODE> is a <a href="../../nw/gfx/ResourceResult.html"><CODE>ResourceResult</CODE></a> object. Error handling would look like the following. <br />
33        <ul>
34            <li>
35                Inadequate resources to resolve references
36                <ul>
37                    <li><CODE>RESOURCE_RESULT_NOT_FOUND_TEXTURE</CODE></li>
38                    <li><CODE>RESOURCE_RESULT_NOT_FOUND_SHADER</CODE></li>
39                    <li><CODE>RESOURCE_RESULT_NOT_FOUND_LUT</CODE></li>
40                </ul>
41                Call <CODE>Setup</CODE> again, passing <a href="../../nw/gfx/res/ResGraphicsFile/Overview.html"><CODE>ResGraphicsFile</CODE></a> as an argument.
42            </li>
43            <li>
44                Inconsistencies in materials during <CODE>Setup</CODE>
45                <ul>
46                    <li><CODE>RESOURCE_RESULT_IRRELEVANT_LOCATION_LUT</CODE></li>
47                    <li>RESOURCE_RESULT_IRRELEVANT_LOCATION_SHADER_SYMBOL</li>
48                    <li><CODE>RESOURCE_RESULT_IRRELEVANT_TEXTURE_MAPPING_METHOD</CODE></li>
49                </ul>
50                Review the data, as the display results might be different from the expected results.
51            </li>
52        </ul>
53      </p>
54    </div>
55
56    <h2>Change Binary Resource Values</h2>
57    <div class="section">
58      <p>
59        You can change binary resource values via the <CODE>Res*</CODE> class accessor. However, when changing values, you must also set the hash to <CODE>0</CODE>. The following table shows how class and variable names correspond to hashes.
60        <table>
61            <tr>
62                <th>Class / Var Name</th>
63                <th>Hash</th>
64            </tr>
65            <tr>
66                <td><CODE>ResMaterial::m_Flags</CODE></td>
67                <td><CODE>ShadingParameterHash</CODE></td>
68            </tr>
69            <tr>
70                <td><CODE>ResShaderParameter</CODE></td>
71                <td><CODE>ShaderParametersHash</CODE></td>
72            </tr>
73            <tr>
74                <td><CODE>ResTextureCoordinator</CODE></td>
75                <td><CODE>TextureCoordinatorsHash</CODE></td>
76            </tr>
77            <tr>
78                <td><CODE>ResPixelBasedTextureMapper</CODE>, <CODE>ResStandardTextureSampler</CODE></td>
79                <td><CODE>TextureMappersHash</CODE></td>
80            </tr>
81            <tr>
82                <td><CODE>ResMaterialColor</CODE></td>
83                <td><CODE>MaterialColorHash</CODE></td>
84            </tr>
85            <tr>
86                <td><CODE>ResRasterization</CODE></td>
87                <td><CODE>RasterizationHash</CODE></td>
88            </tr>
89            <tr>
90                <td><CODE>ResFragmentLighting</CODE></td>
91                <td><CODE>FragmentLightingHash</CODE></td>
92            </tr>
93            <tr>
94                <td><CODE>ResFragmentLightingTable</CODE></td>
95                <td><CODE>FragmentLightingTableHash</CODE></td>
96            </tr>
97            <tr>
98                <td><CODE>ResAlphaTest</CODE></td>
99                <td><CODE>AlphaTestHash</CODE></td>
100            </tr>
101            <tr>
102                <td><CODE>ResTextureCombiner</CODE></td>
103                <td><CODE>TextureCombinersHash</CODE></td>
104            </tr>
105            <tr>
106                <td><CODE>ResFragmentOperation</CODE></td>
107                <td><CODE>FragmentOperationHash</CODE></td>
108            </tr>
109        </table>
110      </p>
111    </div>
112    <h2 id="transfer_vram">Users Handling VRAM Transfers</h2>
113    <div class="section">
114      <p>
115        When running <CODE>Setup</CODE> using multiple threads, the user must handle VRAM transfers. Handling all VRAM transfers at once is also more efficient than dealing with VRAM transfers within <CODE>Setup</CODE>. The process is as follows.
116        <ol>
117            <li>
118                Get the texture or vertex image data block.
119                <pre>
120nw::gfx::ResGraphicsFile resFile = resourceSet-&gt;resource;
121void* imageData = resFile.GetImageBlockData();
122                </pre>
123            </li>
124
125            <li>
126                Bundle the textures or vertices and transfer to VRAM.
127                <pre>
128s32 size = resFile.GetImageBlockDataSize();
129
130void* vramAddr = nw::demo::AllocateGraphicsMemory(NN_GX_MEM_VRAMA, NN_GX_MEM_TEXTURE, 0, size);
131
132// Flush the data cache and transfer to VRAM.
133nngxUpdateBuffer( imageData, size );
134nngxAddVramDmaCommand( imageData, vramAddr, size );
135                </pre>
136            </li>
137            <li>
138                Set the address of the transferred image data to the resource before running <CODE>Setup</CODE>.
139                <pre>
140nw::gfx::TransferedVramAddressSetter locationSetter( imageData, vramAddr );
141resFile.ForeachTexture(locationSetter);
142resFile.ForeachIndexStream(locationSetter);
143resFile.ForeachVertexStream(locationSetter);
144                </pre>
145            </li>
146        </ol>
147      </p>
148    </div>
149  <hr><p>CONFIDENTIAL</p></body>
150</html>