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

游戏引擎

开发平台:

C++ Builder

  1. /**
  2.  * @file llviewerparcelmediaautoplay.cpp
  3.  * @brief timer to automatically play media in a parcel
  4.  *
  5.  * $LicenseInfo:firstyear=2007&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2007-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 "llviewerparcelmediaautoplay.h"
  34. #include "llviewerparcelmedia.h"
  35. #include "llviewercontrol.h"
  36. #include "llviewermedia.h"
  37. #include "llviewerregion.h"
  38. #include "llparcel.h"
  39. #include "llviewerparcelmgr.h"
  40. #include "lluuid.h"
  41. #include "message.h"
  42. #include "llviewertexturelist.h"         // for texture stats
  43. #include "llagent.h"
  44. const F32 AUTOPLAY_TIME  = 5;          // how many seconds before we autoplay
  45. const F32 AUTOPLAY_SIZE  = 24*24;      // how big the texture must be (pixel area) before we autoplay
  46. const F32 AUTOPLAY_SPEED = 0.1f;        // how slow should the agent be moving to autoplay
  47. LLViewerParcelMediaAutoPlay::LLViewerParcelMediaAutoPlay() :
  48. LLEventTimer(1),
  49. mLastParcelID(-1),
  50. mPlayed(FALSE),
  51. mTimeInParcel(0)
  52. {
  53. }
  54. static LLViewerParcelMediaAutoPlay *sAutoPlay = NULL;
  55. // static
  56. void LLViewerParcelMediaAutoPlay::initClass()
  57. {
  58. if (!sAutoPlay)
  59. sAutoPlay = new LLViewerParcelMediaAutoPlay;
  60. }
  61. // static
  62. void LLViewerParcelMediaAutoPlay::cleanupClass()
  63. {
  64. if (sAutoPlay)
  65. delete sAutoPlay;
  66. }
  67. // static
  68. void LLViewerParcelMediaAutoPlay::playStarted()
  69. {
  70. if (sAutoPlay)
  71. {
  72. sAutoPlay->mPlayed = TRUE;
  73. }
  74. }
  75. BOOL LLViewerParcelMediaAutoPlay::tick()
  76. {
  77. LLParcel *this_parcel = NULL;
  78. LLViewerRegion *this_region = NULL;
  79. std::string this_media_url;
  80. LLUUID this_media_texture_id;
  81. S32 this_parcel_id = 0;
  82. LLUUID this_region_id;
  83. this_region = gAgent.getRegion();
  84. if (this_region)
  85. {
  86. this_region_id = this_region->getRegionID();
  87. }
  88. this_parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
  89. if (this_parcel)
  90. {
  91. this_media_url = std::string(this_parcel->getMediaURL());
  92. this_media_texture_id = this_parcel->getMediaID();
  93. this_parcel_id = this_parcel->getLocalID();
  94. }
  95. if (this_parcel_id != mLastParcelID ||
  96.     this_region_id != mLastRegionID)
  97. {
  98. // we've entered a new parcel
  99. mPlayed    = FALSE;                   // we haven't autoplayed yet
  100. mTimeInParcel = 0;                    // reset our timer
  101. mLastParcelID = this_parcel_id;
  102. mLastRegionID = this_region_id;
  103. }
  104. mTimeInParcel += mPeriod;                 // increase mTimeInParcel by the amount of time between ticks
  105. if ((!mPlayed) &&                         // if we've never played
  106. (mTimeInParcel > AUTOPLAY_TIME) &&    // and if we've been here for so many seconds
  107. (this_media_url.size() != 0) &&       // and if the parcel has media
  108. (LLViewerParcelMedia::sMediaImpl.isNull()))   // and if the media is not already playing
  109. {
  110. if (this_media_texture_id.notNull())  // and if the media texture is good
  111. {
  112. LLViewerMediaTexture *image = LLViewerTextureManager::getMediaTexture(this_media_texture_id, FALSE) ;
  113. F32 image_size = 0;
  114. if (image)
  115. {
  116. image_size = image->getMaxVirtualSize() ;
  117. }
  118. if (gAgent.getVelocity().magVec() < AUTOPLAY_SPEED) // and if the agent is stopped (slow enough)
  119. {
  120. if (image_size > AUTOPLAY_SIZE)    // and if the target texture is big enough on screen
  121. {
  122. if (this_parcel)
  123. {
  124. if (gSavedSettings.getBOOL("ParcelMediaAutoPlayEnable"))
  125. {
  126. // and last but not least, only play when autoplay is enabled
  127. LLViewerParcelMedia::play(this_parcel);
  128. }
  129. }
  130. mPlayed = TRUE;
  131. }
  132. }
  133. }
  134. }
  135. return FALSE; // continue ticking forever please.
  136. }