diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index aced9c35d..9490b9d1e 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -12692,5 +12692,16 @@
Value
0
+ UseLLWind
+
diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml
index 0ed5663ec..05d55dce9 100644
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -394,6 +394,17 @@
max_attachment_offset="2.0"
visible_in_first_person="true" />
+
+
= 1.0)
- {
- LLVector3 pos_region_scaled(pos_region * temp_dim);
- r_val += getVelocity(pos_region_scaled) * (1.0f/temp_dim);
- temp_dim /= 2.0;
+ F32 temp_dim = dim;
+ while (temp_dim >= 1.0)
+ {
+ LLVector3 pos_region_scaled(pos_region * temp_dim);
+ r_val += getVelocity(pos_region_scaled) * (1.0f/temp_dim);
+ temp_dim /= 2.0;
+ }
+
+ return r_val * (1.0f/norm) * WIND_SCALE_HACK;
+ }
+ else
+ {
+ return LLVector3(0, 0, 0);
}
-
- return r_val * (1.0f/norm) * WIND_SCALE_HACK;
}
LLVector3 LLWind::getVelocity(const LLVector3 &pos_region)
{
- llassert(mSize == 16);
- // Resolves value of wind at a location relative to SW corner of region
- //
- // Returns wind magnitude in X,Y components of vector3
- LLVector3 r_val;
- F32 dx,dy;
- S32 k;
+ if(gUseLLWind)
+ {
+ llassert(mSize == 16);
+ // Resolves value of wind at a location relative to SW corner of region
+ //
+ // Returns wind magnitude in X,Y components of vector3
+ LLVector3 r_val;
+ F32 dx,dy;
+ S32 k;
- LLVector3 pos_clamped_region(pos_region);
-
- F32 region_width_meters = LLWorld::getInstance()->getRegionWidthInMeters();
+ LLVector3 pos_clamped_region(pos_region);
+
+ F32 region_width_meters = LLWorld::getInstance()->getRegionWidthInMeters();
- if (pos_clamped_region.mV[VX] < 0.f)
- {
- pos_clamped_region.mV[VX] = 0.f;
- }
- else if (pos_clamped_region.mV[VX] >= region_width_meters)
- {
- pos_clamped_region.mV[VX] = (F32) fmod(pos_clamped_region.mV[VX], region_width_meters);
- }
+ if (pos_clamped_region.mV[VX] < 0.f)
+ {
+ pos_clamped_region.mV[VX] = 0.f;
+ }
+ else if (pos_clamped_region.mV[VX] >= region_width_meters)
+ {
+ pos_clamped_region.mV[VX] = (F32) fmod(pos_clamped_region.mV[VX], region_width_meters);
+ }
- if (pos_clamped_region.mV[VY] < 0.f)
- {
- pos_clamped_region.mV[VY] = 0.f;
- }
- else if (pos_clamped_region.mV[VY] >= region_width_meters)
- {
- pos_clamped_region.mV[VY] = (F32) fmod(pos_clamped_region.mV[VY], region_width_meters);
- }
-
-
- S32 i = llfloor(pos_clamped_region.mV[VX] * mSize / region_width_meters);
- S32 j = llfloor(pos_clamped_region.mV[VY] * mSize / region_width_meters);
- k = i + j*mSize;
- dx = ((pos_clamped_region.mV[VX] * mSize / region_width_meters) - (F32) i);
- dy = ((pos_clamped_region.mV[VY] * mSize / region_width_meters) - (F32) j);
+ if (pos_clamped_region.mV[VY] < 0.f)
+ {
+ pos_clamped_region.mV[VY] = 0.f;
+ }
+ else if (pos_clamped_region.mV[VY] >= region_width_meters)
+ {
+ pos_clamped_region.mV[VY] = (F32) fmod(pos_clamped_region.mV[VY], region_width_meters);
+ }
+
+
+ S32 i = llfloor(pos_clamped_region.mV[VX] * mSize / region_width_meters);
+ S32 j = llfloor(pos_clamped_region.mV[VY] * mSize / region_width_meters);
+ k = i + j*mSize;
+ dx = ((pos_clamped_region.mV[VX] * mSize / region_width_meters) - (F32) i);
+ dy = ((pos_clamped_region.mV[VY] * mSize / region_width_meters) - (F32) j);
- if ((i < mSize-1) && (j < mSize-1))
- {
- // Interior points, no edges
- r_val.mV[VX] = mVelX[k]*(1.0f - dx)*(1.0f - dy) +
- mVelX[k + 1]*dx*(1.0f - dy) +
- mVelX[k + mSize]*dy*(1.0f - dx) +
- mVelX[k + mSize + 1]*dx*dy;
- r_val.mV[VY] = mVelY[k]*(1.0f - dx)*(1.0f - dy) +
- mVelY[k + 1]*dx*(1.0f - dy) +
- mVelY[k + mSize]*dy*(1.0f - dx) +
- mVelY[k + mSize + 1]*dx*dy;
- }
- else
- {
- r_val.mV[VX] = mVelX[k];
- r_val.mV[VY] = mVelY[k];
- }
+ if ((i < mSize-1) && (j < mSize-1))
+ {
+ // Interior points, no edges
+ r_val.mV[VX] = mVelX[k]*(1.0f - dx)*(1.0f - dy) +
+ mVelX[k + 1]*dx*(1.0f - dy) +
+ mVelX[k + mSize]*dy*(1.0f - dx) +
+ mVelX[k + mSize + 1]*dx*dy;
+ r_val.mV[VY] = mVelY[k]*(1.0f - dx)*(1.0f - dy) +
+ mVelY[k + 1]*dx*(1.0f - dy) +
+ mVelY[k + mSize]*dy*(1.0f - dx) +
+ mVelY[k + mSize + 1]*dx*dy;
+ }
+ else
+ {
+ r_val.mV[VX] = mVelX[k];
+ r_val.mV[VY] = mVelY[k];
+ }
- r_val.mV[VZ] = 0.f;
- return r_val * WIND_SCALE_HACK;
+ r_val.mV[VZ] = 0.f;
+ return r_val * WIND_SCALE_HACK;
+ }
+ else
+ {
+ return LLVector3(0, 0, 0);
+ }
}
LLVector3 LLWind::getCloudVelocity(const LLVector3 &pos_region)
{
- llassert(mSize == 16);
- // Resolves value of wind at a location relative to SW corner of region
- //
- // Returns wind magnitude in X,Y components of vector3
- LLVector3 r_val;
- F32 dx,dy;
- S32 k;
+ if(gUseLLWind)
+ {
+ llassert(mSize == 16);
+ // Resolves value of wind at a location relative to SW corner of region
+ //
+ // Returns wind magnitude in X,Y components of vector3
+ LLVector3 r_val;
+ F32 dx,dy;
+ S32 k;
- LLVector3 pos_clamped_region(pos_region);
-
- F32 region_width_meters = LLWorld::getInstance()->getRegionWidthInMeters();
+ LLVector3 pos_clamped_region(pos_region);
+
+ F32 region_width_meters = LLWorld::getInstance()->getRegionWidthInMeters();
- if (pos_clamped_region.mV[VX] < 0.f)
- {
- pos_clamped_region.mV[VX] = 0.f;
- }
- else if (pos_clamped_region.mV[VX] >= region_width_meters)
- {
- pos_clamped_region.mV[VX] = (F32) fmod(pos_clamped_region.mV[VX], region_width_meters);
- }
+ if (pos_clamped_region.mV[VX] < 0.f)
+ {
+ pos_clamped_region.mV[VX] = 0.f;
+ }
+ else if (pos_clamped_region.mV[VX] >= region_width_meters)
+ {
+ pos_clamped_region.mV[VX] = (F32) fmod(pos_clamped_region.mV[VX], region_width_meters);
+ }
- if (pos_clamped_region.mV[VY] < 0.f)
- {
- pos_clamped_region.mV[VY] = 0.f;
- }
- else if (pos_clamped_region.mV[VY] >= region_width_meters)
- {
- pos_clamped_region.mV[VY] = (F32) fmod(pos_clamped_region.mV[VY], region_width_meters);
- }
-
-
- S32 i = llfloor(pos_clamped_region.mV[VX] * mSize / region_width_meters);
- S32 j = llfloor(pos_clamped_region.mV[VY] * mSize / region_width_meters);
- k = i + j*mSize;
- dx = ((pos_clamped_region.mV[VX] * mSize / region_width_meters) - (F32) i);
- dy = ((pos_clamped_region.mV[VY] * mSize / region_width_meters) - (F32) j);
+ if (pos_clamped_region.mV[VY] < 0.f)
+ {
+ pos_clamped_region.mV[VY] = 0.f;
+ }
+ else if (pos_clamped_region.mV[VY] >= region_width_meters)
+ {
+ pos_clamped_region.mV[VY] = (F32) fmod(pos_clamped_region.mV[VY], region_width_meters);
+ }
+
+
+ S32 i = llfloor(pos_clamped_region.mV[VX] * mSize / region_width_meters);
+ S32 j = llfloor(pos_clamped_region.mV[VY] * mSize / region_width_meters);
+ k = i + j*mSize;
+ dx = ((pos_clamped_region.mV[VX] * mSize / region_width_meters) - (F32) i);
+ dy = ((pos_clamped_region.mV[VY] * mSize / region_width_meters) - (F32) j);
- if ((i < mSize-1) && (j < mSize-1))
- {
- // Interior points, no edges
- r_val.mV[VX] = mCloudVelX[k]*(1.0f - dx)*(1.0f - dy) +
- mCloudVelX[k + 1]*dx*(1.0f - dy) +
- mCloudVelX[k + mSize]*dy*(1.0f - dx) +
- mCloudVelX[k + mSize + 1]*dx*dy;
- r_val.mV[VY] = mCloudVelY[k]*(1.0f - dx)*(1.0f - dy) +
- mCloudVelY[k + 1]*dx*(1.0f - dy) +
- mCloudVelY[k + mSize]*dy*(1.0f - dx) +
- mCloudVelY[k + mSize + 1]*dx*dy;
- }
- else
- {
- r_val.mV[VX] = mCloudVelX[k];
- r_val.mV[VY] = mCloudVelY[k];
- }
+ if ((i < mSize-1) && (j < mSize-1))
+ {
+ // Interior points, no edges
+ r_val.mV[VX] = mCloudVelX[k]*(1.0f - dx)*(1.0f - dy) +
+ mCloudVelX[k + 1]*dx*(1.0f - dy) +
+ mCloudVelX[k + mSize]*dy*(1.0f - dx) +
+ mCloudVelX[k + mSize + 1]*dx*dy;
+ r_val.mV[VY] = mCloudVelY[k]*(1.0f - dx)*(1.0f - dy) +
+ mCloudVelY[k + 1]*dx*(1.0f - dy) +
+ mCloudVelY[k + mSize]*dy*(1.0f - dx) +
+ mCloudVelY[k + mSize + 1]*dx*dy;
+ }
+ else
+ {
+ r_val.mV[VX] = mCloudVelX[k];
+ r_val.mV[VY] = mCloudVelY[k];
+ }
- r_val.mV[VZ] = 0.f;
- return r_val * WIND_SCALE_HACK;
+ r_val.mV[VZ] = 0.f;
+ return r_val * WIND_SCALE_HACK;
+ }
+ else
+ {
+ return LLVector3(0, 0, 0);
+ }
}
diff --git a/indra/newview/llwind.h b/indra/newview/llwind.h
index 7a4582d9d..83b04f0b2 100644
--- a/indra/newview/llwind.h
+++ b/indra/newview/llwind.h
@@ -42,6 +42,7 @@ class LLVector3;
class LLBitPack;
class LLGroupHeader;
+extern BOOL gUseLLWind;
class LLWind
{
@@ -58,6 +59,7 @@ public:
void setCloudDensityPointer(F32 *densityp);
void setOriginGlobal(const LLVector3d &origin_global);
+
private:
S32 mSize;
F32 * mVelX;
diff --git a/indra/newview/skins/default/textures/icn_toolbar_radar.tga b/indra/newview/skins/default/textures/icn_toolbar_radar.tga
new file mode 100644
index 000000000..e1a814b1e
Binary files /dev/null and b/indra/newview/skins/default/textures/icn_toolbar_radar.tga differ
diff --git a/indra/newview/skins/default/xui/en-us/panel_toolbar.xml b/indra/newview/skins/default/xui/en-us/panel_toolbar.xml
index df00ca0b6..726f30369 100644
--- a/indra/newview/skins/default/xui/en-us/panel_toolbar.xml
+++ b/indra/newview/skins/default/xui/en-us/panel_toolbar.xml
@@ -26,12 +26,13 @@
label_selected="Radar" left="0" name="radar_list_btn"
tool_tip="View a list of nearby avatars."
width="50" follows="left|right" user_resize="false"/>
-