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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llsky.cpp
  3.  * @brief IndraWorld sky class 
  4.  *
  5.  * $LicenseInfo:firstyear=2000&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2000-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. // Ideas:
  33. // -haze should be controlled by global query from sims
  34. // -need secondary optical effects on sun (flare)
  35. // -stars should be brought down from sims
  36. // -star intensity should be driven by global ambient level from sims,
  37. //  so that eclipses, etc can be easily done.
  38. //
  39. #include "llviewerprecompiledheaders.h"
  40. #include "llsky.h"
  41. // linden library includes
  42. #include "llerror.h"
  43. #include "llmath.h"
  44. #include "math.h"
  45. #include "v4color.h"
  46. #include "llviewerobjectlist.h"
  47. #include "llviewerobject.h"
  48. #include "llviewercamera.h"
  49. #include "pipeline.h"
  50. #include "lldrawpool.h"
  51. #include "llvosky.h"
  52. #include "llcubemap.h"
  53. #include "llviewercontrol.h"
  54. #include "llvowlsky.h"
  55. F32 azimuth_from_vector(const LLVector3 &v);
  56. F32 elevation_from_vector(const LLVector3 &v);
  57. LLSky gSky;
  58. // ---------------- LLSky ----------------
  59. const F32 LLSky::NIGHTTIME_ELEVATION = -8.0f; // degrees
  60. const F32 LLSky::NIGHTTIME_ELEVATION_COS = (F32)sin(NIGHTTIME_ELEVATION*DEG_TO_RAD);
  61. //////////////////////////////////////////////////////////////////////
  62. // Construction/Destruction
  63. //////////////////////////////////////////////////////////////////////
  64. LLSky::LLSky()
  65. {
  66. // Set initial clear color to black
  67. // Set fog color 
  68. mFogColor.mV[VRED] = mFogColor.mV[VGREEN] = mFogColor.mV[VBLUE] = 0.5f;
  69. mFogColor.mV[VALPHA] = 0.0f;
  70. mLightingGeneration = 0;
  71. mUpdatedThisFrame = TRUE;
  72. mOverrideSimSunPosition = FALSE;
  73. mSunPhase = 0.f;
  74. }
  75. LLSky::~LLSky()
  76. {
  77. }
  78. void LLSky::cleanup()
  79. {
  80. mVOSkyp = NULL;
  81. mVOWLSkyp = NULL;
  82. mVOGroundp = NULL;
  83. }
  84. void LLSky::destroyGL()
  85. {
  86. if (!mVOSkyp.isNull() && mVOSkyp->getCubeMap())
  87. {
  88. mVOSkyp->cleanupGL();
  89. }
  90. if (mVOWLSkyp.notNull())
  91. {
  92. mVOWLSkyp->cleanupGL();
  93. }
  94. }
  95. void LLSky::restoreGL()
  96. {
  97. if (mVOSkyp)
  98. {
  99. mVOSkyp->restoreGL();
  100. }
  101. if (mVOWLSkyp)
  102. {
  103. mVOWLSkyp->restoreGL();
  104. }
  105. }
  106. void LLSky::resetVertexBuffers()
  107. {
  108. if (gSky.mVOSkyp.notNull())
  109. {
  110. gPipeline.resetVertexBuffers(gSky.mVOSkyp->mDrawable);
  111. gPipeline.resetVertexBuffers(gSky.mVOGroundp->mDrawable);
  112. gPipeline.markRebuild(gSky.mVOSkyp->mDrawable, LLDrawable::REBUILD_ALL, TRUE);
  113. gPipeline.markRebuild(gSky.mVOGroundp->mDrawable, LLDrawable::REBUILD_ALL, TRUE);
  114. }
  115. if (gSky.mVOWLSkyp.notNull())
  116. {
  117. gSky.mVOWLSkyp->resetVertexBuffers();
  118. gPipeline.resetVertexBuffers(gSky.mVOWLSkyp->mDrawable);
  119. gPipeline.markRebuild(gSky.mVOWLSkyp->mDrawable, LLDrawable::REBUILD_ALL, TRUE);
  120. }
  121. }
  122. void LLSky::setOverrideSun(BOOL override)
  123. {
  124. if (!mOverrideSimSunPosition && override)
  125. {
  126. mLastSunDirection = getSunDirection();
  127. }
  128. else if (mOverrideSimSunPosition && !override)
  129. {
  130. setSunDirection(mLastSunDirection, LLVector3::zero);
  131. }
  132. mOverrideSimSunPosition = override;
  133. }
  134. void LLSky::setSunDirection(const LLVector3 &sun_direction, const LLVector3 &sun_ang_velocity)
  135. {
  136. if(mVOSkyp.notNull()) {
  137. mVOSkyp->setSunDirection(sun_direction, sun_ang_velocity);
  138. }
  139. }
  140. void LLSky::setSunTargetDirection(const LLVector3 &sun_direction, const LLVector3 &sun_ang_velocity)
  141. {
  142. mSunTargDir = sun_direction;
  143. }
  144. LLVector3 LLSky::getSunDirection() const
  145. {
  146. if (mVOSkyp)
  147. {
  148. return mVOSkyp->getToSun();
  149. }
  150. else
  151. {
  152. return LLVector3::z_axis;
  153. }
  154. }
  155. LLVector3 LLSky::getMoonDirection() const
  156. {
  157. if (mVOSkyp)
  158. {
  159. return mVOSkyp->getToMoon();
  160. }
  161. else
  162. {
  163. return LLVector3::z_axis;
  164. }
  165. }
  166. LLColor4 LLSky::getSunDiffuseColor() const
  167. {
  168. if (mVOSkyp)
  169. {
  170. return LLColor4(mVOSkyp->getSunDiffuseColor());
  171. }
  172. else
  173. {
  174. return LLColor4(1.f, 1.f, 1.f, 1.f);
  175. }
  176. }
  177. LLColor4 LLSky::getSunAmbientColor() const
  178. {
  179. if (mVOSkyp)
  180. {
  181. return LLColor4(mVOSkyp->getSunAmbientColor());
  182. }
  183. else
  184. {
  185. return LLColor4(0.f, 0.f, 0.f, 1.f);
  186. }
  187. }
  188. LLColor4 LLSky::getMoonDiffuseColor() const
  189. {
  190. if (mVOSkyp)
  191. {
  192. return LLColor4(mVOSkyp->getMoonDiffuseColor());
  193. }
  194. else
  195. {
  196. return LLColor4(1.f, 1.f, 1.f, 1.f);
  197. }
  198. }
  199. LLColor4 LLSky::getMoonAmbientColor() const
  200. {
  201. if (mVOSkyp)
  202. {
  203. return LLColor4(mVOSkyp->getMoonAmbientColor());
  204. }
  205. else
  206. {
  207. return LLColor4(0.f, 0.f, 0.f, 0.f);
  208. }
  209. }
  210. LLColor4 LLSky::getTotalAmbientColor() const
  211. {
  212. if (mVOSkyp)
  213. {
  214. return mVOSkyp->getTotalAmbientColor();
  215. }
  216. else
  217. {
  218. return LLColor4(1.f, 1.f, 1.f, 1.f);
  219. }
  220. }
  221. BOOL LLSky::sunUp() const
  222. {
  223. if (mVOSkyp)
  224. {
  225. return mVOSkyp->isSunUp();
  226. }
  227. else
  228. {
  229. return TRUE;
  230. }
  231. }
  232. LLColor4U LLSky::getFadeColor() const
  233. {
  234. if (mVOSkyp)
  235. {
  236. return mVOSkyp->getFadeColor();
  237. }
  238. else
  239. {
  240. return LLColor4(1.f, 1.f, 1.f, 1.f);
  241. }
  242. }
  243. //////////////////////////////////////////////////////////////////////
  244. // Public Methods
  245. //////////////////////////////////////////////////////////////////////
  246. void LLSky::init(const LLVector3 &sun_direction)
  247. {
  248. LLGLState::checkStates();
  249. LLGLState::checkTextureChannels();
  250. mVOWLSkyp = static_cast<LLVOWLSky*>(gObjectList.createObjectViewer(LLViewerObject::LL_VO_WL_SKY, NULL));
  251. mVOWLSkyp->initSunDirection(sun_direction, LLVector3::zero);
  252. gPipeline.createObject(mVOWLSkyp.get());
  253. LLGLState::checkStates();
  254. LLGLState::checkTextureChannels();
  255. mVOSkyp = (LLVOSky *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_SKY, NULL);
  256. LLGLState::checkStates();
  257. LLGLState::checkTextureChannels();
  258. mVOSkyp->initSunDirection(sun_direction, LLVector3());
  259. LLGLState::checkStates();
  260. LLGLState::checkTextureChannels();
  261. gPipeline.createObject((LLViewerObject *)mVOSkyp);
  262. LLGLState::checkStates();
  263. LLGLState::checkTextureChannels();
  264. mVOGroundp = (LLVOGround*)gObjectList.createObjectViewer(LLViewerObject::LL_VO_GROUND, NULL);
  265. LLVOGround *groundp = mVOGroundp;
  266. gPipeline.createObject((LLViewerObject *)groundp);
  267. LLGLState::checkStates();
  268. LLGLState::checkTextureChannels();
  269. gSky.setFogRatio(gSavedSettings.getF32("RenderFogRatio"));
  270. ////////////////////////////
  271. //
  272. // Legacy code, ignore
  273. //
  274. //
  275. // Get the parameters.
  276. mSunDefaultPosition = gSavedSettings.getVector3("SkySunDefaultPosition");
  277. LLGLState::checkStates();
  278. LLGLState::checkTextureChannels();
  279. if (gSavedSettings.getBOOL("SkyOverrideSimSunPosition") || mOverrideSimSunPosition)
  280. {
  281. setSunDirection(mSunDefaultPosition, LLVector3(0.f, 0.f, 0.f));
  282. }
  283. else
  284. {
  285. setSunDirection(sun_direction, LLVector3(0.f, 0.f, 0.f));
  286. }
  287. LLGLState::checkStates();
  288. LLGLState::checkTextureChannels();
  289. mUpdatedThisFrame = TRUE;
  290. }
  291. void LLSky::setCloudDensityAtAgent(F32 cloud_density)
  292. {
  293. if (mVOSkyp)
  294. {
  295. mVOSkyp->setCloudDensity(cloud_density);
  296. }
  297. }
  298. void LLSky::setWind(const LLVector3& average_wind)
  299. {
  300. if (mVOSkyp)
  301. {
  302. mVOSkyp->setWind(average_wind);
  303. }
  304. }
  305. void LLSky::propagateHeavenlyBodies(F32 dt)
  306. {
  307. if (!mOverrideSimSunPosition)
  308. {
  309. LLVector3 curr_dir = getSunDirection();
  310. LLVector3 diff = mSunTargDir - curr_dir;
  311. const F32 dist = diff.normVec();
  312. if (dist > 0)
  313. {
  314. const F32 step = llmin (dist, 0.00005f);
  315. //const F32 step = min (dist, 0.0001);
  316. diff *= step;
  317. curr_dir += diff;
  318. curr_dir.normVec();
  319. if (mVOSkyp)
  320. {
  321. mVOSkyp->setSunDirection(curr_dir, LLVector3());
  322. }
  323. }
  324. }
  325. }
  326. F32 LLSky::getSunPhase() const
  327. {
  328. return mSunPhase;
  329. }
  330. void LLSky::setSunPhase(const F32 phase)
  331. {
  332. mSunPhase = phase;
  333. }
  334. //////////////////////////////////////////////////////////////////////
  335. // Private Methods
  336. //////////////////////////////////////////////////////////////////////
  337. LLColor4 LLSky::getFogColor() const
  338. {
  339. if (mVOSkyp)
  340. {
  341. return mVOSkyp->getFogColor();
  342. }
  343. return LLColor4(1.f, 1.f, 1.f, 1.f);
  344. }
  345. void LLSky::updateFog(const F32 distance)
  346. {
  347. if (mVOSkyp)
  348. {
  349. mVOSkyp->updateFog(distance);
  350. }
  351. }
  352. void LLSky::updateCull()
  353. {
  354. // *TODO: do culling for wl sky properly -Brad
  355. }
  356. void LLSky::updateSky()
  357. {
  358. if (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_SKY))
  359. {
  360. return;
  361. }
  362. if (mVOSkyp)
  363. {
  364. mVOSkyp->updateSky();
  365. }
  366. }
  367. void LLSky::setFogRatio(const F32 fog_ratio)
  368. {
  369. if (mVOSkyp)
  370. {
  371. mVOSkyp->setFogRatio(fog_ratio);
  372. }
  373. }
  374. F32 LLSky::getFogRatio() const
  375. {
  376. if (mVOSkyp)
  377. {
  378. return mVOSkyp->getFogRatio();
  379. }
  380. else
  381. {
  382. return 0.f;
  383. }
  384. }
  385. // Returns angle (DEGREES) between the horizontal plane and "v", 
  386. // where the angle is negative when v.mV[VZ] < 0.0f
  387. F32 elevation_from_vector(const LLVector3 &v)
  388. {
  389. F32 elevation = 0.0f;
  390. F32 xy_component = (F32) sqrt(v.mV[VX] * v.mV[VX] + v.mV[VY] * v.mV[VY]);
  391. if (xy_component != 0.0f)
  392. {
  393. elevation = RAD_TO_DEG * (F32) atan(v.mV[VZ]/xy_component);
  394. }
  395. else
  396. {
  397. if (v.mV[VZ] > 0.f)
  398. {
  399. elevation = 90.f;
  400. }
  401. else
  402. {
  403. elevation = -90.f;
  404. }
  405. }
  406. return elevation;
  407. }