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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llvotextbubble.cpp
  3.  * @brief Viewer-object text bubble.
  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 "llvotextbubble.h"
  34. #include "imageids.h"
  35. #include "llviewercontrol.h"
  36. #include "llprimitive.h"
  37. #include "llrendersphere.h"
  38. #include "llbox.h"
  39. #include "lldrawable.h"
  40. #include "llface.h"
  41. #include "llviewertexturelist.h"
  42. #include "llvolume.h"
  43. #include "pipeline.h"
  44. #include "llviewerregion.h"
  45. LLVOTextBubble::LLVOTextBubble(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
  46. : LLAlphaObject(id, pcode, regionp)
  47. {
  48. setScale(LLVector3(1.5f, 1.5f, 0.25f));
  49. mbCanSelect = FALSE;
  50. mLOD = MIN_LOD;
  51. mVolumeChanged = TRUE;
  52. setVelocity(LLVector3(0.f, 0.f, 0.75f));
  53. LLVolumeParams volume_params;
  54. volume_params.setType(LL_PCODE_PROFILE_CIRCLE, LL_PCODE_PATH_LINE);
  55. volume_params.setBeginAndEndS(0.f, 1.f);
  56. volume_params.setBeginAndEndT(0.f, 1.f);
  57. volume_params.setRatio(0.25f, 0.25f);
  58. volume_params.setShear(0.f, 0.f);
  59. setVolume(volume_params, 0);
  60. mColor = LLColor4(1.0f, 0.0f, 0.0f, 1.f);
  61. S32 i;
  62. for (i = 0; i < getNumTEs(); i++)
  63. {
  64. setTEColor(i, mColor);
  65. setTETexture(i, LLUUID(IMG_DEFAULT));
  66. }
  67. }
  68. LLVOTextBubble::~LLVOTextBubble()
  69. {
  70. }
  71. BOOL LLVOTextBubble::isActive() const
  72. {
  73. return TRUE;
  74. }
  75. BOOL LLVOTextBubble::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
  76. {
  77. F32 dt = mUpdateTimer.getElapsedTimeF32();
  78. // Die after a few seconds.
  79. if (dt > 1.5f)
  80. {
  81. return FALSE;
  82. }
  83. LLViewerObject::idleUpdate(agent, world, time);
  84. setScale(0.5f * (1.f+dt) * LLVector3(1.5f, 1.5f, 0.5f));
  85. F32 alpha = 0.35f*dt;
  86. LLColor4 color = mColor;
  87. color.mV[VALPHA] -= alpha;
  88. if (color.mV[VALPHA] <= 0.05f)
  89. {
  90. return FALSE;
  91. }
  92. S32 i;
  93. for (i = 0; i < getNumTEs(); i++)
  94. {
  95. setTEColor(i, color);
  96. setTEFullbright(i, TRUE);
  97. }
  98. gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, TRUE);
  99. return TRUE;
  100. }
  101. void LLVOTextBubble::updateTextures()
  102. {
  103. // Update the image levels of all textures...
  104. for (U32 i = 0; i < getNumTEs(); i++)
  105. {
  106. const LLTextureEntry *te = getTE(i);
  107. F32 texel_area_ratio = fabs(te->mScaleS * te->mScaleT);
  108. texel_area_ratio = llclamp(texel_area_ratio, .125f, 16.f);
  109. LLViewerTexture *imagep = getTEImage(i);
  110. if (imagep)
  111. {
  112. imagep->addTextureStats(mPixelArea / texel_area_ratio);
  113. }
  114. }
  115. }
  116. LLDrawable *LLVOTextBubble::createDrawable(LLPipeline *pipeline)
  117. {
  118. pipeline->allocDrawable(this);
  119. mDrawable->setLit(FALSE);
  120. mDrawable->setRenderType(LLPipeline::RENDER_TYPE_VOLUME);
  121. for (U32 i = 0; i < getNumTEs(); i++)
  122. {
  123. LLViewerTexture *imagep;
  124. const LLTextureEntry *texture_entry = getTE(i);
  125. imagep = LLViewerTextureManager::getFetchedTexture(texture_entry->getID());
  126. mDrawable->addFace((LLFacePool*) NULL, imagep);
  127. }
  128. return mDrawable;
  129. }
  130. // virtual
  131. BOOL LLVOTextBubble::setVolume(const LLVolumeParams &volume_params, const S32 detail, bool unique_volume)
  132. {
  133. if (LLPrimitive::setVolume(volume_params, mLOD))
  134. {
  135. if (mDrawable)
  136. {
  137. gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_VOLUME, TRUE);
  138. mVolumeChanged = TRUE;
  139. }
  140. return TRUE;
  141. }
  142. return FALSE;
  143. }
  144. BOOL LLVOTextBubble::updateLOD()
  145. {
  146. return FALSE;
  147. }
  148. BOOL LLVOTextBubble::updateGeometry(LLDrawable *drawable)
  149. {
  150.   if (!(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_VOLUME)))
  151. return TRUE;
  152. if (mVolumeChanged)
  153. {
  154. LLVolumeParams volume_params = getVolume()->getParams();
  155. setVolume(volume_params, 0);
  156. LLPipeline::sCompiles++;
  157. drawable->setNumFaces(getVolume()->getNumFaces(), drawable->getFace(0)->getPool(), getTEImage(0));
  158. }
  159. LLMatrix4 identity4;
  160. LLMatrix3 identity3;
  161. for (S32 i = 0; i < drawable->getNumFaces(); i++)
  162. {
  163. LLFace *face = drawable->getFace(i);
  164. face->setTEOffset(i);
  165. face->setTexture(LLViewerFetchedTexture::sSmokeImagep);
  166. face->setState(LLFace::FULLBRIGHT);
  167. }
  168. mVolumeChanged = FALSE;
  169. mDrawable->movePartition();
  170. return TRUE;
  171. }
  172. void LLVOTextBubble::updateFaceSize(S32 idx)
  173. {
  174. LLFace* face = mDrawable->getFace(idx);
  175. if (idx == 0 || idx == 2)
  176. {
  177. face->setSize(0,0);
  178. }
  179. else
  180. {
  181. const LLVolumeFace& vol_face = getVolume()->getVolumeFace(idx);
  182. face->setSize(vol_face.mVertices.size(), vol_face.mIndices.size());
  183. }
  184. }
  185. void LLVOTextBubble::getGeometry(S32 idx,
  186. LLStrider<LLVector3>& verticesp,
  187. LLStrider<LLVector3>& normalsp, 
  188. LLStrider<LLVector2>& texcoordsp,
  189. LLStrider<LLColor4U>& colorsp, 
  190. LLStrider<U16>& indicesp) 
  191. {
  192. if (idx == 0 || idx == 2)
  193. {
  194. return;
  195. }
  196. const LLVolumeFace& face = getVolume()->getVolumeFace(idx);
  197. LLVector3 pos = getPositionAgent();
  198. LLColor4U color = LLColor4U(getTE(idx)->getColor());
  199. U32 offset = mDrawable->getFace(idx)->getGeomIndex();
  200. for (U32 i = 0; i < face.mVertices.size(); i++)
  201. {
  202. *verticesp++ = face.mVertices[i].mPosition.scaledVec(getScale()) + pos;
  203. *normalsp++ = face.mVertices[i].mNormal;
  204. *texcoordsp++ = face.mVertices[i].mTexCoord;
  205. *colorsp++ = color;
  206. }
  207. for (U32 i = 0; i < face.mIndices.size(); i++)
  208. {
  209. *indicesp++ = face.mIndices[i] + offset;
  210. }
  211. }
  212. U32 LLVOTextBubble::getPartitionType() const
  213. return LLViewerRegion::PARTITION_PARTICLE; 
  214. }