Difference between revisions of "Team Guardian Cube Mapping"

From CDOT Wiki
Jump to: navigation, search
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
<html xmlns:v="urn:schemas-microsoft-com:vml"
+
<div class="WordSection1">
xmlns:o="urn:schemas-microsoft-com:office:office"
+
 
xmlns:w="urn:schemas-microsoft-com:office:word"
+
Theory behind the Material Class:
xmlns:m="http://schemas.microsoft.com/office/2004/12/omml"
+
 
xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=windows-1252"><meta name=ProgId content=Word.Document><meta name=Generator content="Microsoft Word 12"><meta name=Originator content="Microsoft Word 12"><link rel=File-List
+
-<span style="font: 7.0pt &quot;Times New Roman&quot;">          </span>The material class was originally supposed to encapsulate all material related data, such as textures, colors, reflectivity etc. The intention was to replace a lot of the functionality of graphic, so that an object encapsulates an in world object, graphic encapsulated a static mesh and material described the appearance of a mesh.  This way you could have a material attached to many different meshes, so a similar appearance can be applied amongst many objects. This is similar to the approach taken by 3DS Max.
href="How%20to%20implement%20Environmental%20Cube%20Mapping_files/filelist.xml"><&#33;--[if gte mso 9]><xml><o:DocumentProperties><o:Author>CloudScorpion</o:Author><o:LastAuthor>CloudScorpion</o:LastAuthor><o:Revision>2</o:Revision><o:TotalTime>1971</o:TotalTime><o:Created>2011-04-14T09:44:00Z</o:Created><o:LastSaved>2011-04-14T09:44:00Z</o:LastSaved><o:Pages>3</o:Pages><o:Words>1044</o:Words><o:Characters>5954</o:Characters><o:Lines>49</o:Lines><o:Paragraphs>13</o:Paragraphs><o:CharactersWithSpaces>6985</o:CharactersWithSpaces><o:Version>12.00</o:Version></o:DocumentProperties></xml><&#33;[endif]--><link rel=themeData
+
 
href="How%20to%20implement%20Environmental%20Cube%20Mapping_files/themedata.thmx"><link rel=colorSchemeMapping
+
-<span style="font: 7.0pt &quot;Times New Roman&quot;">          </span>This approach proved too invasive for others to implement, so now I have made Material a category, which will shift responsibility of drawing the object away from graphic and into Material.
href="How%20to%20implement%20Environmental%20Cube%20Mapping_files/colorschememapping.xml"><&#33;--[if gte mso 9]><xml><w:WordDocument><w:SpellingState>Clean</w:SpellingState><w:GrammarState>Clean</w:GrammarState><w:TrackMoves>false</w:TrackMoves><w:TrackFormatting/><w:PunctuationKerning/><w:ValidateAgainstSchemas/><w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid><w:IgnoreMixedContent>false</w:IgnoreMixedContent><w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText><w:DoNotPromoteQF/><w:LidThemeOther>EN-CA</w:LidThemeOther><w:LidThemeAsian>X-NONE</w:LidThemeAsian><w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript><w:Compatibility><w:BreakWrappedTables/><w:SnapToGridInCell/><w:WrapTextWithPunct/><w:UseAsianBreakRules/><w:DontGrowAutofit/><w:SplitPgBreakAndParaMark/><w:DontVertAlignCellWithSp/><w:DontBreakConstrainedForcedTables/><w:DontVertAlignInTxbx/><w:Word11KerningPairs/><w:CachedColBalance/></w:Compatibility><w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel><m:mathPr><m:mathFont m:val="Cambria Math"/><m:brkBin m:val="before"/><m:brkBinSub m:val="&#45;-"/><m:smallFrac m:val="off"/><m:dispDef/><m:lMargin m:val="0"/><m:rMargin m:val="0"/><m:defJc m:val="centerGroup"/><m:wrapIndent m:val="1440"/><m:intLim m:val="subSup"/><m:naryLim m:val="undOvr"/></m:mathPr></w:WordDocument></xml><&#33;[endif]--><&#33;--[if gte mso 9]><xml><w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true"
+
 
DefSemiHidden="true" DefQFormat="false" DefPriority="99"
+
How to implement Environmental Cube Mapping
LatentStyleCount="267"><w:LsdException Locked="false" Priority="0" SemiHidden="false"
+
 
UnhideWhenUsed="false" QFormat="true" Name="Normal"/><w:LsdException Locked="false" Priority="9" SemiHidden="false"
+
1)<span style="font: 7.0pt &quot;Times New Roman&quot;">      </span>Download and include the iMaterial.h, Material.h and Material.cpp into your project.
UnhideWhenUsed="false" QFormat="true" Name="heading 1"/><w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/><w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/><w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/><w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/><w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/><w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/><w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/><w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/><w:LsdException Locked="false" Priority="39" Name="toc 1"/><w:LsdException Locked="false" Priority="39" Name="toc 2"/><w:LsdException Locked="false" Priority="39" Name="toc 3"/><w:LsdException Locked="false" Priority="39" Name="toc 4"/><w:LsdException Locked="false" Priority="39" Name="toc 5"/><w:LsdException Locked="false" Priority="39" Name="toc 6"/><w:LsdException Locked="false" Priority="39" Name="toc 7"/><w:LsdException Locked="false" Priority="39" Name="toc 8"/><w:LsdException Locked="false" Priority="39" Name="toc 9"/><w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/><w:LsdException Locked="false" Priority="10" SemiHidden="false"
+
 
UnhideWhenUsed="false" QFormat="true" Name="Title"/><w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/><w:LsdException Locked="false" Priority="11" SemiHidden="false"
+
2)<span style="font: 7.0pt &quot;Times New Roman&quot;">      </span>Add the cube map code from the provided FX file into your own FX file. If you will be adding there manually, copy the code between //REF_CUBE_MAP_A# and //END REF_CUBE_MAP_A#, there should be 4 sections to copy in total
UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/><w:LsdException Locked="false" Priority="22" SemiHidden="false"
+
 
UnhideWhenUsed="false" QFormat="true" Name="Strong"/><w:LsdException Locked="false" Priority="20" SemiHidden="false"
+
3)<span style="font: 7.0pt &quot;Times New Roman&quot;">      </span>Edit the Configuration.h file  and add “MATERIAL” to the Category enumeration
UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/><w:LsdException Locked="false" Priority="59" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Table Grid"/><w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/><w:LsdException Locked="false" Priority="1" SemiHidden="false"
+
4)<span style="font: 7.0pt &quot;Times New Roman&quot;">      </span>Object is now going to need some adjustments.  I’ll break this down into a few components:
UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/><w:LsdException Locked="false" Priority="60" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Light Shading"/><w:LsdException Locked="false" Priority="61" SemiHidden="false"
+
<font face="Symbol">·<span style="font: 7.0pt &quot;Times New Roman&quot;">         </span></font>iObject.h
UnhideWhenUsed="false" Name="Light List"/><w:LsdException Locked="false" Priority="62" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Light Grid"/><w:LsdException Locked="false" Priority="63" SemiHidden="false"
+
<span style="font: 7.0pt &quot;Times New Roman&quot;">                                                              </span>I.<span style="font: 7.0pt &quot;Times New Roman&quot;">      </span>Add ‘class iMaterial’ to the top of the file with the rest of the declarations
UnhideWhenUsed="false" Name="Medium Shading 1"/><w:LsdException Locked="false" Priority="64" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Medium Shading 2"/><w:LsdException Locked="false" Priority="65" SemiHidden="false"
+
<span style="font: 7.0pt &quot;Times New Roman&quot;">                                                            </span>II.<span style="font: 7.0pt &quot;Times New Roman&quot;">      </span>Add a virtual getting and setter for the Object’s material
UnhideWhenUsed="false" Name="Medium List 1"/><w:LsdException Locked="false" Priority="66" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Medium List 2"/><w:LsdException Locked="false" Priority="67" SemiHidden="false"
+
<span style="font: 7.0pt &quot;Times New Roman&quot;">                                                          </span>III.<span style="font: 7.0pt &quot;Times New Roman&quot;">      </span>Add two more virtual functions, one called getID, receives an int and returns an int, and second one called resetID which receives an int and returns nothing.
UnhideWhenUsed="false" Name="Medium Grid 1"/><w:LsdException Locked="false" Priority="68" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Medium Grid 2"/><w:LsdException Locked="false" Priority="69" SemiHidden="false"
+
<font face="Symbol">·<span style="font: 7.0pt &quot;Times New Roman&quot;">         </span></font>Object.h
UnhideWhenUsed="false" Name="Medium Grid 3"/><w:LsdException Locked="false" Priority="70" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Dark List"/><w:LsdException Locked="false" Priority="71" SemiHidden="false"
+
<span style="font: 7.0pt &quot;Times New Roman&quot;">                                                              </span>I.<span style="font: 7.0pt &quot;Times New Roman&quot;">      </span>Add a private iMaterial pointer to the object named rMaterial (you could change it to w/e you want, but it won’t be as easy to copy/paste code if you don’t)
UnhideWhenUsed="false" Name="Colorful Shading"/><w:LsdException Locked="false" Priority="72" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Colorful List"/><w:LsdException Locked="false" Priority="73" SemiHidden="false"
+
<span style="font: 7.0pt &quot;Times New Roman&quot;">                                                            </span>II.<span style="font: 7.0pt &quot;Times New Roman&quot;">      </span>Implement the getter and setter in the in the Object header, in the setter, change the category of the object to MATERIAL.
UnhideWhenUsed="false" Name="Colorful Grid"/><w:LsdException Locked="false" Priority="60" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Light Shading Accent 1"/><w:LsdException Locked="false" Priority="61" SemiHidden="false"
+
<span style="font: 7.0pt &quot;Times New Roman&quot;">                                                          </span>III.<span style="font: 7.0pt &quot;Times New Roman&quot;">      </span>Remove the braces after Object’s preDraw() function, we are going to need to implement this function in the cpp.
UnhideWhenUsed="false" Name="Light List Accent 1"/><w:LsdException Locked="false" Priority="62" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Light Grid Accent 1"/><w:LsdException Locked="false" Priority="63" SemiHidden="false"
+
<span style="font: 7.0pt &quot;Times New Roman&quot;">                                                          </span>IV.<span style="font: 7.0pt &quot;Times New Roman&quot;">      </span>Add a private int array called get cubeMapID, which for this implementation,  it can be an array of 2 items, since reflection depth will not be implemented.
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/><w:LsdException Locked="false" Priority="64" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/><w:LsdException Locked="false" Priority="65" SemiHidden="false"
+
<span style="font: 7.0pt &quot;Times New Roman&quot;">                                                            </span>V.<span style="font: 7.0pt &quot;Times New Roman&quot;">      </span>Implement getID and resetID, get id returns the int at level in the cubeMapID array (return cubeMapID[level];) and resetID sets the int at level in the cubeMapID to -1.
UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/><w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/><w:LsdException Locked="false" Priority="34" SemiHidden="false"
+
 
UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/><w:LsdException Locked="false" Priority="29" SemiHidden="false"
+
<font face="Symbol">·<span style="font: 7.0pt &quot;Times New Roman&quot;">         </span></font>Object.cpp
UnhideWhenUsed="false" QFormat="true" Name="Quote"/><w:LsdException Locked="false" Priority="30" SemiHidden="false"
+
 
UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/><w:LsdException Locked="false" Priority="66" SemiHidden="false"
+
<span style="font: 7.0pt &quot;Times New Roman&quot;">                                                              </span>I.<span style="font: 7.0pt &quot;Times New Roman&quot;">      </span>Add ‘#include iMaterial.h’ at the top.
UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/><w:LsdException Locked="false" Priority="67" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/><w:LsdException Locked="false" Priority="68" SemiHidden="false"
+
<span style="font: 7.0pt &quot;Times New Roman&quot;">                                                            </span>II.<span style="font: 7.0pt &quot;Times New Roman&quot;">      </span>In the object constructor add ‘rMaterial = NULL’, just to be safe, also set cubeMapID [0] and [1] to -1.
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/><w:LsdException Locked="false" Priority="69" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/><w:LsdException Locked="false" Priority="70" SemiHidden="false"
+
<span style="font: 7.0pt &quot;Times New Roman&quot;">                                                          </span>III.<span style="font: 7.0pt &quot;Times New Roman&quot;">      </span>In the object’s = operator, set CubeMapID[0] and [1] to -1.
UnhideWhenUsed="false" Name="Dark List Accent 1"/><w:LsdException Locked="false" Priority="71" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/><w:LsdException Locked="false" Priority="72" SemiHidden="false"
+
<span style="font: 7.0pt &quot;Times New Roman&quot;">                                                          </span>IV.<span style="font: 7.0pt &quot;Times New Roman&quot;">      </span>In the Object’s attach function,  check if the category is set to MATERIAL and that rMaterial isn’t NULL, if true, use Material’s setStage, if category is not set to MATERIALS then use the code already there (Remember, if reading this is confusing, you can always copy the code, this is just trying to explain what to do)
UnhideWhenUsed="false" Name="Colorful List Accent 1"/><w:LsdException Locked="false" Priority="73" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/><w:LsdException Locked="false" Priority="60" SemiHidden="false"
+
<span style="font: 7.0pt &quot;Times New Roman&quot;">                                                            </span>V.<span style="font: 7.0pt &quot;Times New Roman&quot;">      </span>Above the draw function, add the implementation of the preDraw, which is simple. Check if the category is set to MATERIAL and rMaterial isn’t NULL, if true, set the cubeMapID (at index of rMaterial->getDepth()) to dthe result of rMaterial->getCubeID(this). Finally call the preDraw function on rMaterial and pass it a reference to the object (this), vertexlist pointer, and scene pointer.
UnhideWhenUsed="false" Name="Light Shading Accent 2"/><w:LsdException Locked="false" Priority="61" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Light List Accent 2"/><w:LsdException Locked="false" Priority="62" SemiHidden="false"
+
<span style="font: 7.0pt &quot;Times New Roman&quot;">                                                          </span>VI.<span style="font: 7.0pt &quot;Times New Roman&quot;">      </span>Mod the Object’s draw function to test if the category is set to MATERIAL, if it is and  rMaterial isn’t NULL, call the draw function on the material (passing in the object and scene) in place of using the attach and draw code in the function, the report should occur regardless.
UnhideWhenUsed="false" Name="Light Grid Accent 2"/><w:LsdException Locked="false" Priority="63" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/><w:LsdException Locked="false" Priority="64" SemiHidden="false"
+
<span style="font: 7.0pt &quot;Times New Roman&quot;">                                                        </span>VII.<span style="font: 7.0pt &quot;Times New Roman&quot;">      </span>In the suspend code, check if rMaterial is NULL, if not, call suspend on it. Do the same for release.
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/><w:LsdException Locked="false" Priority="65" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/><w:LsdException Locked="false" Priority="66" SemiHidden="false"
+
5)<span style="font: 7.0pt &quot;Times New Roman&quot;">      </span>Open Display.cpp,  #include Material.h and call the static function connectDevice from Material, this will give material access to the device and below, call the static function connectEffect, giving Material access to the effect file.
UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/><w:LsdException Locked="false" Priority="67" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/><w:LsdException Locked="false" Priority="68" SemiHidden="false"
+
6)<span style="font: 7.0pt &quot;Times New Roman&quot;">      </span>The system requires a knowledge of the vertices of the in a mesh, so you have to go to iVertex list and add two virtual functions,  ‘int getNumOfVerts()’ and ‘Vertex* getVertitices()’. Now you have to go into the VertexList class, implement these functions to return nVertices and Vertex.  You also need to make an implementation for stock mesh, simply give return NULL for both stock mesh implementations. <br /> NOTE: If you already have your object’s center and radius calculated or easily accessible, you can skip this step and alter the code in the Material class to use that data instead of calculating the center from the vertex list.
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/><w:LsdException Locked="false" Priority="69" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/><w:LsdException Locked="false" Priority="70" SemiHidden="false"
+
7)<span style="font: 7.0pt &quot;Times New Roman&quot;">      </span>Open Design.cpp and #include iMaterial.h.  Add scene->draw(MATERIAL); to Design’s draw function and scene->draw(MATERIAL); to Design’s preDraw.
UnhideWhenUsed="false" Name="Dark List Accent 2"/><w:LsdException Locked="false" Priority="71" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/><w:LsdException Locked="false" Priority="72" SemiHidden="false"
+
This will give you the ability to use the Material class with your object to give them a nice reflective or refracting effect.
UnhideWhenUsed="false" Name="Colorful List Accent 2"/><w:LsdException Locked="false" Priority="73" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/><w:LsdException Locked="false" Priority="60" SemiHidden="false"
+
How to use Material:
UnhideWhenUsed="false" Name="Light Shading Accent 3"/><w:LsdException Locked="false" Priority="61" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Light List Accent 3"/><w:LsdException Locked="false" Priority="62" SemiHidden="false"
+
To use a material, follow these few steps:
UnhideWhenUsed="false" Name="Light Grid Accent 3"/><w:LsdException Locked="false" Priority="63" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/><w:LsdException Locked="false" Priority="64" SemiHidden="false"
+
1)<span style="font: 7.0pt &quot;Times New Roman&quot;">      </span>Create a Material:<br />''iMaterial* mat = CreateMaterial(contextPointer, numberOfStages, numberOfSubsets);<br />''NOTES: if the material only have one stage and subset, only pass in context.
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/><w:LsdException Locked="false" Priority="65" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/><w:LsdException Locked="false" Priority="66" SemiHidden="false"
+
2)<span style="font: 7.0pt &quot;Times New Roman&quot;">      </span>Setup the material:<br />''mat->setup(arrayOfBasicColors, twoDimensionalTextureArray, arrayOfColorsRepresentingReflection, arrayOfRefractionPowers, twoDimensionalArrayOfColorsRepresentingRefraction, ObjectShine, ObjectFlags, ObjectBorderColor);''<br /> NOTE: If you specify only one subset/stage, you can simply put in a pointers to this data, but if you specify more than one subset or stage, you  must implement the data in an array OR pass in NULL. The alpha channel determines how strong the effect of the reflection or refraction will be, and they are both over-riding effects, reflection being the most over-riding of the two.  So if refraction’s alpha channel is 1.0, the object’s color and texture will be completely gone, the object will only have the refracted texture on it. If the alpha channel is 0.5, then it will be half refracted texture, half color/diffuse texture. The same works with reflection except that reflection will over-ride refraction, so if an object is 100% refractive and 100% reflective, you will only see the reflection. Where as if the reflection is 50% and refraction is 50%, the distribution of the texture will be 50% reflective, 25% refractive, 25% diffuse. The refractive power float array dictates how much the light bends, so if it is equal to 1.0, the light will not bend at all, where as if it is set to 0.9, it will bend about 10% of the angle of the normal of the fragment.
UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/><w:LsdException Locked="false" Priority="67" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/><w:LsdException Locked="false" Priority="68" SemiHidden="false"
+
3)<span style="font: 7.0pt &quot;Times New Roman&quot;">      </span>Set the material onto the object:<br />''object->setMaterial(mat);''<br /> NOTE: this will convert the object to a material object and attach the material.
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/><w:LsdException Locked="false" Priority="69" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/><w:LsdException Locked="false" Priority="70" SemiHidden="false"
+
A quick example of how to make a glass like cube would be:
UnhideWhenUsed="false" Name="Dark List Accent 3"/><w:LsdException Locked="false" Priority="71" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/><w:LsdException Locked="false" Priority="72" SemiHidden="false"
+
<br />''iObject* boxy = CreateBox(-10,-10, -10, 10, 10, 10, “opaque”, Colour(1.0f, 1.0f, 1.0f,1.0f);<br /> iMaterial* mat = CreateMaterial(context);<br /> float power = 0.9f; //this is just to sidestep the need for an array<br /> mat->setup(&Colour(0.7f, 0.7f, 0.7f, 0.7f), NULL, &Colour(1.0f, 1.0f, 1.0f, 0.25), &power, &Colour(1.0f, 1.0f, 1.0f, 1.0f));<br /> boxy->setMaterial(mat);''
UnhideWhenUsed="false" Name="Colorful List Accent 3"/><w:LsdException Locked="false" Priority="73" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/><w:LsdException Locked="false" Priority="60" SemiHidden="false"
+
I didn’t test the above code so there could be a typo.
UnhideWhenUsed="false" Name="Light Shading Accent 4"/><w:LsdException Locked="false" Priority="61" SemiHidden="false"
+
 
UnhideWhenUsed="false" Name="Light List Accent 4"/><w:LsdException Locked="false" Priority="62" SemiHidden="false"
+
</div>
UnhideWhenUsed="false" Name="Light Grid Accent 4"/><w:LsdException Locked="false" Priority="63" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/><w:LsdException Locked="false" Priority="64" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/><w:LsdException Locked="false" Priority="65" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/><w:LsdException Locked="false" Priority="66" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/><w:LsdException Locked="false" Priority="67" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/><w:LsdException Locked="false" Priority="68" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/><w:LsdException Locked="false" Priority="69" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/><w:LsdException Locked="false" Priority="70" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Dark List Accent 4"/><w:LsdException Locked="false" Priority="71" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/><w:LsdException Locked="false" Priority="72" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Colorful List Accent 4"/><w:LsdException Locked="false" Priority="73" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/><w:LsdException Locked="false" Priority="60" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Light Shading Accent 5"/><w:LsdException Locked="false" Priority="61" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Light List Accent 5"/><w:LsdException Locked="false" Priority="62" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Light Grid Accent 5"/><w:LsdException Locked="false" Priority="63" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/><w:LsdException Locked="false" Priority="64" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/><w:LsdException Locked="false" Priority="65" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/><w:LsdException Locked="false" Priority="66" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/><w:LsdException Locked="false" Priority="67" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/><w:LsdException Locked="false" Priority="68" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/><w:LsdException Locked="false" Priority="69" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/><w:LsdException Locked="false" Priority="70" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Dark List Accent 5"/><w:LsdException Locked="false" Priority="71" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/><w:LsdException Locked="false" Priority="72" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Colorful List Accent 5"/><w:LsdException Locked="false" Priority="73" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/><w:LsdException Locked="false" Priority="60" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Light Shading Accent 6"/><w:LsdException Locked="false" Priority="61" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Light List Accent 6"/><w:LsdException Locked="false" Priority="62" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Light Grid Accent 6"/><w:LsdException Locked="false" Priority="63" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/><w:LsdException Locked="false" Priority="64" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/><w:LsdException Locked="false" Priority="65" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/><w:LsdException Locked="false" Priority="66" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/><w:LsdException Locked="false" Priority="67" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/><w:LsdException Locked="false" Priority="68" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/><w:LsdException Locked="false" Priority="69" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/><w:LsdException Locked="false" Priority="70" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Dark List Accent 6"/><w:LsdException Locked="false" Priority="71" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/><w:LsdException Locked="false" Priority="72" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Colorful List Accent 6"/><w:LsdException Locked="false" Priority="73" SemiHidden="false"
 
UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/><w:LsdException Locked="false" Priority="19" SemiHidden="false"
 
UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/><w:LsdException Locked="false" Priority="21" SemiHidden="false"
 
UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/><w:LsdException Locked="false" Priority="31" SemiHidden="false"
 
UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/><w:LsdException Locked="false" Priority="32" SemiHidden="false"
 
UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/><w:LsdException Locked="false" Priority="33" SemiHidden="false"
 
UnhideWhenUsed="false" QFormat="true" Name="Book Title"/><w:LsdException Locked="false" Priority="37" Name="Bibliography"/><w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/></w:LatentStyles></xml><&#33;[endif]--><style><&#33;--
 
/* Font Definitions */
 
@font-face
 
{font-family:Wingdings;
 
panose-1:5 0 0 0 0 0 0 0 0 0;
 
mso-font-charset:2;
 
mso-generic-font-family:auto;
 
mso-font-pitch:variable;
 
mso-font-signature:0 268435456 0 0 -2147483648 0;}
 
@font-face
 
{font-family:"Cambria Math";
 
panose-1:2 4 5 3 5 4 6 3 2 4;
 
mso-font-charset:0;
 
mso-generic-font-family:roman;
 
mso-font-pitch:variable;
 
mso-font-signature:-536870145 1107305727 0 0 415 0;}
 
@font-face
 
{font-family:Calibri;
 
panose-1:2 15 5 2 2 2 4 3 2 4;
 
mso-font-charset:0;
 
mso-generic-font-family:swiss;
 
mso-font-pitch:variable;
 
mso-font-signature:-520092929 1073786111 9 0 415 0;}
 
/* Style Definitions */
 
p.MsoNormal, li.MsoNormal, div.MsoNormal
 
{mso-style-unhide:no;
 
mso-style-qformat:yes;
 
mso-style-parent:"";
 
margin-top:0cm;
 
margin-right:0cm;
 
margin-bottom:10.0pt;
 
margin-left:0cm;
 
line-height:115%;
 
mso-pagination:widow-orphan;
 
font-size:11.0pt;
 
font-family:"Calibri","sans-serif";
 
mso-ascii-font-family:Calibri;
 
mso-ascii-theme-font:minor-latin;
 
mso-fareast-font-family:Calibri;
 
mso-fareast-theme-font:minor-latin;
 
mso-hansi-font-family:Calibri;
 
mso-hansi-theme-font:minor-latin;
 
mso-bidi-font-family:"Times New Roman";
 
mso-bidi-theme-font:minor-bidi;
 
mso-fareast-language:EN-US;}
 
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
 
{mso-style-priority:34;
 
mso-style-unhide:no;
 
mso-style-qformat:yes;
 
margin-top:0cm;
 
margin-right:0cm;
 
margin-bottom:10.0pt;
 
margin-left:36.0pt;
 
mso-add-space:auto;
 
line-height:115%;
 
mso-pagination:widow-orphan;
 
font-size:11.0pt;
 
font-family:"Calibri","sans-serif";
 
mso-ascii-font-family:Calibri;
 
mso-ascii-theme-font:minor-latin;
 
mso-fareast-font-family:Calibri;
 
mso-fareast-theme-font:minor-latin;
 
mso-hansi-font-family:Calibri;
 
mso-hansi-theme-font:minor-latin;
 
mso-bidi-font-family:"Times New Roman";
 
mso-bidi-theme-font:minor-bidi;
 
mso-fareast-language:EN-US;}
 
p.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParagraphCxSpFirst
 
{mso-style-priority:34;
 
mso-style-unhide:no;
 
mso-style-qformat:yes;
 
mso-style-type:export-only;
 
margin-top:0cm;
 
margin-right:0cm;
 
margin-bottom:0cm;
 
margin-left:36.0pt;
 
margin-bottom:.0001pt;
 
mso-add-space:auto;
 
line-height:115%;
 
mso-pagination:widow-orphan;
 
font-size:11.0pt;
 
font-family:"Calibri","sans-serif";
 
mso-ascii-font-family:Calibri;
 
mso-ascii-theme-font:minor-latin;
 
mso-fareast-font-family:Calibri;
 
mso-fareast-theme-font:minor-latin;
 
mso-hansi-font-family:Calibri;
 
mso-hansi-theme-font:minor-latin;
 
mso-bidi-font-family:"Times New Roman";
 
mso-bidi-theme-font:minor-bidi;
 
mso-fareast-language:EN-US;}
 
p.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListParagraphCxSpMiddle
 
{mso-style-priority:34;
 
mso-style-unhide:no;
 
mso-style-qformat:yes;
 
mso-style-type:export-only;
 
margin-top:0cm;
 
margin-right:0cm;
 
margin-bottom:0cm;
 
margin-left:36.0pt;
 
margin-bottom:.0001pt;
 
mso-add-space:auto;
 
line-height:115%;
 
mso-pagination:widow-orphan;
 
font-size:11.0pt;
 
font-family:"Calibri","sans-serif";
 
mso-ascii-font-family:Calibri;
 
mso-ascii-theme-font:minor-latin;
 
mso-fareast-font-family:Calibri;
 
mso-fareast-theme-font:minor-latin;
 
mso-hansi-font-family:Calibri;
 
mso-hansi-theme-font:minor-latin;
 
mso-bidi-font-family:"Times New Roman";
 
mso-bidi-theme-font:minor-bidi;
 
mso-fareast-language:EN-US;}
 
p.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagraphCxSpLast
 
{mso-style-priority:34;
 
mso-style-unhide:no;
 
mso-style-qformat:yes;
 
mso-style-type:export-only;
 
margin-top:0cm;
 
margin-right:0cm;
 
margin-bottom:10.0pt;
 
margin-left:36.0pt;
 
mso-add-space:auto;
 
line-height:115%;
 
mso-pagination:widow-orphan;
 
font-size:11.0pt;
 
font-family:"Calibri","sans-serif";
 
mso-ascii-font-family:Calibri;
 
mso-ascii-theme-font:minor-latin;
 
mso-fareast-font-family:Calibri;
 
mso-fareast-theme-font:minor-latin;
 
mso-hansi-font-family:Calibri;
 
mso-hansi-theme-font:minor-latin;
 
mso-bidi-font-family:"Times New Roman";
 
mso-bidi-theme-font:minor-bidi;
 
mso-fareast-language:EN-US;}
 
span.SpellE
 
{mso-style-name:"";
 
mso-spl-e:yes;}
 
span.GramE
 
{mso-style-name:"";
 
mso-gram-e:yes;}
 
.MsoChpDefault
 
{mso-style-type:export-only;
 
mso-default-props:yes;
 
mso-ascii-font-family:Calibri;
 
mso-ascii-theme-font:minor-latin;
 
mso-fareast-font-family:Calibri;
 
mso-fareast-theme-font:minor-latin;
 
mso-hansi-font-family:Calibri;
 
mso-hansi-theme-font:minor-latin;
 
mso-bidi-font-family:"Times New Roman";
 
mso-bidi-theme-font:minor-bidi;
 
mso-fareast-language:EN-US;}
 
.MsoPapDefault
 
{mso-style-type:export-only;
 
margin-bottom:10.0pt;
 
line-height:115%;}
 
@page WordSection1
 
{size:612.0pt 792.0pt;
 
margin:72.0pt 72.0pt 72.0pt 72.0pt;
 
mso-header-margin:35.4pt;
 
mso-footer-margin:35.4pt;
 
mso-paper-source:0;}
 
div.WordSection1
 
{page:WordSection1;}
 
/* List Definitions */
 
@list l0
 
{mso-list-id:99953897;
 
mso-list-type:hybrid;
 
mso-list-template-ids:1078334064 269025297 269025281 269025299 269025295 269025305 269025307 269025295 269025305 269025307;}
 
@list l0:level1
 
{mso-level-text:"%1)";
 
mso-level-tab-stop:none;
 
mso-level-number-position:left;
 
text-indent:-18.0pt;}
 
@list l0:level2
 
{mso-level-number-format:bullet;
 
mso-level-text:F0B7;
 
mso-level-tab-stop:none;
 
mso-level-number-position:left;
 
text-indent:-18.0pt;
 
font-family:Symbol;}
 
@list l0:level3
 
{mso-level-number-format:roman-upper;
 
mso-level-tab-stop:none;
 
mso-level-number-position:right;
 
text-indent:-9.0pt;}
 
@list l1
 
{mso-list-id:1295597332;
 
mso-list-type:hybrid;
 
mso-list-template-ids:1772285300 659349742 269025283 269025285 269025281 269025283 269025285 269025281 269025283 269025285;}
 
@list l1:level1
 
{mso-level-start-at:7;
 
mso-level-number-format:bullet;
 
mso-level-text:-;
 
mso-level-tab-stop:none;
 
mso-level-number-position:left;
 
text-indent:-18.0pt;
 
font-family:"Calibri","sans-serif";
 
mso-fareast-font-family:Calibri;
 
mso-fareast-theme-font:minor-latin;}
 
@list l2
 
{mso-list-id:1355693235;
 
mso-list-type:hybrid;
 
mso-list-template-ids:-1185349758 269025295 269025305 269025307 269025295 269025305 269025307 269025295 269025305 269025307;}
 
@list l2:level1
 
{mso-level-tab-stop:none;
 
mso-level-number-position:left;
 
margin-left:18.0pt;
 
text-indent:-18.0pt;}
 
@list l3
 
{mso-list-id:1524247400;
 
mso-list-type:hybrid;
 
mso-list-template-ids:-930814958 269025297 269025305 269025307 269025295 269025305 269025307 269025295 269025305 269025307;}
 
@list l3:level1
 
{mso-level-text:"%1)";
 
mso-level-tab-stop:none;
 
mso-level-number-position:left;
 
margin-left:54.0pt;
 
text-indent:-18.0pt;}
 
@list l3:level2
 
{mso-level-number-format:alpha-lower;
 
mso-level-tab-stop:none;
 
mso-level-number-position:left;
 
margin-left:90.0pt;
 
text-indent:-18.0pt;}
 
@list l4
 
{mso-list-id:2127850769;
 
mso-list-type:hybrid;
 
mso-list-template-ids:226368910 269025295 269025305 269025307 269025295 269025305 269025307 269025295 269025305 269025307;}
 
@list l4:level1
 
{mso-level-tab-stop:none;
 
mso-level-number-position:left;
 
margin-left:18.0pt;
 
text-indent:-18.0pt;}
 
ol
 
{margin-bottom:0cm;}
 
ul
 
{margin-bottom:0cm;}
 
--></style><&#33;--[if gte mso 10]><style>
 
/* Style Definitions */
 
table.MsoNormalTable
 
{mso-style-name:"Table Normal";
 
mso-tstyle-rowband-size:0;
 
mso-tstyle-colband-size:0;
 
mso-style-noshow:yes;
 
mso-style-priority:99;
 
mso-style-qformat:yes;
 
mso-style-parent:"";
 
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
 
mso-para-margin-top:0cm;
 
mso-para-margin-right:0cm;
 
mso-para-margin-bottom:10.0pt;
 
mso-para-margin-left:0cm;
 
line-height:115%;
 
mso-pagination:widow-orphan;
 
font-size:11.0pt;
 
font-family:"Calibri","sans-serif";
 
mso-ascii-font-family:Calibri;
 
mso-ascii-theme-font:minor-latin;
 
mso-hansi-font-family:Calibri;
 
mso-hansi-theme-font:minor-latin;
 
mso-bidi-font-family:"Times New Roman";
 
mso-bidi-theme-font:minor-bidi;
 
mso-fareast-language:EN-US;}
 
</style><&#33;[endif]--><&#33;--[if gte mso 9]><xml><o:shapedefaults v:ext="edit" spidmax="2050"/></xml><&#33;[endif]--><&#33;--[if gte mso 9]><xml><o:shapelayout v:ext="edit"><o:idmap v:ext="edit" data="1"/></o:shapelayout></xml><&#33;[endif]--></head><body lang=EN-CA style='tab-interval:36.0pt'><div class=WordSection1><p class=MsoNormal>Theory behind the Material Class:</p><p class=MsoListParagraphCxSpFirst style='text-indent:-18.0pt;mso-list:l1 level1 lfo4'><&#33;[if &#33;supportLists]><span
 
style='mso-ascii-font-family:Calibri;mso-fareast-font-family:Calibri;
 
mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri'><span
 
style='mso-list:Ignore'>-<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]>The material class was originally supposed to encapsulate
 
all material related data, such as textures, colors, reflectivity etc. The
 
intention was to replace a lot of the functionality of graphic, so that an
 
object encapsulates an in world object, graphic encapsulated a static mesh and material
 
described the appearance of a mesh. <span style='mso-spacerun:yes'> </span>This
 
way you could have a material attached to many different meshes, so a similar
 
appearance can be applied amongst many objects. This is similar to the approach
 
taken by 3DS Max.</p><p class=MsoListParagraphCxSpLast style='text-indent:-18.0pt;mso-list:l1 level1 lfo4'><&#33;[if &#33;supportLists]><span
 
style='mso-ascii-font-family:Calibri;mso-fareast-font-family:Calibri;
 
mso-hansi-font-family:Calibri;mso-bidi-font-family:Calibri'><span
 
style='mso-list:Ignore'>-<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]>This approach proved too invasive for others to
 
implement, so now I have made Material a category, which will shift
 
responsibility of drawing the object away from graphic and into Material.</p><p class=MsoNormal>How to implement Environmental Cube Mapping</p><p class=MsoListParagraphCxSpFirst style='text-indent:-18.0pt;mso-list:l0 level1 lfo1'><&#33;[if &#33;supportLists]><span
 
style='mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin'><span
 
style='mso-list:Ignore'>1)<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]>Download and include the <span class=SpellE>iMaterial.h</span>,
 
<span class=SpellE>Material.h</span> and Material.cpp into your project.</p><p class=MsoListParagraphCxSpMiddle style='text-indent:-18.0pt;mso-list:l0 level1 lfo1'><&#33;[if &#33;supportLists]><span
 
style='mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin'><span
 
style='mso-list:Ignore'>2)<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]>Add the cube map code from the provided FX file
 
into your own FX file. If you will be adding there manually, copy the code
 
between //REF_CUBE_MAP_A# and //END REF_CUBE_MAP_A#, there should be 4 sections
 
to copy in total</p><p class=MsoListParagraphCxSpMiddle style='text-indent:-18.0pt;mso-list:l0 level1 lfo1'><&#33;[if &#33;supportLists]><span
 
style='mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin'><span
 
style='mso-list:Ignore'>3)<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]>Edit the <span class=SpellE>Configuration.h</span>
 
file<span style='mso-spacerun:yes'>  </span>and add “MATERIAL” to the Category
 
enumeration</p><p class=MsoListParagraphCxSpMiddle style='text-indent:-18.0pt;mso-list:l0 level1 lfo1'><&#33;[if &#33;supportLists]><span
 
style='mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin'><span
 
style='mso-list:Ignore'>4)<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]>Object is now going to need some
 
adjustments.<span style='mso-spacerun:yes'>  </span>I’ll break this down into a
 
few components:</p><p class=MsoListParagraphCxSpMiddle style='margin-left:72.0pt;mso-add-space:
 
auto;text-indent:-18.0pt;mso-list:l0 level2 lfo1'><&#33;[if &#33;supportLists]><span
 
style='font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:
 
Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]><span class=SpellE>iObject.h</span></p><p class=MsoListParagraphCxSpMiddle style='margin-left:108.0pt;mso-add-space:
 
auto;text-indent:-108.0pt;mso-text-indent-alt:-9.0pt;mso-list:l0 level3 lfo1'><&#33;[if &#33;supportLists]><span
 
style='mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin'><span
 
style='mso-list:Ignore'><span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span>I.<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]>Add ‘class <span class=SpellE>iMaterial</span>’
 
to the top of the file with the rest of the declarations</p><p class=MsoListParagraphCxSpMiddle style='margin-left:108.0pt;mso-add-space:
 
auto;text-indent:-108.0pt;mso-text-indent-alt:-9.0pt;mso-list:l0 level3 lfo1'><&#33;[if &#33;supportLists]><span
 
style='mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin'><span
 
style='mso-list:Ignore'><span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span>II.<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]>Add a virtual getting and setter for the
 
Object’s material</p><p class=MsoListParagraphCxSpMiddle style='margin-left:108.0pt;mso-add-space:
 
auto;text-indent:-108.0pt;mso-text-indent-alt:-9.0pt;mso-list:l0 level3 lfo1'><&#33;[if &#33;supportLists]><span
 
style='mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin'><span
 
style='mso-list:Ignore'><span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span>III.<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]>Add two more virtual functions, one called <span
 
class=SpellE>getID</span>, receives an <span class=SpellE>int</span> and
 
returns an <span class=SpellE>int</span>, and second one called <span
 
class=SpellE>resetID</span> which receives an <span class=SpellE>int</span> and
 
returns nothing.</p><p class=MsoListParagraphCxSpMiddle style='margin-left:72.0pt;mso-add-space:
 
auto;text-indent:-18.0pt;mso-list:l0 level2 lfo1'><&#33;[if &#33;supportLists]><span
 
style='font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:
 
Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]><span class=SpellE>Object.h</span></p><p class=MsoListParagraphCxSpMiddle style='margin-left:108.0pt;mso-add-space:
 
auto;text-indent:-108.0pt;mso-text-indent-alt:-9.0pt;mso-list:l0 level3 lfo1'><&#33;[if &#33;supportLists]><span
 
style='mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin'><span
 
style='mso-list:Ignore'><span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span>I.<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]>Add a private <span class=SpellE>iMaterial</span>
 
pointer to the object named <span class=SpellE>rMaterial</span> (you could
 
change it to w/e you want, but it won’t be as easy to copy/paste code if you
 
don’t)</p><p class=MsoListParagraphCxSpMiddle style='margin-left:108.0pt;mso-add-space:
 
auto;text-indent:-108.0pt;mso-text-indent-alt:-9.0pt;mso-list:l0 level3 lfo1'><&#33;[if &#33;supportLists]><span
 
style='mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin'><span
 
style='mso-list:Ignore'><span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span>II.<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]>Implement the getter and setter in the in the
 
Object header, in the setter, change the category of the object to MATERIAL.</p><p class=MsoListParagraphCxSpMiddle style='margin-left:108.0pt;mso-add-space:
 
auto;text-indent:-108.0pt;mso-text-indent-alt:-9.0pt;mso-list:l0 level3 lfo1'><&#33;[if &#33;supportLists]><span
 
style='mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin'><span
 
style='mso-list:Ignore'><span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span>III.<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]>Remove the braces after Object’s <span
 
class=SpellE><span class=GramE>preDraw</span></span><span class=GramE>(</span>)
 
function, we are going to need to implement this function in the <span
 
class=SpellE>cpp</span>.</p><p class=MsoListParagraphCxSpMiddle style='margin-left:108.0pt;mso-add-space:
 
auto;text-indent:-108.0pt;mso-text-indent-alt:-9.0pt;mso-list:l0 level3 lfo1'><&#33;[if &#33;supportLists]><span
 
style='mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin'><span
 
style='mso-list:Ignore'><span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span>IV.<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]>Add a private <span class=SpellE>int</span>
 
array called get <span class=SpellE>cubeMapID</span>, which for this
 
implementation<span class=GramE>,<span style='mso-spacerun:yes'>  </span>it</span>
 
can be an array of 2 items, since reflection depth will not be implemented.</p><p class=MsoListParagraphCxSpMiddle style='margin-left:108.0pt;mso-add-space:
 
auto;text-indent:-108.0pt;mso-text-indent-alt:-9.0pt;mso-list:l0 level3 lfo1'><&#33;[if &#33;supportLists]><span
 
style='mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin'><span
 
style='mso-list:Ignore'><span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span>V.<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]>Implement <span class=SpellE>getID</span> and <span
 
class=SpellE>resetID</span>, get id returns the <span class=SpellE>int</span>
 
at level in the <span class=SpellE>cubeMapID</span> array (return <span
 
class=SpellE><span class=GramE>cubeMapID</span></span><span class=GramE>[</span>level];)
 
and <span class=SpellE>resetID</span> sets the <span class=SpellE>int</span> at
 
level in the <span class=SpellE>cubeMapID</span> to -1.</p><p class=MsoListParagraphCxSpMiddle style='margin-left:72.0pt;mso-add-space:
 
auto;text-indent:-18.0pt;mso-list:l0 level2 lfo1'><&#33;[if &#33;supportLists]><span
 
style='font-family:Symbol;mso-fareast-font-family:Symbol;mso-bidi-font-family:
 
Symbol'><span style='mso-list:Ignore'>·<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]>Object.cpp</p><p class=MsoListParagraphCxSpMiddle style='margin-left:108.0pt;mso-add-space:
 
auto;text-indent:-108.0pt;mso-text-indent-alt:-9.0pt;mso-list:l0 level3 lfo1'><&#33;[if &#33;supportLists]><span
 
style='mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin'><span
 
style='mso-list:Ignore'><span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span>I.<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]>Add ‘#<span class=GramE>include</span><span
 
class=SpellE>iMaterial.h</span>’ at the top.</p><p class=MsoListParagraphCxSpMiddle style='margin-left:108.0pt;mso-add-space:
 
auto;text-indent:-108.0pt;mso-text-indent-alt:-9.0pt;mso-list:l0 level3 lfo1'><&#33;[if &#33;supportLists]><span
 
style='mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin'><span
 
style='mso-list:Ignore'><span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span>II.<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]>In the object constructor add ‘<span
 
class=SpellE>rMaterial</span> = NULL’, just to be safe, also set <span
 
class=SpellE>cubeMapID</span> [0] and [1] to -1.</p><p class=MsoListParagraphCxSpMiddle style='margin-left:108.0pt;mso-add-space:
 
auto;text-indent:-108.0pt;mso-text-indent-alt:-9.0pt;mso-list:l0 level3 lfo1'><&#33;[if &#33;supportLists]><span
 
style='mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin'><span
 
style='mso-list:Ignore'><span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span>III.<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]>In the object’s = operator, set <span
 
class=SpellE><span class=GramE>CubeMapID</span></span><span class=GramE>[</span>0]
 
and [1] to -1.</p><p class=MsoListParagraphCxSpMiddle style='margin-left:108.0pt;mso-add-space:
 
auto;text-indent:-108.0pt;mso-text-indent-alt:-9.0pt;mso-list:l0 level3 lfo1'><&#33;[if &#33;supportLists]><span
 
style='mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin'><span
 
style='mso-list:Ignore'><span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span>IV.<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]>In the Object’s attach function,<span
 
style='mso-spacerun:yes'>  </span>check if the category is set to MATERIAL and
 
that <span class=SpellE>rMaterial</span> isn’t NULL, if true, use Material’s <span
 
class=SpellE>setStage</span>, if category is not set to MATERIALS then use the
 
code already there (Remember, if reading this is confusing, you can always copy
 
the code, this is just trying to explain what to do)</p><p class=MsoListParagraphCxSpMiddle style='margin-left:108.0pt;mso-add-space:
 
auto;text-indent:-108.0pt;mso-text-indent-alt:-9.0pt;mso-list:l0 level3 lfo1'><&#33;[if &#33;supportLists]><span
 
style='mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin'><span
 
style='mso-list:Ignore'><span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span>V.<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]>Above the draw function, add the implementation
 
of the <span class=SpellE>preDraw</span>, which is simple. Check if the
 
category is set to MATERIAL and <span class=SpellE>rMaterial</span> isn’t NULL,
 
if true, set the <span class=SpellE>cubeMapID</span> (at index of <span
 
class=SpellE>rMaterial</span>-&gt;<span class=SpellE><span class=GramE>getDepth</span></span><span
 
class=GramE>(</span>)) to <span class=SpellE>dthe</span> result of <span
 
class=SpellE>rMaterial</span>-&gt;<span class=SpellE>getCubeID</span>(this).
 
Finally call the <span class=SpellE>preDraw</span> function on <span
 
class=SpellE>rMaterial</span> and pass it a reference to the object (this), <span
 
class=SpellE>vertexlist</span> pointer, and scene pointer.</p><p class=MsoListParagraphCxSpMiddle style='margin-left:108.0pt;mso-add-space:
 
auto;text-indent:-108.0pt;mso-text-indent-alt:-9.0pt;mso-list:l0 level3 lfo1'><&#33;[if &#33;supportLists]><span
 
style='mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin'><span
 
style='mso-list:Ignore'><span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span>VI.<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]>Mod the Object’s draw function to test if the
 
category is set to MATERIAL, if it is and<span style='mso-spacerun:yes'> 
 
</span><span class=SpellE>rMaterial</span> isn’t NULL, call the draw function
 
on the material (passing in the object and scene) in place of using the attach
 
and draw code in the function, the report should occur regardless.</p><p class=MsoListParagraphCxSpMiddle style='margin-left:108.0pt;mso-add-space:
 
auto;text-indent:-108.0pt;mso-text-indent-alt:-9.0pt;mso-list:l0 level3 lfo1'><&#33;[if &#33;supportLists]><span
 
style='mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin'><span
 
style='mso-list:Ignore'><span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span>VII.<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]>In the suspend code, check if <span
 
class=SpellE>rMaterial</span> is NULL, if not, call suspend on it. Do the same
 
for release.</p><p class=MsoListParagraphCxSpMiddle style='text-indent:-18.0pt;mso-list:l0 level1 lfo1'><&#33;[if &#33;supportLists]><span
 
style='mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin'><span
 
style='mso-list:Ignore'>5)<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]>Open Display.cpp,<span
 
style='mso-spacerun:yes'>  </span>#include <span class=SpellE>Material.h</span>
 
and call the static function <span class=SpellE>connectDevice</span> from
 
Material, this will give material access to the device and below, call the
 
static function <span class=SpellE>connectEffect</span>, giving Material access
 
to the effect file.</p><p class=MsoListParagraphCxSpMiddle style='text-indent:-18.0pt;mso-list:l0 level1 lfo1'><&#33;[if &#33;supportLists]><span
 
style='mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin'><span
 
style='mso-list:Ignore'>6)<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]>The system requires a knowledge of the vertices
 
of the in a mesh, so you have to go to <span class=SpellE>iVertex</span> list
 
and add two virtual functions<span class=GramE>,<span
 
style='mso-spacerun:yes'>  </span>‘<span class=SpellE>int</span></span><span
 
class=SpellE>getNumOfVerts</span>()’ and ‘Vertex* <span class=SpellE>getVertitices</span>()’.
 
Now you have to go into the <span class=SpellE>VertexList</span> class,
 
implement these functions to return <span class=SpellE>nVertices</span> and
 
Vertex.<span style='mso-spacerun:yes'>  </span>You also need to make an
 
implementation for stock mesh, simply give return NULL for both stock mesh
 
implementations. <br>
 
NOTE: If you already have your object’s center and radius calculated or easily
 
accessible, you can skip this step and alter the code in the Material class to
 
use that data instead of calculating the center from the vertex list.</p><p class=MsoListParagraphCxSpLast style='text-indent:-18.0pt;mso-list:l0 level1 lfo1'><&#33;[if &#33;supportLists]><span
 
style='mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin'><span
 
style='mso-list:Ignore'>7)<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]>Open Design.cpp and #include <span class=SpellE>iMaterial.h</span>.<span
 
style='mso-spacerun:yes'>  </span>Add scene-&gt;<span class=GramE>draw(</span>MATERIAL);
 
to Design’s draw function and scene-&gt;draw(MATERIAL); to Design’s <span
 
class=SpellE>preDraw</span>.</p><p class=MsoNormal>This will give you the ability to use the Material class
 
with your object to give them a nice reflective or refracting effect.</p><p class=MsoNormal>How to use Material:</p><p class=MsoNormal>To use a material, follow these few steps:</p><p class=MsoListParagraphCxSpFirst style='margin-left:54.0pt;mso-add-space:
 
auto;text-indent:-18.0pt;mso-list:l3 level1 lfo5'><&#33;[if &#33;supportLists]><span
 
style='mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin'><span
 
style='mso-list:Ignore'>1)<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]>Create a Material<span class=GramE>:</span><br><span class=SpellE><i style='mso-bidi-font-style:normal'>iMaterial</i></span><i
 
style='mso-bidi-font-style:normal'>* mat = <span class=SpellE>CreateMaterial</span>(<span
 
class=SpellE>contextPointer</span>, <span class=SpellE>numberOfStages</span>, <span
 
class=SpellE>numberOfSubsets</span>);<br></i>NOTES: if the material only have one stage and subset, only pass in
 
context.</p><p class=MsoListParagraphCxSpMiddle style='margin-left:54.0pt;mso-add-space:
 
auto;text-indent:-18.0pt;mso-list:l3 level1 lfo5'><&#33;[if &#33;supportLists]><span
 
style='mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin'><span
 
style='mso-list:Ignore'>2)<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]>Setup the material<span class=GramE>:</span><br><i style='mso-bidi-font-style:normal'>mat-&gt;setup(<span class=SpellE>arrayOfBasicColors</span>,
 
<span class=SpellE>twoDimensionalTextureArray</span>, <span class=SpellE>arrayOfColorsRepresentingReflection</span>,
 
<span class=SpellE>arrayOfRefractionPowers</span>, <span class=SpellE>twoDimensionalArrayOfColorsRepresentingRefraction</span>,
 
<span class=SpellE>ObjectShine</span>, <span class=SpellE>ObjectFlags</span>, <span
 
class=SpellE>ObjectBorderColor</span>);</i><br>
 
NOTE: If you specify only one subset/stage, you can simply put in a pointers to
 
this data, but if you specify more than one subset or stage, you <span
 
style='mso-spacerun:yes'> </span>must implement the data in an array OR pass in
 
NULL. The alpha channel determines how strong the effect of the reflection or
 
refraction will be, and they are both over-riding effects, reflection being the
 
most over-riding of the two. <span style='mso-spacerun:yes'> </span>So if
 
refraction’s alpha channel is 1.0, the object’s color and texture will be
 
completely gone, the object will only have the refracted texture on it. If the
 
alpha channel is 0.5, then it will be half refracted texture, half
 
color/diffuse texture. The same works with reflection except that reflection
 
will over-ride refraction, so if an object is 100% refractive and 100%
 
reflective, you will only see the reflection. Where as if the reflection is 50%
 
and refraction is 50%, the distribution of the texture will be 50% reflective,
 
25% refractive, 25% diffuse. The refractive power float array dictates how much
 
the light bends, so if it is equal to 1.0, the light will not bend at all,
 
where as if it is set to 0.9, it will bend about 10% of the angle of the normal
 
of the fragment.</p><p class=MsoListParagraphCxSpLast style='margin-left:54.0pt;mso-add-space:auto;
 
text-indent:-18.0pt;mso-list:l3 level1 lfo5'><&#33;[if &#33;supportLists]><span
 
style='mso-bidi-font-family:Calibri;mso-bidi-theme-font:minor-latin'><span
 
style='mso-list:Ignore'>3)<span style='font:7.0pt "Times New Roman"'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
</span></span></span><&#33;[endif]>Set the material onto the object<span
 
class=GramE>:</span><br><i style='mso-bidi-font-style:normal'>object-&gt;<span class=SpellE>setMaterial</span>(mat);</i><br>
 
NOTE: this will convert the object to a material object and attach the
 
material.</p><p class=MsoNormal><o:p>&nbsp;</o:p></p><p class=MsoNormal>A quick example of how to make a glass like cube would be:</p><p class=MsoNormal><br><span class=SpellE><i style='mso-bidi-font-style:normal'>iObject</i></span><i
 
style='mso-bidi-font-style:normal'>* boxy = <span class=SpellE>CreateBox</span>(-10,-10,
 
-10, 10, 10, 10, “opaque”, Colour(1.0f, 1.0f, 1.0f,1.0f);<br><span class=SpellE>iMaterial</span>* mat = <span class=SpellE>CreateMaterial</span>(context);<br>
 
float power = 0.9f; //this is just to sidestep the need for an array<br>
 
mat-&gt;setup(&amp;Colour(0.7f, 0.7f, 0.7f, 0.7f), NULL, &amp;Colour(1.0f,
 
1.0f, 1.0f, 0.25), &amp;power, &amp;Colour(1.0f, 1.0f, 1.0f, 1.0f));<br>
 
boxy-&gt;<span class=SpellE>setMaterial</span>(mat);<o:p></o:p></i></p><p class=MsoNormal>I didn’t test the above code so there could be a typo.</p></div></body></html>
 

Latest revision as of 05:05, 14 April 2011

Theory behind the Material Class:

-          The material class was originally supposed to encapsulate all material related data, such as textures, colors, reflectivity etc. The intention was to replace a lot of the functionality of graphic, so that an object encapsulates an in world object, graphic encapsulated a static mesh and material described the appearance of a mesh.  This way you could have a material attached to many different meshes, so a similar appearance can be applied amongst many objects. This is similar to the approach taken by 3DS Max.

-          This approach proved too invasive for others to implement, so now I have made Material a category, which will shift responsibility of drawing the object away from graphic and into Material.

How to implement Environmental Cube Mapping

1)      Download and include the iMaterial.h, Material.h and Material.cpp into your project.

2)      Add the cube map code from the provided FX file into your own FX file. If you will be adding there manually, copy the code between //REF_CUBE_MAP_A# and //END REF_CUBE_MAP_A#, there should be 4 sections to copy in total

3)      Edit the Configuration.h file  and add “MATERIAL” to the Category enumeration

4)      Object is now going to need some adjustments.  I’ll break this down into a few components:

·         iObject.h

                                                              I.      Add ‘class iMaterial’ to the top of the file with the rest of the declarations

                                                            II.      Add a virtual getting and setter for the Object’s material

                                                          III.      Add two more virtual functions, one called getID, receives an int and returns an int, and second one called resetID which receives an int and returns nothing.

·         Object.h

                                                              I.      Add a private iMaterial pointer to the object named rMaterial (you could change it to w/e you want, but it won’t be as easy to copy/paste code if you don’t)

                                                            II.      Implement the getter and setter in the in the Object header, in the setter, change the category of the object to MATERIAL.

                                                          III.      Remove the braces after Object’s preDraw() function, we are going to need to implement this function in the cpp.

                                                          IV.      Add a private int array called get cubeMapID, which for this implementation,  it can be an array of 2 items, since reflection depth will not be implemented.

                                                            V.      Implement getID and resetID, get id returns the int at level in the cubeMapID array (return cubeMapID[level];) and resetID sets the int at level in the cubeMapID to -1.

·         Object.cpp

                                                              I.      Add ‘#include iMaterial.h’ at the top.

                                                            II.      In the object constructor add ‘rMaterial = NULL’, just to be safe, also set cubeMapID [0] and [1] to -1.

                                                          III.      In the object’s = operator, set CubeMapID[0] and [1] to -1.

                                                          IV.      In the Object’s attach function,  check if the category is set to MATERIAL and that rMaterial isn’t NULL, if true, use Material’s setStage, if category is not set to MATERIALS then use the code already there (Remember, if reading this is confusing, you can always copy the code, this is just trying to explain what to do)

                                                            V.      Above the draw function, add the implementation of the preDraw, which is simple. Check if the category is set to MATERIAL and rMaterial isn’t NULL, if true, set the cubeMapID (at index of rMaterial->getDepth()) to dthe result of rMaterial->getCubeID(this). Finally call the preDraw function on rMaterial and pass it a reference to the object (this), vertexlist pointer, and scene pointer.

                                                          VI.      Mod the Object’s draw function to test if the category is set to MATERIAL, if it is and  rMaterial isn’t NULL, call the draw function on the material (passing in the object and scene) in place of using the attach and draw code in the function, the report should occur regardless.

                                                        VII.      In the suspend code, check if rMaterial is NULL, if not, call suspend on it. Do the same for release.

5)      Open Display.cpp,  #include Material.h and call the static function connectDevice from Material, this will give material access to the device and below, call the static function connectEffect, giving Material access to the effect file.

6)      The system requires a knowledge of the vertices of the in a mesh, so you have to go to iVertex list and add two virtual functions,  ‘int getNumOfVerts()’ and ‘Vertex* getVertitices()’. Now you have to go into the VertexList class, implement these functions to return nVertices and Vertex.  You also need to make an implementation for stock mesh, simply give return NULL for both stock mesh implementations.
NOTE: If you already have your object’s center and radius calculated or easily accessible, you can skip this step and alter the code in the Material class to use that data instead of calculating the center from the vertex list.

7)      Open Design.cpp and #include iMaterial.h.  Add scene->draw(MATERIAL); to Design’s draw function and scene->draw(MATERIAL); to Design’s preDraw.

This will give you the ability to use the Material class with your object to give them a nice reflective or refracting effect.

How to use Material:

To use a material, follow these few steps:

1)      Create a Material:
iMaterial* mat = CreateMaterial(contextPointer, numberOfStages, numberOfSubsets);
NOTES: if the material only have one stage and subset, only pass in context.

2)      Setup the material:
mat->setup(arrayOfBasicColors, twoDimensionalTextureArray, arrayOfColorsRepresentingReflection, arrayOfRefractionPowers, twoDimensionalArrayOfColorsRepresentingRefraction, ObjectShine, ObjectFlags, ObjectBorderColor);
NOTE: If you specify only one subset/stage, you can simply put in a pointers to this data, but if you specify more than one subset or stage, you  must implement the data in an array OR pass in NULL. The alpha channel determines how strong the effect of the reflection or refraction will be, and they are both over-riding effects, reflection being the most over-riding of the two.  So if refraction’s alpha channel is 1.0, the object’s color and texture will be completely gone, the object will only have the refracted texture on it. If the alpha channel is 0.5, then it will be half refracted texture, half color/diffuse texture. The same works with reflection except that reflection will over-ride refraction, so if an object is 100% refractive and 100% reflective, you will only see the reflection. Where as if the reflection is 50% and refraction is 50%, the distribution of the texture will be 50% reflective, 25% refractive, 25% diffuse. The refractive power float array dictates how much the light bends, so if it is equal to 1.0, the light will not bend at all, where as if it is set to 0.9, it will bend about 10% of the angle of the normal of the fragment.

3)      Set the material onto the object:
object->setMaterial(mat);
NOTE: this will convert the object to a material object and attach the material.

A quick example of how to make a glass like cube would be:


iObject* boxy = CreateBox(-10,-10, -10, 10, 10, 10, “opaque”, Colour(1.0f, 1.0f, 1.0f,1.0f);
iMaterial* mat = CreateMaterial(context);
float power = 0.9f; //this is just to sidestep the need for an array
mat->setup(&Colour(0.7f, 0.7f, 0.7f, 0.7f), NULL, &Colour(1.0f, 1.0f, 1.0f, 0.25), &power, &Colour(1.0f, 1.0f, 1.0f, 1.0f));
boxy->setMaterial(mat);

I didn’t test the above code so there could be a typo.