llmaterialtable.cpp

Go to the documentation of this file.
00001 
00032 #include "linden_common.h"
00033 
00034 #include "llmaterialtable.h"
00035 #include "llstl.h"
00036 #include "material_codes.h"
00037 #include "sound_ids.h"
00038 #include "imageids.h"
00039 
00040 LLMaterialTable LLMaterialTable::basic(1);
00041 
00042 /* 
00043         Old Havok 1 constants
00044 
00045 // these are the approximately correct friction values for various materials
00046 // however Havok1's friction dynamics are not very correct, so the effective
00047 // friction coefficients that result from these numbers are approximately
00048 // 25-50% too low, more incorrect for the lower values.
00049 F32 const LLMaterialTable::FRICTION_MIN         = 0.2f;         
00050 F32 const LLMaterialTable::FRICTION_GLASS       = 0.2f;         // borosilicate glass
00051 F32 const LLMaterialTable::FRICTION_LIGHT       = 0.2f;         //
00052 F32 const LLMaterialTable::FRICTION_METAL       = 0.3f;         // steel
00053 F32 const LLMaterialTable::FRICTION_PLASTIC     = 0.4f;         // HDPE
00054 F32 const LLMaterialTable::FRICTION_WOOD        = 0.6f;         // southern pine
00055 F32 const LLMaterialTable::FRICTION_FLESH       = 0.60f;        // saltwater
00056 F32 const LLMaterialTable::FRICTION_LAND        = 0.78f;        // dirt
00057 F32 const LLMaterialTable::FRICTION_STONE       = 0.8f;         // concrete
00058 F32 const LLMaterialTable::FRICTION_RUBBER      = 0.9f;         //
00059 F32 const LLMaterialTable::FRICTION_MAX         = 0.95f;        //
00060 */
00061 
00062 // #if LL_CURRENT_HAVOK_VERSION == LL_HAVOK_VERSION_460
00063 // Havok4 has more correct friction dynamics, however here we have to use
00064 // the "incorrect" equivalents for the legacy Havok1 behavior
00065 F32 const LLMaterialTable::FRICTION_MIN         = 0.15f;        
00066 F32 const LLMaterialTable::FRICTION_GLASS       = 0.13f;        // borosilicate glass
00067 F32 const LLMaterialTable::FRICTION_LIGHT       = 0.14f;        //
00068 F32 const LLMaterialTable::FRICTION_METAL       = 0.22f;        // steel
00069 F32 const LLMaterialTable::FRICTION_PLASTIC     = 0.3f;         // HDPE
00070 F32 const LLMaterialTable::FRICTION_WOOD        = 0.44f;        // southern pine
00071 F32 const LLMaterialTable::FRICTION_FLESH       = 0.46f;        // saltwater
00072 F32 const LLMaterialTable::FRICTION_LAND        = 0.58f;        // dirt
00073 F32 const LLMaterialTable::FRICTION_STONE       = 0.6f;         // concrete
00074 F32 const LLMaterialTable::FRICTION_RUBBER      = 0.67f;        //
00075 F32 const LLMaterialTable::FRICTION_MAX         = 0.71f;        //
00076 // #endif
00077 
00078 F32 const LLMaterialTable::RESTITUTION_MIN              = 0.02f;        
00079 F32 const LLMaterialTable::RESTITUTION_LAND     = LLMaterialTable::RESTITUTION_MIN;
00080 F32 const LLMaterialTable::RESTITUTION_FLESH    = 0.2f;         // saltwater
00081 F32 const LLMaterialTable::RESTITUTION_STONE    = 0.4f;         // concrete
00082 F32 const LLMaterialTable::RESTITUTION_METAL    = 0.4f;         // steel
00083 F32 const LLMaterialTable::RESTITUTION_WOOD     = 0.5f;         // southern pine
00084 F32 const LLMaterialTable::RESTITUTION_GLASS    = 0.7f;         // borosilicate glass
00085 F32 const LLMaterialTable::RESTITUTION_PLASTIC  = 0.7f;         // HDPE
00086 F32 const LLMaterialTable::RESTITUTION_LIGHT    = 0.7f;         //
00087 F32 const LLMaterialTable::RESTITUTION_RUBBER   = 0.9f;         //
00088 F32 const LLMaterialTable::RESTITUTION_MAX              = 0.95f;
00089 
00090 F32 const LLMaterialTable::DEFAULT_FRICTION = 0.5f;
00091 F32 const LLMaterialTable::DEFAULT_RESTITUTION = 0.4f;
00092 
00093 LLMaterialTable::LLMaterialTable()
00094 {
00095 }
00096 
00097 LLMaterialTable::LLMaterialTable(U8 isBasic)
00098 {
00099         initBasicTable();
00100 }
00101 
00102 LLMaterialTable::~LLMaterialTable()
00103 {
00104         if (mCollisionSoundMatrix)
00105         {
00106                 delete [] mCollisionSoundMatrix;
00107                 mCollisionSoundMatrix = NULL;
00108         }
00109 
00110         if (mSlidingSoundMatrix)
00111         {
00112                 delete [] mSlidingSoundMatrix;
00113                 mSlidingSoundMatrix = NULL;
00114         }
00115 
00116         if (mRollingSoundMatrix)
00117         {
00118                 delete [] mRollingSoundMatrix;
00119                 mRollingSoundMatrix = NULL;
00120         }
00121 
00122         for_each(mMaterialInfoList.begin(), mMaterialInfoList.end(), DeletePointer());
00123         mMaterialInfoList.clear();
00124 }
00125 
00126 void LLMaterialTable::initBasicTable()
00127 {
00128         add(LL_MCODE_STONE,"Stone", LL_DEFAULT_STONE_UUID);     
00129         add(LL_MCODE_METAL,"Metal", LL_DEFAULT_METAL_UUID);
00130         add(LL_MCODE_GLASS,"Glass", LL_DEFAULT_GLASS_UUID);
00131         add(LL_MCODE_WOOD,"Wood", LL_DEFAULT_WOOD_UUID);
00132         add(LL_MCODE_FLESH,"Flesh", LL_DEFAULT_FLESH_UUID);
00133         add(LL_MCODE_PLASTIC,"Plastic", LL_DEFAULT_PLASTIC_UUID);
00134         add(LL_MCODE_RUBBER,"Rubber", LL_DEFAULT_RUBBER_UUID);
00135         add(LL_MCODE_LIGHT,"Light", LL_DEFAULT_LIGHT_UUID);
00136 
00137         // specify densities for these materials. . . 
00138     // these were taken from http://www.mcelwee.net/html/densities_of_various_materials.html
00139 
00140         addDensity(LL_MCODE_STONE,30.f);
00141         addDensity(LL_MCODE_METAL,50.f);
00142         addDensity(LL_MCODE_GLASS,20.f);
00143         addDensity(LL_MCODE_WOOD,10.f); 
00144         addDensity(LL_MCODE_FLESH,10.f);
00145         addDensity(LL_MCODE_PLASTIC,5.f);
00146         addDensity(LL_MCODE_RUBBER,0.5f); //
00147         addDensity(LL_MCODE_LIGHT,20.f); //
00148 
00149         // add damage and energy values
00150         addDamageAndEnergy(LL_MCODE_STONE, 1.f, 1.f, 1.f);      // concrete
00151         addDamageAndEnergy(LL_MCODE_METAL, 1.f, 1.f, 1.f);  // steel
00152         addDamageAndEnergy(LL_MCODE_GLASS, 1.f, 1.f, 1.f);  // borosilicate glass
00153         addDamageAndEnergy(LL_MCODE_WOOD, 1.f, 1.f, 1.f);    // southern pine
00154         addDamageAndEnergy(LL_MCODE_FLESH, 1.f, 1.f, 1.f);  // saltwater
00155         addDamageAndEnergy(LL_MCODE_PLASTIC, 1.f, 1.f, 1.f); // HDPE
00156         addDamageAndEnergy(LL_MCODE_RUBBER, 1.f, 1.f, 1.f); //
00157         addDamageAndEnergy(LL_MCODE_LIGHT, 1.f, 1.f, 1.f); //
00158 
00159         addFriction(LL_MCODE_STONE,0.8f);       // concrete
00160         addFriction(LL_MCODE_METAL,0.3f);  // steel
00161         addFriction(LL_MCODE_GLASS,0.2f);  // borosilicate glass
00162         addFriction(LL_MCODE_WOOD,0.6f);    // southern pine
00163         addFriction(LL_MCODE_FLESH,0.9f);  // saltwater
00164         addFriction(LL_MCODE_PLASTIC,0.4f); // HDPE
00165         addFriction(LL_MCODE_RUBBER,0.9f); //
00166         addFriction(LL_MCODE_LIGHT,0.2f); //
00167 
00168         addRestitution(LL_MCODE_STONE,0.4f);    // concrete
00169         addRestitution(LL_MCODE_METAL,0.4f);  // steel
00170         addRestitution(LL_MCODE_GLASS,0.7f);  // borosilicate glass
00171         addRestitution(LL_MCODE_WOOD,0.5f);    // southern pine
00172         addRestitution(LL_MCODE_FLESH,0.3f);  // saltwater
00173         addRestitution(LL_MCODE_PLASTIC,0.7f); // HDPE
00174         addRestitution(LL_MCODE_RUBBER,0.9f); //
00175         addRestitution(LL_MCODE_LIGHT,0.7f); //
00176 
00177         addShatterSound(LL_MCODE_STONE,LLUUID("ea296329-0f09-4993-af1b-e6784bab1dc9"));
00178         addShatterSound(LL_MCODE_METAL,LLUUID("d1375446-1c4d-470b-9135-30132433b678"));
00179         addShatterSound(LL_MCODE_GLASS,LLUUID("85cda060-b393-48e6-81c8-2cfdfb275351"));
00180         addShatterSound(LL_MCODE_WOOD,LLUUID("6f00669f-15e0-4793-a63e-c03f62fee43a"));
00181         addShatterSound(LL_MCODE_FLESH,LLUUID("2d8c6f51-149e-4e23-8413-93a379b42b67"));
00182         addShatterSound(LL_MCODE_PLASTIC,LLUUID("d55c7f3c-e1c3-4ddc-9eff-9ef805d9190e"));
00183         addShatterSound(LL_MCODE_RUBBER,LLUUID("212b6d1e-8d9c-4986-b3aa-f3c6df8d987d"));
00184         addShatterSound(LL_MCODE_LIGHT,LLUUID("d55c7f3c-e1c3-4ddc-9eff-9ef805d9190e"));
00185 
00186         //  CollisionSounds
00187         mCollisionSoundMatrix = new LLUUID[LL_MCODE_END*LL_MCODE_END];
00188         if (mCollisionSoundMatrix)
00189         {
00190                 addCollisionSound(LL_MCODE_STONE, LL_MCODE_STONE, SND_STONE_STONE);
00191                 addCollisionSound(LL_MCODE_STONE, LL_MCODE_METAL, SND_STONE_METAL);
00192                 addCollisionSound(LL_MCODE_STONE, LL_MCODE_GLASS, SND_STONE_GLASS);
00193                 addCollisionSound(LL_MCODE_STONE, LL_MCODE_WOOD, SND_STONE_WOOD);
00194                 addCollisionSound(LL_MCODE_STONE, LL_MCODE_FLESH, SND_STONE_FLESH);
00195                 addCollisionSound(LL_MCODE_STONE, LL_MCODE_PLASTIC, SND_STONE_PLASTIC);
00196                 addCollisionSound(LL_MCODE_STONE, LL_MCODE_RUBBER, SND_STONE_RUBBER);
00197                 addCollisionSound(LL_MCODE_STONE, LL_MCODE_LIGHT, SND_STONE_PLASTIC);
00198 
00199                 addCollisionSound(LL_MCODE_METAL, LL_MCODE_METAL, SND_METAL_METAL);
00200                 addCollisionSound(LL_MCODE_METAL, LL_MCODE_GLASS, SND_METAL_GLASS);
00201                 addCollisionSound(LL_MCODE_METAL, LL_MCODE_WOOD, SND_METAL_WOOD);
00202                 addCollisionSound(LL_MCODE_METAL, LL_MCODE_FLESH, SND_METAL_FLESH);
00203                 addCollisionSound(LL_MCODE_METAL, LL_MCODE_PLASTIC, SND_METAL_PLASTIC);
00204                 addCollisionSound(LL_MCODE_METAL, LL_MCODE_LIGHT, SND_METAL_PLASTIC);
00205                 addCollisionSound(LL_MCODE_METAL, LL_MCODE_RUBBER, SND_METAL_RUBBER);
00206 
00207                 addCollisionSound(LL_MCODE_GLASS, LL_MCODE_GLASS, SND_GLASS_GLASS);
00208                 addCollisionSound(LL_MCODE_GLASS, LL_MCODE_WOOD, SND_GLASS_WOOD);
00209                 addCollisionSound(LL_MCODE_GLASS, LL_MCODE_FLESH, SND_GLASS_FLESH);
00210                 addCollisionSound(LL_MCODE_GLASS, LL_MCODE_PLASTIC, SND_GLASS_PLASTIC);
00211                 addCollisionSound(LL_MCODE_GLASS, LL_MCODE_RUBBER, SND_GLASS_RUBBER);
00212                 addCollisionSound(LL_MCODE_GLASS, LL_MCODE_LIGHT, SND_GLASS_PLASTIC);
00213 
00214                 addCollisionSound(LL_MCODE_WOOD, LL_MCODE_WOOD, SND_WOOD_WOOD);
00215                 addCollisionSound(LL_MCODE_WOOD, LL_MCODE_FLESH, SND_WOOD_FLESH);
00216                 addCollisionSound(LL_MCODE_WOOD, LL_MCODE_PLASTIC, SND_WOOD_PLASTIC);
00217                 addCollisionSound(LL_MCODE_WOOD, LL_MCODE_RUBBER, SND_WOOD_RUBBER);
00218                 addCollisionSound(LL_MCODE_WOOD, LL_MCODE_LIGHT, SND_WOOD_PLASTIC);
00219 
00220                 addCollisionSound(LL_MCODE_FLESH, LL_MCODE_FLESH, SND_FLESH_FLESH);
00221                 addCollisionSound(LL_MCODE_FLESH, LL_MCODE_PLASTIC, SND_FLESH_PLASTIC);
00222                 addCollisionSound(LL_MCODE_FLESH, LL_MCODE_RUBBER, SND_FLESH_RUBBER);
00223                 addCollisionSound(LL_MCODE_FLESH, LL_MCODE_LIGHT, SND_FLESH_PLASTIC);
00224 
00225                 addCollisionSound(LL_MCODE_RUBBER, LL_MCODE_RUBBER, SND_RUBBER_RUBBER);
00226                 addCollisionSound(LL_MCODE_RUBBER, LL_MCODE_PLASTIC, SND_RUBBER_PLASTIC);
00227                 addCollisionSound(LL_MCODE_RUBBER, LL_MCODE_LIGHT, SND_RUBBER_PLASTIC);
00228 
00229                 addCollisionSound(LL_MCODE_PLASTIC, LL_MCODE_PLASTIC, SND_PLASTIC_PLASTIC);
00230                 addCollisionSound(LL_MCODE_PLASTIC, LL_MCODE_LIGHT, SND_PLASTIC_PLASTIC);
00231 
00232                 addCollisionSound(LL_MCODE_LIGHT, LL_MCODE_LIGHT, SND_PLASTIC_PLASTIC);
00233         }
00234         
00235         //  Sliding Sounds
00236         mSlidingSoundMatrix = new LLUUID[LL_MCODE_END*LL_MCODE_END];
00237         if (mSlidingSoundMatrix)
00238         {
00239                 addSlidingSound(LL_MCODE_STONE, LL_MCODE_STONE, SND_SLIDE_STONE_STONE);
00240                 addSlidingSound(LL_MCODE_STONE, LL_MCODE_METAL, SND_SLIDE_STONE_STONE_01);
00241                 addSlidingSound(LL_MCODE_STONE, LL_MCODE_GLASS, SND_SLIDE_STONE_STONE_01);
00242                 addSlidingSound(LL_MCODE_STONE, LL_MCODE_WOOD, SND_SLIDE_STONE_WOOD);
00243                 addSlidingSound(LL_MCODE_STONE, LL_MCODE_FLESH, SND_SLIDE_STONE_STONE_01);
00244                 addSlidingSound(LL_MCODE_STONE, LL_MCODE_PLASTIC, SND_SLIDE_STONE_PLASTIC);
00245                 addSlidingSound(LL_MCODE_STONE, LL_MCODE_RUBBER, SND_SLIDE_STONE_RUBBER);
00246                 addSlidingSound(LL_MCODE_STONE, LL_MCODE_LIGHT, SND_SLIDE_STONE_PLASTIC);
00247 
00248                 addSlidingSound(LL_MCODE_METAL, LL_MCODE_METAL, SND_SLIDE_METAL_METAL);
00249                 addSlidingSound(LL_MCODE_METAL, LL_MCODE_GLASS, SND_SLIDE_METAL_GLASS);
00250                 addSlidingSound(LL_MCODE_METAL, LL_MCODE_WOOD, SND_SLIDE_METAL_WOOD);
00251                 addSlidingSound(LL_MCODE_METAL, LL_MCODE_FLESH, SND_SLIDE_METAL_FLESH);
00252                 addSlidingSound(LL_MCODE_METAL, LL_MCODE_PLASTIC, SND_SLIDE_STONE_STONE_01);
00253                 addSlidingSound(LL_MCODE_METAL, LL_MCODE_RUBBER, SND_SLIDE_METAL_RUBBER);
00254                 addSlidingSound(LL_MCODE_METAL, LL_MCODE_LIGHT, SND_SLIDE_STONE_STONE_01);
00255 
00256                 addSlidingSound(LL_MCODE_GLASS, LL_MCODE_GLASS, SND_SLIDE_STONE_STONE_01);
00257                 addSlidingSound(LL_MCODE_GLASS, LL_MCODE_WOOD, SND_SLIDE_STONE_STONE_01);
00258                 addSlidingSound(LL_MCODE_GLASS, LL_MCODE_FLESH, SND_SLIDE_STONE_STONE_01);
00259                 addSlidingSound(LL_MCODE_GLASS, LL_MCODE_PLASTIC, SND_SLIDE_STONE_STONE_01);
00260                 addSlidingSound(LL_MCODE_GLASS, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01);
00261                 addSlidingSound(LL_MCODE_GLASS, LL_MCODE_LIGHT, SND_SLIDE_STONE_STONE_01);
00262 
00263                 addSlidingSound(LL_MCODE_WOOD, LL_MCODE_WOOD, SND_SLIDE_WOOD_WOOD);
00264                 addSlidingSound(LL_MCODE_WOOD, LL_MCODE_FLESH, SND_SLIDE_WOOD_FLESH);
00265                 addSlidingSound(LL_MCODE_WOOD, LL_MCODE_PLASTIC, SND_SLIDE_WOOD_PLASTIC);
00266                 addSlidingSound(LL_MCODE_WOOD, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01);
00267                 addSlidingSound(LL_MCODE_WOOD, LL_MCODE_LIGHT, SND_SLIDE_WOOD_PLASTIC);
00268 
00269                 addSlidingSound(LL_MCODE_FLESH, LL_MCODE_FLESH, SND_SLIDE_FLESH_FLESH);
00270                 addSlidingSound(LL_MCODE_FLESH, LL_MCODE_PLASTIC, SND_SLIDE_STONE_STONE_01);
00271                 addSlidingSound(LL_MCODE_FLESH, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01);
00272                 addSlidingSound(LL_MCODE_FLESH, LL_MCODE_LIGHT, SND_SLIDE_STONE_STONE_01);
00273 
00274                 addSlidingSound(LL_MCODE_RUBBER, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01);
00275                 addSlidingSound(LL_MCODE_RUBBER, LL_MCODE_PLASTIC, SND_SLIDE_RUBBER_PLASTIC);
00276                 addSlidingSound(LL_MCODE_RUBBER, LL_MCODE_LIGHT, SND_SLIDE_RUBBER_PLASTIC);
00277 
00278                 addSlidingSound(LL_MCODE_PLASTIC, LL_MCODE_PLASTIC, SND_SLIDE_STONE_STONE_01);
00279                 addSlidingSound(LL_MCODE_PLASTIC, LL_MCODE_LIGHT, SND_SLIDE_STONE_STONE_01);
00280 
00281                 addSlidingSound(LL_MCODE_LIGHT, LL_MCODE_LIGHT, SND_SLIDE_STONE_STONE_01);
00282         }
00283 
00284         //  Rolling Sounds
00285         mRollingSoundMatrix = new LLUUID[LL_MCODE_END*LL_MCODE_END];
00286         if (mRollingSoundMatrix)
00287         {
00288                 addRollingSound(LL_MCODE_STONE, LL_MCODE_STONE, SND_ROLL_STONE_STONE);
00289                 addRollingSound(LL_MCODE_STONE, LL_MCODE_METAL, SND_SLIDE_STONE_STONE_01);
00290                 addRollingSound(LL_MCODE_STONE, LL_MCODE_GLASS, SND_SLIDE_STONE_STONE_01);
00291                 addRollingSound(LL_MCODE_STONE, LL_MCODE_WOOD, SND_ROLL_STONE_WOOD);
00292                 addRollingSound(LL_MCODE_STONE, LL_MCODE_FLESH, SND_SLIDE_STONE_STONE_01);
00293                 addRollingSound(LL_MCODE_STONE, LL_MCODE_PLASTIC, SND_ROLL_STONE_PLASTIC);
00294                 addRollingSound(LL_MCODE_STONE, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01);
00295                 addRollingSound(LL_MCODE_STONE, LL_MCODE_LIGHT, SND_ROLL_STONE_PLASTIC);
00296 
00297                 addRollingSound(LL_MCODE_METAL, LL_MCODE_METAL, SND_SLIDE_STONE_STONE_01);
00298                 addRollingSound(LL_MCODE_METAL, LL_MCODE_GLASS, SND_ROLL_METAL_GLASS);
00299                 addRollingSound(LL_MCODE_METAL, LL_MCODE_WOOD, SND_ROLL_METAL_WOOD);
00300                 addRollingSound(LL_MCODE_METAL, LL_MCODE_FLESH, SND_SLIDE_STONE_STONE_01);
00301                 addRollingSound(LL_MCODE_METAL, LL_MCODE_PLASTIC, SND_ROLL_METAL_WOOD);
00302                 addRollingSound(LL_MCODE_METAL, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01);
00303                 addRollingSound(LL_MCODE_METAL, LL_MCODE_LIGHT, SND_ROLL_METAL_WOOD);
00304 
00305                 addRollingSound(LL_MCODE_GLASS, LL_MCODE_GLASS, SND_SLIDE_STONE_STONE_01);
00306                 addRollingSound(LL_MCODE_GLASS, LL_MCODE_WOOD, SND_ROLL_GLASS_WOOD);
00307                 addRollingSound(LL_MCODE_GLASS, LL_MCODE_FLESH, SND_SLIDE_STONE_STONE_01);
00308                 addRollingSound(LL_MCODE_GLASS, LL_MCODE_PLASTIC, SND_SLIDE_STONE_STONE_01);
00309                 addRollingSound(LL_MCODE_GLASS, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01);
00310                 addRollingSound(LL_MCODE_GLASS, LL_MCODE_LIGHT, SND_SLIDE_STONE_STONE_01);
00311 
00312                 addRollingSound(LL_MCODE_WOOD, LL_MCODE_WOOD, SND_ROLL_WOOD_WOOD);
00313                 addRollingSound(LL_MCODE_WOOD, LL_MCODE_FLESH, SND_ROLL_WOOD_FLESH);
00314                 addRollingSound(LL_MCODE_WOOD, LL_MCODE_PLASTIC, SND_ROLL_WOOD_PLASTIC);
00315                 addRollingSound(LL_MCODE_WOOD, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01);
00316                 addRollingSound(LL_MCODE_WOOD, LL_MCODE_LIGHT, SND_ROLL_WOOD_PLASTIC);
00317 
00318                 addRollingSound(LL_MCODE_FLESH, LL_MCODE_FLESH, SND_SLIDE_STONE_STONE_01);
00319                 addRollingSound(LL_MCODE_FLESH, LL_MCODE_PLASTIC, SND_ROLL_FLESH_PLASTIC);
00320                 addRollingSound(LL_MCODE_FLESH, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01);
00321                 addRollingSound(LL_MCODE_FLESH, LL_MCODE_LIGHT, SND_ROLL_FLESH_PLASTIC);
00322 
00323                 addRollingSound(LL_MCODE_RUBBER, LL_MCODE_RUBBER, SND_SLIDE_STONE_STONE_01);
00324                 addRollingSound(LL_MCODE_RUBBER, LL_MCODE_PLASTIC, SND_SLIDE_STONE_STONE_01);
00325                 addRollingSound(LL_MCODE_RUBBER, LL_MCODE_LIGHT, SND_SLIDE_STONE_STONE_01);
00326 
00327                 addRollingSound(LL_MCODE_PLASTIC, LL_MCODE_PLASTIC, SND_ROLL_PLASTIC_PLASTIC);
00328                 addRollingSound(LL_MCODE_PLASTIC, LL_MCODE_LIGHT, SND_ROLL_PLASTIC_PLASTIC);
00329 
00330                 addRollingSound(LL_MCODE_LIGHT, LL_MCODE_LIGHT, SND_ROLL_PLASTIC_PLASTIC);
00331         }
00332 }
00333 
00334 BOOL LLMaterialTable::add(U8 mcode, char* name, const LLUUID &uuid)
00335 {
00336         LLMaterialInfo *infop;
00337 
00338         infop = new LLMaterialInfo(mcode,name,uuid);
00339         if (!infop) return FALSE;
00340 
00341         // Add at the end so the order in menus matches the order in this
00342         // file.  JNC 11.30.01
00343         mMaterialInfoList.push_back(infop);
00344 
00345         return TRUE;
00346 }
00347 
00348 BOOL LLMaterialTable::addCollisionSound(U8 mcode, U8 mcode2, const LLUUID &uuid)
00349 {
00350         if (mCollisionSoundMatrix && (mcode < LL_MCODE_END) && (mcode2 < LL_MCODE_END))
00351         {
00352                 mCollisionSoundMatrix[mcode * LL_MCODE_END + mcode2] = uuid;            
00353                 if (mcode != mcode2)
00354                 {
00355                         mCollisionSoundMatrix[mcode2 * LL_MCODE_END + mcode] = uuid;            
00356                 }
00357         }
00358         return TRUE;
00359 }
00360 
00361 BOOL LLMaterialTable::addSlidingSound(U8 mcode, U8 mcode2, const LLUUID &uuid)
00362 {
00363         if (mSlidingSoundMatrix && (mcode < LL_MCODE_END) && (mcode2 < LL_MCODE_END))
00364         {
00365                 mSlidingSoundMatrix[mcode * LL_MCODE_END + mcode2] = uuid;              
00366                 if (mcode != mcode2)
00367                 {
00368                         mSlidingSoundMatrix[mcode2 * LL_MCODE_END + mcode] = uuid;              
00369                 }
00370         }
00371         return TRUE;
00372 }
00373 
00374 BOOL LLMaterialTable::addRollingSound(U8 mcode, U8 mcode2, const LLUUID &uuid)
00375 {
00376         if (mRollingSoundMatrix && (mcode < LL_MCODE_END) && (mcode2 < LL_MCODE_END))
00377         {
00378                 mRollingSoundMatrix[mcode * LL_MCODE_END + mcode2] = uuid;              
00379                 if (mcode != mcode2)
00380                 {
00381                         mRollingSoundMatrix[mcode2 * LL_MCODE_END + mcode] = uuid;              
00382                 }
00383         }
00384         return TRUE;
00385 }
00386 
00387 BOOL LLMaterialTable::addShatterSound(U8 mcode, const LLUUID &uuid)
00388 {
00389         for (info_list_t::iterator iter = mMaterialInfoList.begin();
00390                  iter != mMaterialInfoList.end(); ++iter)
00391         {
00392                 LLMaterialInfo *infop = *iter;
00393                 if (mcode == infop->mMCode)
00394                 {
00395                         infop->mShatterSoundID = uuid;
00396                         return TRUE;
00397                 }
00398         }
00399 
00400         return FALSE;
00401 }
00402 
00403 BOOL LLMaterialTable::addDensity(U8 mcode, const F32 &density)
00404 {
00405         for (info_list_t::iterator iter = mMaterialInfoList.begin();
00406                  iter != mMaterialInfoList.end(); ++iter)
00407         {
00408                 LLMaterialInfo *infop = *iter;
00409                 if (mcode == infop->mMCode)
00410                 {
00411                         infop->mDensity = density;
00412                         return TRUE;
00413                 }
00414         }
00415 
00416         return FALSE;
00417 }
00418 
00419 BOOL LLMaterialTable::addRestitution(U8 mcode, const F32 &restitution)
00420 {
00421         for (info_list_t::iterator iter = mMaterialInfoList.begin();
00422                  iter != mMaterialInfoList.end(); ++iter)
00423         {
00424                 LLMaterialInfo *infop = *iter;
00425                 if (mcode == infop->mMCode)
00426                 {
00427                         infop->mRestitution = restitution;
00428                         return TRUE;
00429                 }
00430         }
00431 
00432         return FALSE;
00433 }
00434 
00435 BOOL LLMaterialTable::addFriction(U8 mcode, const F32 &friction)
00436 {
00437         for (info_list_t::iterator iter = mMaterialInfoList.begin();
00438                  iter != mMaterialInfoList.end(); ++iter)
00439         {
00440                 LLMaterialInfo *infop = *iter;
00441                 if (mcode == infop->mMCode)
00442                 {
00443                         infop->mFriction = friction;
00444                         return TRUE;
00445                 }
00446         }
00447 
00448         return FALSE;
00449 }
00450 
00451 BOOL LLMaterialTable::addDamageAndEnergy(U8 mcode, const F32 &hp_mod, const F32 &damage_mod, const F32 &ep_mod)
00452 {
00453         for (info_list_t::iterator iter = mMaterialInfoList.begin();
00454                  iter != mMaterialInfoList.end(); ++iter)
00455         {
00456                 LLMaterialInfo *infop = *iter;
00457                 if (mcode == infop->mMCode)
00458                 {
00459                         infop->mHPModifier = hp_mod;
00460                         infop->mDamageModifier = damage_mod;
00461                         infop->mEPModifier = ep_mod;
00462                         return TRUE;
00463                 }
00464         }
00465 
00466         return FALSE;
00467 }
00468 
00469 LLUUID LLMaterialTable::getDefaultTextureID(char* name)
00470 {
00471         for (info_list_t::iterator iter = mMaterialInfoList.begin();
00472                  iter != mMaterialInfoList.end(); ++iter)
00473         {
00474                 LLMaterialInfo *infop = *iter;
00475                 if (!strcmp(name, infop->mName))
00476                 {
00477                         return infop->mDefaultTextureID;
00478                 }
00479         }
00480 
00481         return LLUUID::null;
00482 }
00483 
00484 
00485 LLUUID LLMaterialTable::getDefaultTextureID(U8 mcode)
00486 {
00487         mcode &= LL_MCODE_MASK;
00488         for (info_list_t::iterator iter = mMaterialInfoList.begin();
00489                  iter != mMaterialInfoList.end(); ++iter)
00490         {
00491                 LLMaterialInfo *infop = *iter;
00492                 if (mcode == infop->mMCode)
00493                 {
00494                         return infop->mDefaultTextureID;
00495                 }
00496         }
00497 
00498         return LLUUID::null;
00499 }
00500 
00501 
00502 U8 LLMaterialTable::getMCode(const char* name)
00503 {
00504         for (info_list_t::iterator iter = mMaterialInfoList.begin();
00505                  iter != mMaterialInfoList.end(); ++iter)
00506         {
00507                 LLMaterialInfo *infop = *iter;
00508                 if (!strcmp(name, infop->mName))
00509                 {
00510                         return infop->mMCode;
00511                 }
00512         }
00513 
00514         return 0;
00515 }
00516 
00517 
00518 char* LLMaterialTable::getName(U8 mcode)
00519 {
00520         mcode &= LL_MCODE_MASK;
00521         for (info_list_t::iterator iter = mMaterialInfoList.begin();
00522                  iter != mMaterialInfoList.end(); ++iter)
00523         {
00524                 LLMaterialInfo *infop = *iter;
00525                 if (mcode == infop->mMCode)
00526                 {
00527                         return infop->mName;
00528                 }
00529         }
00530 
00531         return NULL;
00532 }
00533 
00534 
00535 LLUUID LLMaterialTable::getCollisionSoundUUID(U8 mcode, U8 mcode2)
00536 {
00537         mcode &= LL_MCODE_MASK;
00538         mcode2 &= LL_MCODE_MASK;
00539         
00540         //llinfos << "code 1: " << ((U32) mcode) << " code 2:" << ((U32) mcode2) << llendl;
00541         if (mCollisionSoundMatrix && (mcode < LL_MCODE_END) && (mcode2 < LL_MCODE_END))
00542         {
00543                 return(mCollisionSoundMatrix[mcode * LL_MCODE_END + mcode2]);
00544         }
00545         else
00546         {
00547                 //llinfos << "Null Sound" << llendl;
00548                 return(SND_NULL);
00549         }
00550 }
00551 
00552 LLUUID LLMaterialTable::getSlidingSoundUUID(U8 mcode, U8 mcode2)
00553 {       
00554         mcode &= LL_MCODE_MASK;
00555         mcode2 &= LL_MCODE_MASK;
00556         
00557         if (mSlidingSoundMatrix && (mcode < LL_MCODE_END) && (mcode2 < LL_MCODE_END))
00558         {
00559                 return(mSlidingSoundMatrix[mcode * LL_MCODE_END + mcode2]);
00560         }
00561         else
00562         {
00563                 return(SND_NULL);
00564         }
00565 }
00566 
00567 LLUUID LLMaterialTable::getRollingSoundUUID(U8 mcode, U8 mcode2)
00568 {       
00569         mcode &= LL_MCODE_MASK;
00570         mcode2 &= LL_MCODE_MASK;
00571         
00572         if (mRollingSoundMatrix && (mcode < LL_MCODE_END) && (mcode2 < LL_MCODE_END))
00573         {
00574                 return(mRollingSoundMatrix[mcode * LL_MCODE_END + mcode2]);
00575         }
00576         else
00577         {
00578                 return(SND_NULL);
00579         }
00580 }
00581 
00582 LLUUID LLMaterialTable::getGroundCollisionSoundUUID(U8 mcode)
00583 {       
00584         //  Create material appropriate sounds for collisions with the ground 
00585         //  For now, simply return a single sound for all materials 
00586         return SND_STONE_DIRT_02;
00587 }
00588 
00589 LLUUID LLMaterialTable::getGroundSlidingSoundUUID(U8 mcode)
00590 {       
00591         //  Create material-specific sound for sliding on ground
00592         //  For now, just return a single sound 
00593         return SND_SLIDE_STONE_STONE_01;
00594 }
00595 
00596 LLUUID LLMaterialTable::getGroundRollingSoundUUID(U8 mcode)
00597 {       
00598         //  Create material-specific sound for rolling on ground
00599         //  For now, just return a single sound 
00600         return SND_SLIDE_STONE_STONE_01;
00601 }
00602 
00603 LLUUID LLMaterialTable::getCollisionParticleUUID(U8 mcode, U8 mcode2)
00604 {       
00605         //  Returns an appropriate UUID to use as sprite at collision betweeen objects  
00606         //  For now, just return a single image 
00607         return IMG_SHOT;
00608 }
00609 
00610 LLUUID LLMaterialTable::getGroundCollisionParticleUUID(U8 mcode)
00611 {       
00612         //  Returns an appropriate 
00613         //  For now, just return a single sound 
00614         return IMG_SMOKE_POOF;
00615 }
00616 
00617 
00618 F32 LLMaterialTable::getDensity(U8 mcode)
00619 {       
00620         mcode &= LL_MCODE_MASK;
00621         for (info_list_t::iterator iter = mMaterialInfoList.begin();
00622                  iter != mMaterialInfoList.end(); ++iter)
00623         {
00624                 LLMaterialInfo *infop = *iter;
00625                 if (mcode == infop->mMCode)
00626                 {
00627                         return infop->mDensity;
00628                 }
00629         }
00630 
00631         return 0.f;
00632 }
00633 
00634 F32 LLMaterialTable::getRestitution(U8 mcode)
00635 {       
00636         mcode &= LL_MCODE_MASK;
00637         for (info_list_t::iterator iter = mMaterialInfoList.begin();
00638                  iter != mMaterialInfoList.end(); ++iter)
00639         {
00640                 LLMaterialInfo *infop = *iter;
00641                 if (mcode == infop->mMCode)
00642                 {
00643                         return infop->mRestitution;
00644                 }
00645         }
00646 
00647         return LLMaterialTable::DEFAULT_RESTITUTION;
00648 }
00649 
00650 F32 LLMaterialTable::getFriction(U8 mcode)
00651 {       
00652         mcode &= LL_MCODE_MASK;
00653         for (info_list_t::iterator iter = mMaterialInfoList.begin();
00654                  iter != mMaterialInfoList.end(); ++iter)
00655         {
00656                 LLMaterialInfo *infop = *iter;
00657                 if (mcode == infop->mMCode)
00658                 {
00659                         return infop->mFriction;
00660                 }
00661         }
00662 
00663         return LLMaterialTable::DEFAULT_FRICTION;
00664 }
00665 
00666 F32 LLMaterialTable::getHPMod(U8 mcode)
00667 {       
00668         mcode &= LL_MCODE_MASK;
00669         for (info_list_t::iterator iter = mMaterialInfoList.begin();
00670                  iter != mMaterialInfoList.end(); ++iter)
00671         {
00672                 LLMaterialInfo *infop = *iter;
00673                 if (mcode == infop->mMCode)
00674                 {
00675                         return infop->mHPModifier;
00676                 }
00677         }
00678 
00679         return 1.f;
00680 }
00681 
00682 F32 LLMaterialTable::getDamageMod(U8 mcode)
00683 {       
00684         mcode &= LL_MCODE_MASK;
00685         for (info_list_t::iterator iter = mMaterialInfoList.begin();
00686                  iter != mMaterialInfoList.end(); ++iter)
00687         {
00688                 LLMaterialInfo *infop = *iter;
00689                 if (mcode == infop->mMCode)
00690                 {
00691                         return infop->mDamageModifier;
00692                 }
00693         }
00694 
00695         return 1.f;
00696 }
00697 
00698 F32 LLMaterialTable::getEPMod(U8 mcode)
00699 {       
00700         mcode &= LL_MCODE_MASK;
00701         for (info_list_t::iterator iter = mMaterialInfoList.begin();
00702                  iter != mMaterialInfoList.end(); ++iter)
00703         {
00704                 LLMaterialInfo *infop = *iter;
00705                 if (mcode == infop->mMCode)
00706                 {
00707                         return infop->mEPModifier;
00708                 }
00709         }
00710 
00711         return 1.f;
00712 }
00713 
00714 LLUUID LLMaterialTable::getShatterSoundUUID(U8 mcode)
00715 {       
00716         mcode &= LL_MCODE_MASK;
00717         for (info_list_t::iterator iter = mMaterialInfoList.begin();
00718                  iter != mMaterialInfoList.end(); ++iter)
00719         {
00720                 LLMaterialInfo *infop = *iter;
00721                 if (mcode == infop->mMCode)
00722                 {
00723                         return infop->mShatterSoundID;
00724                 }
00725         }
00726 
00727         return SND_NULL;
00728 }

Generated on Fri May 16 08:32:45 2008 for SecondLife by  doxygen 1.5.5