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
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
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
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
00136 if(mParamValues[paramName].isReal())
00137 {
00138 mParamValues[paramName] = x;
00139 }
00140
00141
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
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
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
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
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
00268 LLSD::map_iterator cIt = mParamValues.beginMap();
00269
00270
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
00282
00283 for(; cIt != mParamValues.endMap(); cIt++) {
00284
00285
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
00305 if(!cIt->second.isArray())
00306 {
00307 continue;
00308 }
00309
00310
00311 if(!cIt->second[0].isReal())
00312 {
00313 continue;
00314 }
00315
00316
00317 if( cIt->second.size() != srcVal.size() ||
00318 cIt->second.size() != destVal.size())
00319 {
00320 continue;
00321 }
00322
00323
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
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
00346
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
00380
00381
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 }