summaryrefslogtreecommitdiff
path: root/indra/newview/llvosky.h
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llvosky.h')
-rw-r--r--indra/newview/llvosky.h407
1 files changed, 72 insertions, 335 deletions
diff --git a/indra/newview/llvosky.h b/indra/newview/llvosky.h
index f3bceb0653..260aeeada7 100644
--- a/indra/newview/llvosky.h
+++ b/indra/newview/llvosky.h
@@ -48,6 +48,7 @@
//
const F32 HORIZON_DIST = 1024.0f;
+const F32 SKY_BOX_MULT = 16.0f;
const F32 HEAVENLY_BODY_DIST = HORIZON_DIST - 10.f;
const F32 HEAVENLY_BODY_FACTOR = 0.1f;
const F32 HEAVENLY_BODY_SCALE = HEAVENLY_BODY_DIST * HEAVENLY_BODY_FACTOR;
@@ -85,7 +86,6 @@ LL_FORCE_INLINE LLColor3 color_div(const LLColor3 &col1, const LLColor3 &col2)
}
LLColor3 color_norm(const LLColor3 &col);
-LLVector3 move_vec (const LLVector3& v, F32 cos_max_angle);
BOOL clip_quad_to_horizon(F32& t_left, F32& t_right, LLVector3 v_clipped[4],
const LLVector3 v_corner[4], const F32 cos_max_angle);
F32 clip_side_to_horizon(const LLVector3& v0, const LLVector3& v1, const F32 cos_max_angle);
@@ -111,18 +111,6 @@ inline F32 color_min(const LLColor3 &col)
return llmin(col.mV[0], col.mV[1], col.mV[2]);
}
-inline LLColor3 color_norm_abs(const LLColor3 &col)
-{
- const F32 m = color_max(col);
- if (m > 1e-6)
- {
- return 1.f/m * col;
- }
- else return col;
-}
-
-
-
class LLFace;
class LLHaze;
@@ -135,7 +123,7 @@ private:
static S32 sComponents;
LLPointer<LLImageGL> mImageGL[2];
LLPointer<LLImageRaw> mImageRaw[2];
- LLColor3 *mSkyData;
+ LLColor4 *mSkyData;
LLVector3 *mSkyDirs; // Cache of sky direction vectors
static S32 sCurrent;
static F32 sInterpVal;
@@ -163,7 +151,8 @@ protected:
static S32 getWhich(const BOOL curr) { return curr ? sCurrent : getNext(); }
void initEmpty(const S32 tex);
- void create(F32 brightness_scale, const LLColor3& multiscatt);
+
+ void create(F32 brightness);
void setDir(const LLVector3 &dir, const S32 i, const S32 j)
{
@@ -177,7 +166,7 @@ protected:
return mSkyDirs[offset];
}
- void setPixel(const LLColor3 &col, const S32 i, const S32 j)
+ void setPixel(const LLColor4 &col, const S32 i, const S32 j)
{
S32 offset = i * sResolution + j;
mSkyData[offset] = col;
@@ -203,7 +192,7 @@ protected:
void createGLImage(BOOL curr=TRUE);
};
-
+/// TODO Move into the stars draw pool (and rename them appropriately).
class LLHeavenBody
{
protected:
@@ -261,27 +250,6 @@ public:
return sInterpVal * mColor + (1 - sInterpVal) * mColorCached;
}
-// LLColor3 getDiffuseColor() const
-// {
-// LLColor3 dif = mColorCached;
-// dif.clamp();
-// return 2 * dif;
-// }
-
-// LLColor4 getAmbientColor(const LLColor3& scatt, F32 scale) const
-// {
-// const F32 min_val = 0.05f;
-// LLColor4 col = LLColor4(scale * (0.8f * color_norm_abs(getDiffuseColor()) + 0.2f * scatt));
-// //F32 left = max(0, 1 - col.mV[0]);
-// if (col.mV[0] >= 0.9)
-// {
-// col.mV[1] = llmax(col.mV[1], 2.f * min_val);
-// col.mV[2] = llmax(col.mV[2], min_val);
-// }
-// col.setAlpha(1.f);
-// return col;
-// }
-
const F32& getHorizonVisibility() const { return mHorizonVisibility; }
void setHorizonVisibility(const F32 c = 1) { mHorizonVisibility = c; }
const F32& getVisibility() const { return mVisibility; }
@@ -440,82 +408,55 @@ protected:
F32 mAbsCoef;
};
-class LLTranspMap
-{
-public:
- LLTranspMap() : mElevation(0), mMaxAngle(0), mStep(5), mHaze(NULL), mT(NULL) {}
- ~LLTranspMap()
- {
- delete[] mT;
- mT = NULL;
- }
-
- void init(const F32 elev, const F32 step, const F32 h, const LLHaze* const haze);
-
- F32 calcHeight(const LLVector3& pos) const
- {
- return pos.magVec() - EARTH_RADIUS ;
- }
-
- BOOL hasHaze() const
- {
- return mHaze != NULL;
- }
- LLColor3 calcSigExt(const F32 h) const
- {
- return LLHaze::calcAirSca(h) + (hasHaze() ? mHaze->calcSigExt(h) : LLColor3(0, 0, 0));
- }
+class LLCubeMap;
- inline void calcAirTransp(const F32 cos_angle, LLColor3 &result) const;
- LLColor3 calcAirTranspDir(const F32 elevation, const LLVector3 &dir) const;
- LLColor3 getHorizonAirTransp () const { return mT[mMapSize-1]; }
- F32 hitsAtmEdge(const LLVector3& orig, const LLVector3& dir) const;
+// turn on floating point precision
+// in vs2003 for this class. Otherwise
+// black dots go everywhere from 7:10 - 8:50
+#if LL_MSVC && __MSVC_VER__ < 8
+#pragma optimize("p", on)
+#endif
-protected:
- F32 mAtmHeight;
- F32 mElevation;
- F32 mMaxAngle;
- F32 mCosMaxAngle;
- F32 mStep;
- F32 mStepInv;
- S32 mMapSize;
- const LLHaze *mHaze;
- LLColor3 *mT; // transparency values in all directions
- //starting with mAngleBelowHorz at mElevation
-};
-class LLTranspMapSet
+class LLVOSky : public LLStaticViewerObject
{
-protected:
- F32 *mHeights;
- LLTranspMap *mTransp;
- S32 mSize;
- F32 mMediaHeight;
- const LLHaze *mHaze;
- S32 lerp(F32& dt, S32& indx, const F32 h) const;
public:
- LLTranspMapSet() : mHeights(NULL), mTransp(NULL), mHaze(NULL) {}
- ~LLTranspMapSet();
-
- void init (S32 size, F32 first_step, F32 media_height, const LLHaze* const haze);
- S32 getSize() const { return mSize; }
- F32 getMediaHeight() const { return mMediaHeight; }
- const LLTranspMap& getLastTransp() const { return mTransp[mSize-1]; }
- F32 getLastHeight() const { return mHeights[mSize-1]; }
- const LLTranspMap& getMap(const S32 n) const { return mTransp[n]; }
- F32 getHeight(const S32 n) const { return mHeights[n]; }
- BOOL isReady() const { return mTransp != NULL; }
-
- inline LLColor3 calcTransp(const F32 cos_angle, const F32 h) const;
- inline void calcTransp(const F32 cos_angle, const F32 h, LLColor3 &result) const;
-};
+ /// WL PARAMS
+ F32 dome_radius;
+ F32 dome_offset_ratio;
+ LLColor3 sunlight_color;
+ LLColor3 ambient;
+ F32 gamma;
+ LLVector4 lightnorm;
+ LLVector4 unclamped_lightnorm;
+ LLColor3 blue_density;
+ LLColor3 blue_horizon;
+ F32 haze_density;
+ LLColor3 haze_horizon;
+ F32 density_multiplier;
+ F32 max_y;
+ LLColor3 glow;
+ F32 cloud_shadow;
+ LLColor3 cloud_color;
+ F32 cloud_scale;
+ LLColor3 cloud_pos_density1;
+ LLColor3 cloud_pos_density2;
+
+public:
+ void initAtmospherics(void);
+ void calcAtmospherics(void);
+ LLColor3 createDiffuseFromWL(LLColor3 diffuse, LLColor3 ambient, LLColor3 sundiffuse, LLColor3 sunambient);
+ LLColor3 createAmbientFromWL(LLColor3 ambient, LLColor3 sundiffuse, LLColor3 sunambient);
-class LLCubeMap;
+ void calcSkyColorWLVert(LLVector3 & Pn, LLColor3 & vary_HazeColor, LLColor3 & vary_CloudColorSun,
+ LLColor3 & vary_CloudColorAmbient, F32 & vary_CloudDensity,
+ LLVector2 vary_HorizontalProjection[2]);
+ LLColor3 calcSkyColorWLFrag(LLVector3 & Pn, LLColor3 & vary_HazeColor, LLColor3 & vary_CloudColorSun,
+ LLColor3 & vary_CloudColorAmbient, F32 & vary_CloudDensity,
+ LLVector2 vary_HorizontalProjection[2]);
-class LLVOSky : public LLStaticViewerObject
-{
public:
enum
{
@@ -529,6 +470,7 @@ public:
FACE_MOON, // was 7
FACE_BLOOM, // was 8
FACE_REFLECTION, // was 10
+ FACE_DUMMY, //for an ATI bug --bao
FACE_COUNT
};
@@ -539,9 +481,7 @@ public:
void init();
void initCubeMap();
void initEmpty();
- BOOL isReady() const { return mTransp.isReady(); }
- const LLTranspMapSet& getTransp() const { return mTransp; }
-
+
void cleanupGL();
void restoreGL();
@@ -557,26 +497,12 @@ public:
void initSkyTextureDirs(const S32 side, const S32 tile);
void createSkyTexture(const S32 side, const S32 tile);
- void updateBrightestDir();
- void calcBrightnessScaleAndColors();
-
- LLColor3 calcSkyColorInDir(const LLVector3& dir);
- void calcSkyColorInDir(LLColor3& res, LLColor3& transp,
- const LLVector3& dir) const;
- LLColor4 calcInScatter(LLColor4& transp, const LLVector3 &point, F32 exag) const;
- void calcInScatter( LLColor3& res, LLColor3& transp,
- const LLVector3& P, F32 exag) const;
-
- // Not currently used.
- //LLColor3 calcGroundFog(LLColor3& transp, const LLVector3 &view_dir, F32 obj_dist) const;
- //void calcGroundFog(LLColor3& res, LLColor3& transp, const LLVector3 view_dir, F32 dist) const;
-
+ LLColor4 calcSkyColorInDir(const LLVector3& dir, bool isShiny = false);
+
LLColor3 calcRadianceAtPoint(const LLVector3& pos) const
{
- const F32 cos_angle = calcUpVec(pos) * getToSunLast();
- LLColor3 tr;
- mTransp.calcTransp(cos_angle, calcHeight(pos), tr);
- return mBrightnessScaleGuess * mSun.getIntensity() * tr;
+ F32 radiance = mBrightnessScaleGuess * mSun.getIntensity();
+ return LLColor3(radiance, radiance, radiance);
}
const LLHeavenBody& getSun() const { return mSun; }
@@ -597,58 +523,16 @@ public:
LLColor4 getFogColor() const { return mFogColor; }
LLColor4 getGLFogColor() const { return mGLFogCol; }
- LLVector3 calcUpVec(const LLVector3 &pos) const
- {
- LLVector3 v = pos - mEarthCenter;
- v.normVec();
- return v;
- }
-
- F32 calcHeight(const LLVector3& pos) const
- {
- return dist_vec(pos, mEarthCenter) - EARTH_RADIUS;
- }
-
- // Phase function for atmospheric scattering.
- // co = cos ( theta )
- F32 calcAirPhaseFunc(const F32 co) const
- {
- return (0.75f * (1.f + co*co));
- }
-
-
BOOL isSameFace(S32 idx, const LLFace* face) const { return mFace[idx] == face; }
- void initSunDirection(const LLVector3 &sun_dir, const LLVector3 &sun_ang_velocity)
- {
- LLVector3 sun_direction = (sun_dir.magVec() == 0) ? LLVector3::x_axis : sun_dir;
- sun_direction.normVec();
- mSun.setDirection(sun_direction);
- mSun.renewDirection();
- mSun.setAngularVelocity(sun_ang_velocity);
- mMoon.setDirection(-mSun.getDirection());
- mMoon.renewDirection();
- mLastLightingDirection = mSun.getDirection();
-
- if ( !isReady() )
- {
- init();
- LLSkyTex::stepCurrent();
- }
- }
+ void initSunDirection(const LLVector3 &sun_dir, const LLVector3 &sun_ang_velocity);
void setSunDirection(const LLVector3 &sun_dir, const LLVector3 &sun_ang_velocity);
- void updateHaze();
-
BOOL updateHeavenlyBodyGeometry(LLDrawable *drawable, const S32 side, const BOOL is_sun,
LLHeavenBody& hb, const F32 sin_max_angle,
const LLVector3 &up, const LLVector3 &right);
- LLVector3 toHorizon(const LLVector3& dir, F32 delta = 0) const
- {
- return move_vec(dir, cosHorizon(delta));
- }
F32 cosHorizon(const F32 delta = 0) const
{
const F32 sin_angle = EARTH_RADIUS/(EARTH_RADIUS + mCameraPosAgent.mV[2]);
@@ -681,18 +565,14 @@ public:
BOOL isReflFace(const LLFace* face) const { return face == mFace[FACE_REFLECTION]; }
LLFace* getReflFace() const { return mFace[FACE_REFLECTION]; }
- F32 calcHitsEarth(const LLVector3& orig, const LLVector3& dir) const;
- F32 calcHitsAtmEdge(const LLVector3& orig, const LLVector3& dir) const;
LLViewerImage* getSunTex() const { return mSunTexturep; }
LLViewerImage* getMoonTex() const { return mMoonTexturep; }
LLViewerImage* getBloomTex() const { return mBloomTexturep; }
-
- void generateScatterMap();
- LLImageGL* getScatterMap() { return mScatterMap; }
+ void forceSkyUpdate(void) { mForceUpdate = TRUE; }
public:
- static F32 sNighttimeBrightness; // [0,2] default = 1.0
- LLFace *mFace[FACE_COUNT];
+ LLFace *mFace[FACE_COUNT];
+ LLVector3 mBumpSunDir;
protected:
~LLVOSky();
@@ -705,6 +585,7 @@ protected:
static S32 sTileResX;
static S32 sTileResY;
LLSkyTex mSkyTex[6];
+ LLSkyTex mShinyTex[6];
LLHeavenBody mSun;
LLHeavenBody mMoon;
LLVector3 mSunDefaultPosition;
@@ -718,7 +599,6 @@ protected:
LLColor3 mBrightestPointNew;
F32 mBrightnessScaleGuess;
LLColor3 mBrightestPointGuess;
- LLTranspMapSet mTransp;
LLHaze mHaze;
F32 mHazeConcentration;
BOOL mWeatherChange;
@@ -751,10 +631,23 @@ protected:
LLFrameTimer mUpdateTimer;
- LLPointer<LLImageGL> mScatterMap;
- LLPointer<LLImageRaw> mScatterMapRaw;
+public:
+ //by bao
+ //fake vertex buffer updating
+ //to guaranttee at least updating one VBO buffer every frame
+ //to walk around the bug caused by ATI card --> DEV-3855
+ //
+ void createDummyVertexBuffer() ;
+ void updateDummyVertexBuffer() ;
+
+ BOOL mHeavenlyBodyUpdated ;
};
+// turn it off
+#if LL_MSVC && __MSVC_VER__ < 8
+#pragma optimize("p", off)
+#endif
+
// Utility functions
F32 azimuth(const LLVector3 &v);
F32 color_norm_pow(LLColor3& col, F32 e, BOOL postmultiply = FALSE);
@@ -776,161 +669,5 @@ inline void LLHaze::calcAirSca(const F32 h, LLColor3 &result)
result *= calcFalloff(h);
}
-// Given cos of the angle between direction of interest and zenith,
-// compute transparency by interpolation of known values.
-inline void LLTranspMap::calcAirTransp(const F32 cos_angle, LLColor3 &result) const
-{
- if (cos_angle > 1.f)
- {
- result = mT[0];
- return;
- }
- if (cos_angle < mCosMaxAngle - 0.1f)
- {
- result.setVec(0.f, 0.f, 0.f);
- return;
- }
- if (cos_angle < mCosMaxAngle)
- {
- result = mT[mMapSize-1];
- return;
- }
-
-
- const F32 relative = (1 - cos_angle)*mStepInv;
- const S32 index = llfloor(relative);
- const F32 dt = relative - index;
-
- if (index >= (mMapSize-1))
- {
- result = mT[0];
- return;
- }
-// result = mT[index];
-// LLColor3 res2(mT[index+1]);
-// result *= 1 - dt;
-// res2 *= dt;
-// result += res2;
-
- const LLColor3& color1 = mT[index];
- const LLColor3& color2 = mT[index + 1];
-
- const F32 x1 = color1.mV[VX];
- const F32 x2 = color2.mV[VX];
- result.mV[VX] = x1 - dt * (x1 - x2);
-
- const F32 y1 = color1.mV[VY];
- const F32 y2 = color2.mV[VY];
- result.mV[VY] = y1 - dt * (y1 - y2);
-
- const F32 z1 = color1.mV[VZ];
- const F32 z2 = color2.mV[VZ];
- result.mV[VZ] = z1 - dt * (z1 - z2);
-}
-
-
-
-// Returns the translucency of the atmosphere along the ray in the sky.
-// dir is assumed to be normalized
-inline void LLTranspMapSet::calcTransp(const F32 cos_angle, const F32 h, LLColor3 &result) const
-{
- S32 indx = 0;
- F32 dt = 0.f;
- const S32 status = lerp(dt, indx, h);
-
- if (status < 0)
- {
- mTransp[0].calcAirTransp(cos_angle, result);
- return;
- }
- if (status > 0)
- {
- mTransp[NO_STEPS].calcAirTransp(cos_angle, result);
- return;
- }
-
- mTransp[indx].calcAirTransp(cos_angle, result);
- result *= 1 - dt;
-
- LLColor3 transp_above;
-
- mTransp[indx + 1].calcAirTransp(cos_angle, transp_above);
- transp_above *= dt;
- result += transp_above;
-}
-
-
-inline LLColor3 LLTranspMapSet::calcTransp(const F32 cos_angle, const F32 h) const
-{
- LLColor3 result;
- S32 indx = 0;
- F32 dt = 0;
- const S32 status = lerp(dt, indx, h);
-
- if (status < 0)
- {
- mTransp[0].calcAirTransp(cos_angle, result);
- return result;
- }
- if (status > 0)
- {
- mTransp[NO_STEPS].calcAirTransp(cos_angle, result);
- return result;
- }
-
- mTransp[indx].calcAirTransp(cos_angle, result);
- result *= 1 - dt;
-
- LLColor3 transp_above;
-
- mTransp[indx + 1].calcAirTransp(cos_angle, transp_above);
- transp_above *= dt;
- result += transp_above;
- return result;
-}
-
-
-// Returns -1 if height < 0; +1 if height > max height; 0 if within range
-inline S32 LLTranspMapSet::lerp(F32& dt, S32& indx, const F32 h) const
-{
- static S32 last_indx = 0;
-
- if (h < 0)
- {
- return -1;
- }
- if (h > getLastHeight())
- {
- return 1;
- }
-
- if (h < mHeights[last_indx])
- {
- indx = last_indx-1;
- while (mHeights[indx] > h)
- {
- indx--;
- }
- last_indx = indx;
- }
- else if (h > mHeights[last_indx+1])
- {
- indx = last_indx+1;
- while (mHeights[indx+1] < h)
- {
- indx++;
- }
- last_indx = indx;
- }
- else
- {
- indx = last_indx;
- }
-
- const F32 h_below = mHeights[indx];
- const F32 h_above = mHeights[indx+1];
- dt = (h - h_below) / (h_above - h_below);
- return 0;
-}
#endif