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

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file lldrawpoolavatar.cpp
  3.  * @brief LLDrawPoolAvatar class implementation
  4.  *
  5.  * $LicenseInfo:firstyear=2002&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2002-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 "lldrawpoolavatar.h"
  34. #include "llrender.h"
  35. #include "llvoavatar.h"
  36. #include "m3math.h"
  37. #include "lldrawable.h"
  38. #include "llface.h"
  39. #include "llsky.h"
  40. #include "llviewercamera.h"
  41. #include "llviewerregion.h"
  42. #include "noise.h"
  43. #include "pipeline.h"
  44. #include "llviewershadermgr.h"
  45. #include "llappviewer.h"
  46. #include "llrendersphere.h"
  47. #include "llviewerpartsim.h"
  48. static U32 sDataMask = LLDrawPoolAvatar::VERTEX_DATA_MASK;
  49. static U32 sBufferUsage = GL_STREAM_DRAW_ARB;
  50. static U32 sShaderLevel = 0;
  51. static LLGLSLShader* sVertexProgram = NULL;
  52. BOOL LLDrawPoolAvatar::sSkipOpaque = FALSE;
  53. BOOL LLDrawPoolAvatar::sSkipTransparent = FALSE;
  54. extern BOOL gUseGLPick;
  55. F32 CLOTHING_GRAVITY_EFFECT = 0.7f;
  56. F32 CLOTHING_ACCEL_FORCE_FACTOR = 0.2f;
  57. const S32 NUM_TEST_AVATARS = 30;
  58. const S32 MIN_PIXEL_AREA_2_PASS_SKINNING = 500000000;
  59. // Format for gAGPVertices
  60. // vertex format for bumpmapping:
  61. //  vertices   12
  62. //  pad     4
  63. //  normals    12
  64. //  pad     4
  65. //  texcoords0  8
  66. //  texcoords1  8
  67. // total       48
  68. //
  69. // for no bumpmapping
  70. //  vertices    12
  71. //  texcoords 8
  72. //  normals    12
  73. // total    32
  74. //
  75. S32 AVATAR_OFFSET_POS = 0;
  76. S32 AVATAR_OFFSET_NORMAL = 16;
  77. S32 AVATAR_OFFSET_TEX0 = 32;
  78. S32 AVATAR_OFFSET_TEX1 = 40;
  79. S32 AVATAR_VERTEX_BYTES = 48;
  80. BOOL gAvatarEmbossBumpMap = FALSE;
  81. static BOOL sRenderingSkinned = FALSE;
  82. S32 normal_channel = -1;
  83. S32 specular_channel = -1;
  84. S32 diffuse_channel = -1;
  85. static LLFastTimer::DeclareTimer FTM_SHADOW_AVATAR("Avatar Shadow");
  86. LLDrawPoolAvatar::LLDrawPoolAvatar() : 
  87. LLFacePool(POOL_AVATAR)
  88. {
  89. }
  90. //-----------------------------------------------------------------------------
  91. // instancePool()
  92. //-----------------------------------------------------------------------------
  93. LLDrawPool *LLDrawPoolAvatar::instancePool()
  94. {
  95. return new LLDrawPoolAvatar();
  96. }
  97. S32 LLDrawPoolAvatar::getVertexShaderLevel() const
  98. {
  99. return (S32) LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_AVATAR);
  100. }
  101. void LLDrawPoolAvatar::prerender()
  102. {
  103. mVertexShaderLevel = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_AVATAR);
  104. sShaderLevel = mVertexShaderLevel;
  105. if (sShaderLevel > 0)
  106. {
  107. sBufferUsage = GL_STATIC_DRAW_ARB;
  108. }
  109. else
  110. {
  111. sBufferUsage = GL_STREAM_DRAW_ARB;
  112. }
  113. }
  114. LLMatrix4& LLDrawPoolAvatar::getModelView()
  115. {
  116. static LLMatrix4 ret;
  117. ret.initRows(LLVector4(gGLModelView+0),
  118.  LLVector4(gGLModelView+4),
  119.  LLVector4(gGLModelView+8),
  120.  LLVector4(gGLModelView+12));
  121. return ret;
  122. }
  123. //-----------------------------------------------------------------------------
  124. // render()
  125. //-----------------------------------------------------------------------------
  126. S32 LLDrawPoolAvatar::getNumDeferredPasses()
  127. {
  128. return getNumPasses();
  129. }
  130. void LLDrawPoolAvatar::beginDeferredPass(S32 pass)
  131. {
  132. LLFastTimer t(FTM_RENDER_CHARACTERS);
  133. if (LLPipeline::sImpostorRender)
  134. {
  135. beginDeferredSkinned();
  136. return;
  137. }
  138. switch (pass)
  139. {
  140. case 0:
  141. beginDeferredImpostor();
  142. break;
  143. case 1:
  144. beginDeferredRigid();
  145. break;
  146. case 2:
  147. beginDeferredSkinned();
  148. break;
  149. }
  150. }
  151. void LLDrawPoolAvatar::endDeferredPass(S32 pass)
  152. {
  153. LLFastTimer t(FTM_RENDER_CHARACTERS);
  154. if (LLPipeline::sImpostorRender)
  155. {
  156. endDeferredSkinned();
  157. return;
  158. }
  159. switch (pass)
  160. {
  161. case 0:
  162. endDeferredImpostor();
  163. break;
  164. case 1:
  165. endDeferredRigid();
  166. break;
  167. case 2:
  168. endDeferredSkinned();
  169. break;
  170. }
  171. }
  172. void LLDrawPoolAvatar::renderDeferred(S32 pass)
  173. {
  174. render(pass);
  175. }
  176. S32 LLDrawPoolAvatar::getNumPostDeferredPasses()
  177. {
  178. return 1;
  179. }
  180. void LLDrawPoolAvatar::beginPostDeferredPass(S32 pass)
  181. {
  182. sSkipOpaque = TRUE;
  183. sShaderLevel = mVertexShaderLevel;
  184. sVertexProgram = &gDeferredAvatarAlphaProgram;
  185. sRenderingSkinned = TRUE;
  186. gPipeline.bindDeferredShader(*sVertexProgram);
  187. enable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
  188. }
  189. void LLDrawPoolAvatar::endPostDeferredPass(S32 pass)
  190. {
  191. // if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done
  192. sRenderingSkinned = FALSE;
  193. sSkipOpaque = FALSE;
  194. disable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
  195. gPipeline.unbindDeferredShader(*sVertexProgram);
  196. sShaderLevel = mVertexShaderLevel;
  197. }
  198. void LLDrawPoolAvatar::renderPostDeferred(S32 pass)
  199. {
  200. render(2); //pass 2 = skinned
  201. }
  202. S32 LLDrawPoolAvatar::getNumShadowPasses()
  203. {
  204. return 1;
  205. }
  206. void LLDrawPoolAvatar::beginShadowPass(S32 pass)
  207. {
  208. LLFastTimer t(FTM_SHADOW_AVATAR);
  209. sVertexProgram = &gDeferredAvatarShadowProgram;
  210. if (sShaderLevel > 0)
  211. {
  212. gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX];
  213. }
  214. gGL.setAlphaRejectSettings(LLRender::CF_GREATER_EQUAL, 0.2f);
  215. glColor4f(1,1,1,1);
  216. if ((sShaderLevel > 0))  // for hardware blending
  217. {
  218. sRenderingSkinned = TRUE;
  219. sVertexProgram->bind();
  220. enable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
  221. }
  222. }
  223. void LLDrawPoolAvatar::endShadowPass(S32 pass)
  224. {
  225. LLFastTimer t(FTM_SHADOW_AVATAR);
  226. if (sShaderLevel > 0)
  227. {
  228. sRenderingSkinned = FALSE;
  229. sVertexProgram->unbind();
  230. disable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
  231. }
  232. gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
  233. }
  234. void LLDrawPoolAvatar::renderShadow(S32 pass)
  235. {
  236. LLFastTimer t(FTM_SHADOW_AVATAR);
  237. if (mDrawFace.empty())
  238. {
  239. return;
  240. }
  241. const LLFace *facep = mDrawFace[0];
  242. if (!facep->getDrawable())
  243. {
  244. return;
  245. }
  246. LLVOAvatar *avatarp = (LLVOAvatar *)facep->getDrawable()->getVObj().get();
  247. if (avatarp->isDead() || avatarp->mIsDummy || avatarp->mDrawable.isNull())
  248. {
  249. return;
  250. }
  251. BOOL impostor = avatarp->isImpostor();
  252. if (impostor)
  253. {
  254. return;
  255. }
  256. avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE);
  257. }
  258. S32 LLDrawPoolAvatar::getNumPasses()
  259. {
  260. return LLPipeline::sImpostorRender ? 1 : 3;
  261. }
  262. void LLDrawPoolAvatar::render(S32 pass)
  263. {
  264. LLFastTimer t(FTM_RENDER_CHARACTERS);
  265. if (LLPipeline::sImpostorRender)
  266. {
  267. renderAvatars(NULL, 2);
  268. return;
  269. }
  270. renderAvatars(NULL, pass); // render all avatars
  271. }
  272. void LLDrawPoolAvatar::beginRenderPass(S32 pass)
  273. {
  274. LLFastTimer t(FTM_RENDER_CHARACTERS);
  275. //reset vertex buffer mappings
  276. LLVertexBuffer::unbind();
  277. if (LLPipeline::sImpostorRender)
  278. {
  279. beginSkinned();
  280. return;
  281. }
  282. switch (pass)
  283. {
  284. case 0:
  285. beginFootShadow();
  286. break;
  287. case 1:
  288. beginRigid();
  289. break;
  290. case 2:
  291. beginSkinned();
  292. break;
  293. }
  294. }
  295. void LLDrawPoolAvatar::endRenderPass(S32 pass)
  296. {
  297. LLFastTimer t(FTM_RENDER_CHARACTERS);
  298. if (LLPipeline::sImpostorRender)
  299. {
  300. endSkinned();
  301. return;
  302. }
  303. switch (pass)
  304. {
  305. case 0:
  306. endFootShadow();
  307. break;
  308. case 1:
  309. endRigid();
  310. break;
  311. case 2:
  312. endSkinned();
  313. }
  314. }
  315. void LLDrawPoolAvatar::beginFootShadow()
  316. {
  317. if (!LLPipeline::sReflectionRender)
  318. {
  319. LLVOAvatar::sRenderDistance = llclamp(LLVOAvatar::sRenderDistance, 16.f, 256.f);
  320. LLVOAvatar::sNumVisibleAvatars = 0;
  321. }
  322. gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
  323. diffuse_channel = 0;
  324. }
  325. void LLDrawPoolAvatar::endFootShadow()
  326. {
  327. gPipeline.enableLightsDynamic();
  328. }
  329. void LLDrawPoolAvatar::beginRigid()
  330. {
  331. if (gPipeline.canUseVertexShaders())
  332. {
  333. if (LLPipeline::sUnderWaterRender)
  334. {
  335. sVertexProgram = &gObjectSimpleWaterProgram;
  336. }
  337. else
  338. {
  339. sVertexProgram = &gObjectSimpleProgram;
  340. }
  341. if (sVertexProgram != NULL)
  342. { //eyeballs render with the specular shader
  343. sVertexProgram->bind();
  344. }
  345. }
  346. else
  347. {
  348. sVertexProgram = NULL;
  349. }
  350. }
  351. void LLDrawPoolAvatar::endRigid()
  352. {
  353. sShaderLevel = mVertexShaderLevel;
  354. if (sVertexProgram != NULL)
  355. {
  356. sVertexProgram->unbind();
  357. }
  358. }
  359. void LLDrawPoolAvatar::beginDeferredImpostor()
  360. {
  361. if (!LLPipeline::sReflectionRender)
  362. {
  363. LLVOAvatar::sRenderDistance = llclamp(LLVOAvatar::sRenderDistance, 16.f, 256.f);
  364. LLVOAvatar::sNumVisibleAvatars = 0;
  365. }
  366. sVertexProgram = &gDeferredImpostorProgram;
  367. normal_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::DEFERRED_NORMAL);
  368. specular_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::SPECULAR_MAP);
  369. diffuse_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
  370. sVertexProgram->bind();
  371. }
  372. void LLDrawPoolAvatar::endDeferredImpostor()
  373. {
  374. sShaderLevel = mVertexShaderLevel;
  375. sVertexProgram->disableTexture(LLViewerShaderMgr::DEFERRED_NORMAL);
  376. sVertexProgram->disableTexture(LLViewerShaderMgr::SPECULAR_MAP);
  377. sVertexProgram->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
  378. sVertexProgram->unbind();
  379. gGL.getTexUnit(0)->activate();
  380. }
  381. void LLDrawPoolAvatar::beginDeferredRigid()
  382. {
  383. sVertexProgram = &gDeferredDiffuseProgram;
  384. sVertexProgram->bind();
  385. }
  386. void LLDrawPoolAvatar::endDeferredRigid()
  387. {
  388. sShaderLevel = mVertexShaderLevel;
  389. sVertexProgram->unbind();
  390. gGL.getTexUnit(0)->activate();
  391. }
  392. void LLDrawPoolAvatar::beginSkinned()
  393. {
  394. if (sShaderLevel > 0)
  395. {
  396. if (LLPipeline::sUnderWaterRender)
  397. {
  398. sVertexProgram = &gAvatarWaterProgram;
  399. sShaderLevel = llmin((U32) 1, sShaderLevel);
  400. }
  401. else
  402. {
  403. sVertexProgram = &gAvatarProgram;
  404. }
  405. }
  406. else
  407. {
  408. if (LLPipeline::sUnderWaterRender)
  409. {
  410. sVertexProgram = &gObjectSimpleWaterProgram;
  411. }
  412. else
  413. {
  414. sVertexProgram = &gObjectSimpleProgram;
  415. }
  416. }
  417. if (sShaderLevel > 0)  // for hardware blending
  418. {
  419. sRenderingSkinned = TRUE;
  420. sVertexProgram->bind();
  421. if (sShaderLevel >= SHADER_LEVEL_CLOTH)
  422. {
  423. enable_cloth_weights(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_CLOTHING]);
  424. }
  425. enable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
  426. if (sShaderLevel >= SHADER_LEVEL_BUMP)
  427. {
  428. enable_binormals(sVertexProgram->mAttribute[LLViewerShaderMgr::BINORMAL]);
  429. }
  430. sVertexProgram->enableTexture(LLViewerShaderMgr::BUMP_MAP);
  431. gGL.getTexUnit(0)->activate();
  432. }
  433. else
  434. {
  435. if(gPipeline.canUseVertexShaders())
  436. {
  437. // software skinning, use a basic shader for windlight.
  438. // TODO: find a better fallback method for software skinning.
  439. sVertexProgram->bind();
  440. }
  441. }
  442. }
  443. void LLDrawPoolAvatar::endSkinned()
  444. {
  445. // if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done
  446. if (sShaderLevel > 0)
  447. {
  448. sRenderingSkinned = FALSE;
  449. sVertexProgram->disableTexture(LLViewerShaderMgr::BUMP_MAP);
  450. gGL.getTexUnit(0)->activate();
  451. disable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
  452. if (sShaderLevel >= SHADER_LEVEL_BUMP)
  453. {
  454. disable_binormals(sVertexProgram->mAttribute[LLViewerShaderMgr::BINORMAL]);
  455. }
  456. if ((sShaderLevel >= SHADER_LEVEL_CLOTH))
  457. {
  458. disable_cloth_weights(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_CLOTHING]);
  459. }
  460. sVertexProgram->unbind();
  461. sShaderLevel = mVertexShaderLevel;
  462. }
  463. else
  464. {
  465. if(gPipeline.canUseVertexShaders())
  466. {
  467. // software skinning, use a basic shader for windlight.
  468. // TODO: find a better fallback method for software skinning.
  469. sVertexProgram->unbind();
  470. }
  471. }
  472. gGL.getTexUnit(0)->activate();
  473. }
  474. void LLDrawPoolAvatar::beginDeferredSkinned()
  475. {
  476. sSkipTransparent = TRUE;
  477. sShaderLevel = mVertexShaderLevel;
  478. sVertexProgram = &gDeferredAvatarProgram;
  479. sRenderingSkinned = TRUE;
  480. sVertexProgram->bind();
  481. enable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
  482. gGL.getTexUnit(0)->activate();
  483. }
  484. void LLDrawPoolAvatar::endDeferredSkinned()
  485. {
  486. sSkipTransparent = FALSE;
  487. // if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done
  488. sRenderingSkinned = FALSE;
  489. disable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
  490. sVertexProgram->unbind();
  491. sShaderLevel = mVertexShaderLevel;
  492. gGL.getTexUnit(0)->activate();
  493. }
  494. void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
  495. {
  496. if (pass == -1)
  497. {
  498. for (S32 i = 1; i < getNumPasses(); i++)
  499. { //skip foot shadows
  500. prerender();
  501. beginRenderPass(i);
  502. renderAvatars(single_avatar, i);
  503. endRenderPass(i);
  504. }
  505. return;
  506. }
  507. if (mDrawFace.empty() && !single_avatar)
  508. {
  509. return;
  510. }
  511. LLVOAvatar *avatarp;
  512. if (single_avatar)
  513. {
  514. avatarp = single_avatar;
  515. }
  516. else
  517. {
  518. const LLFace *facep = mDrawFace[0];
  519. if (!facep->getDrawable())
  520. {
  521. return;
  522. }
  523. avatarp = (LLVOAvatar *)facep->getDrawable()->getVObj().get();
  524. }
  525.     if (avatarp->isDead() || avatarp->mDrawable.isNull())
  526. {
  527. return;
  528. }
  529. if (!single_avatar && !avatarp->isFullyLoaded() )
  530. {
  531. if (pass==1 && (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_PARTICLES) || LLViewerPartSim::getMaxPartCount() <= 0))
  532. {
  533. // debug code to draw a sphere in place of avatar
  534. gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sWhiteImagep);
  535. gGL.setColorMask(true, true);
  536. LLVector3 pos = avatarp->getPositionAgent();
  537. gGL.color4f(1.0f, 1.0f, 1.0f, 0.7f);
  538. gGL.pushMatrix();  
  539. gGL.translatef((F32)(pos.mV[VX]),  
  540.    (F32)(pos.mV[VY]),  
  541. (F32)(pos.mV[VZ]));  
  542.  gGL.scalef(0.15f, 0.15f, 0.3f);  
  543.  gSphere.render();  
  544.  gGL.popMatrix();
  545.  gGL.setColorMask(true, false);
  546. }
  547. // don't render please
  548. return;
  549. }
  550. BOOL impostor = avatarp->isImpostor() && !single_avatar;
  551. if (impostor && pass != 0)
  552. { //don't draw anything but the impostor for impostored avatars
  553. return;
  554. }
  555. if (pass == 0 && !impostor && LLPipeline::sUnderWaterRender)
  556. { //don't draw foot shadows under water
  557. return;
  558. }
  559.     LLOverrideFaceColor color(this, 1.0f, 1.0f, 1.0f, 1.0f);
  560. if (pass == 0)
  561. {
  562. if (!LLPipeline::sReflectionRender)
  563. {
  564. LLVOAvatar::sNumVisibleAvatars++;
  565. }
  566. if (impostor)
  567. {
  568. if (LLPipeline::sRenderDeferred && avatarp->mImpostor.isComplete()) 
  569. {
  570. if (normal_channel > -1)
  571. {
  572. avatarp->mImpostor.bindTexture(2, normal_channel);
  573. }
  574. if (specular_channel > -1)
  575. {
  576. avatarp->mImpostor.bindTexture(1, specular_channel);
  577. }
  578. }
  579. avatarp->renderImpostor(LLColor4U(255,255,255,255), diffuse_channel);
  580. }
  581. else if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_FOOT_SHADOWS) && !LLPipeline::sRenderDeferred)
  582. {
  583. avatarp->renderFootShadows();
  584. }
  585. return;
  586. }
  587. if (single_avatar && avatarp->mSpecialRenderMode >= 1) // 1=anim preview, 2=image preview,  3=morph view
  588. {
  589. gPipeline.enableLightsAvatarEdit(LLColor4(.5f, .5f, .5f, 1.f));
  590. }
  591. if (pass == 1)
  592. {
  593. // render rigid meshes (eyeballs) first
  594. avatarp->renderRigid();
  595. return;
  596. }
  597. if (sShaderLevel > 0)
  598. {
  599. gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX];
  600. }
  601.     
  602. if ((sShaderLevel >= SHADER_LEVEL_CLOTH))
  603. {
  604. LLMatrix4 rot_mat;
  605. LLViewerCamera::getInstance()->getMatrixToLocal(rot_mat);
  606. LLMatrix4 cfr(OGL_TO_CFR_ROTATION);
  607. rot_mat *= cfr;
  608. LLVector4 wind;
  609. wind.setVec(avatarp->mWindVec);
  610. wind.mV[VW] = 0;
  611. wind = wind * rot_mat;
  612. wind.mV[VW] = avatarp->mWindVec.mV[VW];
  613. sVertexProgram->vertexAttrib4fv(LLViewerShaderMgr::AVATAR_WIND, wind.mV);
  614. F32 phase = -1.f * (avatarp->mRipplePhase);
  615. F32 freq = 7.f + (noise1(avatarp->mRipplePhase) * 2.f);
  616. LLVector4 sin_params(freq, freq, freq, phase);
  617. sVertexProgram->vertexAttrib4fv(LLViewerShaderMgr::AVATAR_SINWAVE, sin_params.mV);
  618. LLVector4 gravity(0.f, 0.f, -CLOTHING_GRAVITY_EFFECT, 0.f);
  619. gravity = gravity * rot_mat;
  620. sVertexProgram->vertexAttrib4fv(LLViewerShaderMgr::AVATAR_GRAVITY, gravity.mV);
  621. }
  622. if( !single_avatar || (avatarp == single_avatar) )
  623. {
  624. avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE);
  625. }
  626. }
  627. //-----------------------------------------------------------------------------
  628. // renderForSelect()
  629. //-----------------------------------------------------------------------------
  630. void LLDrawPoolAvatar::renderForSelect()
  631. {
  632. if (mDrawFace.empty())
  633. {
  634. return;
  635. }
  636. const LLFace *facep = mDrawFace[0];
  637. if (!facep->getDrawable())
  638. {
  639. return;
  640. }
  641. LLVOAvatar *avatarp = (LLVOAvatar *)facep->getDrawable()->getVObj().get();
  642. if (avatarp->isDead() || avatarp->mIsDummy || avatarp->mDrawable.isNull())
  643. {
  644. return;
  645. }
  646. S32 curr_shader_level = getVertexShaderLevel();
  647. S32 name = avatarp->mDrawable->getVObj()->mGLName;
  648. LLColor4U color((U8)(name >> 16), (U8)(name >> 8), (U8)name);
  649. BOOL impostor = avatarp->isImpostor();
  650. if (impostor)
  651. {
  652. gGL.getTexUnit(0)->setTextureColorBlend(LLTexUnit::TBO_REPLACE, LLTexUnit::TBS_VERT_COLOR);
  653. gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_ALPHA, LLTexUnit::TBS_VERT_ALPHA);
  654. avatarp->renderImpostor(color);
  655. gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
  656. return;
  657. }
  658. sVertexProgram = &gAvatarPickProgram;
  659. if (curr_shader_level > 0)
  660. {
  661. gAvatarMatrixParam = sVertexProgram->mUniform[LLViewerShaderMgr::AVATAR_MATRIX];
  662. }
  663. gGL.setAlphaRejectSettings(LLRender::CF_GREATER_EQUAL, 0.2f);
  664. gGL.setSceneBlendType(LLRender::BT_REPLACE);
  665. glColor4ubv(color.mV);
  666. if (curr_shader_level > 0)  // for hardware blending
  667. {
  668. sRenderingSkinned = TRUE;
  669. sVertexProgram->bind();
  670. enable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
  671. }
  672. avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE);
  673. // if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done
  674. if (curr_shader_level > 0)
  675. {
  676. sRenderingSkinned = FALSE;
  677. sVertexProgram->unbind();
  678. disable_vertex_weighting(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT]);
  679. }
  680. gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
  681. gGL.setSceneBlendType(LLRender::BT_ALPHA);
  682. // restore texture mode
  683. gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
  684. }
  685. //-----------------------------------------------------------------------------
  686. // getDebugTexture()
  687. //-----------------------------------------------------------------------------
  688. LLViewerTexture *LLDrawPoolAvatar::getDebugTexture()
  689. {
  690. if (mReferences.empty())
  691. {
  692. return NULL;
  693. }
  694. LLFace *face = mReferences[0];
  695. if (!face->getDrawable())
  696. {
  697. return NULL;
  698. }
  699. const LLViewerObject *objectp = face->getDrawable()->getVObj();
  700. // Avatar should always have at least 1 (maybe 3?) TE's.
  701. return objectp->getTEImage(0);
  702. }
  703. LLColor3 LLDrawPoolAvatar::getDebugColor() const
  704. {
  705. return LLColor3(0.f, 1.f, 0.f);
  706. }
  707. LLVertexBufferAvatar::LLVertexBufferAvatar()
  708. : LLVertexBuffer(sDataMask, 
  709. LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_AVATAR) > 0 ?
  710. GL_DYNAMIC_DRAW_ARB : 
  711. GL_STREAM_DRAW_ARB)
  712. {
  713. }
  714. void LLVertexBufferAvatar::setupVertexBuffer(U32 data_mask) const
  715. {
  716. if (sRenderingSkinned)
  717. {
  718. U8* base = useVBOs() ? NULL : mMappedData;
  719. glVertexPointer(3,GL_FLOAT, mStride, (void*)(base + 0));
  720. glNormalPointer(GL_FLOAT, mStride, (void*)(base + mOffsets[TYPE_NORMAL]));
  721. glTexCoordPointer(2,GL_FLOAT, mStride, (void*)(base + mOffsets[TYPE_TEXCOORD0]));
  722. set_vertex_weights(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_WEIGHT], mStride, (F32*)(base + mOffsets[TYPE_WEIGHT]));
  723. if (sShaderLevel >= LLDrawPoolAvatar::SHADER_LEVEL_BUMP)
  724. {
  725. set_binormals(sVertexProgram->mAttribute[LLViewerShaderMgr::BINORMAL], mStride, (LLVector3*)(base + mOffsets[TYPE_BINORMAL]));
  726. }
  727. if (sShaderLevel >= LLDrawPoolAvatar::SHADER_LEVEL_CLOTH)
  728. {
  729. set_vertex_clothing_weights(sVertexProgram->mAttribute[LLViewerShaderMgr::AVATAR_CLOTHING], mStride, (LLVector4*)(base + mOffsets[TYPE_CLOTHWEIGHT]));
  730. }
  731. }
  732. else
  733. {
  734. LLVertexBuffer::setupVertexBuffer(data_mask);
  735. }
  736. }