llvosky.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:20k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llvosky.h
  3.  * @brief LLVOSky class header file
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #ifndef LL_LLVOSKY_H
  33. #define LL_LLVOSKY_H
  34. #include "stdtypes.h"
  35. #include "v3color.h"
  36. #include "v4coloru.h"
  37. #include "llviewertexture.h"
  38. #include "llviewerobject.h"
  39. #include "llframetimer.h"
  40. //////////////////////////////////
  41. //
  42. // Lots of constants
  43. //
  44. // Will clean these up at some point...
  45. //
  46. const F32 HORIZON_DIST = 1024.0f;
  47. const F32 SKY_BOX_MULT = 16.0f;
  48. const F32 HEAVENLY_BODY_DIST = HORIZON_DIST - 10.f;
  49. const F32 HEAVENLY_BODY_FACTOR = 0.1f;
  50. const F32 HEAVENLY_BODY_SCALE = HEAVENLY_BODY_DIST * HEAVENLY_BODY_FACTOR;
  51. const F32 EARTH_RADIUS = 6.4e6f;       // exact radius = 6.37 x 10^6 m
  52. const F32 ATM_EXP_FALLOFF = 0.000126f;
  53. const F32 ATM_SEA_LEVEL_NDENS = 2.55e25f;
  54. // Somewhat arbitrary:
  55. const F32 ATM_HEIGHT = 100000.f;
  56. const F32 FIRST_STEP = 5000.f;
  57. const F32 INV_FIRST_STEP = 1.f/FIRST_STEP;
  58. const S32 NO_STEPS = 15;
  59. const F32 INV_NO_STEPS = 1.f/NO_STEPS;
  60. // constants used in calculation of scattering coeff of clear air
  61. const F32 sigma = 0.035f;
  62. const F32 fsigma = (6.f + 3.f * sigma) / (6.f-7.f*sigma);
  63. const F64 Ndens = 2.55e25;
  64. const F64 Ndens2 = Ndens*Ndens;
  65. // HACK: Allow server to change sun and moon IDs.
  66. // I can't figure out how to pass the appropriate
  67. // information into the LLVOSky constructor.  JC
  68. extern LLUUID gSunTextureID;
  69. extern LLUUID gMoonTextureID;
  70. LL_FORCE_INLINE LLColor3 color_div(const LLColor3 &col1, const LLColor3 &col2)
  71. {
  72. return LLColor3( 
  73. col1.mV[0] / col2.mV[0],
  74. col1.mV[1] / col2.mV[1],
  75. col1.mV[2] / col2.mV[2] );
  76. }
  77. LLColor3 color_norm(const LLColor3 &col);
  78. BOOL clip_quad_to_horizon(F32& t_left, F32& t_right, LLVector3 v_clipped[4],
  79.   const LLVector3 v_corner[4], const F32 cos_max_angle);
  80. F32 clip_side_to_horizon(const LLVector3& v0, const LLVector3& v1, const F32 cos_max_angle);
  81. inline F32 color_intens ( const LLColor3 &col )
  82. {
  83. return col.mV[0] + col.mV[1] + col.mV[2];
  84. }
  85. inline F32 color_max(const LLColor3 &col)
  86. {
  87. return llmax(col.mV[0], col.mV[1], col.mV[2]);
  88. }
  89. inline F32 color_max(const LLColor4 &col)
  90. {
  91. return llmax(col.mV[0], col.mV[1], col.mV[2]);
  92. }
  93. inline F32 color_min(const LLColor3 &col)
  94. {
  95. return llmin(col.mV[0], col.mV[1], col.mV[2]);
  96. }
  97. class LLFace;
  98. class LLHaze;
  99. class LLSkyTex
  100. {
  101. friend class LLVOSky;
  102. private:
  103. static S32 sResolution;
  104. static S32 sComponents;
  105. LLPointer<LLViewerTexture> mTexture[2];
  106. LLPointer<LLImageRaw> mImageRaw[2];
  107. LLColor4 *mSkyData;
  108. LLVector3 *mSkyDirs; // Cache of sky direction vectors
  109. static S32 sCurrent;
  110. static F32 sInterpVal;
  111. public:
  112. static F32 getInterpVal() { return sInterpVal; }
  113. static void setInterpVal(const F32 v) { sInterpVal = v; }
  114. static BOOL doInterpolate() { return sInterpVal > 0.001f; }
  115. void bindTexture(BOOL curr = TRUE);
  116. protected:
  117. LLSkyTex();
  118. void init();
  119. void cleanupGL();
  120. void restoreGL();
  121. ~LLSkyTex();
  122. static S32 getResolution() { return sResolution; }
  123. static S32 getCurrent() { return sCurrent; }
  124. static S32 stepCurrent() { return (sCurrent = (sCurrent + 1) % 2); }
  125. static S32 getNext() { return ((sCurrent+1) % 2); }
  126. static S32 getWhich(const BOOL curr) { return curr ? sCurrent : getNext(); }
  127. void initEmpty(const S32 tex);
  128. void create(F32 brightness);
  129. void setDir(const LLVector3 &dir, const S32 i, const S32 j)
  130. {
  131. S32 offset = i * sResolution + j;
  132. mSkyDirs[offset] = dir;
  133. }
  134. const LLVector3 &getDir(const S32 i, const S32 j) const
  135. {
  136. S32 offset = i * sResolution + j;
  137. return mSkyDirs[offset];
  138. }
  139. void setPixel(const LLColor4 &col, const S32 i, const S32 j)
  140. {
  141. S32 offset = i * sResolution + j;
  142. mSkyData[offset] = col;
  143. }
  144. void setPixel(const LLColor4U &col, const S32 i, const S32 j)
  145. {
  146. S32 offset = (i * sResolution + j) * sComponents;
  147. U32* pix = (U32*) &(mImageRaw[sCurrent]->getData()[offset]);
  148. *pix = col.mAll;
  149. }
  150. LLColor4U getPixel(const S32 i, const S32 j)
  151. {
  152. LLColor4U col;
  153. S32 offset = (i * sResolution + j) * sComponents;
  154. U32* pix = (U32*) &(mImageRaw[sCurrent]->getData()[offset]);
  155. col.mAll = *pix;
  156. return col;
  157. }
  158. LLImageRaw* getImageRaw(BOOL curr=TRUE) { return mImageRaw[getWhich(curr)]; }
  159. void createGLImage(BOOL curr=TRUE);
  160. };
  161. /// TODO Move into the stars draw pool (and rename them appropriately).
  162. class LLHeavenBody
  163. {
  164. protected:
  165. LLVector3 mDirectionCached; // hack for events that shouldn't happen every frame
  166. LLColor3 mColor;
  167. LLColor3 mColorCached;
  168. F32 mIntensity;
  169. LLVector3 mDirection; // direction of the local heavenly body
  170. LLVector3 mAngularVelocity; // velocity of the local heavenly body
  171. F32 mDiskRadius;
  172. BOOL mDraw; // FALSE - do not draw.
  173. F32 mHorizonVisibility; // number [0, 1] due to how horizon
  174. F32 mVisibility; // same but due to other objects being in throng.
  175. BOOL mVisible;
  176. static F32 sInterpVal;
  177. LLVector3 mQuadCorner[4];
  178. LLVector3 mU;
  179. LLVector3 mV;
  180. LLVector3 mO;
  181. public:
  182. LLHeavenBody(const F32 rad) :
  183. mDirectionCached(LLVector3(0,0,0)),
  184. mDirection(LLVector3(0,0,0)),
  185. mIntensity(0.f),
  186. mDiskRadius(rad), mDraw(FALSE),
  187. mHorizonVisibility(1.f), mVisibility(1.f),
  188. mVisible(FALSE)
  189. {
  190. mColor.setToBlack();
  191. mColorCached.setToBlack();
  192. }
  193. ~LLHeavenBody() {}
  194. const LLVector3& getDirection() const { return mDirection; }
  195. void setDirection(const LLVector3 &direction) { mDirection = direction; }
  196. void setAngularVelocity(const LLVector3 &ang_vel) { mAngularVelocity = ang_vel; }
  197. const LLVector3& getAngularVelocity() const { return mAngularVelocity; }
  198. const LLVector3& getDirectionCached() const { return mDirectionCached; }
  199. void renewDirection() { mDirectionCached = mDirection; }
  200. const LLColor3& getColorCached() const { return mColorCached; }
  201. void setColorCached(const LLColor3& c) { mColorCached = c; }
  202. const LLColor3& getColor() const { return mColor; }
  203. void setColor(const LLColor3& c) { mColor = c; }
  204. void renewColor() { mColorCached = mColor; }
  205. static F32 interpVal() { return sInterpVal; }
  206. static void setInterpVal(const F32 v) { sInterpVal = v; }
  207. LLColor3 getInterpColor() const
  208. {
  209. return sInterpVal * mColor + (1 - sInterpVal) * mColorCached;
  210. }
  211. const F32& getHorizonVisibility() const { return mHorizonVisibility; }
  212. void setHorizonVisibility(const F32 c = 1) { mHorizonVisibility = c; }
  213. const F32& getVisibility() const { return mVisibility; }
  214. void setVisibility(const F32 c = 1) { mVisibility = c; }
  215. F32 getHaloBrighness() const
  216. {
  217. return llmax(0.f, llmin(0.9f, mHorizonVisibility)) * mVisibility;
  218. }
  219. BOOL isVisible() const { return mVisible; }
  220. void setVisible(const BOOL v) { mVisible = v; }
  221. const F32& getIntensity() const { return mIntensity; }
  222. void setIntensity(const F32 c) { mIntensity = c; }
  223. void setDiskRadius(const F32 radius) { mDiskRadius = radius; }
  224. F32 getDiskRadius() const { return mDiskRadius; }
  225. void setDraw(const BOOL draw) { mDraw = draw; }
  226. BOOL getDraw() const { return mDraw; }
  227. const LLVector3& corner(const S32 n) const { return mQuadCorner[n]; }
  228. LLVector3& corner(const S32 n) { return mQuadCorner[n]; }
  229. const LLVector3* corners() const { return mQuadCorner; }
  230. const LLVector3& getU() const { return mU; }
  231. const LLVector3& getV() const { return mV; }
  232. void setU(const LLVector3& u) { mU = u; }
  233. void setV(const LLVector3& v) { mV = v; }
  234. };
  235. LL_FORCE_INLINE LLColor3 refr_ind_calc(const LLColor3 &wave_length)
  236. {
  237. LLColor3 refr_ind;
  238. for (S32 i = 0; i < 3; ++i)
  239. {
  240. const F32 wl2 = wave_length.mV[i] * wave_length.mV[i] * 1e-6f;
  241. refr_ind.mV[i] = 6.43e3f + ( 2.95e6f / ( 146.0f - 1.f/wl2 ) ) + ( 2.55e4f / ( 41.0f - 1.f/wl2 ) );
  242. refr_ind.mV[i] *= 1.0e-8f;
  243. refr_ind.mV[i] += 1.f;
  244. }
  245. return refr_ind;
  246. }
  247. LL_FORCE_INLINE LLColor3 calc_air_sca_sea_level()
  248. {
  249. const static LLColor3 WAVE_LEN(675, 520, 445);
  250. const static LLColor3 refr_ind = refr_ind_calc(WAVE_LEN);
  251. const static LLColor3 n21 = refr_ind * refr_ind - LLColor3(1, 1, 1);
  252. const static LLColor3 n4 = n21 * n21;
  253. const static LLColor3 wl2 = WAVE_LEN * WAVE_LEN * 1e-6f;
  254. const static LLColor3 wl4 = wl2 * wl2;
  255. const static LLColor3 mult_const = fsigma * 2.0f/ 3.0f * 1e24f * (F_PI * F_PI) * n4;
  256. const static F32 dens_div_N = F32( ATM_SEA_LEVEL_NDENS / Ndens2);
  257. return dens_div_N * color_div ( mult_const, wl4 );
  258. }
  259. const LLColor3 gAirScaSeaLevel = calc_air_sca_sea_level();
  260. const F32 AIR_SCA_INTENS = color_intens(gAirScaSeaLevel);
  261. const F32 AIR_SCA_AVG = AIR_SCA_INTENS / 3.f;
  262. class LLHaze
  263. {
  264. public:
  265. LLHaze() : mG(0), mFalloff(1), mAbsCoef(0.f) {mSigSca.setToBlack();}
  266. LLHaze(const F32 g, const LLColor3& sca, const F32 fo = 2.f) : 
  267. mG(g), mSigSca(0.25f/F_PI * sca), mFalloff(fo), mAbsCoef(0.f)
  268. {
  269. mAbsCoef = color_intens(mSigSca) / AIR_SCA_INTENS;
  270. }
  271. LLHaze(const F32 g, const F32 sca, const F32 fo = 2.f) : mG(g),
  272. mSigSca(0.25f/F_PI * LLColor3(sca, sca, sca)), mFalloff(fo)
  273. {
  274. mAbsCoef = 0.01f * sca / AIR_SCA_AVG;
  275. }
  276. static void initClass();
  277. F32 getG() const { return mG; }
  278. void setG(const F32 g)
  279. {
  280. mG = g;
  281. }
  282. const LLColor3& getSigSca() const // sea level
  283. {
  284. return mSigSca;
  285. void setSigSca(const LLColor3& s)
  286. {
  287. mSigSca = s;
  288. mAbsCoef = 0.01f * color_intens(mSigSca) / AIR_SCA_INTENS;
  289. }
  290. void setSigSca(const F32 s0, const F32 s1, const F32 s2)
  291. {
  292. mSigSca = AIR_SCA_AVG * LLColor3 (s0, s1, s2);
  293. mAbsCoef = 0.01f * (s0 + s1 + s2) / 3;
  294. }
  295. F32 getFalloff() const
  296. {
  297. return mFalloff;
  298. }
  299. void setFalloff(const F32 fo)
  300. {
  301. mFalloff = fo;
  302. }
  303. F32 getAbsCoef() const
  304. {
  305. return mAbsCoef;
  306. }
  307. inline static F32 calcFalloff(const F32 h)
  308. {
  309. return (h <= 0) ? 1.0f : (F32)LL_FAST_EXP(-ATM_EXP_FALLOFF * h);
  310. }
  311. inline LLColor3 calcSigSca(const F32 h) const
  312. {
  313. return calcFalloff(h * mFalloff) * mSigSca;
  314. }
  315. inline void calcSigSca(const F32 h, LLColor3 &result) const
  316. {
  317. result = mSigSca;
  318. result *= calcFalloff(h * mFalloff);
  319. }
  320. LLColor3 calcSigExt(const F32 h) const
  321. {
  322. return calcFalloff(h * mFalloff) * (1 + mAbsCoef) * mSigSca;
  323. }
  324. F32 calcPhase(const F32 cos_theta) const;
  325. static inline LLColor3 calcAirSca(const F32 h);
  326. static inline void calcAirSca(const F32 h, LLColor3 &result);
  327. static LLColor3 calcAirScaSeaLevel() { return gAirScaSeaLevel; }
  328. static const LLColor3 &getAirScaSeaLevel() { return sAirScaSeaLevel; }
  329. public:
  330. static LLColor3 sAirScaSeaLevel;
  331. protected:
  332. F32 mG;
  333. LLColor3 mSigSca;
  334. F32 mFalloff; // 1 - slow, >1 - faster
  335. F32 mAbsCoef;
  336. };
  337. class LLCubeMap;
  338. // turn on floating point precision
  339. // in vs2003 for this class.  Otherwise
  340. // black dots go everywhere from 7:10 - 8:50
  341. #if LL_MSVC && __MSVC_VER__ < 8
  342. #pragma optimize("p", on)
  343. #endif
  344. class LLVOSky : public LLStaticViewerObject
  345. {
  346. public:
  347. /// WL PARAMS
  348. F32 dome_radius;
  349. F32 dome_offset_ratio;
  350. LLColor3 sunlight_color;
  351. LLColor3 ambient;
  352. F32 gamma;
  353. LLVector4 lightnorm;
  354. LLVector4 unclamped_lightnorm;
  355. LLColor3 blue_density;
  356. LLColor3 blue_horizon;
  357. F32 haze_density;
  358. LLColor3 haze_horizon;
  359. F32 density_multiplier;
  360. F32 max_y;
  361. LLColor3 glow;
  362. F32 cloud_shadow;
  363. LLColor3 cloud_color;
  364. F32 cloud_scale;
  365. LLColor3 cloud_pos_density1;
  366. LLColor3 cloud_pos_density2;
  367. public:
  368. void initAtmospherics(void);
  369. void calcAtmospherics(void);
  370. LLColor3 createDiffuseFromWL(LLColor3 diffuse, LLColor3 ambient, LLColor3 sundiffuse, LLColor3 sunambient);
  371. LLColor3 createAmbientFromWL(LLColor3 ambient, LLColor3 sundiffuse, LLColor3 sunambient);
  372. void calcSkyColorWLVert(LLVector3 & Pn, LLColor3 & vary_HazeColor, LLColor3 & vary_CloudColorSun, 
  373. LLColor3 & vary_CloudColorAmbient, F32 & vary_CloudDensity, 
  374. LLVector2 vary_HorizontalProjection[2]);
  375. LLColor3 calcSkyColorWLFrag(LLVector3 & Pn, LLColor3 & vary_HazeColor, LLColor3 & vary_CloudColorSun, 
  376. LLColor3 & vary_CloudColorAmbient, F32 & vary_CloudDensity, 
  377. LLVector2 vary_HorizontalProjection[2]);
  378. public:
  379. enum
  380. {
  381. FACE_SIDE0,
  382. FACE_SIDE1,
  383. FACE_SIDE2,
  384. FACE_SIDE3,
  385. FACE_SIDE4,
  386. FACE_SIDE5,
  387. FACE_SUN, // was 6
  388. FACE_MOON, // was 7
  389. FACE_BLOOM, // was 8
  390. FACE_REFLECTION, // was 10
  391. FACE_DUMMY, //for an ATI bug --bao
  392. FACE_COUNT
  393. };
  394. LLVOSky(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp);
  395. // Initialize/delete data that's only inited once per class.
  396. static void initClass();
  397. void init();
  398. void initCubeMap();
  399. void initEmpty();
  400. void cleanupGL();
  401. void restoreGL();
  402. /*virtual*/ BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
  403. BOOL updateSky();
  404. // Graphical stuff for objects - maybe broken out into render class
  405. // later?
  406. /*virtual*/ void updateTextures();
  407. /*virtual*/ LLDrawable* createDrawable(LLPipeline *pipeline);
  408. /*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
  409. void initSkyTextureDirs(const S32 side, const S32 tile);
  410. void createSkyTexture(const S32 side, const S32 tile);
  411. LLColor4 calcSkyColorInDir(const LLVector3& dir, bool isShiny = false);
  412. LLColor3 calcRadianceAtPoint(const LLVector3& pos) const
  413. {
  414. F32 radiance = mBrightnessScaleGuess * mSun.getIntensity();
  415. return LLColor3(radiance, radiance, radiance);
  416. }
  417. const LLHeavenBody& getSun() const { return mSun; }
  418. const LLHeavenBody& getMoon() const { return mMoon; }
  419. const LLVector3& getToSunLast() const { return mSun.getDirectionCached(); }
  420. const LLVector3& getToSun() const { return mSun.getDirection(); }
  421. const LLVector3& getToMoon() const { return mMoon.getDirection(); }
  422. const LLVector3& getToMoonLast() const { return mMoon.getDirectionCached(); }
  423. BOOL isSunUp() const { return mSun.getDirectionCached().mV[2] > -0.05f; }
  424. void calculateColors();
  425. LLColor3 getSunDiffuseColor() const { return mSunDiffuse; }
  426. LLColor3 getMoonDiffuseColor() const { return mMoonDiffuse; }
  427. LLColor4 getSunAmbientColor() const { return mSunAmbient; }
  428. LLColor4 getMoonAmbientColor() const { return mMoonAmbient; }
  429. const LLColor4& getTotalAmbientColor() const { return mTotalAmbient; }
  430. LLColor4 getFogColor() const { return mFogColor; }
  431. LLColor4 getGLFogColor() const { return mGLFogCol; }
  432. BOOL isSameFace(S32 idx, const LLFace* face) const { return mFace[idx] == face; }
  433. void initSunDirection(const LLVector3 &sun_dir, const LLVector3 &sun_ang_velocity);
  434. void setSunDirection(const LLVector3 &sun_dir, const LLVector3 &sun_ang_velocity);
  435. BOOL updateHeavenlyBodyGeometry(LLDrawable *drawable, const S32 side, const BOOL is_sun,
  436. LLHeavenBody& hb, const F32 sin_max_angle,
  437. const LLVector3 &up, const LLVector3 &right);
  438. F32 cosHorizon(const F32 delta = 0) const
  439. {
  440. const F32 sin_angle = EARTH_RADIUS/(EARTH_RADIUS + mCameraPosAgent.mV[2]);
  441. return delta - (F32)sqrt(1.f - sin_angle * sin_angle);
  442. }
  443. void updateSunHaloGeometry(LLDrawable *drawable);
  444. void updateReflectionGeometry(LLDrawable *drawable, F32 H, const LLHeavenBody& HB);
  445. const LLHaze& getHaze() const { return mHaze; }
  446. LLHaze& getHaze() { return mHaze; }
  447. F32 getHazeConcentration() const { return mHazeConcentration; }
  448. void setHaze(const LLHaze& h) { mHaze = h; }
  449. F32 getWorldScale() const { return mWorldScale; }
  450. void setWorldScale(const F32 s) { mWorldScale = s; }
  451. void updateFog(const F32 distance);
  452. void setFogRatio(const F32 fog_ratio) { mFogRatio = fog_ratio; }
  453. LLColor4U getFadeColor() const { return mFadeColor; }
  454. F32 getFogRatio() const { return mFogRatio; }
  455. void setCloudDensity(F32 cloud_density) { mCloudDensity = cloud_density; }
  456. void setWind ( const LLVector3& wind ) { mWind = wind.length(); }
  457. const LLVector3 &getCameraPosAgent() const { return mCameraPosAgent; }
  458. LLVector3 getEarthCenter() const { return mEarthCenter; }
  459. LLCubeMap *getCubeMap() const { return mCubeMap; }
  460. S32 getDrawRefl() const { return mDrawRefl; }
  461. void setDrawRefl(const S32 r) { mDrawRefl = r; }
  462. BOOL isReflFace(const LLFace* face) const { return face == mFace[FACE_REFLECTION]; }
  463. LLFace* getReflFace() const { return mFace[FACE_REFLECTION]; }
  464. LLViewerTexture* getSunTex() const { return mSunTexturep; }
  465. LLViewerTexture* getMoonTex() const { return mMoonTexturep; }
  466. LLViewerTexture* getBloomTex() const { return mBloomTexturep; }
  467. void forceSkyUpdate(void) { mForceUpdate = TRUE; }
  468. public:
  469. LLFace *mFace[FACE_COUNT];
  470. LLVector3 mBumpSunDir;
  471. protected:
  472. ~LLVOSky();
  473. LLPointer<LLViewerFetchedTexture> mSunTexturep;
  474. LLPointer<LLViewerFetchedTexture> mMoonTexturep;
  475. LLPointer<LLViewerFetchedTexture> mBloomTexturep;
  476. static S32 sResolution;
  477. static S32 sTileResX;
  478. static S32 sTileResY;
  479. LLSkyTex mSkyTex[6];
  480. LLSkyTex mShinyTex[6];
  481. LLHeavenBody mSun;
  482. LLHeavenBody mMoon;
  483. LLVector3 mSunDefaultPosition;
  484. LLVector3 mSunAngVel;
  485. F32 mAtmHeight;
  486. LLVector3 mEarthCenter;
  487. LLVector3 mCameraPosAgent;
  488. F32 mBrightnessScale;
  489. LLColor3 mBrightestPoint;
  490. F32 mBrightnessScaleNew;
  491. LLColor3 mBrightestPointNew;
  492. F32 mBrightnessScaleGuess;
  493. LLColor3 mBrightestPointGuess;
  494. LLHaze mHaze;
  495. F32 mHazeConcentration;
  496. BOOL mWeatherChange;
  497. F32 mCloudDensity;
  498. F32 mWind;
  499. BOOL mInitialized;
  500. BOOL mForceUpdate; //flag to force instantaneous update of cubemap
  501. LLVector3 mLastLightingDirection;
  502. LLColor3 mLastTotalAmbient;
  503. F32 mAmbientScale;
  504. LLColor3 mNightColorShift;
  505. F32 mInterpVal;
  506. LLColor4 mFogColor;
  507. LLColor4 mGLFogCol;
  508. F32 mFogRatio;
  509. F32 mWorldScale;
  510. LLColor4 mSunAmbient;
  511. LLColor4 mMoonAmbient;
  512. LLColor4 mTotalAmbient;
  513. LLColor3 mSunDiffuse;
  514. LLColor3 mMoonDiffuse;
  515. LLColor4U mFadeColor; // Color to fade in from
  516. LLPointer<LLCubeMap> mCubeMap; // Cube map for the environment
  517. S32 mDrawRefl;
  518. LLFrameTimer mUpdateTimer;
  519. public:
  520. //by bao
  521. //fake vertex buffer updating
  522. //to guarantee at least updating one VBO buffer every frame
  523. //to work around the bug caused by ATI card --> DEV-3855
  524. //
  525. void createDummyVertexBuffer() ;
  526. void updateDummyVertexBuffer() ;
  527. BOOL mHeavenlyBodyUpdated ;
  528. };
  529. // turn it off
  530. #if LL_MSVC && __MSVC_VER__ < 8
  531. #pragma optimize("p", off)
  532. #endif
  533. // Utility functions
  534. F32 azimuth(const LLVector3 &v);
  535. F32 color_norm_pow(LLColor3& col, F32 e, BOOL postmultiply = FALSE);
  536. /* Proportion of light that is scattered into 'path' from 'in' over distance dt. */
  537. /* assumes that vectors 'path' and 'in' are normalized. Scattering coef / 2pi */
  538. inline LLColor3 LLHaze::calcAirSca(const F32 h)
  539. {
  540. static const LLColor3 air_sca_sea_level = calcAirScaSeaLevel();
  541. return calcFalloff(h) * air_sca_sea_level;
  542. }
  543. inline void LLHaze::calcAirSca(const F32 h, LLColor3 &result)
  544. {
  545. static const LLColor3 air_sca_sea_level = calcAirScaSeaLevel();
  546. result = air_sca_sea_level;
  547. result *= calcFalloff(h);
  548. }
  549. #endif