llwlparamset.cpp

Go to the documentation of this file.
00001 
00032 #include "llviewerprecompiledheaders.h"
00033 
00034 #include "llwlparamset.h"
00035 #include "llwlanimator.h"
00036 
00037 #include "llfloaterwindlight.h"
00038 #include "llwlparammanager.h"
00039 #include "lluictrlfactory.h"
00040 #include "llsliderctrl.h"
00041 
00042 #include <llgl.h>
00043 
00044 #include <sstream>
00045 
00046 LLWLParamSet::LLWLParamSet(void) :
00047         mName("Unnamed Preset"),
00048         mCloudScrollXOffset(0.f), mCloudScrollYOffset(0.f)      
00049 {
00050 /* REMOVE or init the LLSD
00051         const std::map<std::string, LLVector4>::value_type hardcodedPreset[] = {
00052                 std::make_pair("lightnorm",                             LLVector4(0.f, 0.707f, -0.707f, 0.f)),
00053                 std::make_pair("sunlight_color",                LLVector4(0.6f, 0.6f, 2.83f, 2.27f)),
00054                 std::make_pair("ambient",                               LLVector4(0.27f, 0.33f, 0.44f, 1.19f)),
00055                 std::make_pair("blue_horizon",                  LLVector4(0.3f, 0.4f, 0.9f, 1.f)),
00056                 std::make_pair("blue_density",                  LLVector4(0.3f, 0.4f, 0.8f, 1.f)),
00057                 std::make_pair("haze_horizon",                  LLVector4(0.6f, 0.6f, 0.6f, 1.f)),
00058                 std::make_pair("haze_density",                  LLVector4(0.3f, 0.3f, 0.3f, 1.f)),
00059                 std::make_pair("cloud_shadow",                  LLVector4(0.f, 0.f, 0.f, 0.f)),
00060                 std::make_pair("density_multiplier",    LLVector4(0.001f, 0.001f, 0.001f, 0.001f)),
00061                 std::make_pair("distance_multiplier",   LLVector4(1.f, 1.f, 1.f, 1.f)),
00062                 std::make_pair("max_y",                                 LLVector4(600.f, 600.f, 600.f, 0.f)),
00063                 std::make_pair("glow",                                  LLVector4(15.f, 0.001f, -0.03125f, 0.f)),
00064                 std::make_pair("cloud_color",                   LLVector4(0.0f, 0.0f, 0.0f, 0.0f)),
00065                 std::make_pair("cloud_pos_density1",    LLVector4(0.f, 0.f, 0.f, 1.f)),
00066                 std::make_pair("cloud_pos_density2",    LLVector4(0.f, 0.f, 0.f, 1.f)),
00067                 std::make_pair("cloud_scale",                   LLVector4(0.42f, 0.f, 0.f, 1.f)),
00068                 std::make_pair("gamma",                                 LLVector4(2.0f, 2.0f, 2.0f, 0.0f)),
00069         };
00070         std::map<std::string, LLVector4>::value_type const * endHardcodedPreset = 
00071                 hardcodedPreset + sizeof(hardcodedPreset)/sizeof(hardcodedPreset[0]);
00072 
00073         mParamValues.insert(hardcodedPreset, endHardcodedPreset);
00074 */
00075 }
00076 
00077 void LLWLParamSet::update(LLGLSLShader * shader) const 
00078 {       
00079         for(LLSD::map_const_iterator i = mParamValues.beginMap();
00080                 i != mParamValues.endMap();
00081                 ++i)
00082         {
00083                 const LLString& param = i->first;
00084                 
00085                 if(     param == "star_brightness" || param == "preset_num" || param == "sun_angle" ||
00086                         param == "east_angle" || param == "enable_cloud_scroll" ||
00087                         param == "cloud_scroll_rate" || param == "lightnorm" ) 
00088                 {
00089                         continue;
00090                 }
00091                 
00092                 if(param == "cloud_pos_density1") 
00093                 {
00094                         LLVector4 val;
00095                         val.mV[0] = F32(i->second[0].asReal()) + mCloudScrollXOffset;
00096                         val.mV[1] = F32(i->second[1].asReal()) + mCloudScrollYOffset;
00097                         val.mV[2] = (F32) i->second[2].asReal();
00098                         val.mV[3] = (F32) i->second[3].asReal();
00099                         
00100                         shader->uniform4fv(param, 1, val.mV);   
00101                 } 
00102                 else 
00103                 {
00104                         LLVector4 val;
00105                         
00106                         // handle all the different cases
00107                         if(i->second.isArray() && i->second.size() == 4) 
00108                         {
00109                                 val.mV[0] = (F32) i->second[0].asReal();
00110                                 val.mV[1] = (F32) i->second[1].asReal();
00111                                 val.mV[2] = (F32) i->second[2].asReal();
00112                                 val.mV[3] = (F32) i->second[3].asReal();                                                                                                                        
00113                         } 
00114                         else if(i->second.isReal()) 
00115                         {
00116                                 val.mV[0] = (F32) i->second.asReal();
00117                         } 
00118                         else if(i->second.isInteger()) 
00119                         {
00120                                 val.mV[0] = (F32) i->second.asReal();
00121                         } 
00122                         else if(i->second.isBoolean())
00123                         {
00124                                 val.mV[0] = i->second.asBoolean();
00125                         }
00126                         
00127                         
00128                         shader->uniform4fv(param, 1, val.mV);
00129                 }
00130         }
00131 }
00132 
00133 void LLWLParamSet::set(const char * paramName, float x) 
00134 {       
00135         // handle case where no array
00136         if(mParamValues[paramName].isReal()) 
00137         {
00138                 mParamValues[paramName] = x;
00139         } 
00140         
00141         // handle array
00142         else if(mParamValues[paramName].isArray() &&
00143                         mParamValues[paramName][0].isReal())
00144         {
00145                 mParamValues[paramName][0] = x;
00146         }
00147 }
00148 
00149 void LLWLParamSet::set(const char * paramName, float x, float y) {
00150         mParamValues[paramName][0] = x;
00151         mParamValues[paramName][1] = y;
00152 }
00153 
00154 void LLWLParamSet::set(const char * paramName, float x, float y, float z) 
00155 {
00156         mParamValues[paramName][0] = x;
00157         mParamValues[paramName][1] = y;
00158         mParamValues[paramName][2] = z;
00159 }
00160 
00161 void LLWLParamSet::set(const char * paramName, float x, float y, float z, float w) 
00162 {
00163         mParamValues[paramName][0] = x;
00164         mParamValues[paramName][1] = y;
00165         mParamValues[paramName][2] = z;
00166         mParamValues[paramName][3] = w;
00167 }
00168 
00169 void LLWLParamSet::set(const char * paramName, const float * val) 
00170 {
00171         mParamValues[paramName][0] = val[0];
00172         mParamValues[paramName][1] = val[1];
00173         mParamValues[paramName][2] = val[2];
00174         mParamValues[paramName][3] = val[3];
00175 }
00176 
00177 void LLWLParamSet::set(const char * paramName, const LLVector4 & val) 
00178 {
00179         mParamValues[paramName][0] = val.mV[0];
00180         mParamValues[paramName][1] = val.mV[1];
00181         mParamValues[paramName][2] = val.mV[2];
00182         mParamValues[paramName][3] = val.mV[3];
00183 }
00184 
00185 void LLWLParamSet::set(const char * paramName, const LLColor4 & val) 
00186 {
00187         mParamValues[paramName][0] = val.mV[0];
00188         mParamValues[paramName][1] = val.mV[1];
00189         mParamValues[paramName][2] = val.mV[2];
00190         mParamValues[paramName][3] = val.mV[3];
00191 }
00192 
00193 LLVector4 LLWLParamSet::getVector(const char * paramName, bool& error) 
00194 {
00195         
00196         // test to see if right type
00197         LLSD cur_val = mParamValues.get(paramName);
00198         if (!cur_val.isArray()) 
00199         {
00200                 error = true;
00201                 return LLVector4(0,0,0,0);
00202         }
00203         
00204         LLVector4 val;
00205         val.mV[0] = (F32) cur_val[0].asReal();
00206         val.mV[1] = (F32) cur_val[1].asReal();
00207         val.mV[2] = (F32) cur_val[2].asReal();
00208         val.mV[3] = (F32) cur_val[3].asReal();
00209         
00210         error = false;
00211         return val;
00212 }
00213 
00214 F32 LLWLParamSet::getFloat(const char * paramName, bool& error) 
00215 {
00216         
00217         // test to see if right type
00218         LLSD cur_val = mParamValues.get(paramName);
00219         if (cur_val.isArray() && cur_val.size() != 0) 
00220         {
00221                 error = false;
00222                 return (F32) cur_val[0].asReal();       
00223         }
00224         
00225         if(cur_val.isReal())
00226         {
00227                 error = false;
00228                 return (F32) cur_val.asReal();
00229         }
00230         
00231         error = true;
00232         return 0;
00233 }
00234 
00235 
00236 
00237 void LLWLParamSet::setSunAngle(float val) 
00238 {
00239         // keep range 0 - 2pi
00240         if(val > F_TWO_PI || val < 0)
00241         {
00242                 F32 num = val / F_TWO_PI;
00243                 num -= floor(num);
00244                 val = F_TWO_PI * num;
00245         }
00246 
00247         mParamValues["sun_angle"] = val;
00248 }
00249 
00250 
00251 void LLWLParamSet::setEastAngle(float val) 
00252 {
00253         // keep range 0 - 2pi
00254         if(val > F_TWO_PI || val < 0)
00255         {
00256                 F32 num = val / F_TWO_PI;
00257                 num -= floor(num);
00258                 val = F_TWO_PI * num;
00259         }
00260 
00261         mParamValues["east_angle"] = val;
00262 }
00263 
00264 
00265 void LLWLParamSet::mix(LLWLParamSet& src, LLWLParamSet& dest, F32 weight)
00266 {
00267         // set up the iterators
00268         LLSD::map_iterator cIt = mParamValues.beginMap();
00269 
00270         // keep cloud positions and coverage the same
00272         F32 cloudPos1X = (F32) mParamValues["cloud_pos_density1"][0].asReal();
00273         F32 cloudPos1Y = (F32) mParamValues["cloud_pos_density1"][1].asReal();
00274         F32 cloudPos2X = (F32) mParamValues["cloud_pos_density2"][0].asReal();
00275         F32 cloudPos2Y = (F32) mParamValues["cloud_pos_density2"][1].asReal();
00276         F32 cloudCover = (F32) mParamValues["cloud_shadow"][0].asReal();
00277 
00278         LLSD srcVal;
00279         LLSD destVal;
00280 
00281         // do the interpolation for all the ones saved as vectors
00282         // skip the weird ones
00283         for(; cIt != mParamValues.endMap(); cIt++) {
00284 
00285                 // check params to make sure they're actually there
00286                 if(src.mParamValues.has(cIt->first))
00287                 {
00288                         srcVal = src.mParamValues[cIt->first];
00289                 }
00290                 else
00291                 {
00292                         continue;
00293                 }
00294                 
00295                 if(dest.mParamValues.has(cIt->first))
00296                 {
00297                         destVal = dest.mParamValues[cIt->first];
00298                 }
00299                 else
00300                 {
00301                         continue;
00302                 }               
00303                                 
00304                 // skip if not a vector
00305                 if(!cIt->second.isArray()) 
00306                 {
00307                         continue;
00308                 }
00309 
00310                 // only Real vectors allowed
00311                 if(!cIt->second[0].isReal()) 
00312                 {
00313                         continue;
00314                 }
00315                 
00316                 // make sure all the same size
00317                 if(     cIt->second.size() != srcVal.size() ||
00318                         cIt->second.size() != destVal.size())
00319                 {
00320                         continue;
00321                 }
00322                 
00323                 // more error checking might be necessary;
00324                 
00325                 for(int i=0; i < cIt->second.size(); ++i) 
00326                 {
00327                         cIt->second[i] = (1.0f - weight) * (F32) srcVal[i].asReal() + 
00328                                 weight * (F32) destVal[i].asReal();
00329                 }
00330         }
00331 
00332         // now mix the extra parameters
00333         setStarBrightness((1 - weight) * (F32) src.getStarBrightness()
00334                 + weight * (F32) dest.getStarBrightness());
00335 
00336         llassert(src.getSunAngle() >= - F_PI && 
00337                                         src.getSunAngle() <= 3 * F_PI);
00338         llassert(dest.getSunAngle() >= - F_PI && 
00339                                         dest.getSunAngle() <= 3 * F_PI);
00340         llassert(src.getEastAngle() >= 0 && 
00341                                         src.getEastAngle() <= 4 * F_PI);
00342         llassert(dest.getEastAngle() >= 0 && 
00343                                         dest.getEastAngle() <= 4 * F_PI);
00344 
00345         // sun angle and east angle require some handling to make sure
00346         // they go in circles.  Yes quaternions would work better.
00347         F32 srcSunAngle = src.getSunAngle();
00348         F32 destSunAngle = dest.getSunAngle();
00349         F32 srcEastAngle = src.getEastAngle();
00350         F32 destEastAngle = dest.getEastAngle();
00351         
00352         if(fabsf(srcSunAngle - destSunAngle) > F_PI) 
00353         {
00354                 if(srcSunAngle > destSunAngle) 
00355                 {
00356                         destSunAngle += 2 * F_PI;
00357                 } 
00358                 else 
00359                 {
00360                         srcSunAngle += 2 * F_PI;
00361                 }
00362         }
00363 
00364         if(fabsf(srcEastAngle - destEastAngle) > F_PI) 
00365         {
00366                 if(srcEastAngle > destEastAngle) 
00367                 {
00368                         destEastAngle += 2 * F_PI;
00369                 } 
00370                 else 
00371                 {
00372                         srcEastAngle += 2 * F_PI;
00373                 }
00374         }
00375 
00376         setSunAngle((1 - weight) * srcSunAngle + weight * destSunAngle);
00377         setEastAngle((1 - weight) * srcEastAngle + weight * destEastAngle);
00378         
00379         // now setup the sun properly
00380 
00381         // reset those cloud positions
00382         mParamValues["cloud_pos_density1"][0] = cloudPos1X;
00383         mParamValues["cloud_pos_density1"][1] = cloudPos1Y;
00384         mParamValues["cloud_pos_density2"][0] = cloudPos2X;
00385         mParamValues["cloud_pos_density2"][1] = cloudPos2Y;
00386         mParamValues["cloud_shadow"][0] = cloudCover;
00387 }
00388 
00389 void LLWLParamSet::updateCloudScrolling(void) 
00390 {
00391         static LLTimer s_cloud_timer;
00392 
00393         F64 delta_t = s_cloud_timer.getElapsedTimeAndResetF64();
00394 
00395         if(getEnableCloudScrollX())
00396         {
00397                 mCloudScrollXOffset += F32(delta_t * (getCloudScrollX() - 10.f) / 100.f);
00398         }
00399         if(getEnableCloudScrollY())
00400         {
00401                 mCloudScrollYOffset += F32(delta_t * (getCloudScrollY() - 10.f) / 100.f);
00402         }
00403 }

Generated on Fri May 16 08:34:26 2008 for SecondLife by  doxygen 1.5.5