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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llworld.cpp
  3.  * @brief Initial test structure to organize viewer regions
  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. #include "llviewerprecompiledheaders.h"
  33. #include "llworld.h"
  34. #include "llrender.h"
  35. #include "indra_constants.h"
  36. #include "llstl.h"
  37. #include "llagent.h"
  38. #include "llviewercontrol.h"
  39. #include "lldrawpool.h"
  40. #include "llglheaders.h"
  41. #include "llhttpnode.h"
  42. #include "llregionhandle.h"
  43. #include "llsurface.h"
  44. #include "llviewercamera.h"
  45. #include "llviewertexture.h"
  46. #include "llviewertexturelist.h"
  47. #include "llviewernetwork.h"
  48. #include "llviewerobjectlist.h"
  49. #include "llviewerparceloverlay.h"
  50. #include "llviewerregion.h"
  51. #include "llviewerstats.h"
  52. #include "llvlcomposition.h"
  53. #include "llvoavatar.h"
  54. #include "llvowater.h"
  55. #include "message.h"
  56. #include "pipeline.h"
  57. #include "llappviewer.h" // for do_disconnect()
  58. //
  59. // Globals
  60. //
  61. U32 gAgentPauseSerialNum = 0;
  62. //
  63. // Constants
  64. //
  65. const S32 MAX_NUMBER_OF_CLOUDS = 750;
  66. const S32 WORLD_PATCH_SIZE = 16;
  67. extern LLColor4U MAX_WATER_COLOR;
  68. const U32 LLWorld::mWidth = 256;
  69. // meters/point, therefore mWidth * mScale = meters per edge
  70. const F32 LLWorld::mScale = 1.f;
  71. const F32 LLWorld::mWidthInMeters = mWidth * mScale;
  72. //
  73. // Functions
  74. //
  75. // allocate the stack
  76. LLWorld::LLWorld() :
  77. mLandFarClip(DEFAULT_FAR_PLANE),
  78. mLastPacketsIn(0),
  79. mLastPacketsOut(0),
  80. mLastPacketsLost(0),
  81. mSpaceTimeUSec(0)
  82. {
  83. for (S32 i = 0; i < 8; i++)
  84. {
  85. mEdgeWaterObjects[i] = NULL;
  86. }
  87. if (gNoRender)
  88. {
  89. return;
  90. }
  91. LLPointer<LLImageRaw> raw = new LLImageRaw(1,1,4);
  92. U8 *default_texture = raw->getData();
  93. *(default_texture++) = MAX_WATER_COLOR.mV[0];
  94. *(default_texture++) = MAX_WATER_COLOR.mV[1];
  95. *(default_texture++) = MAX_WATER_COLOR.mV[2];
  96. *(default_texture++) = MAX_WATER_COLOR.mV[3];
  97. mDefaultWaterTexturep = LLViewerTextureManager::getLocalTexture(raw.get(), FALSE);
  98. gGL.getTexUnit(0)->bind(mDefaultWaterTexturep);
  99. mDefaultWaterTexturep->setAddressMode(LLTexUnit::TAM_CLAMP);
  100. }
  101. void LLWorld::destroyClass()
  102. {
  103. mHoleWaterObjects.clear();
  104. gObjectList.destroy();
  105. for(region_list_t::iterator region_it = mRegionList.begin(); region_it != mRegionList.end(); )
  106. {
  107. LLViewerRegion* region_to_delete = *region_it++;
  108. removeRegion(region_to_delete->getHost());
  109. }
  110. LLViewerPartSim::getInstance()->destroyClass();
  111. }
  112. LLViewerRegion* LLWorld::addRegion(const U64 &region_handle, const LLHost &host)
  113. {
  114. LLMemType mt(LLMemType::MTYPE_REGIONS);
  115. LLViewerRegion *regionp = getRegionFromHandle(region_handle);
  116. if (regionp)
  117. {
  118. LLHost old_host = regionp->getHost();
  119. // region already exists!
  120. if (host == old_host && regionp->isAlive())
  121. {
  122. // This is a duplicate for the same host and it's alive, don't bother.
  123. return regionp;
  124. }
  125. if (host != old_host)
  126. {
  127. llwarns << "LLWorld::addRegion exists, but old host " << old_host
  128. << " does not match new host " << host << llendl;
  129. }
  130. if (!regionp->isAlive())
  131. {
  132. llwarns << "LLWorld::addRegion exists, but isn't alive" << llendl;
  133. }
  134. // Kill the old host, and then we can continue on and add the new host.  We have to kill even if the host
  135. // matches, because all the agent state for the new camera is completely different.
  136. removeRegion(old_host);
  137. }
  138. U32 iindex = 0;
  139. U32 jindex = 0;
  140. from_region_handle(region_handle, &iindex, &jindex);
  141. S32 x = (S32)(iindex/mWidth);
  142. S32 y = (S32)(jindex/mWidth);
  143. llinfos << "Adding new region (" << x << ":" << y << ")" << llendl;
  144. llinfos << "Host: " << host << llendl;
  145. LLVector3d origin_global;
  146. origin_global = from_region_handle(region_handle);
  147. regionp = new LLViewerRegion(region_handle,
  148.     host,
  149. mWidth,
  150. WORLD_PATCH_SIZE,
  151. getRegionWidthInMeters() );
  152. if (!regionp)
  153. {
  154. llerrs << "Unable to create new region!" << llendl;
  155. }
  156. regionp->mCloudLayer.create(regionp);
  157. regionp->mCloudLayer.setWidth((F32)mWidth);
  158. regionp->mCloudLayer.setWindPointer(&regionp->mWind);
  159. mRegionList.push_back(regionp);
  160. mActiveRegionList.push_back(regionp);
  161. mCulledRegionList.push_back(regionp);
  162. // Find all the adjacent regions, and attach them.
  163. // Generate handles for all of the adjacent regions, and attach them in the correct way.
  164. // connect the edges
  165. F32 adj_x = 0.f;
  166. F32 adj_y = 0.f;
  167. F32 region_x = 0.f;
  168. F32 region_y = 0.f;
  169. U64 adj_handle = 0;
  170. F32 width = getRegionWidthInMeters();
  171. LLViewerRegion *neighborp;
  172. from_region_handle(region_handle, &region_x, &region_y);
  173. // Iterate through all directions, and connect neighbors if there.
  174. S32 dir;
  175. for (dir = 0; dir < 8; dir++)
  176. {
  177. adj_x = region_x + width * gDirAxes[dir][0];
  178. adj_y = region_y + width * gDirAxes[dir][1];
  179. to_region_handle(adj_x, adj_y, &adj_handle);
  180. neighborp = getRegionFromHandle(adj_handle);
  181. if (neighborp)
  182. {
  183. //llinfos << "Connecting " << region_x << ":" << region_y << " -> " << adj_x << ":" << adj_y << llendl;
  184. regionp->connectNeighbor(neighborp, dir);
  185. }
  186. }
  187. updateWaterObjects();
  188. return regionp;
  189. }
  190. void LLWorld::removeRegion(const LLHost &host)
  191. {
  192. F32 x, y;
  193. LLViewerRegion *regionp = getRegion(host);
  194. if (!regionp)
  195. {
  196. llwarns << "Trying to remove region that doesn't exist!" << llendl;
  197. return;
  198. }
  199. if (regionp == gAgent.getRegion())
  200. {
  201. for (region_list_t::iterator iter = mRegionList.begin();
  202.  iter != mRegionList.end(); ++iter)
  203. {
  204. LLViewerRegion* reg = *iter;
  205. llwarns << "RegionDump: " << reg->getName()
  206. << " " << reg->getHost()
  207. << " " << reg->getOriginGlobal()
  208. << llendl;
  209. }
  210. llwarns << "Agent position global " << gAgent.getPositionGlobal() 
  211. << " agent " << gAgent.getPositionAgent()
  212. << llendl;
  213. llwarns << "Regions visited " << gAgent.getRegionsVisited() << llendl;
  214. llwarns << "gFrameTimeSeconds " << gFrameTimeSeconds << llendl;
  215. llwarns << "Disabling region " << regionp->getName() << " that agent is in!" << llendl;
  216. LLAppViewer::instance()->forceDisconnect("You have been disconnected from the region you were in.");
  217. return;
  218. }
  219. from_region_handle(regionp->getHandle(), &x, &y);
  220. llinfos << "Removing region " << x << ":" << y << llendl;
  221. mRegionList.remove(regionp);
  222. mActiveRegionList.remove(regionp);
  223. mCulledRegionList.remove(regionp);
  224. mVisibleRegionList.remove(regionp);
  225. delete regionp;
  226. updateWaterObjects();
  227. }
  228. LLViewerRegion* LLWorld::getRegion(const LLHost &host)
  229. {
  230. for (region_list_t::iterator iter = mRegionList.begin();
  231.  iter != mRegionList.end(); ++iter)
  232. {
  233. LLViewerRegion* regionp = *iter;
  234. if (regionp->getHost() == host)
  235. {
  236. return regionp;
  237. }
  238. }
  239. return NULL;
  240. }
  241. LLViewerRegion* LLWorld::getRegionFromPosAgent(const LLVector3 &pos)
  242. {
  243. return getRegionFromPosGlobal(gAgent.getPosGlobalFromAgent(pos));
  244. }
  245. LLViewerRegion* LLWorld::getRegionFromPosGlobal(const LLVector3d &pos)
  246. {
  247. for (region_list_t::iterator iter = mRegionList.begin();
  248.  iter != mRegionList.end(); ++iter)
  249. {
  250. LLViewerRegion* regionp = *iter;
  251. if (regionp->pointInRegionGlobal(pos))
  252. {
  253. return regionp;
  254. }
  255. }
  256. return NULL;
  257. }
  258. LLVector3d LLWorld::clipToVisibleRegions(const LLVector3d &start_pos, const LLVector3d &end_pos)
  259. {
  260. if (positionRegionValidGlobal(end_pos))
  261. {
  262. return end_pos;
  263. }
  264. LLViewerRegion* regionp = getRegionFromPosGlobal(start_pos);
  265. if (!regionp) 
  266. {
  267. return start_pos;
  268. }
  269. LLVector3d delta_pos = end_pos - start_pos;
  270. LLVector3d delta_pos_abs;
  271. delta_pos_abs.setVec(delta_pos);
  272. delta_pos_abs.abs();
  273. LLVector3 region_coord = regionp->getPosRegionFromGlobal(end_pos);
  274. F64 clip_factor = 1.0;
  275. F32 region_width = regionp->getWidth();
  276. if (region_coord.mV[VX] < 0.f)
  277. {
  278. if (region_coord.mV[VY] < region_coord.mV[VX])
  279. {
  280. // clip along y -
  281. clip_factor = -(region_coord.mV[VY] / delta_pos_abs.mdV[VY]);
  282. }
  283. else
  284. {
  285. // clip along x -
  286. clip_factor = -(region_coord.mV[VX] / delta_pos_abs.mdV[VX]);
  287. }
  288. }
  289. else if (region_coord.mV[VX] > region_width)
  290. {
  291. if (region_coord.mV[VY] > region_coord.mV[VX])
  292. {
  293. // clip along y +
  294. clip_factor = (region_coord.mV[VY] - region_width) / delta_pos_abs.mdV[VY];
  295. }
  296. else
  297. {
  298. //clip along x +
  299. clip_factor = (region_coord.mV[VX] - region_width) / delta_pos_abs.mdV[VX];
  300. }
  301. }
  302. else if (region_coord.mV[VY] < 0.f)
  303. {
  304. // clip along y -
  305. clip_factor = -(region_coord.mV[VY] / delta_pos_abs.mdV[VY]);
  306. }
  307. else if (region_coord.mV[VY] > region_width)
  308. // clip along y +
  309. clip_factor = (region_coord.mV[VY] - region_width) / delta_pos_abs.mdV[VY];
  310. }
  311. // clamp to within region dimensions
  312. LLVector3d final_region_pos = LLVector3d(region_coord) - (delta_pos * clip_factor);
  313. final_region_pos.mdV[VX] = llclamp(final_region_pos.mdV[VX], 0.0,
  314.    (F64)(region_width - F_ALMOST_ZERO));
  315. final_region_pos.mdV[VY] = llclamp(final_region_pos.mdV[VY], 0.0,
  316.    (F64)(region_width - F_ALMOST_ZERO));
  317. final_region_pos.mdV[VZ] = llclamp(final_region_pos.mdV[VZ], 0.0,
  318.    (F64)(LLWorld::getInstance()->getRegionMaxHeight() - F_ALMOST_ZERO));
  319. return regionp->getPosGlobalFromRegion(LLVector3(final_region_pos));
  320. }
  321. LLViewerRegion* LLWorld::getRegionFromHandle(const U64 &handle)
  322. {
  323. for (region_list_t::iterator iter = mRegionList.begin();
  324.  iter != mRegionList.end(); ++iter)
  325. {
  326. LLViewerRegion* regionp = *iter;
  327. if (regionp->getHandle() == handle)
  328. {
  329. return regionp;
  330. }
  331. }
  332. return NULL;
  333. }
  334. void LLWorld::updateAgentOffset(const LLVector3d &offset_global)
  335. {
  336. #if 0
  337. for (region_list_t::iterator iter = mRegionList.begin();
  338.  iter != mRegionList.end(); ++iter)
  339. {
  340. LLViewerRegion* regionp = *iter;
  341. regionp->setAgentOffset(offset_global);
  342. }
  343. #endif
  344. }
  345. BOOL LLWorld::positionRegionValidGlobal(const LLVector3d &pos_global)
  346. {
  347. for (region_list_t::iterator iter = mRegionList.begin();
  348.  iter != mRegionList.end(); ++iter)
  349. {
  350. LLViewerRegion* regionp = *iter;
  351. if (regionp->pointInRegionGlobal(pos_global))
  352. {
  353. return TRUE;
  354. }
  355. }
  356. return FALSE;
  357. }
  358. // Allow objects to go up to their radius underground.
  359. F32 LLWorld::getMinAllowedZ(LLViewerObject* object)
  360. {
  361. F32 land_height = resolveLandHeightGlobal(object->getPositionGlobal());
  362. F32 radius = 0.5f * object->getScale().length();
  363. return land_height - radius;
  364. }
  365. LLViewerRegion* LLWorld::resolveRegionGlobal(LLVector3 &pos_region, const LLVector3d &pos_global)
  366. {
  367. LLViewerRegion *regionp = getRegionFromPosGlobal(pos_global);
  368. if (regionp)
  369. {
  370. pos_region = regionp->getPosRegionFromGlobal(pos_global);
  371. return regionp;
  372. }
  373. return NULL;
  374. }
  375. LLViewerRegion* LLWorld::resolveRegionAgent(LLVector3 &pos_region, const LLVector3 &pos_agent)
  376. {
  377. LLVector3d pos_global = gAgent.getPosGlobalFromAgent(pos_agent);
  378. LLViewerRegion *regionp = getRegionFromPosGlobal(pos_global);
  379. if (regionp)
  380. {
  381. pos_region = regionp->getPosRegionFromGlobal(pos_global);
  382. return regionp;
  383. }
  384. return NULL;
  385. }
  386. F32 LLWorld::resolveLandHeightAgent(const LLVector3 &pos_agent)
  387. {
  388. LLVector3d pos_global = gAgent.getPosGlobalFromAgent(pos_agent);
  389. return resolveLandHeightGlobal(pos_global);
  390. }
  391. F32 LLWorld::resolveLandHeightGlobal(const LLVector3d &pos_global)
  392. {
  393. LLViewerRegion *regionp = getRegionFromPosGlobal(pos_global);
  394. if (regionp)
  395. {
  396. return regionp->getLand().resolveHeightGlobal(pos_global);
  397. }
  398. return 0.0f;
  399. }
  400. // Takes a line defined by "point_a" and "point_b" and determines the closest (to point_a) 
  401. // point where the the line intersects an object or the land surface.  Stores the results
  402. // in "intersection" and "intersection_normal" and returns a scalar value that represents
  403. // the normalized distance along the line from "point_a" to "intersection".
  404. //
  405. // Currently assumes point_a and point_b only differ in z-direction, 
  406. // but it may eventually become more general.
  407. F32 LLWorld::resolveStepHeightGlobal(const LLVOAvatar* avatarp, const LLVector3d &point_a, const LLVector3d &point_b, 
  408.    LLVector3d &intersection, LLVector3 &intersection_normal,
  409.    LLViewerObject **viewerObjectPtr)
  410. {
  411. // initialize return value to null
  412. if (viewerObjectPtr)
  413. {
  414. *viewerObjectPtr = NULL;
  415. }
  416. LLViewerRegion *regionp = getRegionFromPosGlobal(point_a);
  417. if (!regionp)
  418. {
  419. // We're outside the world 
  420. intersection = 0.5f * (point_a + point_b);
  421. intersection_normal.setVec(0.0f, 0.0f, 1.0f);
  422. return 0.5f;
  423. }
  424. // calculate the length of the segment
  425. F32 segment_length = (F32)((point_a - point_b).length());
  426. if (0.0f == segment_length)
  427. {
  428. intersection = point_a;
  429. intersection_normal.setVec(0.0f, 0.0f, 1.0f);
  430. return segment_length;
  431. }
  432. // get land height
  433. // Note: we assume that the line is parallel to z-axis here
  434. LLVector3d land_intersection = point_a;
  435. F32 normalized_land_distance;
  436. land_intersection.mdV[VZ] = regionp->getLand().resolveHeightGlobal(point_a);
  437. normalized_land_distance = (F32)(point_a.mdV[VZ] - land_intersection.mdV[VZ]) / segment_length;
  438. intersection = land_intersection;
  439. intersection_normal = resolveLandNormalGlobal(land_intersection);
  440. if (avatarp && !avatarp->mFootPlane.isExactlyClear())
  441. {
  442. LLVector3 foot_plane_normal(avatarp->mFootPlane.mV);
  443. LLVector3 start_pt = avatarp->getRegion()->getPosRegionFromGlobal(point_a);
  444. // added 0.05 meters to compensate for error in foot plane reported by Havok
  445. F32 norm_dist_from_plane = ((start_pt * foot_plane_normal) - avatarp->mFootPlane.mV[VW]) + 0.05f;
  446. norm_dist_from_plane = llclamp(norm_dist_from_plane / segment_length, 0.f, 1.f);
  447. if (norm_dist_from_plane < normalized_land_distance)
  448. {
  449. // collided with object before land
  450. normalized_land_distance = norm_dist_from_plane;
  451. intersection = point_a;
  452. intersection.mdV[VZ] -= norm_dist_from_plane * segment_length;
  453. intersection_normal = foot_plane_normal;
  454. }
  455. else
  456. {
  457. intersection = land_intersection;
  458. intersection_normal = resolveLandNormalGlobal(land_intersection);
  459. }
  460. }
  461. return normalized_land_distance;
  462. }
  463. LLSurfacePatch * LLWorld::resolveLandPatchGlobal(const LLVector3d &pos_global)
  464. {
  465. //  returns a pointer to the patch at this location
  466. LLViewerRegion *regionp = getRegionFromPosGlobal(pos_global);
  467. if (!regionp)
  468. {
  469. return NULL;
  470. }
  471. return regionp->getLand().resolvePatchGlobal(pos_global);
  472. }
  473. LLVector3 LLWorld::resolveLandNormalGlobal(const LLVector3d &pos_global)
  474. {
  475. LLViewerRegion *regionp = getRegionFromPosGlobal(pos_global);
  476. if (!regionp)
  477. {
  478. return LLVector3::z_axis;
  479. }
  480. return regionp->getLand().resolveNormalGlobal(pos_global);
  481. }
  482. void LLWorld::updateVisibilities()
  483. {
  484. F32 cur_far_clip = LLViewerCamera::getInstance()->getFar();
  485. LLViewerCamera::getInstance()->setFar(mLandFarClip);
  486. F32 diagonal_squared = F_SQRT2 * F_SQRT2 * mWidth * mWidth;
  487. // Go through the culled list and check for visible regions
  488. for (region_list_t::iterator iter = mCulledRegionList.begin();
  489.  iter != mCulledRegionList.end(); )
  490. {
  491. region_list_t::iterator curiter = iter++;
  492. LLViewerRegion* regionp = *curiter;
  493. F32 height = regionp->getLand().getMaxZ() - regionp->getLand().getMinZ();
  494. F32 radius = 0.5f*fsqrtf(height * height + diagonal_squared);
  495. if (!regionp->getLand().hasZData()
  496. || LLViewerCamera::getInstance()->sphereInFrustum(regionp->getCenterAgent(), radius))
  497. {
  498. mCulledRegionList.erase(curiter);
  499. mVisibleRegionList.push_back(regionp);
  500. }
  501. }
  502. // Update all of the visible regions 
  503. for (region_list_t::iterator iter = mVisibleRegionList.begin();
  504.  iter != mVisibleRegionList.end(); )
  505. {
  506. region_list_t::iterator curiter = iter++;
  507. LLViewerRegion* regionp = *curiter;
  508. if (!regionp->getLand().hasZData())
  509. {
  510. continue;
  511. }
  512. F32 height = regionp->getLand().getMaxZ() - regionp->getLand().getMinZ();
  513. F32 radius = 0.5f*fsqrtf(height * height + diagonal_squared);
  514. if (LLViewerCamera::getInstance()->sphereInFrustum(regionp->getCenterAgent(), radius))
  515. {
  516. regionp->calculateCameraDistance();
  517. if (!gNoRender)
  518. {
  519. regionp->getLand().updatePatchVisibilities(gAgent);
  520. }
  521. }
  522. else
  523. {
  524. mVisibleRegionList.erase(curiter);
  525. mCulledRegionList.push_back(regionp);
  526. }
  527. }
  528. // Sort visible regions
  529. mVisibleRegionList.sort(LLViewerRegion::CompareDistance());
  530. LLViewerCamera::getInstance()->setFar(cur_far_clip);
  531. }
  532. void LLWorld::updateRegions(F32 max_update_time)
  533. {
  534. LLMemType mt_ur(LLMemType::MTYPE_IDLE_UPDATE_REGIONS);
  535. LLTimer update_timer;
  536. BOOL did_one = FALSE;
  537. // Perform idle time updates for the regions (and associated surfaces)
  538. for (region_list_t::iterator iter = mRegionList.begin();
  539.  iter != mRegionList.end(); ++iter)
  540. {
  541. LLViewerRegion* regionp = *iter;
  542. F32 max_time = max_update_time - update_timer.getElapsedTimeF32();
  543. if (did_one && max_time <= 0.f)
  544. break;
  545. max_time = llmin(max_time, max_update_time*.1f);
  546. did_one |= regionp->idleUpdate(max_update_time);
  547. }
  548. }
  549. void LLWorld::updateParticles()
  550. {
  551. LLViewerPartSim::getInstance()->updateSimulation();
  552. }
  553. void LLWorld::updateClouds(const F32 dt)
  554. {
  555. if (gSavedSettings.getBOOL("FreezeTime") ||
  556. !gSavedSettings.getBOOL("SkyUseClassicClouds"))
  557. {
  558. // don't move clouds in snapshot mode
  559. return;
  560. }
  561. if (mActiveRegionList.size())
  562. {
  563. // Update all the cloud puff positions, and timer based stuff
  564. // such as death decay
  565. for (region_list_t::iterator iter = mActiveRegionList.begin();
  566.  iter != mActiveRegionList.end(); ++iter)
  567. {
  568. LLViewerRegion* regionp = *iter;
  569. regionp->mCloudLayer.updatePuffs(dt);
  570. }
  571. // Reshuffle who owns which puffs
  572. for (region_list_t::iterator iter = mActiveRegionList.begin();
  573.  iter != mActiveRegionList.end(); ++iter)
  574. {
  575. LLViewerRegion* regionp = *iter;
  576. regionp->mCloudLayer.updatePuffOwnership();
  577. }
  578. // Add new puffs
  579. for (region_list_t::iterator iter = mActiveRegionList.begin();
  580.  iter != mActiveRegionList.end(); ++iter)
  581. {
  582. LLViewerRegion* regionp = *iter;
  583. regionp->mCloudLayer.updatePuffCount();
  584. }
  585. }
  586. }
  587. LLCloudGroup* LLWorld::findCloudGroup(const LLCloudPuff &puff)
  588. {
  589. if (mActiveRegionList.size())
  590. {
  591. // Update all the cloud puff positions, and timer based stuff
  592. // such as death decay
  593. for (region_list_t::iterator iter = mActiveRegionList.begin();
  594.  iter != mActiveRegionList.end(); ++iter)
  595. {
  596. LLViewerRegion* regionp = *iter;
  597. LLCloudGroup *groupp = regionp->mCloudLayer.findCloudGroup(puff);
  598. if (groupp)
  599. {
  600. return groupp;
  601. }
  602. }
  603. }
  604. return NULL;
  605. }
  606. void LLWorld::renderPropertyLines()
  607. {
  608. S32 region_count = 0;
  609. S32 vertex_count = 0;
  610. for (region_list_t::iterator iter = mVisibleRegionList.begin();
  611.  iter != mVisibleRegionList.end(); ++iter)
  612. {
  613. LLViewerRegion* regionp = *iter;
  614. region_count++;
  615. vertex_count += regionp->renderPropertyLines();
  616. }
  617. }
  618. void LLWorld::updateNetStats()
  619. {
  620. F32 bits = 0.f;
  621. U32 packets = 0;
  622. for (region_list_t::iterator iter = mActiveRegionList.begin();
  623.  iter != mActiveRegionList.end(); ++iter)
  624. {
  625. LLViewerRegion* regionp = *iter;
  626. regionp->updateNetStats();
  627. bits += regionp->mBitStat.getCurrent();
  628. packets += llfloor( regionp->mPacketsStat.getCurrent() );
  629. }
  630. S32 packets_in = gMessageSystem->mPacketsIn - mLastPacketsIn;
  631. S32 packets_out = gMessageSystem->mPacketsOut - mLastPacketsOut;
  632. S32 packets_lost = gMessageSystem->mDroppedPackets - mLastPacketsLost;
  633. S32 actual_in_bits = gMessageSystem->mPacketRing.getAndResetActualInBits();
  634. S32 actual_out_bits = gMessageSystem->mPacketRing.getAndResetActualOutBits();
  635. LLViewerStats::getInstance()->mActualInKBitStat.addValue(actual_in_bits/1024.f);
  636. LLViewerStats::getInstance()->mActualOutKBitStat.addValue(actual_out_bits/1024.f);
  637. LLViewerStats::getInstance()->mKBitStat.addValue(bits/1024.f);
  638. LLViewerStats::getInstance()->mPacketsInStat.addValue(packets_in);
  639. LLViewerStats::getInstance()->mPacketsOutStat.addValue(packets_out);
  640. LLViewerStats::getInstance()->mPacketsLostStat.addValue(gMessageSystem->mDroppedPackets);
  641. if (packets_in)
  642. {
  643. LLViewerStats::getInstance()->mPacketsLostPercentStat.addValue(100.f*((F32)packets_lost/(F32)packets_in));
  644. }
  645. else
  646. {
  647. LLViewerStats::getInstance()->mPacketsLostPercentStat.addValue(0.f);
  648. }
  649. mLastPacketsIn = gMessageSystem->mPacketsIn;
  650. mLastPacketsOut = gMessageSystem->mPacketsOut;
  651. mLastPacketsLost = gMessageSystem->mDroppedPackets;
  652. }
  653. void LLWorld::printPacketsLost()
  654. {
  655. llinfos << "Simulators:" << llendl;
  656. llinfos << "----------" << llendl;
  657. LLCircuitData *cdp = NULL;
  658. for (region_list_t::iterator iter = mActiveRegionList.begin();
  659.  iter != mActiveRegionList.end(); ++iter)
  660. {
  661. LLViewerRegion* regionp = *iter;
  662. cdp = gMessageSystem->mCircuitInfo.findCircuit(regionp->getHost());
  663. if (cdp)
  664. {
  665. LLVector3d range = regionp->getCenterGlobal() - gAgent.getPositionGlobal();
  666. llinfos << regionp->getHost() << ", range: " << range.length()
  667. << " packets lost: " << cdp->getPacketsLost() << llendl;
  668. }
  669. }
  670. }
  671. void LLWorld::processCoarseUpdate(LLMessageSystem* msg, void** user_data)
  672. {
  673. LLViewerRegion* region = LLWorld::getInstance()->getRegion(msg->getSender());
  674. if( region )
  675. {
  676. region->updateCoarseLocations(msg);
  677. }
  678. }
  679. F32 LLWorld::getLandFarClip() const
  680. {
  681. return mLandFarClip;
  682. }
  683. void LLWorld::setLandFarClip(const F32 far_clip)
  684. {
  685. mLandFarClip = far_clip;
  686. }
  687. void LLWorld::updateWaterObjects()
  688. {
  689. if (!gAgent.getRegion())
  690. {
  691. return;
  692. }
  693. if (mRegionList.empty())
  694. {
  695. llwarns << "No regions!" << llendl;
  696. return;
  697. }
  698. // First, determine the min and max "box" of water objects
  699. S32 min_x = 0;
  700. S32 min_y = 0;
  701. S32 max_x = 0;
  702. S32 max_y = 0;
  703. U32 region_x, region_y;
  704. S32 rwidth = 256;
  705. // We only want to fill in water for stuff that's near us, say, within 256 or 512m
  706. S32 range = LLViewerCamera::getInstance()->getFar() > 256.f ? 512 : 256;
  707. LLViewerRegion* regionp = gAgent.getRegion();
  708. from_region_handle(regionp->getHandle(), &region_x, &region_y);
  709. min_x = (S32)region_x - range;
  710. min_y = (S32)region_y - range;
  711. max_x = (S32)region_x + range;
  712. max_y = (S32)region_y + range;
  713. F32 height = 0.f;
  714. for (region_list_t::iterator iter = mRegionList.begin();
  715.  iter != mRegionList.end(); ++iter)
  716. {
  717. LLViewerRegion* regionp = *iter;
  718. LLVOWater* waterp = regionp->getLand().getWaterObj();
  719. height += regionp->getWaterHeight();
  720. if (waterp)
  721. {
  722. gObjectList.updateActive(waterp);
  723. }
  724. }
  725. for (std::list<LLVOWater*>::iterator iter = mHoleWaterObjects.begin();
  726.  iter != mHoleWaterObjects.end(); ++ iter)
  727. {
  728. LLVOWater* waterp = *iter;
  729. gObjectList.killObject(waterp);
  730. }
  731. mHoleWaterObjects.clear();
  732. // Now, get a list of the holes
  733. S32 x, y;
  734. for (x = min_x; x <= max_x; x += rwidth)
  735. {
  736. for (y = min_y; y <= max_y; y += rwidth)
  737. {
  738. U64 region_handle = to_region_handle(x, y);
  739. if (!getRegionFromHandle(region_handle))
  740. {
  741. LLVOWater* waterp = (LLVOWater *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_WATER, gAgent.getRegion());
  742. waterp->setUseTexture(FALSE);
  743. waterp->setPositionGlobal(LLVector3d(x + rwidth/2,
  744.  y + rwidth/2,
  745.  256.f+DEFAULT_WATER_HEIGHT));
  746. waterp->setScale(LLVector3((F32)rwidth, (F32)rwidth, 512.f));
  747. gPipeline.createObject(waterp);
  748. mHoleWaterObjects.push_back(waterp);
  749. }
  750. }
  751. }
  752. // Update edge water objects
  753. S32 wx, wy;
  754. S32 center_x, center_y;
  755. wx = (max_x - min_x) + rwidth;
  756. wy = (max_y - min_y) + rwidth;
  757. center_x = min_x + (wx >> 1);
  758. center_y = min_y + (wy >> 1);
  759. S32 add_boundary[4] = {
  760. 512 - (max_x - region_x),
  761. 512 - (max_y - region_y),
  762. 512 - (region_x - min_x),
  763. 512 - (region_y - min_y) };
  764. S32 dir;
  765. for (dir = 0; dir < 8; dir++)
  766. {
  767. S32 dim[2] = { 0 };
  768. switch (gDirAxes[dir][0])
  769. {
  770. case -1: dim[0] = add_boundary[2]; break;
  771. case  0: dim[0] = wx; break;
  772. default: dim[0] = add_boundary[0]; break;
  773. }
  774. switch (gDirAxes[dir][1])
  775. {
  776. case -1: dim[1] = add_boundary[3]; break;
  777. case  0: dim[1] = wy; break;
  778. default: dim[1] = add_boundary[1]; break;
  779. }
  780. // Resize and reshape the water objects
  781. const S32 water_center_x = center_x + llround((wx + dim[0]) * 0.5f * gDirAxes[dir][0]);
  782. const S32 water_center_y = center_y + llround((wy + dim[1]) * 0.5f * gDirAxes[dir][1]);
  783. LLVOWater* waterp = mEdgeWaterObjects[dir];
  784. if (!waterp || waterp->isDead())
  785. {
  786. // The edge water objects can be dead because they're attached to the region that the
  787. // agent was in when they were originally created.
  788. mEdgeWaterObjects[dir] = (LLVOWater *)gObjectList.createObjectViewer(LLViewerObject::LL_VO_WATER,
  789.  gAgent.getRegion());
  790. waterp = mEdgeWaterObjects[dir];
  791. waterp->setUseTexture(FALSE);
  792. waterp->setIsEdgePatch(TRUE);
  793. gPipeline.createObject(waterp);
  794. }
  795. waterp->setRegion(gAgent.getRegion());
  796. LLVector3d water_pos(water_center_x, water_center_y, 
  797. DEFAULT_WATER_HEIGHT+256.f);
  798. LLVector3 water_scale((F32) dim[0], (F32) dim[1], 512.f);
  799. //stretch out to horizon
  800. water_scale.mV[0] += fabsf(2048.f * gDirAxes[dir][0]);
  801. water_scale.mV[1] += fabsf(2048.f * gDirAxes[dir][1]);
  802. water_pos.mdV[0] += 1024.f * gDirAxes[dir][0];
  803. water_pos.mdV[1] += 1024.f * gDirAxes[dir][1];
  804. waterp->setPositionGlobal(water_pos);
  805. waterp->setScale(water_scale);
  806. gObjectList.updateActive(waterp);
  807. }
  808. }
  809. void LLWorld::shiftRegions(const LLVector3& offset)
  810. {
  811. for (region_list_t::const_iterator i = getRegionList().begin(); i != getRegionList().end(); ++i)
  812. {
  813. LLViewerRegion* region = *i;
  814. region->updateRenderMatrix();
  815. }
  816. LLViewerPartSim::getInstance()->shift(offset);
  817. }
  818. LLViewerTexture* LLWorld::getDefaultWaterTexture()
  819. {
  820. return mDefaultWaterTexturep;
  821. }
  822. void LLWorld::setSpaceTimeUSec(const U64 space_time_usec)
  823. {
  824. mSpaceTimeUSec = space_time_usec;
  825. }
  826. U64 LLWorld::getSpaceTimeUSec() const
  827. {
  828. return mSpaceTimeUSec;
  829. }
  830. void LLWorld::requestCacheMisses()
  831. {
  832. for (region_list_t::iterator iter = mRegionList.begin();
  833.  iter != mRegionList.end(); ++iter)
  834. {
  835. LLViewerRegion* regionp = *iter;
  836. regionp->requestCacheMisses();
  837. }
  838. }
  839. void LLWorld::getInfo(LLSD& info)
  840. {
  841. LLSD region_info;
  842. for (region_list_t::iterator iter = mRegionList.begin();
  843.  iter != mRegionList.end(); ++iter)
  844. {
  845. LLViewerRegion* regionp = *iter;
  846. regionp->getInfo(region_info);
  847. info["World"].append(region_info);
  848. }
  849. }
  850. void LLWorld::disconnectRegions()
  851. {
  852. LLMessageSystem* msg = gMessageSystem;
  853. for (region_list_t::iterator iter = mRegionList.begin();
  854.  iter != mRegionList.end(); ++iter)
  855. {
  856. LLViewerRegion* regionp = *iter;
  857. if (regionp == gAgent.getRegion())
  858. {
  859. // Skip the main agent
  860. continue;
  861. }
  862. llinfos << "Sending AgentQuitCopy to: " << regionp->getHost() << llendl;
  863. msg->newMessageFast(_PREHASH_AgentQuitCopy);
  864. msg->nextBlockFast(_PREHASH_AgentData);
  865. msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
  866. msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  867. msg->nextBlockFast(_PREHASH_FuseBlock);
  868. msg->addU32Fast(_PREHASH_ViewerCircuitCode, gMessageSystem->mOurCircuitCode);
  869. msg->sendMessage(regionp->getHost());
  870. }
  871. }
  872. void process_enable_simulator(LLMessageSystem *msg, void **user_data)
  873. {
  874. // enable the appropriate circuit for this simulator and 
  875. // add its values into the gSimulator structure
  876. U64 handle;
  877. U32 ip_u32;
  878. U16 port;
  879. msg->getU64Fast(_PREHASH_SimulatorInfo, _PREHASH_Handle, handle);
  880. msg->getIPAddrFast(_PREHASH_SimulatorInfo, _PREHASH_IP, ip_u32);
  881. msg->getIPPortFast(_PREHASH_SimulatorInfo, _PREHASH_Port, port);
  882. // which simulator should we modify?
  883. LLHost sim(ip_u32, port);
  884. // Viewer trusts the simulator.
  885. msg->enableCircuit(sim, TRUE);
  886. LLWorld::getInstance()->addRegion(handle, sim);
  887. // give the simulator a message it can use to get ip and port
  888. llinfos << "simulator_enable() Enabling " << sim << " with code " << msg->getOurCircuitCode() << llendl;
  889. msg->newMessageFast(_PREHASH_UseCircuitCode);
  890. msg->nextBlockFast(_PREHASH_CircuitCode);
  891. msg->addU32Fast(_PREHASH_Code, msg->getOurCircuitCode());
  892. msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  893. msg->addUUIDFast(_PREHASH_ID, gAgent.getID());
  894. msg->sendReliable(sim);
  895. }
  896. class LLEstablishAgentCommunication : public LLHTTPNode
  897. {
  898. LOG_CLASS(LLEstablishAgentCommunication);
  899. public:
  900.   virtual void describe(Description& desc) const
  901. {
  902. desc.shortInfo("seed capability info for a region");
  903. desc.postAPI();
  904. desc.input(
  905. "{ seed-capability: ..., sim-ip: ..., sim-port }");
  906. desc.source(__FILE__, __LINE__);
  907. }
  908. virtual void post(ResponsePtr response, const LLSD& context, const LLSD& input) const
  909. {
  910. if (!input["body"].has("agent-id") ||
  911. !input["body"].has("sim-ip-and-port") ||
  912. !input["body"].has("seed-capability"))
  913. {
  914. llwarns << "invalid parameters" << llendl;
  915.             return;
  916. }
  917. LLHost sim(input["body"]["sim-ip-and-port"].asString());
  918. LLViewerRegion* regionp = LLWorld::getInstance()->getRegion(sim);
  919. if (!regionp)
  920. {
  921. llwarns << "Got EstablishAgentCommunication for unknown region "
  922. << sim << llendl;
  923. return;
  924. }
  925. regionp->setSeedCapability(input["body"]["seed-capability"]);
  926. }
  927. };
  928. // disable the circuit to this simulator
  929. // Called in response to "DisableSimulator" message.
  930. void process_disable_simulator(LLMessageSystem *mesgsys, void **user_data)
  931. {
  932. LLHost host = mesgsys->getSender();
  933. //llinfos << "Disabling simulator with message from " << host << llendl;
  934. LLWorld::getInstance()->removeRegion(host);
  935. mesgsys->disableCircuit(host);
  936. }
  937. void process_region_handshake(LLMessageSystem* msg, void** user_data)
  938. {
  939. LLHost host = msg->getSender();
  940. LLViewerRegion* regionp = LLWorld::getInstance()->getRegion(host);
  941. if (!regionp)
  942. {
  943. llwarns << "Got region handshake for unknown region "
  944. << host << llendl;
  945. return;
  946. }
  947. regionp->unpackRegionHandshake();
  948. }
  949. void send_agent_pause()
  950. {
  951. // *NOTE:Mani Pausing the mainloop timeout. Otherwise a long modal event may cause
  952. // the thread monitor to timeout.
  953. LLAppViewer::instance()->pauseMainloopTimeout();
  954. // Note: used to check for LLWorld initialization before it became a singleton.
  955. // Rather than just remove this check I'm changing it to assure that the message 
  956. // system has been initialized. -MG
  957. if (!gMessageSystem)
  958. {
  959. return;
  960. }
  961. gMessageSystem->newMessageFast(_PREHASH_AgentPause);
  962. gMessageSystem->nextBlockFast(_PREHASH_AgentData);
  963. gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgentID);
  964. gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
  965. gAgentPauseSerialNum++;
  966. gMessageSystem->addU32Fast(_PREHASH_SerialNum, gAgentPauseSerialNum);
  967. for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
  968.  iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
  969. {
  970. LLViewerRegion* regionp = *iter;
  971. gMessageSystem->sendReliable(regionp->getHost());
  972. }
  973. gObjectList.mWasPaused = TRUE;
  974. }
  975. void send_agent_resume()
  976. {
  977. // Note: used to check for LLWorld initialization before it became a singleton.
  978. // Rather than just remove this check I'm changing it to assure that the message 
  979. // system has been initialized. -MG
  980. if (!gMessageSystem)
  981. {
  982. return;
  983. }
  984. gMessageSystem->newMessageFast(_PREHASH_AgentResume);
  985. gMessageSystem->nextBlockFast(_PREHASH_AgentData);
  986. gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgentID);
  987. gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgentSessionID);
  988. gAgentPauseSerialNum++;
  989. gMessageSystem->addU32Fast(_PREHASH_SerialNum, gAgentPauseSerialNum);
  990. for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
  991.  iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
  992. {
  993. LLViewerRegion* regionp = *iter;
  994. gMessageSystem->sendReliable(regionp->getHost());
  995. }
  996. // Reset the FPS counter to avoid an invalid fps
  997. LLViewerStats::getInstance()->mFPSStat.start();
  998. LLAppViewer::instance()->resumeMainloopTimeout();
  999. }
  1000. static LLVector3d unpackLocalToGlobalPosition(U32 compact_local, const LLVector3d& region_origin)
  1001. {
  1002. LLVector3d pos_global;
  1003. LLVector3 pos_local;
  1004. U8 bits;
  1005. bits = compact_local & 0xFF;
  1006. pos_local.mV[VZ] = F32(bits) * 4.f;
  1007. compact_local >>= 8;
  1008. bits = compact_local & 0xFF;
  1009. pos_local.mV[VY] = (F32)bits;
  1010. compact_local >>= 8;
  1011. bits = compact_local & 0xFF;
  1012. pos_local.mV[VX] = (F32)bits;
  1013. pos_global.setVec( pos_local );
  1014. pos_global += region_origin;
  1015. return pos_global;
  1016. }
  1017. void LLWorld::getAvatars(std::vector<LLUUID>* avatar_ids, std::vector<LLVector3d>* positions, const LLVector3d& relative_to, F32 radius) const
  1018. {
  1019. if(avatar_ids != NULL)
  1020. {
  1021. avatar_ids->clear();
  1022. }
  1023. if(positions != NULL)
  1024. {
  1025. positions->clear();
  1026. }
  1027. for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
  1028. iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
  1029. {
  1030. LLViewerRegion* regionp = *iter;
  1031. const LLVector3d& origin_global = regionp->getOriginGlobal();
  1032. S32 count = regionp->mMapAvatars.count();
  1033. for (S32 i = 0; i < count; i++)
  1034. {
  1035. LLVector3d pos_global = unpackLocalToGlobalPosition(regionp->mMapAvatars.get(i), origin_global);
  1036. if(dist_vec(pos_global, relative_to) <= radius)
  1037. {
  1038. if(positions != NULL)
  1039. {
  1040. positions->push_back(pos_global);
  1041. }
  1042. if(avatar_ids != NULL)
  1043. {
  1044. avatar_ids->push_back(regionp->mMapAvatarIDs.get(i));
  1045. }
  1046. }
  1047. }
  1048. }
  1049. }
  1050. LLHTTPRegistration<LLEstablishAgentCommunication>
  1051. gHTTPRegistrationEstablishAgentCommunication(
  1052. "/message/EstablishAgentCommunication");