PageRenderTime 33ms CodeModel.GetById 9ms RepoModel.GetById 0ms app.codeStats 0ms

/indra/newview/lldrawpoolavatar.cpp

https://bitbucket.org/lindenlab/viewer-beta/
C++ | 1721 lines | 1381 code | 262 blank | 78 comment | 198 complexity | 574bb64e79ec25cafb59b3a49cf84030 MD5 | raw file
Possible License(s): LGPL-2.1
  1. /**
  2. * @file lldrawpoolavatar.cpp
  3. * @brief LLDrawPoolAvatar class implementation
  4. *
  5. * $LicenseInfo:firstyear=2002&license=viewerlgpl$
  6. * Second Life Viewer Source Code
  7. * Copyright (C) 2010, Linden Research, Inc.
  8. *
  9. * This library is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU Lesser General Public
  11. * License as published by the Free Software Foundation;
  12. * version 2.1 of the License only.
  13. *
  14. * This library is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  17. * Lesser General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU Lesser General Public
  20. * License along with this library; if not, write to the Free Software
  21. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  22. *
  23. * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
  24. * $/LicenseInfo$
  25. */
  26. #include "llviewerprecompiledheaders.h"
  27. #include "lldrawpoolavatar.h"
  28. #include "llrender.h"
  29. #include "llvoavatar.h"
  30. #include "m3math.h"
  31. #include "llmatrix4a.h"
  32. #include "llagent.h" //for gAgent.needsRenderAvatar()
  33. #include "lldrawable.h"
  34. #include "lldrawpoolbump.h"
  35. #include "llface.h"
  36. #include "llmeshrepository.h"
  37. #include "llsky.h"
  38. #include "llviewercamera.h"
  39. #include "llviewerregion.h"
  40. #include "noise.h"
  41. #include "pipeline.h"
  42. #include "llviewershadermgr.h"
  43. #include "llvovolume.h"
  44. #include "llvolume.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. LLGLSLShader* LLDrawPoolAvatar::sVertexProgram = NULL;
  52. BOOL LLDrawPoolAvatar::sSkipOpaque = FALSE;
  53. BOOL LLDrawPoolAvatar::sSkipTransparent = FALSE;
  54. S32 LLDrawPoolAvatar::sDiffuseChannel = 0;
  55. static bool is_deferred_render = false;
  56. extern BOOL gUseGLPick;
  57. F32 CLOTHING_GRAVITY_EFFECT = 0.7f;
  58. F32 CLOTHING_ACCEL_FORCE_FACTOR = 0.2f;
  59. const S32 NUM_TEST_AVATARS = 30;
  60. const S32 MIN_PIXEL_AREA_2_PASS_SKINNING = 500000000;
  61. // Format for gAGPVertices
  62. // vertex format for bumpmapping:
  63. // vertices 12
  64. // pad 4
  65. // normals 12
  66. // pad 4
  67. // texcoords0 8
  68. // texcoords1 8
  69. // total 48
  70. //
  71. // for no bumpmapping
  72. // vertices 12
  73. // texcoords 8
  74. // normals 12
  75. // total 32
  76. //
  77. S32 AVATAR_OFFSET_POS = 0;
  78. S32 AVATAR_OFFSET_NORMAL = 16;
  79. S32 AVATAR_OFFSET_TEX0 = 32;
  80. S32 AVATAR_OFFSET_TEX1 = 40;
  81. S32 AVATAR_VERTEX_BYTES = 48;
  82. BOOL gAvatarEmbossBumpMap = FALSE;
  83. static BOOL sRenderingSkinned = FALSE;
  84. S32 normal_channel = -1;
  85. S32 specular_channel = -1;
  86. S32 cube_channel = -1;
  87. static LLFastTimer::DeclareTimer FTM_SHADOW_AVATAR("Avatar Shadow");
  88. LLDrawPoolAvatar::LLDrawPoolAvatar() :
  89. LLFacePool(POOL_AVATAR)
  90. {
  91. }
  92. //-----------------------------------------------------------------------------
  93. // instancePool()
  94. //-----------------------------------------------------------------------------
  95. LLDrawPool *LLDrawPoolAvatar::instancePool()
  96. {
  97. return new LLDrawPoolAvatar();
  98. }
  99. S32 LLDrawPoolAvatar::getVertexShaderLevel() const
  100. {
  101. return (S32) LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_AVATAR);
  102. }
  103. void LLDrawPoolAvatar::prerender()
  104. {
  105. mVertexShaderLevel = LLViewerShaderMgr::instance()->getVertexShaderLevel(LLViewerShaderMgr::SHADER_AVATAR);
  106. sShaderLevel = mVertexShaderLevel;
  107. if (sShaderLevel > 0)
  108. {
  109. sBufferUsage = GL_DYNAMIC_DRAW_ARB;
  110. }
  111. else
  112. {
  113. sBufferUsage = GL_STREAM_DRAW_ARB;
  114. }
  115. }
  116. LLMatrix4& LLDrawPoolAvatar::getModelView()
  117. {
  118. static LLMatrix4 ret;
  119. ret.initRows(LLVector4(gGLModelView+0),
  120. LLVector4(gGLModelView+4),
  121. LLVector4(gGLModelView+8),
  122. LLVector4(gGLModelView+12));
  123. return ret;
  124. }
  125. //-----------------------------------------------------------------------------
  126. // render()
  127. //-----------------------------------------------------------------------------
  128. void LLDrawPoolAvatar::beginDeferredPass(S32 pass)
  129. {
  130. LLFastTimer t(FTM_RENDER_CHARACTERS);
  131. sSkipTransparent = TRUE;
  132. is_deferred_render = true;
  133. if (LLPipeline::sImpostorRender)
  134. { //impostor pass does not have rigid or impostor rendering
  135. pass += 2;
  136. }
  137. switch (pass)
  138. {
  139. case 0:
  140. beginDeferredImpostor();
  141. break;
  142. case 1:
  143. beginDeferredRigid();
  144. break;
  145. case 2:
  146. beginDeferredSkinned();
  147. break;
  148. case 3:
  149. beginDeferredRiggedSimple();
  150. break;
  151. case 4:
  152. beginDeferredRiggedBump();
  153. break;
  154. }
  155. }
  156. void LLDrawPoolAvatar::endDeferredPass(S32 pass)
  157. {
  158. LLFastTimer t(FTM_RENDER_CHARACTERS);
  159. sSkipTransparent = FALSE;
  160. is_deferred_render = false;
  161. if (LLPipeline::sImpostorRender)
  162. {
  163. pass += 2;
  164. }
  165. switch (pass)
  166. {
  167. case 0:
  168. endDeferredImpostor();
  169. break;
  170. case 1:
  171. endDeferredRigid();
  172. break;
  173. case 2:
  174. endDeferredSkinned();
  175. break;
  176. case 3:
  177. endDeferredRiggedSimple();
  178. break;
  179. case 4:
  180. endDeferredRiggedBump();
  181. break;
  182. }
  183. }
  184. void LLDrawPoolAvatar::renderDeferred(S32 pass)
  185. {
  186. render(pass);
  187. }
  188. S32 LLDrawPoolAvatar::getNumPostDeferredPasses()
  189. {
  190. return 6;
  191. }
  192. void LLDrawPoolAvatar::beginPostDeferredPass(S32 pass)
  193. {
  194. switch (pass)
  195. {
  196. case 0:
  197. beginPostDeferredAlpha();
  198. break;
  199. case 1:
  200. beginRiggedFullbright();
  201. break;
  202. case 2:
  203. beginRiggedFullbrightShiny();
  204. break;
  205. case 3:
  206. beginDeferredRiggedAlpha();
  207. break;
  208. case 4:
  209. beginRiggedFullbrightAlpha();
  210. break;
  211. case 5:
  212. beginRiggedGlow();
  213. break;
  214. }
  215. }
  216. void LLDrawPoolAvatar::beginPostDeferredAlpha()
  217. {
  218. sSkipOpaque = TRUE;
  219. sShaderLevel = mVertexShaderLevel;
  220. sVertexProgram = &gDeferredAvatarAlphaProgram;
  221. sRenderingSkinned = TRUE;
  222. gPipeline.bindDeferredShader(*sVertexProgram);
  223. sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
  224. }
  225. void LLDrawPoolAvatar::beginDeferredRiggedAlpha()
  226. {
  227. sVertexProgram = &gDeferredSkinnedAlphaProgram;
  228. gPipeline.bindDeferredShader(*sVertexProgram);
  229. sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
  230. gPipeline.enableLightsDynamic();
  231. }
  232. void LLDrawPoolAvatar::endDeferredRiggedAlpha()
  233. {
  234. LLVertexBuffer::unbind();
  235. gPipeline.unbindDeferredShader(*sVertexProgram);
  236. sDiffuseChannel = 0;
  237. sVertexProgram = NULL;
  238. }
  239. void LLDrawPoolAvatar::endPostDeferredPass(S32 pass)
  240. {
  241. switch (pass)
  242. {
  243. case 0:
  244. endPostDeferredAlpha();
  245. break;
  246. case 1:
  247. endRiggedFullbright();
  248. break;
  249. case 2:
  250. endRiggedFullbrightShiny();
  251. break;
  252. case 3:
  253. endDeferredRiggedAlpha();
  254. break;
  255. case 4:
  256. endRiggedFullbrightAlpha();
  257. break;
  258. case 5:
  259. endRiggedGlow();
  260. break;
  261. }
  262. }
  263. void LLDrawPoolAvatar::endPostDeferredAlpha()
  264. {
  265. // if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done
  266. sRenderingSkinned = FALSE;
  267. sSkipOpaque = FALSE;
  268. gPipeline.unbindDeferredShader(*sVertexProgram);
  269. sDiffuseChannel = 0;
  270. sShaderLevel = mVertexShaderLevel;
  271. }
  272. void LLDrawPoolAvatar::renderPostDeferred(S32 pass)
  273. {
  274. const S32 actual_pass[] =
  275. { //map post deferred pass numbers to what render() expects
  276. 2, //skinned
  277. 4, // rigged fullbright
  278. 6, //rigged fullbright shiny
  279. 7, //rigged alpha
  280. 8, //rigged fullbright alpha
  281. 9, //rigged glow
  282. };
  283. pass = actual_pass[pass];
  284. if (LLPipeline::sImpostorRender)
  285. { //HACK for impostors so actual pass ends up being proper pass
  286. pass -= 2;
  287. }
  288. render(pass);
  289. }
  290. S32 LLDrawPoolAvatar::getNumShadowPasses()
  291. {
  292. return 2;
  293. }
  294. void LLDrawPoolAvatar::beginShadowPass(S32 pass)
  295. {
  296. LLFastTimer t(FTM_SHADOW_AVATAR);
  297. if (pass == 0)
  298. {
  299. sVertexProgram = &gDeferredAvatarShadowProgram;
  300. //gGL.setAlphaRejectSettings(LLRender::CF_GREATER_EQUAL, 0.2f);
  301. if ((sShaderLevel > 0)) // for hardware blending
  302. {
  303. sRenderingSkinned = TRUE;
  304. sVertexProgram->bind();
  305. }
  306. gGL.diffuseColor4f(1,1,1,1);
  307. }
  308. else
  309. {
  310. sVertexProgram = &gDeferredAttachmentShadowProgram;
  311. sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
  312. sVertexProgram->bind();
  313. }
  314. }
  315. void LLDrawPoolAvatar::endShadowPass(S32 pass)
  316. {
  317. LLFastTimer t(FTM_SHADOW_AVATAR);
  318. if (pass == 0)
  319. {
  320. if (sShaderLevel > 0)
  321. {
  322. sRenderingSkinned = FALSE;
  323. sVertexProgram->unbind();
  324. }
  325. }
  326. else
  327. {
  328. LLVertexBuffer::unbind();
  329. sVertexProgram->unbind();
  330. sVertexProgram = NULL;
  331. }
  332. }
  333. void LLDrawPoolAvatar::renderShadow(S32 pass)
  334. {
  335. LLFastTimer t(FTM_SHADOW_AVATAR);
  336. if (mDrawFace.empty())
  337. {
  338. return;
  339. }
  340. const LLFace *facep = mDrawFace[0];
  341. if (!facep->getDrawable())
  342. {
  343. return;
  344. }
  345. LLVOAvatar *avatarp = (LLVOAvatar *)facep->getDrawable()->getVObj().get();
  346. if (avatarp->isDead() || avatarp->mIsDummy || avatarp->mDrawable.isNull())
  347. {
  348. return;
  349. }
  350. BOOL impostor = avatarp->isImpostor();
  351. if (impostor)
  352. {
  353. return;
  354. }
  355. if (pass == 0)
  356. {
  357. avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE);
  358. }
  359. else
  360. {
  361. renderRigged(avatarp, RIGGED_SIMPLE);
  362. renderRigged(avatarp, RIGGED_ALPHA);
  363. renderRigged(avatarp, RIGGED_FULLBRIGHT);
  364. renderRigged(avatarp, RIGGED_FULLBRIGHT_SHINY);
  365. renderRigged(avatarp, RIGGED_SHINY);
  366. renderRigged(avatarp, RIGGED_FULLBRIGHT_ALPHA);
  367. }
  368. }
  369. S32 LLDrawPoolAvatar::getNumPasses()
  370. {
  371. if (LLPipeline::sImpostorRender)
  372. {
  373. return 8;
  374. }
  375. else
  376. {
  377. return 10;
  378. }
  379. }
  380. S32 LLDrawPoolAvatar::getNumDeferredPasses()
  381. {
  382. if (LLPipeline::sImpostorRender)
  383. {
  384. return 3;
  385. }
  386. else
  387. {
  388. return 5;
  389. }
  390. }
  391. void LLDrawPoolAvatar::render(S32 pass)
  392. {
  393. LLFastTimer t(FTM_RENDER_CHARACTERS);
  394. if (LLPipeline::sImpostorRender)
  395. {
  396. renderAvatars(NULL, pass+2);
  397. return;
  398. }
  399. renderAvatars(NULL, pass); // render all avatars
  400. }
  401. void LLDrawPoolAvatar::beginRenderPass(S32 pass)
  402. {
  403. LLFastTimer t(FTM_RENDER_CHARACTERS);
  404. //reset vertex buffer mappings
  405. LLVertexBuffer::unbind();
  406. if (LLPipeline::sImpostorRender)
  407. { //impostor render does not have impostors or rigid rendering
  408. pass += 2;
  409. }
  410. switch (pass)
  411. {
  412. case 0:
  413. beginImpostor();
  414. break;
  415. case 1:
  416. beginRigid();
  417. break;
  418. case 2:
  419. beginSkinned();
  420. break;
  421. case 3:
  422. beginRiggedSimple();
  423. break;
  424. case 4:
  425. beginRiggedFullbright();
  426. break;
  427. case 5:
  428. beginRiggedShinySimple();
  429. break;
  430. case 6:
  431. beginRiggedFullbrightShiny();
  432. break;
  433. case 7:
  434. beginRiggedAlpha();
  435. break;
  436. case 8:
  437. beginRiggedFullbrightAlpha();
  438. break;
  439. case 9:
  440. beginRiggedGlow();
  441. break;
  442. }
  443. if (pass == 0)
  444. { //make sure no stale colors are left over from a previous render
  445. gGL.diffuseColor4f(1,1,1,1);
  446. }
  447. }
  448. void LLDrawPoolAvatar::endRenderPass(S32 pass)
  449. {
  450. LLFastTimer t(FTM_RENDER_CHARACTERS);
  451. if (LLPipeline::sImpostorRender)
  452. {
  453. pass += 2;
  454. }
  455. switch (pass)
  456. {
  457. case 0:
  458. endImpostor();
  459. break;
  460. case 1:
  461. endRigid();
  462. break;
  463. case 2:
  464. endSkinned();
  465. break;
  466. case 3:
  467. endRiggedSimple();
  468. break;
  469. case 4:
  470. endRiggedFullbright();
  471. break;
  472. case 5:
  473. endRiggedShinySimple();
  474. break;
  475. case 6:
  476. endRiggedFullbrightShiny();
  477. break;
  478. case 7:
  479. endRiggedAlpha();
  480. break;
  481. case 8:
  482. endRiggedFullbrightAlpha();
  483. break;
  484. case 9:
  485. endRiggedGlow();
  486. break;
  487. }
  488. }
  489. void LLDrawPoolAvatar::beginImpostor()
  490. {
  491. if (!LLPipeline::sReflectionRender)
  492. {
  493. LLVOAvatar::sRenderDistance = llclamp(LLVOAvatar::sRenderDistance, 16.f, 256.f);
  494. LLVOAvatar::sNumVisibleAvatars = 0;
  495. }
  496. if (LLGLSLShader::sNoFixedFunction)
  497. {
  498. gImpostorProgram.bind();
  499. gImpostorProgram.setMinimumAlpha(0.01f);
  500. }
  501. gPipeline.enableLightsFullbright(LLColor4(1,1,1,1));
  502. sDiffuseChannel = 0;
  503. }
  504. void LLDrawPoolAvatar::endImpostor()
  505. {
  506. if (LLGLSLShader::sNoFixedFunction)
  507. {
  508. gImpostorProgram.unbind();
  509. }
  510. gPipeline.enableLightsDynamic();
  511. }
  512. void LLDrawPoolAvatar::beginRigid()
  513. {
  514. if (gPipeline.canUseVertexShaders())
  515. {
  516. if (LLPipeline::sUnderWaterRender)
  517. {
  518. sVertexProgram = &gObjectAlphaMaskNoColorWaterProgram;
  519. }
  520. else
  521. {
  522. sVertexProgram = &gObjectAlphaMaskNoColorProgram;
  523. }
  524. if (sVertexProgram != NULL)
  525. { //eyeballs render with the specular shader
  526. sVertexProgram->bind();
  527. sVertexProgram->setMinimumAlpha(0.2f);
  528. }
  529. }
  530. else
  531. {
  532. sVertexProgram = NULL;
  533. }
  534. }
  535. void LLDrawPoolAvatar::endRigid()
  536. {
  537. sShaderLevel = mVertexShaderLevel;
  538. if (sVertexProgram != NULL)
  539. {
  540. sVertexProgram->unbind();
  541. }
  542. }
  543. void LLDrawPoolAvatar::beginDeferredImpostor()
  544. {
  545. if (!LLPipeline::sReflectionRender)
  546. {
  547. LLVOAvatar::sRenderDistance = llclamp(LLVOAvatar::sRenderDistance, 16.f, 256.f);
  548. LLVOAvatar::sNumVisibleAvatars = 0;
  549. }
  550. sVertexProgram = &gDeferredImpostorProgram;
  551. specular_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::SPECULAR_MAP);
  552. normal_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::DEFERRED_NORMAL);
  553. sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
  554. sVertexProgram->bind();
  555. sVertexProgram->setMinimumAlpha(0.01f);
  556. }
  557. void LLDrawPoolAvatar::endDeferredImpostor()
  558. {
  559. sShaderLevel = mVertexShaderLevel;
  560. sVertexProgram->disableTexture(LLViewerShaderMgr::DEFERRED_NORMAL);
  561. sVertexProgram->disableTexture(LLViewerShaderMgr::SPECULAR_MAP);
  562. sVertexProgram->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
  563. sVertexProgram->unbind();
  564. gGL.getTexUnit(0)->activate();
  565. }
  566. void LLDrawPoolAvatar::beginDeferredRigid()
  567. {
  568. sVertexProgram = &gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram;
  569. sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
  570. sVertexProgram->bind();
  571. sVertexProgram->setMinimumAlpha(0.2f);
  572. }
  573. void LLDrawPoolAvatar::endDeferredRigid()
  574. {
  575. sShaderLevel = mVertexShaderLevel;
  576. sVertexProgram->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
  577. sVertexProgram->unbind();
  578. gGL.getTexUnit(0)->activate();
  579. }
  580. void LLDrawPoolAvatar::beginSkinned()
  581. {
  582. if (sShaderLevel > 0)
  583. {
  584. if (LLPipeline::sUnderWaterRender)
  585. {
  586. sVertexProgram = &gAvatarWaterProgram;
  587. sShaderLevel = llmin((U32) 1, sShaderLevel);
  588. }
  589. else
  590. {
  591. sVertexProgram = &gAvatarProgram;
  592. }
  593. }
  594. else
  595. {
  596. if (LLPipeline::sUnderWaterRender)
  597. {
  598. sVertexProgram = &gObjectAlphaMaskNoColorWaterProgram;
  599. }
  600. else
  601. {
  602. sVertexProgram = &gObjectAlphaMaskNoColorProgram;
  603. }
  604. }
  605. if (sShaderLevel > 0) // for hardware blending
  606. {
  607. sRenderingSkinned = TRUE;
  608. sVertexProgram->bind();
  609. sVertexProgram->enableTexture(LLViewerShaderMgr::BUMP_MAP);
  610. gGL.getTexUnit(0)->activate();
  611. }
  612. else
  613. {
  614. if(gPipeline.canUseVertexShaders())
  615. {
  616. // software skinning, use a basic shader for windlight.
  617. // TODO: find a better fallback method for software skinning.
  618. sVertexProgram->bind();
  619. }
  620. }
  621. if (LLGLSLShader::sNoFixedFunction)
  622. {
  623. sVertexProgram->setMinimumAlpha(0.2f);
  624. }
  625. }
  626. void LLDrawPoolAvatar::endSkinned()
  627. {
  628. // if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done
  629. if (sShaderLevel > 0)
  630. {
  631. sRenderingSkinned = FALSE;
  632. sVertexProgram->disableTexture(LLViewerShaderMgr::BUMP_MAP);
  633. gGL.getTexUnit(0)->activate();
  634. sVertexProgram->unbind();
  635. sShaderLevel = mVertexShaderLevel;
  636. }
  637. else
  638. {
  639. if(gPipeline.canUseVertexShaders())
  640. {
  641. // software skinning, use a basic shader for windlight.
  642. // TODO: find a better fallback method for software skinning.
  643. sVertexProgram->unbind();
  644. }
  645. }
  646. gGL.getTexUnit(0)->activate();
  647. }
  648. void LLDrawPoolAvatar::beginRiggedSimple()
  649. {
  650. if (sShaderLevel > 0)
  651. {
  652. if (LLPipeline::sUnderWaterRender)
  653. {
  654. sVertexProgram = &gSkinnedObjectSimpleWaterProgram;
  655. }
  656. else
  657. {
  658. sVertexProgram = &gSkinnedObjectSimpleProgram;
  659. }
  660. }
  661. else
  662. {
  663. if (LLPipeline::sUnderWaterRender)
  664. {
  665. sVertexProgram = &gObjectSimpleNonIndexedWaterProgram;
  666. }
  667. else
  668. {
  669. sVertexProgram = &gObjectSimpleNonIndexedProgram;
  670. }
  671. }
  672. if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
  673. {
  674. sDiffuseChannel = 0;
  675. sVertexProgram->bind();
  676. }
  677. }
  678. void LLDrawPoolAvatar::endRiggedSimple()
  679. {
  680. LLVertexBuffer::unbind();
  681. if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
  682. {
  683. sVertexProgram->unbind();
  684. sVertexProgram = NULL;
  685. }
  686. }
  687. void LLDrawPoolAvatar::beginRiggedAlpha()
  688. {
  689. beginRiggedSimple();
  690. }
  691. void LLDrawPoolAvatar::endRiggedAlpha()
  692. {
  693. endRiggedSimple();
  694. }
  695. void LLDrawPoolAvatar::beginRiggedFullbrightAlpha()
  696. {
  697. beginRiggedFullbright();
  698. }
  699. void LLDrawPoolAvatar::endRiggedFullbrightAlpha()
  700. {
  701. endRiggedFullbright();
  702. }
  703. void LLDrawPoolAvatar::beginRiggedGlow()
  704. {
  705. if (sShaderLevel > 0)
  706. {
  707. if (LLPipeline::sUnderWaterRender)
  708. {
  709. sVertexProgram = &gSkinnedObjectEmissiveWaterProgram;
  710. }
  711. else
  712. {
  713. sVertexProgram = &gSkinnedObjectEmissiveProgram;
  714. }
  715. }
  716. else
  717. {
  718. if (LLPipeline::sUnderWaterRender)
  719. {
  720. sVertexProgram = &gObjectEmissiveNonIndexedWaterProgram;
  721. }
  722. else
  723. {
  724. sVertexProgram = &gObjectEmissiveNonIndexedProgram;
  725. }
  726. }
  727. if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
  728. {
  729. sDiffuseChannel = 0;
  730. sVertexProgram->bind();
  731. }
  732. }
  733. void LLDrawPoolAvatar::endRiggedGlow()
  734. {
  735. endRiggedFullbright();
  736. }
  737. void LLDrawPoolAvatar::beginRiggedFullbright()
  738. {
  739. if (sShaderLevel > 0)
  740. {
  741. if (LLPipeline::sUnderWaterRender)
  742. {
  743. sVertexProgram = &gSkinnedObjectFullbrightWaterProgram;
  744. }
  745. else
  746. {
  747. sVertexProgram = &gSkinnedObjectFullbrightProgram;
  748. }
  749. }
  750. else
  751. {
  752. if (LLPipeline::sUnderWaterRender)
  753. {
  754. sVertexProgram = &gObjectFullbrightNonIndexedWaterProgram;
  755. }
  756. else
  757. {
  758. sVertexProgram = &gObjectFullbrightNonIndexedProgram;
  759. }
  760. }
  761. if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
  762. {
  763. sDiffuseChannel = 0;
  764. sVertexProgram->bind();
  765. }
  766. }
  767. void LLDrawPoolAvatar::endRiggedFullbright()
  768. {
  769. LLVertexBuffer::unbind();
  770. if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
  771. {
  772. sVertexProgram->unbind();
  773. sVertexProgram = NULL;
  774. }
  775. }
  776. void LLDrawPoolAvatar::beginRiggedShinySimple()
  777. {
  778. if (sShaderLevel > 0)
  779. {
  780. if (LLPipeline::sUnderWaterRender)
  781. {
  782. sVertexProgram = &gSkinnedObjectShinySimpleWaterProgram;
  783. }
  784. else
  785. {
  786. sVertexProgram = &gSkinnedObjectShinySimpleProgram;
  787. }
  788. }
  789. else
  790. {
  791. if (LLPipeline::sUnderWaterRender)
  792. {
  793. sVertexProgram = &gObjectShinyNonIndexedWaterProgram;
  794. }
  795. else
  796. {
  797. sVertexProgram = &gObjectShinyNonIndexedProgram;
  798. }
  799. }
  800. if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
  801. {
  802. sVertexProgram->bind();
  803. LLDrawPoolBump::bindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
  804. }
  805. }
  806. void LLDrawPoolAvatar::endRiggedShinySimple()
  807. {
  808. LLVertexBuffer::unbind();
  809. if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
  810. {
  811. LLDrawPoolBump::unbindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
  812. sVertexProgram->unbind();
  813. sVertexProgram = NULL;
  814. }
  815. }
  816. void LLDrawPoolAvatar::beginRiggedFullbrightShiny()
  817. {
  818. if (sShaderLevel > 0)
  819. {
  820. if (LLPipeline::sUnderWaterRender)
  821. {
  822. sVertexProgram = &gSkinnedObjectFullbrightShinyWaterProgram;
  823. }
  824. else
  825. {
  826. sVertexProgram = &gSkinnedObjectFullbrightShinyProgram;
  827. }
  828. }
  829. else
  830. {
  831. if (LLPipeline::sUnderWaterRender)
  832. {
  833. sVertexProgram = &gObjectFullbrightShinyNonIndexedWaterProgram;
  834. }
  835. else
  836. {
  837. sVertexProgram = &gObjectFullbrightShinyNonIndexedProgram;
  838. }
  839. }
  840. if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
  841. {
  842. sVertexProgram->bind();
  843. LLDrawPoolBump::bindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
  844. }
  845. }
  846. void LLDrawPoolAvatar::endRiggedFullbrightShiny()
  847. {
  848. LLVertexBuffer::unbind();
  849. if (sShaderLevel > 0 || gPipeline.canUseVertexShaders())
  850. {
  851. LLDrawPoolBump::unbindCubeMap(sVertexProgram, 2, sDiffuseChannel, cube_channel, false);
  852. sVertexProgram->unbind();
  853. sVertexProgram = NULL;
  854. }
  855. }
  856. void LLDrawPoolAvatar::beginDeferredRiggedSimple()
  857. {
  858. sVertexProgram = &gDeferredSkinnedDiffuseProgram;
  859. sDiffuseChannel = 0;
  860. sVertexProgram->bind();
  861. }
  862. void LLDrawPoolAvatar::endDeferredRiggedSimple()
  863. {
  864. LLVertexBuffer::unbind();
  865. sVertexProgram->unbind();
  866. sVertexProgram = NULL;
  867. }
  868. void LLDrawPoolAvatar::beginDeferredRiggedBump()
  869. {
  870. sVertexProgram = &gDeferredSkinnedBumpProgram;
  871. sVertexProgram->bind();
  872. normal_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::BUMP_MAP);
  873. sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
  874. }
  875. void LLDrawPoolAvatar::endDeferredRiggedBump()
  876. {
  877. LLVertexBuffer::unbind();
  878. sVertexProgram->disableTexture(LLViewerShaderMgr::BUMP_MAP);
  879. sVertexProgram->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
  880. sVertexProgram->unbind();
  881. normal_channel = -1;
  882. sDiffuseChannel = 0;
  883. sVertexProgram = NULL;
  884. }
  885. void LLDrawPoolAvatar::beginDeferredSkinned()
  886. {
  887. sShaderLevel = mVertexShaderLevel;
  888. sVertexProgram = &gDeferredAvatarProgram;
  889. sRenderingSkinned = TRUE;
  890. sVertexProgram->bind();
  891. sVertexProgram->setMinimumAlpha(0.2f);
  892. sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
  893. gGL.getTexUnit(0)->activate();
  894. }
  895. void LLDrawPoolAvatar::endDeferredSkinned()
  896. {
  897. // if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done
  898. sRenderingSkinned = FALSE;
  899. sVertexProgram->unbind();
  900. sVertexProgram->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
  901. sShaderLevel = mVertexShaderLevel;
  902. gGL.getTexUnit(0)->activate();
  903. }
  904. void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
  905. {
  906. if (pass == -1)
  907. {
  908. for (S32 i = 1; i < getNumPasses(); i++)
  909. { //skip foot shadows
  910. prerender();
  911. beginRenderPass(i);
  912. renderAvatars(single_avatar, i);
  913. endRenderPass(i);
  914. }
  915. return;
  916. }
  917. if (mDrawFace.empty() && !single_avatar)
  918. {
  919. return;
  920. }
  921. LLVOAvatar *avatarp;
  922. if (single_avatar)
  923. {
  924. avatarp = single_avatar;
  925. }
  926. else
  927. {
  928. const LLFace *facep = mDrawFace[0];
  929. if (!facep->getDrawable())
  930. {
  931. return;
  932. }
  933. avatarp = (LLVOAvatar *)facep->getDrawable()->getVObj().get();
  934. }
  935. if (avatarp->isDead() || avatarp->mDrawable.isNull())
  936. {
  937. return;
  938. }
  939. if (!single_avatar && !avatarp->isFullyLoaded() )
  940. {
  941. if (pass==0 && (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_PARTICLES) || LLViewerPartSim::getMaxPartCount() <= 0))
  942. {
  943. // debug code to draw a sphere in place of avatar
  944. gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sWhiteImagep);
  945. gGL.setColorMask(true, true);
  946. LLVector3 pos = avatarp->getPositionAgent();
  947. gGL.color4f(1.0f, 1.0f, 1.0f, 0.7f);
  948. gGL.pushMatrix();
  949. gGL.translatef((F32)(pos.mV[VX]),
  950. (F32)(pos.mV[VY]),
  951. (F32)(pos.mV[VZ]));
  952. gGL.scalef(0.15f, 0.15f, 0.3f);
  953. gSphere.renderGGL();
  954. gGL.popMatrix();
  955. gGL.setColorMask(true, false);
  956. }
  957. // don't render please
  958. return;
  959. }
  960. BOOL impostor = avatarp->isImpostor() && !single_avatar;
  961. if (impostor && pass != 0)
  962. { //don't draw anything but the impostor for impostored avatars
  963. return;
  964. }
  965. if (pass == 0 && !impostor && LLPipeline::sUnderWaterRender)
  966. { //don't draw foot shadows under water
  967. return;
  968. }
  969. if (pass == 0)
  970. {
  971. if (!LLPipeline::sReflectionRender)
  972. {
  973. LLVOAvatar::sNumVisibleAvatars++;
  974. }
  975. if (impostor)
  976. {
  977. if (LLPipeline::sRenderDeferred && !LLPipeline::sReflectionRender && avatarp->mImpostor.isComplete())
  978. {
  979. if (normal_channel > -1)
  980. {
  981. avatarp->mImpostor.bindTexture(2, normal_channel);
  982. }
  983. if (specular_channel > -1)
  984. {
  985. avatarp->mImpostor.bindTexture(1, specular_channel);
  986. }
  987. }
  988. avatarp->renderImpostor(LLColor4U(255,255,255,255), sDiffuseChannel);
  989. }
  990. return;
  991. }
  992. /*if (single_avatar && avatarp->mSpecialRenderMode >= 1) // 1=anim preview, 2=image preview, 3=morph view
  993. {
  994. gPipeline.enableLightsAvatarEdit(LLColor4(.5f, .5f, .5f, 1.f));
  995. }*/
  996. if (pass == 1)
  997. {
  998. // render rigid meshes (eyeballs) first
  999. avatarp->renderRigid();
  1000. return;
  1001. }
  1002. if (pass == 3)
  1003. {
  1004. if (is_deferred_render)
  1005. {
  1006. renderDeferredRiggedSimple(avatarp);
  1007. }
  1008. else
  1009. {
  1010. renderRiggedSimple(avatarp);
  1011. }
  1012. return;
  1013. }
  1014. if (pass == 4)
  1015. {
  1016. if (is_deferred_render)
  1017. {
  1018. renderDeferredRiggedBump(avatarp);
  1019. }
  1020. else
  1021. {
  1022. renderRiggedFullbright(avatarp);
  1023. }
  1024. return;
  1025. }
  1026. if (pass == 5)
  1027. {
  1028. renderRiggedShinySimple(avatarp);
  1029. return;
  1030. }
  1031. if (pass == 6)
  1032. {
  1033. renderRiggedFullbrightShiny(avatarp);
  1034. return;
  1035. }
  1036. if (pass >= 7 && pass < 9)
  1037. {
  1038. LLGLEnable blend(GL_BLEND);
  1039. gGL.setColorMask(true, true);
  1040. gGL.blendFunc(LLRender::BF_SOURCE_ALPHA,
  1041. LLRender::BF_ONE_MINUS_SOURCE_ALPHA,
  1042. LLRender::BF_ZERO,
  1043. LLRender::BF_ONE_MINUS_SOURCE_ALPHA);
  1044. if (pass == 7)
  1045. {
  1046. renderRiggedAlpha(avatarp);
  1047. return;
  1048. }
  1049. if (pass == 8)
  1050. {
  1051. renderRiggedFullbrightAlpha(avatarp);
  1052. return;
  1053. }
  1054. }
  1055. if (pass == 9)
  1056. {
  1057. LLGLEnable blend(GL_BLEND);
  1058. LLGLDisable test(GL_ALPHA_TEST);
  1059. gGL.flush();
  1060. LLGLEnable polyOffset(GL_POLYGON_OFFSET_FILL);
  1061. glPolygonOffset(-1.0f, -1.0f);
  1062. gGL.setSceneBlendType(LLRender::BT_ADD);
  1063. LLGLDepthTest depth(GL_TRUE, GL_FALSE);
  1064. gGL.setColorMask(false, true);
  1065. renderRiggedGlow(avatarp);
  1066. gGL.setColorMask(true, false);
  1067. gGL.setSceneBlendType(LLRender::BT_ALPHA);
  1068. return;
  1069. }
  1070. if ((sShaderLevel >= SHADER_LEVEL_CLOTH))
  1071. {
  1072. LLMatrix4 rot_mat;
  1073. LLViewerCamera::getInstance()->getMatrixToLocal(rot_mat);
  1074. LLMatrix4 cfr(OGL_TO_CFR_ROTATION);
  1075. rot_mat *= cfr;
  1076. LLVector4 wind;
  1077. wind.setVec(avatarp->mWindVec);
  1078. wind.mV[VW] = 0;
  1079. wind = wind * rot_mat;
  1080. wind.mV[VW] = avatarp->mWindVec.mV[VW];
  1081. sVertexProgram->uniform4fv(LLViewerShaderMgr::AVATAR_WIND, 1, wind.mV);
  1082. F32 phase = -1.f * (avatarp->mRipplePhase);
  1083. F32 freq = 7.f + (noise1(avatarp->mRipplePhase) * 2.f);
  1084. LLVector4 sin_params(freq, freq, freq, phase);
  1085. sVertexProgram->uniform4fv(LLViewerShaderMgr::AVATAR_SINWAVE, 1, sin_params.mV);
  1086. LLVector4 gravity(0.f, 0.f, -CLOTHING_GRAVITY_EFFECT, 0.f);
  1087. gravity = gravity * rot_mat;
  1088. sVertexProgram->uniform4fv(LLViewerShaderMgr::AVATAR_GRAVITY, 1, gravity.mV);
  1089. }
  1090. if( !single_avatar || (avatarp == single_avatar) )
  1091. {
  1092. avatarp->renderSkinned(AVATAR_RENDER_PASS_SINGLE);
  1093. }
  1094. }
  1095. void LLDrawPoolAvatar::updateRiggedFaceVertexBuffer(LLVOAvatar* avatar, LLFace* face, const LLMeshSkinInfo* skin, LLVolume* volume, const LLVolumeFace& vol_face)
  1096. {
  1097. LLVector4a* weight = vol_face.mWeights;
  1098. if (!weight)
  1099. {
  1100. return;
  1101. }
  1102. LLPointer<LLVertexBuffer> buffer = face->getVertexBuffer();
  1103. LLDrawable* drawable = face->getDrawable();
  1104. U32 data_mask = face->getRiggedVertexBufferDataMask();
  1105. if (buffer.isNull() ||
  1106. buffer->getTypeMask() != data_mask ||
  1107. buffer->getNumVerts() != vol_face.mNumVertices ||
  1108. buffer->getNumIndices() != vol_face.mNumIndices ||
  1109. (drawable && drawable->isState(LLDrawable::REBUILD_ALL)))
  1110. {
  1111. face->setGeomIndex(0);
  1112. face->setIndicesIndex(0);
  1113. if (buffer.isNull() || buffer->getTypeMask() != data_mask)
  1114. { //make a new buffer
  1115. if (sShaderLevel > 0)
  1116. {
  1117. buffer = new LLVertexBuffer(data_mask, GL_DYNAMIC_DRAW_ARB);
  1118. }
  1119. else
  1120. {
  1121. buffer = new LLVertexBuffer(data_mask, GL_STREAM_DRAW_ARB);
  1122. }
  1123. buffer->allocateBuffer(vol_face.mNumVertices, vol_face.mNumIndices, true);
  1124. }
  1125. else
  1126. { //resize existing buffer
  1127. buffer->resizeBuffer(vol_face.mNumVertices, vol_face.mNumIndices);
  1128. }
  1129. face->setSize(vol_face.mNumVertices, vol_face.mNumIndices);
  1130. face->setVertexBuffer(buffer);
  1131. U16 offset = 0;
  1132. LLMatrix4 mat_vert = skin->mBindShapeMatrix;
  1133. glh::matrix4f m((F32*) mat_vert.mMatrix);
  1134. m = m.inverse().transpose();
  1135. F32 mat3[] =
  1136. { m.m[0], m.m[1], m.m[2],
  1137. m.m[4], m.m[5], m.m[6],
  1138. m.m[8], m.m[9], m.m[10] };
  1139. LLMatrix3 mat_normal(mat3);
  1140. //let getGeometryVolume know if alpha should override shiny
  1141. if (face->getFaceColor().mV[3] < 1.f)
  1142. {
  1143. face->setPoolType(LLDrawPool::POOL_ALPHA);
  1144. }
  1145. else
  1146. {
  1147. face->setPoolType(LLDrawPool::POOL_AVATAR);
  1148. }
  1149. face->getGeometryVolume(*volume, face->getTEOffset(), mat_vert, mat_normal, offset, true);
  1150. buffer->flush();
  1151. }
  1152. if (sShaderLevel <= 0 && face->mLastSkinTime < avatar->getLastSkinTime())
  1153. { //perform software vertex skinning for this face
  1154. LLStrider<LLVector3> position;
  1155. LLStrider<LLVector3> normal;
  1156. bool has_normal = buffer->hasDataType(LLVertexBuffer::TYPE_NORMAL);
  1157. buffer->getVertexStrider(position);
  1158. if (has_normal)
  1159. {
  1160. buffer->getNormalStrider(normal);
  1161. }
  1162. LLVector4a* pos = (LLVector4a*) position.get();
  1163. LLVector4a* norm = has_normal ? (LLVector4a*) normal.get() : NULL;
  1164. //build matrix palette
  1165. LLMatrix4a mp[64];
  1166. LLMatrix4* mat = (LLMatrix4*) mp;
  1167. for (U32 j = 0; j < skin->mJointNames.size(); ++j)
  1168. {
  1169. LLJoint* joint = avatar->getJoint(skin->mJointNames[j]);
  1170. if (joint)
  1171. {
  1172. mat[j] = skin->mInvBindMatrix[j];
  1173. mat[j] *= joint->getWorldMatrix();
  1174. }
  1175. }
  1176. LLMatrix4a bind_shape_matrix;
  1177. bind_shape_matrix.loadu(skin->mBindShapeMatrix);
  1178. for (U32 j = 0; j < buffer->getNumVerts(); ++j)
  1179. {
  1180. LLMatrix4a final_mat;
  1181. final_mat.clear();
  1182. S32 idx[4];
  1183. LLVector4 wght;
  1184. F32 scale = 0.f;
  1185. for (U32 k = 0; k < 4; k++)
  1186. {
  1187. F32 w = weight[j][k];
  1188. idx[k] = llclamp((S32) floorf(w), 0, 63);
  1189. wght[k] = w - floorf(w);
  1190. scale += wght[k];
  1191. }
  1192. wght *= 1.f/scale;
  1193. for (U32 k = 0; k < 4; k++)
  1194. {
  1195. F32 w = wght[k];
  1196. LLMatrix4a src;
  1197. src.setMul(mp[idx[k]], w);
  1198. final_mat.add(src);
  1199. }
  1200. LLVector4a& v = vol_face.mPositions[j];
  1201. LLVector4a t;
  1202. LLVector4a dst;
  1203. bind_shape_matrix.affineTransform(v, t);
  1204. final_mat.affineTransform(t, dst);
  1205. pos[j] = dst;
  1206. if (norm)
  1207. {
  1208. LLVector4a& n = vol_face.mNormals[j];
  1209. bind_shape_matrix.rotate(n, t);
  1210. final_mat.rotate(t, dst);
  1211. norm[j] = dst;
  1212. }
  1213. }
  1214. }
  1215. if (drawable && (face->getTEOffset() == drawable->getNumFaces()-1))
  1216. {
  1217. drawable->clearState(LLDrawable::REBUILD_ALL);
  1218. }
  1219. }
  1220. void LLDrawPoolAvatar::renderRigged(LLVOAvatar* avatar, U32 type, bool glow)
  1221. {
  1222. if (avatar->isSelf() && !gAgent.needsRenderAvatar() || !gMeshRepo.meshRezEnabled())
  1223. {
  1224. return;
  1225. }
  1226. stop_glerror();
  1227. for (U32 i = 0; i < mRiggedFace[type].size(); ++i)
  1228. {
  1229. LLFace* face = mRiggedFace[type][i];
  1230. LLDrawable* drawable = face->getDrawable();
  1231. if (!drawable)
  1232. {
  1233. continue;
  1234. }
  1235. LLVOVolume* vobj = drawable->getVOVolume();
  1236. if (!vobj)
  1237. {
  1238. continue;
  1239. }
  1240. LLVolume* volume = vobj->getVolume();
  1241. S32 te = face->getTEOffset();
  1242. if (!volume || volume->getNumVolumeFaces() <= te || !volume->isMeshAssetLoaded())
  1243. {
  1244. continue;
  1245. }
  1246. LLUUID mesh_id = volume->getParams().getSculptID();
  1247. if (mesh_id.isNull())
  1248. {
  1249. continue;
  1250. }
  1251. const LLMeshSkinInfo* skin = gMeshRepo.getSkinInfo(mesh_id, vobj);
  1252. if (!skin)
  1253. {
  1254. continue;
  1255. }
  1256. //stop_glerror();
  1257. //const LLVolumeFace& vol_face = volume->getVolumeFace(te);
  1258. //updateRiggedFaceVertexBuffer(avatar, face, skin, volume, vol_face);
  1259. //stop_glerror();
  1260. U32 data_mask = LLFace::getRiggedDataMask(type);
  1261. LLVertexBuffer* buff = face->getVertexBuffer();
  1262. if (buff)
  1263. {
  1264. if (sShaderLevel > 0)
  1265. { //upload matrix palette to shader
  1266. LLMatrix4 mat[64];
  1267. for (U32 i = 0; i < skin->mJointNames.size(); ++i)
  1268. {
  1269. LLJoint* joint = avatar->getJoint(skin->mJointNames[i]);
  1270. if (joint)
  1271. {
  1272. mat[i] = skin->mInvBindMatrix[i];
  1273. mat[i] *= joint->getWorldMatrix();
  1274. }
  1275. }
  1276. stop_glerror();
  1277. LLDrawPoolAvatar::sVertexProgram->uniformMatrix4fv("matrixPalette",
  1278. skin->mJointNames.size(),
  1279. FALSE,
  1280. (GLfloat*) mat[0].mMatrix);
  1281. stop_glerror();
  1282. }
  1283. else
  1284. {
  1285. data_mask &= ~LLVertexBuffer::MAP_WEIGHT4;
  1286. }
  1287. U16 start = face->getGeomStart();
  1288. U16 end = start + face->getGeomCount()-1;
  1289. S32 offset = face->getIndicesStart();
  1290. U32 count = face->getIndicesCount();
  1291. /*if (glow)
  1292. {
  1293. gGL.diffuseColor4f(0,0,0,face->getTextureEntry()->getGlow());
  1294. }*/
  1295. gGL.getTexUnit(sDiffuseChannel)->bind(face->getTexture());
  1296. if (normal_channel > -1)
  1297. {
  1298. LLDrawPoolBump::bindBumpMap(face, normal_channel);
  1299. }
  1300. if (face->mTextureMatrix)
  1301. {
  1302. gGL.matrixMode(LLRender::MM_TEXTURE);
  1303. gGL.loadMatrix((F32*) face->mTextureMatrix->mMatrix);
  1304. buff->setBuffer(data_mask);
  1305. buff->drawRange(LLRender::TRIANGLES, start, end, count, offset);
  1306. gGL.loadIdentity();
  1307. gGL.matrixMode(LLRender::MM_MODELVIEW);
  1308. }
  1309. else
  1310. {
  1311. buff->setBuffer(data_mask);
  1312. buff->drawRange(LLRender::TRIANGLES, start, end, count, offset);
  1313. }
  1314. }
  1315. }
  1316. }
  1317. void LLDrawPoolAvatar::renderDeferredRiggedSimple(LLVOAvatar* avatar)
  1318. {
  1319. updateRiggedVertexBuffers(avatar);
  1320. renderRigged(avatar, RIGGED_DEFERRED_SIMPLE);
  1321. }
  1322. void LLDrawPoolAvatar::renderDeferredRiggedBump(LLVOAvatar* avatar)
  1323. {
  1324. renderRigged(avatar, RIGGED_DEFERRED_BUMP);
  1325. }
  1326. void LLDrawPoolAvatar::updateRiggedVertexBuffers(LLVOAvatar* avatar)
  1327. {
  1328. //update rigged vertex buffers
  1329. for (U32 type = 0; type < NUM_RIGGED_PASSES; ++type)
  1330. {
  1331. for (U32 i = 0; i < mRiggedFace[type].size(); ++i)
  1332. {
  1333. LLFace* face = mRiggedFace[type][i];
  1334. LLDrawable* drawable = face->getDrawable();
  1335. if (!drawable)
  1336. {
  1337. continue;
  1338. }
  1339. LLVOVolume* vobj = drawable->getVOVolume();
  1340. if (!vobj)
  1341. {
  1342. continue;
  1343. }
  1344. LLVolume* volume = vobj->getVolume();
  1345. S32 te = face->getTEOffset();
  1346. if (!volume || volume->getNumVolumeFaces() <= te)
  1347. {
  1348. continue;
  1349. }
  1350. LLUUID mesh_id = volume->getParams().getSculptID();
  1351. if (mesh_id.isNull())
  1352. {
  1353. continue;
  1354. }
  1355. const LLMeshSkinInfo* skin = gMeshRepo.getSkinInfo(mesh_id, vobj);
  1356. if (!skin)
  1357. {
  1358. continue;
  1359. }
  1360. stop_glerror();
  1361. const LLVolumeFace& vol_face = volume->getVolumeFace(te);
  1362. updateRiggedFaceVertexBuffer(avatar, face, skin, volume, vol_face);
  1363. }
  1364. }
  1365. }
  1366. void LLDrawPoolAvatar::renderRiggedSimple(LLVOAvatar* avatar)
  1367. {
  1368. updateRiggedVertexBuffers(avatar);
  1369. renderRigged(avatar, RIGGED_SIMPLE);
  1370. }
  1371. void LLDrawPoolAvatar::renderRiggedFullbright(LLVOAvatar* avatar)
  1372. {
  1373. renderRigged(avatar, RIGGED_FULLBRIGHT);
  1374. }
  1375. void LLDrawPoolAvatar::renderRiggedShinySimple(LLVOAvatar* avatar)
  1376. {
  1377. renderRigged(avatar, RIGGED_SHINY);
  1378. }
  1379. void LLDrawPoolAvatar::renderRiggedFullbrightShiny(LLVOAvatar* avatar)
  1380. {
  1381. renderRigged(avatar, RIGGED_FULLBRIGHT_SHINY);
  1382. }
  1383. void LLDrawPoolAvatar::renderRiggedAlpha(LLVOAvatar* avatar)
  1384. {
  1385. renderRigged(avatar, RIGGED_ALPHA);
  1386. }
  1387. void LLDrawPoolAvatar::renderRiggedFullbrightAlpha(LLVOAvatar* avatar)
  1388. {
  1389. renderRigged(avatar, RIGGED_FULLBRIGHT_ALPHA);
  1390. }
  1391. void LLDrawPoolAvatar::renderRiggedGlow(LLVOAvatar* avatar)
  1392. {
  1393. renderRigged(avatar, RIGGED_GLOW, true);
  1394. }
  1395. //-----------------------------------------------------------------------------
  1396. // getDebugTexture()
  1397. //-----------------------------------------------------------------------------
  1398. LLViewerTexture *LLDrawPoolAvatar::getDebugTexture()
  1399. {
  1400. if (mReferences.empty())
  1401. {
  1402. return NULL;
  1403. }
  1404. LLFace *face = mReferences[0];
  1405. if (!face->getDrawable())
  1406. {
  1407. return NULL;
  1408. }
  1409. const LLViewerObject *objectp = face->getDrawable()->getVObj();
  1410. // Avatar should always have at least 1 (maybe 3?) TE's.
  1411. return objectp->getTEImage(0);
  1412. }
  1413. LLColor3 LLDrawPoolAvatar::getDebugColor() const
  1414. {
  1415. return LLColor3(0.f, 1.f, 0.f);
  1416. }
  1417. void LLDrawPoolAvatar::addRiggedFace(LLFace* facep, U32 type)
  1418. {
  1419. if (type >= NUM_RIGGED_PASSES)
  1420. {
  1421. llerrs << "Invalid rigged face type." << llendl;
  1422. }
  1423. if (facep->getRiggedIndex(type) != -1)
  1424. {
  1425. llerrs << "Tried to add a rigged face that's referenced elsewhere." << llendl;
  1426. }
  1427. facep->setRiggedIndex(type, mRiggedFace[type].size());
  1428. facep->setPool(this);
  1429. mRiggedFace[type].push_back(facep);
  1430. }
  1431. void LLDrawPoolAvatar::removeRiggedFace(LLFace* facep)
  1432. {
  1433. facep->setPool(NULL);
  1434. for (U32 i = 0; i < NUM_RIGGED_PASSES; ++i)
  1435. {
  1436. S32 index = facep->getRiggedIndex(i);
  1437. if (index > -1)
  1438. {
  1439. if (mRiggedFace[i].size() > index && mRiggedFace[i][index] == facep)
  1440. {
  1441. facep->setRiggedIndex(i,-1);
  1442. mRiggedFace[i].erase(mRiggedFace[i].begin()+index);
  1443. for (U32 j = index; j < mRiggedFace[i].size(); ++j)
  1444. { //bump indexes down for faces referenced after erased face
  1445. mRiggedFace[i][j]->setRiggedIndex(i, j);
  1446. }
  1447. }
  1448. else
  1449. {
  1450. llerrs << "Face reference data corrupt for rigged type " << i << llendl;
  1451. }
  1452. }
  1453. }
  1454. }
  1455. LLVertexBufferAvatar::LLVertexBufferAvatar()
  1456. : LLVertexBuffer(sDataMask,
  1457. GL_STREAM_DRAW_ARB) //avatars are always stream draw due to morph targets
  1458. {
  1459. }