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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llviewerregion.cpp
  3.  * @brief Implementation of the LLViewerRegion 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. #include "llviewerprecompiledheaders.h"
  33. #include "llviewerregion.h"
  34. #include "indra_constants.h"
  35. #include "llfloaterreg.h"
  36. #include "llmath.h"
  37. #include "llhttpclient.h"
  38. #include "llregionflags.h"
  39. #include "llregionhandle.h"
  40. #include "llsurface.h"
  41. #include "message.h"
  42. //#include "vmath.h"
  43. #include "v3math.h"
  44. #include "v4math.h"
  45. #include "llagent.h"
  46. #include "llcallingcard.h"
  47. #include "llcaphttpsender.h"
  48. #include "lldir.h"
  49. #include "lleventpoll.h"
  50. #include "llfloatergodtools.h"
  51. #include "llfloaterreporter.h"
  52. #include "llfloaterregioninfo.h"
  53. #include "llhttpnode.h"
  54. #include "llsdutil.h"
  55. #include "llstartup.h"
  56. #include "lltrans.h"
  57. #include "llviewerobjectlist.h"
  58. #include "llviewerparceloverlay.h"
  59. #include "llvlmanager.h"
  60. #include "llvlcomposition.h"
  61. #include "llvocache.h"
  62. #include "llvoclouds.h"
  63. #include "llworld.h"
  64. #include "llspatialpartition.h"
  65. #include "stringize.h"
  66. #ifdef LL_WINDOWS
  67. #pragma warning(disable:4355)
  68. #endif
  69. // Viewer object cache version, change if object update
  70. // format changes. JC
  71. const U32 INDRA_OBJECT_CACHE_VERSION = 14;
  72. extern BOOL gNoRender;
  73. const F32 WATER_TEXTURE_SCALE = 8.f; //  Number of times to repeat the water texture across a region
  74. const S16 MAX_MAP_DIST = 10;
  75. class BaseCapabilitiesComplete : public LLHTTPClient::Responder
  76. {
  77. LOG_CLASS(BaseCapabilitiesComplete);
  78. public:
  79.     BaseCapabilitiesComplete(LLViewerRegion* region)
  80. : mRegion(region)
  81.     { }
  82. virtual ~BaseCapabilitiesComplete()
  83. {
  84. if(mRegion)
  85. {
  86. mRegion->setHttpResponderPtrNULL() ;
  87. }
  88. }
  89. void setRegion(LLViewerRegion* region)
  90. {
  91. mRegion = region ;
  92. }
  93.     void error(U32 statusNum, const std::string& reason)
  94.     {
  95. LL_WARNS2("AppInit", "Capabilities") << statusNum << ": " << reason << LL_ENDL;
  96. if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState())
  97. {
  98. LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED );
  99. }
  100.     }
  101.     void result(const LLSD& content)
  102.     {
  103. if(!mRegion || LLHTTPClient::ResponderPtr(this) != mRegion->getHttpResponderPtr()) //region is removed or responder is not created.
  104. {
  105. return ;
  106. }
  107. LLSD::map_const_iterator iter;
  108. for(iter = content.beginMap(); iter != content.endMap(); ++iter)
  109. {
  110. mRegion->setCapability(iter->first, iter->second);
  111. LL_DEBUGS2("AppInit", "Capabilities") << "got capability for " 
  112. << iter->first << LL_ENDL;
  113. /* HACK we're waiting for the ServerReleaseNotes */
  114. if (iter->first == "ServerReleaseNotes" && mRegion->getReleaseNotesRequested())
  115. {
  116. mRegion->showReleaseNotes();
  117. }
  118. }
  119. if (STATE_SEED_GRANTED_WAIT == LLStartUp::getStartupState())
  120. {
  121. LLStartUp::setStartupState( STATE_SEED_CAP_GRANTED );
  122. }
  123. }
  124.     static boost::intrusive_ptr<BaseCapabilitiesComplete> build(
  125. LLViewerRegion* region)
  126.     {
  127. return boost::intrusive_ptr<BaseCapabilitiesComplete>(
  128.  new BaseCapabilitiesComplete(region));
  129.     }
  130. private:
  131. LLViewerRegion* mRegion;
  132. };
  133. LLViewerRegion::LLViewerRegion(const U64 &handle,
  134.    const LLHost &host,
  135.    const U32 grids_per_region_edge, 
  136.    const U32 grids_per_patch_edge, 
  137.    const F32 region_width_meters)
  138. : mCenterGlobal(),
  139. mHandle(handle),
  140. mHost( host ),
  141. mTimeDilation(1.0f),
  142. mName(""),
  143. mZoning(""),
  144. mOwnerID(),
  145. mIsEstateManager(FALSE),
  146. mCompositionp(NULL),
  147. mRegionFlags( REGION_FLAGS_DEFAULT ),
  148. mSimAccess( SIM_ACCESS_MIN ),
  149. mBillableFactor(1.0),
  150. mMaxTasks(DEFAULT_MAX_REGION_WIDE_PRIM_COUNT),
  151. mClassID(0),
  152. mCPURatio(0),
  153. mColoName("unknown"),
  154. mProductSKU("unknown"),
  155. mProductName("unknown"),
  156. mCacheLoaded(FALSE),
  157. mCacheEntriesCount(0),
  158. mCacheID(),
  159. mEventPoll(NULL),
  160. mReleaseNotesRequested(FALSE),
  161.     // I'd prefer to set the LLCapabilityListener name to match the region
  162.     // name -- it's disappointing that's not available at construction time.
  163.     // We could instead store an LLCapabilityListener*, making
  164.     // setRegionNameAndZone() replace the instance. Would that pose
  165.     // consistency problems? Can we even request a capability before calling
  166.     // setRegionNameAndZone()?
  167.     // For testability -- the new Michael Feathers paradigm --
  168.     // LLCapabilityListener binds all the globals it expects to need at
  169.     // construction time.
  170.     mCapabilityListener(host.getString(), gMessageSystem, *this,
  171.                         gAgent.getID(), gAgent.getSessionID())
  172. {
  173. mWidth = region_width_meters;
  174. mOriginGlobal = from_region_handle(handle); 
  175. updateRenderMatrix();
  176. mLandp = new LLSurface('l', NULL);
  177. if (!gNoRender)
  178. {
  179. // Create the composition layer for the surface
  180. mCompositionp = new LLVLComposition(mLandp, grids_per_region_edge, region_width_meters/grids_per_region_edge);
  181. mCompositionp->setSurface(mLandp);
  182. // Create the surfaces
  183. mLandp->setRegion(this);
  184. mLandp->create(grids_per_region_edge,
  185. grids_per_patch_edge,
  186. mOriginGlobal,
  187. mWidth);
  188. }
  189. if (!gNoRender)
  190. {
  191. mParcelOverlay = new LLViewerParcelOverlay(this, region_width_meters);
  192. }
  193. else
  194. {
  195. mParcelOverlay = NULL;
  196. }
  197. setOriginGlobal(from_region_handle(handle));
  198. calculateCenterGlobal();
  199. // Create the object lists
  200. initStats();
  201. mCacheStart.append(mCacheEnd);
  202. //create object partitions
  203. //MUST MATCH declaration of eObjectPartitions
  204. mObjectPartition.push_back(new LLHUDPartition()); //PARTITION_HUD
  205. mObjectPartition.push_back(new LLTerrainPartition()); //PARTITION_TERRAIN
  206. mObjectPartition.push_back(new LLWaterPartition()); //PARTITION_WATER
  207. mObjectPartition.push_back(new LLTreePartition()); //PARTITION_TREE
  208. mObjectPartition.push_back(new LLParticlePartition()); //PARTITION_PARTICLE
  209. mObjectPartition.push_back(new LLCloudPartition()); //PARTITION_CLOUD
  210. mObjectPartition.push_back(new LLGrassPartition()); //PARTITION_GRASS
  211. mObjectPartition.push_back(new LLVolumePartition()); //PARTITION_VOLUME
  212. mObjectPartition.push_back(new LLBridgePartition()); //PARTITION_BRIDGE
  213. mObjectPartition.push_back(new LLHUDParticlePartition());//PARTITION_HUD_PARTICLE
  214. mObjectPartition.push_back(NULL); //PARTITION_NONE
  215. }
  216. void LLViewerRegion::initStats()
  217. {
  218. mLastNetUpdate.reset();
  219. mPacketsIn = 0;
  220. mBitsIn = 0;
  221. mLastBitsIn = 0;
  222. mLastPacketsIn = 0;
  223. mPacketsOut = 0;
  224. mLastPacketsOut = 0;
  225. mPacketsLost = 0;
  226. mLastPacketsLost = 0;
  227. mPingDelay = 0;
  228. mAlive = false; // can become false if circuit disconnects
  229. }
  230. LLViewerRegion::~LLViewerRegion() 
  231. {
  232. if(mHttpResponderPtr)
  233. {
  234. (static_cast<BaseCapabilitiesComplete*>(mHttpResponderPtr.get()))->setRegion(NULL) ;
  235. }
  236. gVLManager.cleanupData(this);
  237. // Can't do this on destruction, because the neighbor pointers might be invalid.
  238. // This should be reference counted...
  239. disconnectAllNeighbors();
  240. mCloudLayer.destroy();
  241. LLViewerPartSim::getInstance()->cleanupRegion(this);
  242. gObjectList.killObjects(this);
  243. delete mCompositionp;
  244. delete mParcelOverlay;
  245. delete mLandp;
  246. delete mEventPoll;
  247. LLHTTPSender::clearSender(mHost);
  248. saveCache();
  249. std::for_each(mObjectPartition.begin(), mObjectPartition.end(), DeletePointer());
  250. }
  251. void LLViewerRegion::loadCache()
  252. {
  253. if (mCacheLoaded)
  254. {
  255. return;
  256. }
  257. // Presume success.  If it fails, we don't want to try again.
  258. mCacheLoaded = TRUE;
  259. LLVOCacheEntry *entry;
  260. std::string filename;
  261. filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"") + gDirUtilp->getDirDelimiter() +
  262. llformat("objects_%d_%d.slc",U32(mHandle>>32)/REGION_WIDTH_UNITS, U32(mHandle)/REGION_WIDTH_UNITS );
  263. LLFILE* fp = LLFile::fopen(filename, "rb"); /* Flawfinder: ignore */
  264. if (!fp)
  265. {
  266. // might not have a file, which is normal
  267. return;
  268. }
  269. U32 zero;
  270. size_t nread;
  271. nread = fread(&zero, sizeof(U32), 1, fp);
  272. if (nread != 1 || zero)
  273. {
  274. // a non-zero value here means bad things!
  275. // skip reading the cached values
  276. llinfos << "Cache file invalid" << llendl;
  277. fclose(fp);
  278. return;
  279. }
  280. U32 version;
  281. nread = fread(&version, sizeof(U32), 1, fp);
  282. if (nread != 1 || version != INDRA_OBJECT_CACHE_VERSION)
  283. {
  284. // a version mismatch here means we've changed the binary format!
  285. // skip reading the cached values
  286. llinfos << "Cache version changed, discarding" << llendl;
  287. fclose(fp);
  288. return;
  289. }
  290. LLUUID cache_id;
  291. nread = fread(&cache_id.mData, 1, UUID_BYTES, fp);
  292. if (nread != (size_t)UUID_BYTES || mCacheID != cache_id)
  293. {
  294. llinfos << "Cache ID doesn't match for this region, discarding"
  295. << llendl;
  296. fclose(fp);
  297. return;
  298. }
  299. S32 num_entries;
  300. nread = fread(&num_entries, sizeof(S32), 1, fp);
  301. if (nread != 1)
  302. {
  303. llinfos << "Short read, discarding" << llendl;
  304. fclose(fp);
  305. return;
  306. }
  307. S32 i;
  308. for (i = 0; i < num_entries; i++)
  309. {
  310. entry = new LLVOCacheEntry(fp);
  311. if (!entry->getLocalID())
  312. {
  313. llwarns << "Aborting cache file load for " << filename << ", cache file corruption!" << llendl;
  314. delete entry;
  315. entry = NULL;
  316. break;
  317. }
  318. mCacheEnd.insert(*entry);
  319. mCacheMap[entry->getLocalID()] = entry;
  320. mCacheEntriesCount++;
  321. }
  322. fclose(fp);
  323. }
  324. void LLViewerRegion::saveCache()
  325. {
  326. if (!mCacheLoaded)
  327. {
  328. return;
  329. }
  330. S32 num_entries = mCacheEntriesCount;
  331. if (0 == num_entries)
  332. {
  333. return;
  334. }
  335. std::string filename;
  336. filename = gDirUtilp->getExpandedFilename(LL_PATH_CACHE,"") + gDirUtilp->getDirDelimiter() +
  337. llformat("sobjects_%d_%d.slc", U32(mHandle>>32)/REGION_WIDTH_UNITS, U32(mHandle)/REGION_WIDTH_UNITS );
  338. LLFILE* fp = LLFile::fopen(filename, "wb"); /* Flawfinder: ignore */
  339. if (!fp)
  340. {
  341. llwarns << "Unable to write cache file " << filename << llendl;
  342. return;
  343. }
  344. // write out zero to indicate a version cache file
  345. U32 zero = 0;
  346. if (fwrite(&zero, sizeof(U32), 1, fp) != 1)
  347. {
  348. llwarns << "Short write" << llendl;
  349. }
  350. // write out version number
  351. U32 version = INDRA_OBJECT_CACHE_VERSION;
  352. if (fwrite(&version, sizeof(U32), 1, fp) != 1)
  353. {
  354. llwarns << "Short write" << llendl;
  355. }
  356. // write the cache id for this sim
  357. if (fwrite(&mCacheID.mData, 1, UUID_BYTES, fp) != (size_t)UUID_BYTES)
  358. {
  359. llwarns << "Short write" << llendl;
  360. }
  361. if (fwrite(&num_entries, sizeof(S32), 1, fp) != 1)
  362. {
  363. llwarns << "Short write" << llendl;
  364. }
  365. LLVOCacheEntry *entry;
  366. for (entry = mCacheStart.getNext(); entry && (entry != &mCacheEnd); entry = entry->getNext())
  367. {
  368. entry->writeToFile(fp);
  369. }
  370. mCacheMap.clear();
  371. mCacheEnd.unlink();
  372. mCacheEnd.init();
  373. mCacheStart.deleteAll();
  374. mCacheStart.init();
  375. fclose(fp);
  376. }
  377. void LLViewerRegion::sendMessage()
  378. {
  379. gMessageSystem->sendMessage(mHost);
  380. }
  381. void LLViewerRegion::sendReliableMessage()
  382. {
  383. gMessageSystem->sendReliable(mHost);
  384. }
  385. void LLViewerRegion::setFlags(BOOL b, U32 flags)
  386. {
  387. if (b)
  388. {
  389. mRegionFlags |=  flags;
  390. }
  391. else
  392. {
  393. mRegionFlags &= ~flags;
  394. }
  395. }
  396. void LLViewerRegion::setWaterHeight(F32 water_level)
  397. {
  398. mLandp->setWaterHeight(water_level);
  399. }
  400. F32 LLViewerRegion::getWaterHeight() const
  401. {
  402. return mLandp->getWaterHeight();
  403. }
  404. BOOL LLViewerRegion::isVoiceEnabled() const
  405. {
  406. return (getRegionFlags() & REGION_FLAGS_ALLOW_VOICE);
  407. }
  408. void LLViewerRegion::setRegionFlags(U32 flags)
  409. {
  410. mRegionFlags = flags;
  411. }
  412. void LLViewerRegion::setOriginGlobal(const LLVector3d &origin_global) 
  413. mOriginGlobal = origin_global; 
  414. updateRenderMatrix();
  415. mLandp->setOriginGlobal(origin_global);
  416. mWind.setOriginGlobal(origin_global);
  417. mCloudLayer.setOriginGlobal(origin_global);
  418. calculateCenterGlobal();
  419. }
  420. void LLViewerRegion::updateRenderMatrix()
  421. {
  422. mRenderMatrix.setTranslation(getOriginAgent());
  423. }
  424. void LLViewerRegion::setTimeDilation(F32 time_dilation)
  425. {
  426. mTimeDilation = time_dilation;
  427. }
  428. LLVector3 LLViewerRegion::getOriginAgent() const
  429. {
  430. return gAgent.getPosAgentFromGlobal(mOriginGlobal);
  431. }
  432. LLVector3 LLViewerRegion::getCenterAgent() const
  433. {
  434. return gAgent.getPosAgentFromGlobal(mCenterGlobal);
  435. }
  436. void LLViewerRegion::setRegionNameAndZone (const std::string& name_zone)
  437. {
  438. std::string::size_type pipe_pos = name_zone.find('|');
  439. S32 length   = name_zone.size();
  440. if (pipe_pos != std::string::npos)
  441. {
  442. mName   = name_zone.substr(0, pipe_pos);
  443. mZoning = name_zone.substr(pipe_pos+1, length-(pipe_pos+1));
  444. }
  445. else
  446. {
  447. mName   = name_zone;
  448. mZoning = "";
  449. }
  450. LLStringUtil::stripNonprintable(mName);
  451. LLStringUtil::stripNonprintable(mZoning);
  452. }
  453. BOOL LLViewerRegion::canManageEstate() const
  454. {
  455. return gAgent.isGodlike()
  456. || isEstateManager()
  457. || gAgent.getID() == getOwner();
  458. }
  459. const std::string LLViewerRegion::getSimAccessString() const
  460. {
  461. return accessToString(mSimAccess);
  462. }
  463. // static
  464. std::string LLViewerRegion::regionFlagsToString(U32 flags)
  465. {
  466. std::string result;
  467. if (flags & REGION_FLAGS_SANDBOX)
  468. {
  469. result += "Sandbox";
  470. }
  471. if (flags & REGION_FLAGS_ALLOW_DAMAGE)
  472. {
  473. result += " Not Safe";
  474. }
  475. return result;
  476. }
  477. // static
  478. std::string LLViewerRegion::accessToString(U8 sim_access)
  479. {
  480. switch(sim_access)
  481. {
  482. case SIM_ACCESS_PG:
  483. return LLTrans::getString("SIM_ACCESS_PG");
  484. case SIM_ACCESS_MATURE:
  485. return LLTrans::getString("SIM_ACCESS_MATURE");
  486. case SIM_ACCESS_ADULT:
  487. return LLTrans::getString("SIM_ACCESS_ADULT");
  488. case SIM_ACCESS_DOWN:
  489. return LLTrans::getString("SIM_ACCESS_DOWN");
  490. case SIM_ACCESS_MIN:
  491. default:
  492. return LLTrans::getString("SIM_ACCESS_MIN");
  493. }
  494. }
  495. // static
  496. std::string LLViewerRegion::accessToShortString(U8 sim_access)
  497. {
  498. switch(sim_access) /* Flawfinder: ignore */
  499. {
  500. case SIM_ACCESS_PG:
  501. return "PG";
  502. case SIM_ACCESS_MATURE:
  503. return "M";
  504. case SIM_ACCESS_ADULT:
  505. return "A";
  506. case SIM_ACCESS_MIN:
  507. default:
  508. return "U";
  509. }
  510. }
  511. // static
  512. void LLViewerRegion::processRegionInfo(LLMessageSystem* msg, void**)
  513. {
  514. // send it to 'observers'
  515. LLFloaterGodTools::processRegionInfo(msg);
  516. LLFloaterRegionInfo::processRegionInfo(msg);
  517. LLFloaterReporter::processRegionInfo(msg);
  518. }
  519. S32 LLViewerRegion::renderPropertyLines()
  520. {
  521. if (mParcelOverlay)
  522. {
  523. return mParcelOverlay->renderPropertyLines();
  524. }
  525. else
  526. {
  527. return 0;
  528. }
  529. }
  530. // This gets called when the height field changes.
  531. void LLViewerRegion::dirtyHeights()
  532. {
  533. // Property lines need to be reconstructed when the land changes.
  534. if (mParcelOverlay)
  535. {
  536. mParcelOverlay->setDirty();
  537. }
  538. }
  539. BOOL LLViewerRegion::idleUpdate(F32 max_update_time)
  540. {
  541. LLMemType mt_ivr(LLMemType::MTYPE_IDLE_UPDATE_VIEWER_REGION);
  542. // did_update returns TRUE if we did at least one significant update
  543. BOOL did_update = mLandp->idleUpdate(max_update_time);
  544. if (mParcelOverlay)
  545. {
  546. // Hopefully not a significant time sink...
  547. mParcelOverlay->idleUpdate();
  548. }
  549. return did_update;
  550. }
  551. // As above, but forcibly do the update.
  552. void LLViewerRegion::forceUpdate()
  553. {
  554. mLandp->idleUpdate(0.f);
  555. if (mParcelOverlay)
  556. {
  557. mParcelOverlay->idleUpdate(true);
  558. }
  559. }
  560. void LLViewerRegion::connectNeighbor(LLViewerRegion *neighborp, U32 direction)
  561. {
  562. mLandp->connectNeighbor(neighborp->mLandp, direction);
  563. mCloudLayer.connectNeighbor(&(neighborp->mCloudLayer), direction);
  564. }
  565. void LLViewerRegion::disconnectAllNeighbors()
  566. {
  567. mLandp->disconnectAllNeighbors();
  568. mCloudLayer.disconnectAllNeighbors();
  569. }
  570. F32 LLViewerRegion::getCompositionXY(const S32 x, const S32 y) const
  571. {
  572. if (x >= 256)
  573. {
  574. if (y >= 256)
  575. {
  576. LLVector3d center = getCenterGlobal() + LLVector3d(256.f, 256.f, 0.f);
  577. LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromPosGlobal(center);
  578. if (regionp)
  579. {
  580. // OK, we need to do some hackery here - different simulators no longer use
  581. // the same composition values, necessarily.
  582. // If we're attempting to blend, then we want to make the fractional part of
  583. // this region match the fractional of the adjacent.  For now, just minimize
  584. // the delta.
  585. F32 our_comp = getComposition()->getValueScaled(255, 255);
  586. F32 adj_comp = regionp->getComposition()->getValueScaled(x - 256.f, y - 256.f);
  587. while (llabs(our_comp - adj_comp) >= 1.f)
  588. {
  589. if (our_comp > adj_comp)
  590. {
  591. adj_comp += 1.f;
  592. }
  593. else
  594. {
  595. adj_comp -= 1.f;
  596. }
  597. }
  598. return adj_comp;
  599. }
  600. }
  601. else
  602. {
  603. LLVector3d center = getCenterGlobal() + LLVector3d(256.f, 0, 0.f);
  604. LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromPosGlobal(center);
  605. if (regionp)
  606. {
  607. // OK, we need to do some hackery here - different simulators no longer use
  608. // the same composition values, necessarily.
  609. // If we're attempting to blend, then we want to make the fractional part of
  610. // this region match the fractional of the adjacent.  For now, just minimize
  611. // the delta.
  612. F32 our_comp = getComposition()->getValueScaled(255.f, (F32)y);
  613. F32 adj_comp = regionp->getComposition()->getValueScaled(x - 256.f, (F32)y);
  614. while (llabs(our_comp - adj_comp) >= 1.f)
  615. {
  616. if (our_comp > adj_comp)
  617. {
  618. adj_comp += 1.f;
  619. }
  620. else
  621. {
  622. adj_comp -= 1.f;
  623. }
  624. }
  625. return adj_comp;
  626. }
  627. }
  628. }
  629. else if (y >= 256)
  630. {
  631. LLVector3d center = getCenterGlobal() + LLVector3d(0.f, 256.f, 0.f);
  632. LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromPosGlobal(center);
  633. if (regionp)
  634. {
  635. // OK, we need to do some hackery here - different simulators no longer use
  636. // the same composition values, necessarily.
  637. // If we're attempting to blend, then we want to make the fractional part of
  638. // this region match the fractional of the adjacent.  For now, just minimize
  639. // the delta.
  640. F32 our_comp = getComposition()->getValueScaled((F32)x, 255.f);
  641. F32 adj_comp = regionp->getComposition()->getValueScaled((F32)x, y - 256.f);
  642. while (llabs(our_comp - adj_comp) >= 1.f)
  643. {
  644. if (our_comp > adj_comp)
  645. {
  646. adj_comp += 1.f;
  647. }
  648. else
  649. {
  650. adj_comp -= 1.f;
  651. }
  652. }
  653. return adj_comp;
  654. }
  655. }
  656. return getComposition()->getValueScaled((F32)x, (F32)y);
  657. }
  658. void LLViewerRegion::calculateCenterGlobal() 
  659. {
  660. mCenterGlobal = mOriginGlobal;
  661. mCenterGlobal.mdV[VX] += 0.5 * mWidth;
  662. mCenterGlobal.mdV[VY] += 0.5 * mWidth;
  663. mCenterGlobal.mdV[VZ] = 0.5*mLandp->getMinZ() + mLandp->getMaxZ();
  664. }
  665. void LLViewerRegion::calculateCameraDistance()
  666. {
  667. mCameraDistanceSquared = (F32)(gAgent.getCameraPositionGlobal() - getCenterGlobal()).magVecSquared();
  668. }
  669. std::ostream& operator<<(std::ostream &s, const LLViewerRegion &region)
  670. {
  671. s << "{ ";
  672. s << region.mHost;
  673. s << " mOriginGlobal = " << region.getOriginGlobal()<< "n";
  674.     std::string name(region.getName()), zone(region.getZoning());
  675.     if (! name.empty())
  676.     {
  677.         s << " mName         = " << name << 'n';
  678.     }
  679.     if (! zone.empty())
  680.     {
  681.         s << " mZoning       = " << zone << 'n';
  682.     }
  683. s << "}";
  684. return s;
  685. }
  686. // ---------------- Protected Member Functions ----------------
  687. void LLViewerRegion::updateNetStats()
  688. {
  689. F32 dt = mLastNetUpdate.getElapsedTimeAndResetF32();
  690. LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mHost);
  691. if (!cdp)
  692. {
  693. mAlive = false;
  694. return;
  695. }
  696. mAlive = true;
  697. mDeltaTime = dt;
  698. mLastPacketsIn = mPacketsIn;
  699. mLastBitsIn = mBitsIn;
  700. mLastPacketsOut = mPacketsOut;
  701. mLastPacketsLost = mPacketsLost;
  702. mPacketsIn = cdp->getPacketsIn();
  703. mBitsIn = 8 * cdp->getBytesIn();
  704. mPacketsOut = cdp->getPacketsOut();
  705. mPacketsLost = cdp->getPacketsLost();
  706. mPingDelay = cdp->getPingDelay();
  707. mBitStat.addValue(mBitsIn - mLastBitsIn);
  708. mPacketsStat.addValue(mPacketsIn - mLastPacketsIn);
  709. mPacketsLostStat.addValue(mPacketsLost);
  710. }
  711. U32 LLViewerRegion::getPacketsLost() const
  712. {
  713. LLCircuitData *cdp = gMessageSystem->mCircuitInfo.findCircuit(mHost);
  714. if (!cdp)
  715. {
  716. llinfos << "LLViewerRegion::getPacketsLost couldn't find circuit for " << mHost << llendl;
  717. return 0;
  718. }
  719. else
  720. {
  721. return cdp->getPacketsLost();
  722. }
  723. }
  724. BOOL LLViewerRegion::pointInRegionGlobal(const LLVector3d &point_global) const
  725. {
  726. LLVector3 pos_region = getPosRegionFromGlobal(point_global);
  727. if (pos_region.mV[VX] < 0)
  728. {
  729. return FALSE;
  730. }
  731. if (pos_region.mV[VX] >= mWidth)
  732. {
  733. return FALSE;
  734. }
  735. if (pos_region.mV[VY] < 0)
  736. {
  737. return FALSE;
  738. }
  739. if (pos_region.mV[VY] >= mWidth)
  740. {
  741. return FALSE;
  742. }
  743. return TRUE;
  744. }
  745. LLVector3 LLViewerRegion::getPosRegionFromGlobal(const LLVector3d &point_global) const
  746. {
  747. LLVector3 pos_region;
  748. pos_region.setVec(point_global - mOriginGlobal);
  749. return pos_region;
  750. }
  751. LLVector3d LLViewerRegion::getPosGlobalFromRegion(const LLVector3 &pos_region) const
  752. {
  753. LLVector3d pos_region_d;
  754. pos_region_d.setVec(pos_region);
  755. return pos_region_d + mOriginGlobal;
  756. }
  757. LLVector3 LLViewerRegion::getPosAgentFromRegion(const LLVector3 &pos_region) const
  758. {
  759. LLVector3d pos_global = getPosGlobalFromRegion(pos_region);
  760. return gAgent.getPosAgentFromGlobal(pos_global);
  761. }
  762. LLVector3 LLViewerRegion::getPosRegionFromAgent(const LLVector3 &pos_agent) const
  763. {
  764. return pos_agent - getOriginAgent();
  765. }
  766. F32 LLViewerRegion::getLandHeightRegion(const LLVector3& region_pos)
  767. {
  768. return mLandp->resolveHeightRegion( region_pos );
  769. }
  770. bool LLViewerRegion::isAlive()
  771. {
  772. return mAlive;
  773. }
  774. BOOL LLViewerRegion::isOwnedSelf(const LLVector3& pos)
  775. {
  776. if (mParcelOverlay)
  777. {
  778. return mParcelOverlay->isOwnedSelf(pos);
  779. } else {
  780. return FALSE;
  781. }
  782. }
  783. // Owned by a group you belong to?  (officer or member)
  784. BOOL LLViewerRegion::isOwnedGroup(const LLVector3& pos)
  785. {
  786. if (mParcelOverlay)
  787. {
  788. return mParcelOverlay->isOwnedGroup(pos);
  789. } else {
  790. return FALSE;
  791. }
  792. }
  793. // the new TCP coarse location handler node
  794. class CoarseLocationUpdate : public LLHTTPNode
  795. {
  796. public:
  797. virtual void post(
  798. ResponsePtr responder,
  799. const LLSD& context,
  800. const LLSD& input) const
  801. {
  802. LLHost host(input["sender"].asString());
  803. LLViewerRegion* region = LLWorld::getInstance()->getRegion(host);
  804. if( !region )
  805. {
  806. return;
  807. }
  808. S32 target_index = input["body"]["Index"][0]["Prey"].asInteger();
  809. S32 you_index    = input["body"]["Index"][0]["You" ].asInteger();
  810. LLDynamicArray<U32>* avatar_locs = &region->mMapAvatars;
  811. LLDynamicArray<LLUUID>* avatar_ids = &region->mMapAvatarIDs;
  812. avatar_locs->reset();
  813. avatar_ids->reset();
  814. //llinfos << "coarse locations agent[0] " << input["body"]["AgentData"][0]["AgentID"].asUUID() << llendl;
  815. //llinfos << "my agent id = " << gAgent.getID() << llendl;
  816. //llinfos << ll_pretty_print_sd(input) << llendl;
  817. LLSD 
  818. locs   = input["body"]["Location"],
  819. agents = input["body"]["AgentData"];
  820. LLSD::array_iterator 
  821. locs_it = locs.beginArray(), 
  822. agents_it = agents.beginArray();
  823. BOOL has_agent_data = input["body"].has("AgentData");
  824. for(int i=0; 
  825. locs_it != locs.endArray(); 
  826. i++, locs_it++)
  827. {
  828. U8 
  829. x = locs_it->get("X").asInteger(),
  830. y = locs_it->get("Y").asInteger(),
  831. z = locs_it->get("Z").asInteger();
  832. // treat the target specially for the map, and don't add you or the target
  833. if(i == target_index)
  834. {
  835. LLVector3d global_pos(region->getOriginGlobal());
  836. global_pos.mdV[VX] += (F64)x;
  837. global_pos.mdV[VY] += (F64)y;
  838. global_pos.mdV[VZ] += (F64)z * 4.0;
  839. LLAvatarTracker::instance().setTrackedCoarseLocation(global_pos);
  840. }
  841. else if( i != you_index)
  842. {
  843. U32 loc = x << 16 | y << 8 | z; loc = loc;
  844. U32 pos = 0x0;
  845. pos |= x;
  846. pos <<= 8;
  847. pos |= y;
  848. pos <<= 8;
  849. pos |= z;
  850. avatar_locs->put(pos);
  851. //llinfos << "next pos: " << x << "," << y << "," << z << ": " << pos << llendl;
  852. if(has_agent_data) // for backwards compatibility with old message format
  853. {
  854. LLUUID agent_id(agents_it->get("AgentID").asUUID());
  855. //llinfos << "next agent: " << agent_id.asString() << llendl;
  856. avatar_ids->put(agent_id);
  857. }
  858. }
  859. if (has_agent_data)
  860. {
  861. agents_it++;
  862. }
  863. }
  864. }
  865. };
  866. // build the coarse location HTTP node under the "/message" URL
  867. LLHTTPRegistration<CoarseLocationUpdate>
  868.    gHTTPRegistrationCoarseLocationUpdate(
  869.    "/message/CoarseLocationUpdate");
  870. // the deprecated coarse location handler
  871. void LLViewerRegion::updateCoarseLocations(LLMessageSystem* msg)
  872. {
  873. //llinfos << "CoarseLocationUpdate" << llendl;
  874. mMapAvatars.reset();
  875. mMapAvatarIDs.reset(); // only matters in a rare case but it's good to be safe.
  876. U8 x_pos = 0;
  877. U8 y_pos = 0;
  878. U8 z_pos = 0;
  879. U32 pos = 0x0;
  880. S16 agent_index;
  881. S16 target_index;
  882. msg->getS16Fast(_PREHASH_Index, _PREHASH_You, agent_index);
  883. msg->getS16Fast(_PREHASH_Index, _PREHASH_Prey, target_index);
  884. BOOL has_agent_data = msg->has(_PREHASH_AgentData);
  885. S32 count = msg->getNumberOfBlocksFast(_PREHASH_Location);
  886. for(S32 i = 0; i < count; i++)
  887. {
  888. msg->getU8Fast(_PREHASH_Location, _PREHASH_X, x_pos, i);
  889. msg->getU8Fast(_PREHASH_Location, _PREHASH_Y, y_pos, i);
  890. msg->getU8Fast(_PREHASH_Location, _PREHASH_Z, z_pos, i);
  891. LLUUID agent_id = LLUUID::null;
  892. if(has_agent_data)
  893. {
  894. msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id, i);
  895. }
  896. //llinfos << "  object X: " << (S32)x_pos << " Y: " << (S32)y_pos
  897. // << " Z: " << (S32)(z_pos * 4)
  898. // << llendl;
  899. // treat the target specially for the map
  900. if(i == target_index)
  901. {
  902. LLVector3d global_pos(mOriginGlobal);
  903. global_pos.mdV[VX] += (F64)(x_pos);
  904. global_pos.mdV[VY] += (F64)(y_pos);
  905. global_pos.mdV[VZ] += (F64)(z_pos) * 4.0;
  906. LLAvatarTracker::instance().setTrackedCoarseLocation(global_pos);
  907. }
  908. //don't add you
  909. if( i != agent_index)
  910. {
  911. pos = 0x0;
  912. pos |= x_pos;
  913. pos <<= 8;
  914. pos |= y_pos;
  915. pos <<= 8;
  916. pos |= z_pos;
  917. mMapAvatars.put(pos);
  918. if(has_agent_data)
  919. {
  920. mMapAvatarIDs.put(agent_id);
  921. }
  922. }
  923. }
  924. }
  925. void LLViewerRegion::getInfo(LLSD& info)
  926. {
  927. info["Region"]["Host"] = getHost().getIPandPort();
  928. info["Region"]["Name"] = getName();
  929. U32 x, y;
  930. from_region_handle(getHandle(), &x, &y);
  931. info["Region"]["Handle"]["x"] = (LLSD::Integer)x;
  932. info["Region"]["Handle"]["y"] = (LLSD::Integer)y;
  933. }
  934. void LLViewerRegion::cacheFullUpdate(LLViewerObject* objectp, LLDataPackerBinaryBuffer &dp)
  935. {
  936. U32 local_id = objectp->getLocalID();
  937. U32 crc = objectp->getCRC();
  938. LLVOCacheEntry* entry = get_if_there(mCacheMap, local_id, (LLVOCacheEntry*)NULL);
  939. if (entry)
  940. {
  941. // we've seen this object before
  942. if (entry->getCRC() == crc)
  943. {
  944. // Record a hit
  945. entry->recordDupe();
  946. }
  947. else
  948. {
  949. // Update the cache entry
  950. mCacheMap.erase(local_id);
  951. delete entry;
  952. entry = new LLVOCacheEntry(local_id, crc, dp);
  953. mCacheEnd.insert(*entry);
  954. mCacheMap[local_id] = entry;
  955. }
  956. }
  957. else
  958. {
  959. // we haven't seen this object before
  960. // Create new entry and add to map
  961. if (mCacheEntriesCount > MAX_OBJECT_CACHE_ENTRIES)
  962. {
  963. entry = mCacheStart.getNext();
  964. mCacheMap.erase(entry->getLocalID());
  965. delete entry;
  966. mCacheEntriesCount--;
  967. }
  968. entry = new LLVOCacheEntry(local_id, crc, dp);
  969. mCacheEnd.insert(*entry);
  970. mCacheMap[local_id] = entry;
  971. mCacheEntriesCount++;
  972. }
  973. return ;
  974. }
  975. // Get data packer for this object, if we have cached data
  976. // AND the CRC matches. JC
  977. LLDataPacker *LLViewerRegion::getDP(U32 local_id, U32 crc)
  978. {
  979. llassert(mCacheLoaded);
  980. LLVOCacheEntry* entry = get_if_there(mCacheMap, local_id, (LLVOCacheEntry*)NULL);
  981. if (entry)
  982. {
  983. // we've seen this object before
  984. if (entry->getCRC() == crc)
  985. {
  986. // Record a hit
  987. entry->recordHit();
  988. return entry->getDP(crc);
  989. }
  990. else
  991. {
  992. // llinfos << "CRC miss for " << local_id << llendl;
  993. mCacheMissCRC.put(local_id);
  994. }
  995. }
  996. else
  997. {
  998. // llinfos << "Cache miss for " << local_id << llendl;
  999. mCacheMissFull.put(local_id);
  1000. }
  1001. return NULL;
  1002. }
  1003. void LLViewerRegion::addCacheMissFull(const U32 local_id)
  1004. {
  1005. mCacheMissFull.put(local_id);
  1006. }
  1007. void LLViewerRegion::requestCacheMisses()
  1008. {
  1009. S32 full_count = mCacheMissFull.count();
  1010. S32 crc_count = mCacheMissCRC.count();
  1011. if (full_count == 0 && crc_count == 0) return;
  1012. LLMessageSystem* msg = gMessageSystem;
  1013. BOOL start_new_message = TRUE;
  1014. S32 blocks = 0;
  1015. S32 i;
  1016. const U8 CACHE_MISS_TYPE_FULL = 0;
  1017. const U8 CACHE_MISS_TYPE_CRC  = 1;
  1018. // Send full cache miss updates.  For these, we KNOW we don't
  1019. // have a viewer object.
  1020. for (i = 0; i < full_count; i++)
  1021. {
  1022. if (start_new_message)
  1023. {
  1024. msg->newMessageFast(_PREHASH_RequestMultipleObjects);
  1025. msg->nextBlockFast(_PREHASH_AgentData);
  1026. msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
  1027. msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  1028. start_new_message = FALSE;
  1029. }
  1030. msg->nextBlockFast(_PREHASH_ObjectData);
  1031. msg->addU8Fast(_PREHASH_CacheMissType, CACHE_MISS_TYPE_FULL);
  1032. msg->addU32Fast(_PREHASH_ID, mCacheMissFull[i]);
  1033. blocks++;
  1034. if (blocks >= 255)
  1035. {
  1036. sendReliableMessage();
  1037. start_new_message = TRUE;
  1038. blocks = 0;
  1039. }
  1040. }
  1041. // Send CRC miss updates.  For these, we _might_ have a viewer object,
  1042. // but probably not.
  1043. for (i = 0; i < crc_count; i++)
  1044. {
  1045. if (start_new_message)
  1046. {
  1047. msg->newMessageFast(_PREHASH_RequestMultipleObjects);
  1048. msg->nextBlockFast(_PREHASH_AgentData);
  1049. msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
  1050. msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
  1051. start_new_message = FALSE;
  1052. }
  1053. msg->nextBlockFast(_PREHASH_ObjectData);
  1054. msg->addU8Fast(_PREHASH_CacheMissType, CACHE_MISS_TYPE_CRC);
  1055. msg->addU32Fast(_PREHASH_ID, mCacheMissCRC[i]);
  1056. blocks++;
  1057. if (blocks >= 255)
  1058. {
  1059. sendReliableMessage();
  1060. start_new_message = TRUE;
  1061. blocks = 0;
  1062. }
  1063. }
  1064. // finish any pending message
  1065. if (!start_new_message)
  1066. {
  1067. sendReliableMessage();
  1068. }
  1069. mCacheMissFull.reset();
  1070. mCacheMissCRC.reset();
  1071. // llinfos << "KILLDEBUG Sent cache miss full " << full_count << " crc " << crc_count << llendl;
  1072. }
  1073. void LLViewerRegion::dumpCache()
  1074. {
  1075. const S32 BINS = 4;
  1076. S32 hit_bin[BINS];
  1077. S32 change_bin[BINS];
  1078. S32 i;
  1079. for (i = 0; i < BINS; ++i)
  1080. {
  1081. hit_bin[i] = 0;
  1082. change_bin[i] = 0;
  1083. }
  1084. LLVOCacheEntry *entry;
  1085. for (entry = mCacheStart.getNext(); entry && (entry != &mCacheEnd); entry = entry->getNext())
  1086. {
  1087. S32 hits = entry->getHitCount();
  1088. S32 changes = entry->getCRCChangeCount();
  1089. hits = llclamp(hits, 0, BINS-1);
  1090. changes = llclamp(changes, 0, BINS-1);
  1091. hit_bin[hits]++;
  1092. change_bin[changes]++;
  1093. }
  1094. llinfos << "Count " << mCacheEntriesCount << llendl;
  1095. for (i = 0; i < BINS; i++)
  1096. {
  1097. llinfos << "Hits " << i << " " << hit_bin[i] << llendl;
  1098. }
  1099. for (i = 0; i < BINS; i++)
  1100. {
  1101. llinfos << "Changes " << i << " " << change_bin[i] << llendl;
  1102. }
  1103. }
  1104. void LLViewerRegion::unpackRegionHandshake()
  1105. {
  1106. LLMessageSystem *msg = gMessageSystem;
  1107. U32 region_flags;
  1108. U8 sim_access;
  1109. std::string sim_name;
  1110. LLUUID sim_owner;
  1111. BOOL is_estate_manager;
  1112. F32 water_height;
  1113. F32 billable_factor;
  1114. LLUUID cache_id;
  1115. msg->getU32 ("RegionInfo", "RegionFlags", region_flags);
  1116. msg->getU8 ("RegionInfo", "SimAccess", sim_access);
  1117. msg->getString ("RegionInfo", "SimName", sim_name);
  1118. msg->getUUID ("RegionInfo", "SimOwner", sim_owner);
  1119. msg->getBOOL ("RegionInfo", "IsEstateManager", is_estate_manager);
  1120. msg->getF32 ("RegionInfo", "WaterHeight", water_height);
  1121. msg->getF32 ("RegionInfo", "BillableFactor", billable_factor);
  1122. msg->getUUID ("RegionInfo", "CacheID", cache_id );
  1123. setRegionFlags(region_flags);
  1124. setSimAccess(sim_access);
  1125. setRegionNameAndZone(sim_name);
  1126. setOwner(sim_owner);
  1127. setIsEstateManager(is_estate_manager);
  1128. setWaterHeight(water_height);
  1129. setBillableFactor(billable_factor);
  1130. setCacheID(cache_id);
  1131. LLUUID region_id;
  1132. msg->getUUID("RegionInfo2", "RegionID", region_id);
  1133. setRegionID(region_id);
  1134. // Retrieve the CR-53 (Homestead/Land SKU) information
  1135. S32 classID = 0;
  1136. S32 cpuRatio = 0;
  1137. std::string coloName;
  1138. std::string productSKU;
  1139. std::string productName;
  1140. // the only reasonable way to decide if we actually have any data is to
  1141. // check to see if any of these fields have positive sizes
  1142. if (msg->getSize("RegionInfo3", "ColoName") > 0 ||
  1143.     msg->getSize("RegionInfo3", "ProductSKU") > 0 ||
  1144.     msg->getSize("RegionInfo3", "ProductName") > 0)
  1145. {
  1146. msg->getS32     ("RegionInfo3", "CPUClassID",  classID);
  1147. msg->getS32     ("RegionInfo3", "CPURatio",    cpuRatio);
  1148. msg->getString  ("RegionInfo3", "ColoName",    coloName);
  1149. msg->getString  ("RegionInfo3", "ProductSKU",  productSKU);
  1150. msg->getString  ("RegionInfo3", "ProductName", productName);
  1151. mClassID = classID;
  1152. mCPURatio = cpuRatio;
  1153. mColoName = coloName;
  1154. mProductSKU = productSKU;
  1155. mProductName = productName;
  1156. }
  1157. LLVLComposition *compp = getComposition();
  1158. if (compp)
  1159. {
  1160. LLUUID tmp_id;
  1161. msg->getUUID("RegionInfo", "TerrainDetail0", tmp_id);
  1162. compp->setDetailTextureID(0, tmp_id);
  1163. msg->getUUID("RegionInfo", "TerrainDetail1", tmp_id);
  1164. compp->setDetailTextureID(1, tmp_id);
  1165. msg->getUUID("RegionInfo", "TerrainDetail2", tmp_id);
  1166. compp->setDetailTextureID(2, tmp_id);
  1167. msg->getUUID("RegionInfo", "TerrainDetail3", tmp_id);
  1168. compp->setDetailTextureID(3, tmp_id);
  1169. F32 tmp_f32;
  1170. msg->getF32("RegionInfo", "TerrainStartHeight00", tmp_f32);
  1171. compp->setStartHeight(0, tmp_f32);
  1172. msg->getF32("RegionInfo", "TerrainStartHeight01", tmp_f32);
  1173. compp->setStartHeight(1, tmp_f32);
  1174. msg->getF32("RegionInfo", "TerrainStartHeight10", tmp_f32);
  1175. compp->setStartHeight(2, tmp_f32);
  1176. msg->getF32("RegionInfo", "TerrainStartHeight11", tmp_f32);
  1177. compp->setStartHeight(3, tmp_f32);
  1178. msg->getF32("RegionInfo", "TerrainHeightRange00", tmp_f32);
  1179. compp->setHeightRange(0, tmp_f32);
  1180. msg->getF32("RegionInfo", "TerrainHeightRange01", tmp_f32);
  1181. compp->setHeightRange(1, tmp_f32);
  1182. msg->getF32("RegionInfo", "TerrainHeightRange10", tmp_f32);
  1183. compp->setHeightRange(2, tmp_f32);
  1184. msg->getF32("RegionInfo", "TerrainHeightRange11", tmp_f32);
  1185. compp->setHeightRange(3, tmp_f32);
  1186. // If this is an UPDATE (params already ready, we need to regenerate
  1187. // all of our terrain stuff, by
  1188. if (compp->getParamsReady())
  1189. {
  1190. getLand().dirtyAllPatches();
  1191. }
  1192. else
  1193. {
  1194. compp->setParamsReady();
  1195. }
  1196. }
  1197. // Now that we have the name, we can load the cache file
  1198. // off disk.
  1199. loadCache();
  1200. // After loading cache, signal that simulator can start
  1201. // sending data.
  1202. // TODO: Send all upstream viewer->sim handshake info here.
  1203. LLHost host = msg->getSender();
  1204. msg->newMessage("RegionHandshakeReply");
  1205. msg->nextBlock("AgentData");
  1206. msg->addUUID("AgentID", gAgent.getID());
  1207. msg->addUUID("SessionID", gAgent.getSessionID());
  1208. msg->nextBlock("RegionInfo");
  1209. msg->addU32("Flags", 0x0 );
  1210. msg->sendReliable(host);
  1211. }
  1212. void LLViewerRegion::setSeedCapability(const std::string& url)
  1213. {
  1214. if (getCapability("Seed") == url)
  1215.     {
  1216. // llwarns << "Ignoring duplicate seed capability" << llendl;
  1217. return;
  1218.     }
  1219. delete mEventPoll;
  1220. mEventPoll = NULL;
  1221. mCapabilities.clear();
  1222. setCapability("Seed", url);
  1223. LLSD capabilityNames = LLSD::emptyArray();
  1224. capabilityNames.append("AttachmentResources");
  1225. capabilityNames.append("ChatSessionRequest");
  1226. capabilityNames.append("CopyInventoryFromNotecard");
  1227. capabilityNames.append("DispatchRegionInfo");
  1228. capabilityNames.append("EstateChangeInfo");
  1229. capabilityNames.append("EventQueueGet");
  1230. capabilityNames.append("FetchInventory");
  1231. capabilityNames.append("ObjectMedia");
  1232. capabilityNames.append("ObjectMediaNavigate");
  1233. capabilityNames.append("FetchLib");
  1234. capabilityNames.append("FetchLibDescendents");
  1235. capabilityNames.append("GetTexture");
  1236. capabilityNames.append("GroupProposalBallot");
  1237. capabilityNames.append("HomeLocation");
  1238. capabilityNames.append("LandResources");
  1239. capabilityNames.append("MapLayer");
  1240. capabilityNames.append("MapLayerGod");
  1241. capabilityNames.append("NewFileAgentInventory");
  1242. capabilityNames.append("ParcelPropertiesUpdate");
  1243. capabilityNames.append("ParcelMediaURLFilterList");
  1244. capabilityNames.append("ParcelNavigateMedia");
  1245. capabilityNames.append("ParcelVoiceInfoRequest");
  1246. capabilityNames.append("ProductInfoRequest");
  1247. capabilityNames.append("ProvisionVoiceAccountRequest");
  1248. capabilityNames.append("RemoteParcelRequest");
  1249. capabilityNames.append("RequestTextureDownload");
  1250. capabilityNames.append("SearchStatRequest");
  1251. capabilityNames.append("SearchStatTracking");
  1252. capabilityNames.append("SendPostcard");
  1253. capabilityNames.append("SendUserReport");
  1254. capabilityNames.append("SendUserReportWithScreenshot");
  1255. capabilityNames.append("ServerReleaseNotes");
  1256. capabilityNames.append("StartGroupProposal");
  1257. capabilityNames.append("TextureStats");
  1258. capabilityNames.append("UntrustedSimulatorMessage");
  1259. capabilityNames.append("UpdateAgentInformation");
  1260. capabilityNames.append("UpdateAgentLanguage");
  1261. capabilityNames.append("UpdateGestureAgentInventory");
  1262. capabilityNames.append("UpdateNotecardAgentInventory");
  1263. capabilityNames.append("UpdateScriptAgent");
  1264. capabilityNames.append("UpdateGestureTaskInventory");
  1265. capabilityNames.append("UpdateNotecardTaskInventory");
  1266. capabilityNames.append("UpdateScriptTask");
  1267. capabilityNames.append("UploadBakedTexture");
  1268. capabilityNames.append("ViewerStartAuction");
  1269. capabilityNames.append("ViewerStats");
  1270. capabilityNames.append("WebFetchInventoryDescendents");
  1271. // Please add new capabilities alphabetically to reduce
  1272. // merge conflicts.
  1273. llinfos << "posting to seed " << url << llendl;
  1274. mHttpResponderPtr = BaseCapabilitiesComplete::build(this) ;
  1275. LLHTTPClient::post(url, capabilityNames, mHttpResponderPtr);
  1276. }
  1277. void LLViewerRegion::setCapability(const std::string& name, const std::string& url)
  1278. {
  1279. if(name == "EventQueueGet")
  1280. {
  1281. delete mEventPoll;
  1282. mEventPoll = NULL;
  1283. mEventPoll = new LLEventPoll(url, getHost());
  1284. }
  1285. else if(name == "UntrustedSimulatorMessage")
  1286. {
  1287. LLHTTPSender::setSender(mHost, new LLCapHTTPSender(url));
  1288. }
  1289. else
  1290. {
  1291. mCapabilities[name] = url;
  1292. }
  1293. }
  1294. bool LLViewerRegion::isSpecialCapabilityName(const std::string &name)
  1295. {
  1296. return name == "EventQueueGet" || name == "UntrustedSimulatorMessage";
  1297. }
  1298. std::string LLViewerRegion::getCapability(const std::string& name) const
  1299. {
  1300. CapabilityMap::const_iterator iter = mCapabilities.find(name);
  1301. if(iter == mCapabilities.end())
  1302. {
  1303. return "";
  1304. }
  1305. return iter->second;
  1306. }
  1307. void LLViewerRegion::logActiveCapabilities() const
  1308. {
  1309. int count = 0;
  1310. CapabilityMap::const_iterator iter;
  1311. for (iter = mCapabilities.begin(); iter != mCapabilities.end(); iter++, count++)
  1312. {
  1313. if (!iter->second.empty())
  1314. {
  1315. llinfos << iter->first << " URL is " << iter->second << llendl;
  1316. }
  1317. }
  1318. llinfos << "Dumped " << count << " entries." << llendl;
  1319. }
  1320. LLSpatialPartition* LLViewerRegion::getSpatialPartition(U32 type)
  1321. {
  1322. if (type < mObjectPartition.size())
  1323. {
  1324. return mObjectPartition[type];
  1325. }
  1326. return NULL;
  1327. }
  1328. void LLViewerRegion::showReleaseNotes()
  1329. {
  1330. std::string url = this->getCapability("ServerReleaseNotes");
  1331. if (url.empty()) {
  1332. // HACK haven't received the capability yet, we'll wait until
  1333. // it arives.
  1334. mReleaseNotesRequested = TRUE;
  1335. return;
  1336. }
  1337. LLWeb::loadURL(url);
  1338. mReleaseNotesRequested = FALSE;
  1339. }
  1340. std::string LLViewerRegion::getDescription() const
  1341. {
  1342.     return stringize(*this);
  1343. }