diff options
Diffstat (limited to 'indra/newview/lldrawpoolavatar.cpp')
-rw-r--r-- | indra/newview/lldrawpoolavatar.cpp | 1712 |
1 files changed, 856 insertions, 856 deletions
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp index 72e6945679..0f395df276 100644 --- a/indra/newview/lldrawpoolavatar.cpp +++ b/indra/newview/lldrawpoolavatar.cpp @@ -1,862 +1,862 @@ -/** - * @file lldrawpoolavatar.cpp - * @brief LLDrawPoolAvatar class implementation - * - * $LicenseInfo:firstyear=2002&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2010, Linden Research, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA - * $/LicenseInfo$ - */ - -#include "llviewerprecompiledheaders.h" - -#include "lldrawpoolavatar.h" -#include "llskinningutil.h" -#include "llrender.h" - -#include "llvoavatar.h" -#include "m3math.h" -#include "llmatrix4a.h" - -#include "llagent.h" //for gAgent.needsRenderAvatar() -#include "lldrawable.h" -#include "lldrawpoolbump.h" -#include "llface.h" -#include "llmeshrepository.h" -#include "llsky.h" -#include "llviewercamera.h" -#include "llviewerregion.h" -#include "noise.h" -#include "pipeline.h" -#include "llviewershadermgr.h" -#include "llvovolume.h" -#include "llvolume.h" -#include "llappviewer.h" -#include "llrendersphere.h" -#include "llviewerpartsim.h" -#include "llviewercontrol.h" // for gSavedSettings -#include "llviewertexturelist.h" - -static U32 sShaderLevel = 0; - -LLGLSLShader* LLDrawPoolAvatar::sVertexProgram = NULL; -bool LLDrawPoolAvatar::sSkipOpaque = false; -bool LLDrawPoolAvatar::sSkipTransparent = false; -S32 LLDrawPoolAvatar::sShadowPass = -1; -S32 LLDrawPoolAvatar::sDiffuseChannel = 0; -F32 LLDrawPoolAvatar::sMinimumAlpha = 0.2f; - -LLUUID gBlackSquareID; - -static bool is_deferred_render = false; -static bool is_post_deferred_render = false; - -extern bool gUseGLPick; - -F32 CLOTHING_GRAVITY_EFFECT = 0.7f; -F32 CLOTHING_ACCEL_FORCE_FACTOR = 0.2f; - -// Format for gAGPVertices -// vertex format for bumpmapping: -// vertices 12 -// pad 4 -// normals 12 -// pad 4 -// texcoords0 8 -// texcoords1 8 -// total 48 -// -// for no bumpmapping -// vertices 12 -// texcoords 8 -// normals 12 -// total 32 -// - -S32 AVATAR_OFFSET_POS = 0; -S32 AVATAR_OFFSET_NORMAL = 16; -S32 AVATAR_OFFSET_TEX0 = 32; -S32 AVATAR_OFFSET_TEX1 = 40; -S32 AVATAR_VERTEX_BYTES = 48; - -bool gAvatarEmbossBumpMap = false; -static bool sRenderingSkinned = false; -S32 normal_channel = -1; -S32 specular_channel = -1; -S32 cube_channel = -1; - -LLDrawPoolAvatar::LLDrawPoolAvatar(U32 type) : - LLFacePool(type) -{ -} - -LLDrawPoolAvatar::~LLDrawPoolAvatar() -{ - if (!isDead()) - { - LL_WARNS() << "Destroying avatar drawpool that still contains faces" << LL_ENDL; - } -} - -// virtual -bool LLDrawPoolAvatar::isDead() -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR - - if (!LLFacePool::isDead()) - { - return false; - } - - return true; -} - -S32 LLDrawPoolAvatar::getShaderLevel() const -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR - - return (S32) LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_AVATAR); -} - -void LLDrawPoolAvatar::prerender() -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR - - mShaderLevel = LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_AVATAR); - - sShaderLevel = mShaderLevel; -} - -LLMatrix4& LLDrawPoolAvatar::getModelView() -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR - - static LLMatrix4 ret; - - ret.initRows(LLVector4(gGLModelView+0), - LLVector4(gGLModelView+4), - LLVector4(gGLModelView+8), - LLVector4(gGLModelView+12)); - - return ret; -} - -//----------------------------------------------------------------------------- -// render() -//----------------------------------------------------------------------------- - - - -void LLDrawPoolAvatar::beginDeferredPass(S32 pass) -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR; - - sSkipTransparent = true; - is_deferred_render = true; - - if (LLPipeline::sImpostorRender) - { //impostor pass does not have impostor rendering - ++pass; - } - - switch (pass) - { - case 0: - beginDeferredImpostor(); - break; - case 1: - beginDeferredRigid(); - break; - case 2: - beginDeferredSkinned(); - break; - } -} - -void LLDrawPoolAvatar::endDeferredPass(S32 pass) -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR; - - sSkipTransparent = false; - is_deferred_render = false; - - if (LLPipeline::sImpostorRender) - { - ++pass; - } - - switch (pass) - { - case 0: - endDeferredImpostor(); - break; - case 1: - endDeferredRigid(); - break; - case 2: - endDeferredSkinned(); - break; - } -} - -void LLDrawPoolAvatar::renderDeferred(S32 pass) -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR - - render(pass); -} - -S32 LLDrawPoolAvatar::getNumPostDeferredPasses() -{ - return 1; -} - -void LLDrawPoolAvatar::beginPostDeferredPass(S32 pass) -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR - - sSkipOpaque = true; - sShaderLevel = mShaderLevel; - sVertexProgram = &gDeferredAvatarAlphaProgram; - sRenderingSkinned = true; - - gPipeline.bindDeferredShader(*sVertexProgram); - - sVertexProgram->setMinimumAlpha(LLDrawPoolAvatar::sMinimumAlpha); - - sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); -} - -void LLDrawPoolAvatar::endPostDeferredPass(S32 pass) -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR - // if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done - sRenderingSkinned = false; - sSkipOpaque = false; - - gPipeline.unbindDeferredShader(*sVertexProgram); - sDiffuseChannel = 0; - sShaderLevel = mShaderLevel; -} - -void LLDrawPoolAvatar::renderPostDeferred(S32 pass) -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR - - is_post_deferred_render = true; - if (LLPipeline::sImpostorRender) - { //HACK for impostors so actual pass ends up being proper pass - render(0); - } - else - { - render(2); - } - is_post_deferred_render = false; -} - - -S32 LLDrawPoolAvatar::getNumShadowPasses() -{ - // avatars opaque, avatar alpha, avatar alpha mask, alpha attachments, alpha mask attachments, opaque attachments... - return NUM_SHADOW_PASSES; -} - -void LLDrawPoolAvatar::beginShadowPass(S32 pass) -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR; - - if (pass == SHADOW_PASS_AVATAR_OPAQUE) - { - sVertexProgram = &gDeferredAvatarShadowProgram; - - if ((sShaderLevel > 0)) // for hardware blending - { - sRenderingSkinned = true; - sVertexProgram->bind(); - } - - gGL.diffuseColor4f(1, 1, 1, 1); - } - else if (pass == SHADOW_PASS_AVATAR_ALPHA_BLEND) - { - sVertexProgram = &gDeferredAvatarAlphaShadowProgram; - - // bind diffuse tex so we can reference the alpha channel... - S32 loc = sVertexProgram->getUniformLocation(LLViewerShaderMgr::DIFFUSE_MAP); - sDiffuseChannel = 0; - if (loc != -1) - { - sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); - } - - if ((sShaderLevel > 0)) // for hardware blending - { - sRenderingSkinned = true; - sVertexProgram->bind(); - } - - gGL.diffuseColor4f(1, 1, 1, 1); - } - else if (pass == SHADOW_PASS_AVATAR_ALPHA_MASK) - { - sVertexProgram = &gDeferredAvatarAlphaMaskShadowProgram; - - // bind diffuse tex so we can reference the alpha channel... - S32 loc = sVertexProgram->getUniformLocation(LLViewerShaderMgr::DIFFUSE_MAP); - sDiffuseChannel = 0; - if (loc != -1) - { - sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); - } - - if ((sShaderLevel > 0)) // for hardware blending - { - sRenderingSkinned = true; - sVertexProgram->bind(); - } - - gGL.diffuseColor4f(1, 1, 1, 1); - } -} - -void LLDrawPoolAvatar::endShadowPass(S32 pass) -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR; - - if (sShaderLevel > 0) - { - sVertexProgram->unbind(); - } - sVertexProgram = NULL; - sRenderingSkinned = false; - LLDrawPoolAvatar::sShadowPass = -1; -} - -void LLDrawPoolAvatar::renderShadow(S32 pass) -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR; - - if (mDrawFace.empty()) - { - return; - } - - const LLFace *facep = mDrawFace[0]; - if (!facep->getDrawable()) - { - return; - } - LLVOAvatar *avatarp = (LLVOAvatar *)facep->getDrawable()->getVObj().get(); - - if (avatarp->isDead() || avatarp->isUIAvatar() || avatarp->mDrawable.isNull()) - { - return; - } - +/**
+ * @file lldrawpoolavatar.cpp
+ * @brief LLDrawPoolAvatar class implementation
+ *
+ * $LicenseInfo:firstyear=2002&license=viewerlgpl$
+ * Second Life Viewer Source Code
+ * Copyright (C) 2010, Linden Research, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation;
+ * version 2.1 of the License only.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "lldrawpoolavatar.h"
+#include "llskinningutil.h"
+#include "llrender.h"
+
+#include "llvoavatar.h"
+#include "m3math.h"
+#include "llmatrix4a.h"
+
+#include "llagent.h" //for gAgent.needsRenderAvatar()
+#include "lldrawable.h"
+#include "lldrawpoolbump.h"
+#include "llface.h"
+#include "llmeshrepository.h"
+#include "llsky.h"
+#include "llviewercamera.h"
+#include "llviewerregion.h"
+#include "noise.h"
+#include "pipeline.h"
+#include "llviewershadermgr.h"
+#include "llvovolume.h"
+#include "llvolume.h"
+#include "llappviewer.h"
+#include "llrendersphere.h"
+#include "llviewerpartsim.h"
+#include "llviewercontrol.h" // for gSavedSettings
+#include "llviewertexturelist.h"
+
+static U32 sShaderLevel = 0;
+
+LLGLSLShader* LLDrawPoolAvatar::sVertexProgram = NULL;
+bool LLDrawPoolAvatar::sSkipOpaque = false;
+bool LLDrawPoolAvatar::sSkipTransparent = false;
+S32 LLDrawPoolAvatar::sShadowPass = -1;
+S32 LLDrawPoolAvatar::sDiffuseChannel = 0;
+F32 LLDrawPoolAvatar::sMinimumAlpha = 0.2f;
+
+LLUUID gBlackSquareID;
+
+static bool is_deferred_render = false;
+static bool is_post_deferred_render = false;
+
+extern bool gUseGLPick;
+
+F32 CLOTHING_GRAVITY_EFFECT = 0.7f;
+F32 CLOTHING_ACCEL_FORCE_FACTOR = 0.2f;
+
+// Format for gAGPVertices
+// vertex format for bumpmapping:
+// vertices 12
+// pad 4
+// normals 12
+// pad 4
+// texcoords0 8
+// texcoords1 8
+// total 48
+//
+// for no bumpmapping
+// vertices 12
+// texcoords 8
+// normals 12
+// total 32
+//
+
+S32 AVATAR_OFFSET_POS = 0;
+S32 AVATAR_OFFSET_NORMAL = 16;
+S32 AVATAR_OFFSET_TEX0 = 32;
+S32 AVATAR_OFFSET_TEX1 = 40;
+S32 AVATAR_VERTEX_BYTES = 48;
+
+bool gAvatarEmbossBumpMap = false;
+static bool sRenderingSkinned = false;
+S32 normal_channel = -1;
+S32 specular_channel = -1;
+S32 cube_channel = -1;
+
+LLDrawPoolAvatar::LLDrawPoolAvatar(U32 type) :
+ LLFacePool(type)
+{
+}
+
+LLDrawPoolAvatar::~LLDrawPoolAvatar()
+{
+ if (!isDead())
+ {
+ LL_WARNS() << "Destroying avatar drawpool that still contains faces" << LL_ENDL;
+ }
+}
+
+// virtual
+bool LLDrawPoolAvatar::isDead()
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+
+ if (!LLFacePool::isDead())
+ {
+ return false;
+ }
+
+ return true;
+}
+
+S32 LLDrawPoolAvatar::getShaderLevel() const
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+
+ return (S32) LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_AVATAR);
+}
+
+void LLDrawPoolAvatar::prerender()
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+
+ mShaderLevel = LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_AVATAR);
+
+ sShaderLevel = mShaderLevel;
+}
+
+LLMatrix4& LLDrawPoolAvatar::getModelView()
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+
+ static LLMatrix4 ret;
+
+ ret.initRows(LLVector4(gGLModelView+0),
+ LLVector4(gGLModelView+4),
+ LLVector4(gGLModelView+8),
+ LLVector4(gGLModelView+12));
+
+ return ret;
+}
+
+//-----------------------------------------------------------------------------
+// render()
+//-----------------------------------------------------------------------------
+
+
+
+void LLDrawPoolAvatar::beginDeferredPass(S32 pass)
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
+
+ sSkipTransparent = true;
+ is_deferred_render = true;
+
+ if (LLPipeline::sImpostorRender)
+ { //impostor pass does not have impostor rendering
+ ++pass;
+ }
+
+ switch (pass)
+ {
+ case 0:
+ beginDeferredImpostor();
+ break;
+ case 1:
+ beginDeferredRigid();
+ break;
+ case 2:
+ beginDeferredSkinned();
+ break;
+ }
+}
+
+void LLDrawPoolAvatar::endDeferredPass(S32 pass)
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
+
+ sSkipTransparent = false;
+ is_deferred_render = false;
+
+ if (LLPipeline::sImpostorRender)
+ {
+ ++pass;
+ }
+
+ switch (pass)
+ {
+ case 0:
+ endDeferredImpostor();
+ break;
+ case 1:
+ endDeferredRigid();
+ break;
+ case 2:
+ endDeferredSkinned();
+ break;
+ }
+}
+
+void LLDrawPoolAvatar::renderDeferred(S32 pass)
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+
+ render(pass);
+}
+
+S32 LLDrawPoolAvatar::getNumPostDeferredPasses()
+{
+ return 1;
+}
+
+void LLDrawPoolAvatar::beginPostDeferredPass(S32 pass)
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+
+ sSkipOpaque = true;
+ sShaderLevel = mShaderLevel;
+ sVertexProgram = &gDeferredAvatarAlphaProgram;
+ sRenderingSkinned = true;
+
+ gPipeline.bindDeferredShader(*sVertexProgram);
+
+ sVertexProgram->setMinimumAlpha(LLDrawPoolAvatar::sMinimumAlpha);
+
+ sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
+}
+
+void LLDrawPoolAvatar::endPostDeferredPass(S32 pass)
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+ // if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done
+ sRenderingSkinned = false;
+ sSkipOpaque = false;
+
+ gPipeline.unbindDeferredShader(*sVertexProgram);
+ sDiffuseChannel = 0;
+ sShaderLevel = mShaderLevel;
+}
+
+void LLDrawPoolAvatar::renderPostDeferred(S32 pass)
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+
+ is_post_deferred_render = true;
+ if (LLPipeline::sImpostorRender)
+ { //HACK for impostors so actual pass ends up being proper pass
+ render(0);
+ }
+ else
+ {
+ render(2);
+ }
+ is_post_deferred_render = false;
+}
+
+
+S32 LLDrawPoolAvatar::getNumShadowPasses()
+{
+ // avatars opaque, avatar alpha, avatar alpha mask, alpha attachments, alpha mask attachments, opaque attachments...
+ return NUM_SHADOW_PASSES;
+}
+
+void LLDrawPoolAvatar::beginShadowPass(S32 pass)
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
+
+ if (pass == SHADOW_PASS_AVATAR_OPAQUE)
+ {
+ sVertexProgram = &gDeferredAvatarShadowProgram;
+
+ if ((sShaderLevel > 0)) // for hardware blending
+ {
+ sRenderingSkinned = true;
+ sVertexProgram->bind();
+ }
+
+ gGL.diffuseColor4f(1, 1, 1, 1);
+ }
+ else if (pass == SHADOW_PASS_AVATAR_ALPHA_BLEND)
+ {
+ sVertexProgram = &gDeferredAvatarAlphaShadowProgram;
+
+ // bind diffuse tex so we can reference the alpha channel...
+ S32 loc = sVertexProgram->getUniformLocation(LLViewerShaderMgr::DIFFUSE_MAP);
+ sDiffuseChannel = 0;
+ if (loc != -1)
+ {
+ sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
+ }
+
+ if ((sShaderLevel > 0)) // for hardware blending
+ {
+ sRenderingSkinned = true;
+ sVertexProgram->bind();
+ }
+
+ gGL.diffuseColor4f(1, 1, 1, 1);
+ }
+ else if (pass == SHADOW_PASS_AVATAR_ALPHA_MASK)
+ {
+ sVertexProgram = &gDeferredAvatarAlphaMaskShadowProgram;
+
+ // bind diffuse tex so we can reference the alpha channel...
+ S32 loc = sVertexProgram->getUniformLocation(LLViewerShaderMgr::DIFFUSE_MAP);
+ sDiffuseChannel = 0;
+ if (loc != -1)
+ {
+ sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
+ }
+
+ if ((sShaderLevel > 0)) // for hardware blending
+ {
+ sRenderingSkinned = true;
+ sVertexProgram->bind();
+ }
+
+ gGL.diffuseColor4f(1, 1, 1, 1);
+ }
+}
+
+void LLDrawPoolAvatar::endShadowPass(S32 pass)
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
+
+ if (sShaderLevel > 0)
+ {
+ sVertexProgram->unbind();
+ }
+ sVertexProgram = NULL;
+ sRenderingSkinned = false;
+ LLDrawPoolAvatar::sShadowPass = -1;
+}
+
+void LLDrawPoolAvatar::renderShadow(S32 pass)
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
+
+ if (mDrawFace.empty())
+ {
+ return;
+ }
+
+ const LLFace *facep = mDrawFace[0];
+ if (!facep->getDrawable())
+ {
+ return;
+ }
+ LLVOAvatar *avatarp = (LLVOAvatar *)facep->getDrawable()->getVObj().get();
+
+ if (avatarp->isDead() || avatarp->isUIAvatar() || avatarp->mDrawable.isNull())
+ {
+ return;
+ }
+
static LLCachedControl<bool> friends_only(gSavedSettings, "RenderAvatarFriendsOnly", false); if (friends_only() - && !avatarp->isControlAvatar() - && !avatarp->isSelf() - && !avatarp->isBuddy()) - { + && !avatarp->isControlAvatar()
+ && !avatarp->isSelf()
+ && !avatarp->isBuddy())
+ {
+ return;
+ }
+
+ LLVOAvatar::AvatarOverallAppearance oa = avatarp->getOverallAppearance();
+ bool impostor = !LLPipeline::sImpostorRender && avatarp->isImpostor();
+ // no shadows if the shadows are causing this avatar to breach the limit.
+ if (avatarp->isTooSlow() || impostor || (oa == LLVOAvatar::AOA_INVISIBLE))
+ {
+ // No shadows for impostored (including jellydolled) or invisible avs.
+ return;
+ }
+
+ LLDrawPoolAvatar::sShadowPass = pass;
+
+ if (pass == SHADOW_PASS_AVATAR_OPAQUE)
+ {
+ LLDrawPoolAvatar::sSkipTransparent = true;
+ avatarp->renderSkinned();
+ LLDrawPoolAvatar::sSkipTransparent = false;
+ }
+ else if (pass == SHADOW_PASS_AVATAR_ALPHA_BLEND)
+ {
+ LLDrawPoolAvatar::sSkipOpaque = true;
+ avatarp->renderSkinned();
+ LLDrawPoolAvatar::sSkipOpaque = false;
+ }
+ else if (pass == SHADOW_PASS_AVATAR_ALPHA_MASK)
+ {
+ LLDrawPoolAvatar::sSkipOpaque = true;
+ avatarp->renderSkinned();
+ LLDrawPoolAvatar::sSkipOpaque = false;
+ }
+}
+
+S32 LLDrawPoolAvatar::getNumPasses()
+{
+ return 3;
+}
+
+
+S32 LLDrawPoolAvatar::getNumDeferredPasses()
+{
+ return 3;
+}
+
+
+void LLDrawPoolAvatar::render(S32 pass)
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
+ if (LLPipeline::sImpostorRender)
+ {
+ renderAvatars(NULL, ++pass);
+ return;
+ }
+
+ renderAvatars(NULL, pass); // render all avatars
+}
+
+void LLDrawPoolAvatar::beginRenderPass(S32 pass)
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
+ //reset vertex buffer mappings
+ LLVertexBuffer::unbind();
+
+ if (LLPipeline::sImpostorRender)
+ { //impostor render does not have impostors or rigid rendering
+ ++pass;
+ }
+
+ switch (pass)
+ {
+ case 0:
+ beginImpostor();
+ break;
+ case 1:
+ beginRigid();
+ break;
+ case 2:
+ beginSkinned();
+ break;
+ }
+
+ if (pass == 0)
+ { //make sure no stale colors are left over from a previous render
+ gGL.diffuseColor4f(1,1,1,1);
+ }
+}
+
+void LLDrawPoolAvatar::endRenderPass(S32 pass)
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR;
+
+ if (LLPipeline::sImpostorRender)
+ {
+ ++pass;
+ }
+
+ switch (pass)
+ {
+ case 0:
+ endImpostor();
+ break;
+ case 1:
+ endRigid();
+ break;
+ case 2:
+ endSkinned();
+ break;
+ }
+}
+
+void LLDrawPoolAvatar::beginImpostor()
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+
+ if (!LLPipeline::sReflectionRender)
+ {
+ LLVOAvatar::sRenderDistance = llclamp(LLVOAvatar::sRenderDistance, 16.f, 256.f);
+ LLVOAvatar::sNumVisibleAvatars = 0;
+ }
+
+ gImpostorProgram.bind();
+ gImpostorProgram.setMinimumAlpha(0.01f);
+
+ gPipeline.enableLightsFullbright();
+ sDiffuseChannel = 0;
+}
+
+void LLDrawPoolAvatar::endImpostor()
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+
+ gImpostorProgram.unbind();
+ gPipeline.enableLightsDynamic();
+}
+
+void LLDrawPoolAvatar::beginRigid()
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+
+ if (gPipeline.shadersLoaded())
+ {
+ sVertexProgram = &gObjectAlphaMaskNoColorProgram;
+
+ if (sVertexProgram != NULL)
+ { //eyeballs render with the specular shader
+ sVertexProgram->bind();
+ sVertexProgram->setMinimumAlpha(LLDrawPoolAvatar::sMinimumAlpha);
+ }
+ }
+ else
+ {
+ sVertexProgram = NULL;
+ }
+}
+
+void LLDrawPoolAvatar::endRigid()
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+
+ sShaderLevel = mShaderLevel;
+ if (sVertexProgram != NULL)
+ {
+ sVertexProgram->unbind();
+ }
+}
+
+void LLDrawPoolAvatar::beginDeferredImpostor()
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+
+ if (!LLPipeline::sReflectionRender)
+ {
+ LLVOAvatar::sRenderDistance = llclamp(LLVOAvatar::sRenderDistance, 16.f, 256.f);
+ LLVOAvatar::sNumVisibleAvatars = 0;
+ }
+
+ sVertexProgram = &gDeferredImpostorProgram;
+ specular_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::SPECULAR_MAP);
+ normal_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::DEFERRED_NORMAL);
+ sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
+ sVertexProgram->bind();
+ sVertexProgram->setMinimumAlpha(0.01f);
+}
+
+void LLDrawPoolAvatar::endDeferredImpostor()
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+
+ sShaderLevel = mShaderLevel;
+ sVertexProgram->disableTexture(LLViewerShaderMgr::DEFERRED_NORMAL);
+ sVertexProgram->disableTexture(LLViewerShaderMgr::SPECULAR_MAP);
+ sVertexProgram->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
+ gPipeline.unbindDeferredShader(*sVertexProgram);
+ sVertexProgram = NULL;
+ sDiffuseChannel = 0;
+}
+
+void LLDrawPoolAvatar::beginDeferredRigid()
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+
+ sVertexProgram = &gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram;
+ sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
+ sVertexProgram->bind();
+ sVertexProgram->setMinimumAlpha(LLDrawPoolAvatar::sMinimumAlpha);
+}
+
+void LLDrawPoolAvatar::endDeferredRigid()
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+
+ sShaderLevel = mShaderLevel;
+ sVertexProgram->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
+ sVertexProgram->unbind();
+ gGL.getTexUnit(0)->activate();
+}
+
+
+void LLDrawPoolAvatar::beginSkinned()
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+
+ // used for preview only
+
+ sVertexProgram = &gAvatarProgram;
+
+ sRenderingSkinned = true;
+
+ sVertexProgram->bind();
+ sVertexProgram->setMinimumAlpha(LLDrawPoolAvatar::sMinimumAlpha);
+}
+
+void LLDrawPoolAvatar::endSkinned()
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+
+ // if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done
+ if (sShaderLevel > 0)
+ {
+ sRenderingSkinned = false;
+ sVertexProgram->disableTexture(LLViewerShaderMgr::BUMP_MAP);
+ gGL.getTexUnit(0)->activate();
+ sVertexProgram->unbind();
+ sShaderLevel = mShaderLevel;
+ }
+ else
+ {
+ if(gPipeline.shadersLoaded())
+ {
+ // software skinning, use a basic shader for windlight.
+ // TODO: find a better fallback method for software skinning.
+ sVertexProgram->unbind();
+ }
+ }
+
+ gGL.getTexUnit(0)->activate();
+}
+
+void LLDrawPoolAvatar::beginDeferredSkinned()
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+
+ sShaderLevel = mShaderLevel;
+ sVertexProgram = &gDeferredAvatarProgram;
+ sRenderingSkinned = true;
+
+ sVertexProgram->bind();
+ sVertexProgram->setMinimumAlpha(LLDrawPoolAvatar::sMinimumAlpha);
+ sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
+ gGL.getTexUnit(0)->activate();
+}
+
+void LLDrawPoolAvatar::endDeferredSkinned()
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+
+ // if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done
+ sRenderingSkinned = false;
+ sVertexProgram->unbind();
+
+ sVertexProgram->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
+
+ sShaderLevel = mShaderLevel;
+
+ gGL.getTexUnit(0)->activate();
+}
+
+void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR; //LL_RECORD_BLOCK_TIME(FTM_RENDER_CHARACTERS);
+
+ if (pass == -1)
+ {
+ for (S32 i = 1; i < getNumPasses(); i++)
+ { //skip impostor pass
+ prerender();
+ beginRenderPass(i);
+ renderAvatars(single_avatar, i);
+ endRenderPass(i);
+ }
+
+ return;
+ }
+
+ if (mDrawFace.empty() && !single_avatar)
+ {
+ return;
+ }
+
+ LLVOAvatar *avatarp = NULL;
+
+ if (single_avatar)
+ {
+ avatarp = single_avatar;
+ }
+ else
+ {
+ const LLFace *facep = mDrawFace[0];
+ if (!facep->getDrawable())
+ {
+ return;
+ }
+ avatarp = (LLVOAvatar *)facep->getDrawable()->getVObj().get();
+ }
+
+ if (avatarp->isDead() || avatarp->mDrawable.isNull())
+ {
+ return;
+ }
+
+ if (!single_avatar && !avatarp->isFullyLoaded() )
+ {
+ if (pass==0 && (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_PARTICLES) || LLViewerPartSim::getMaxPartCount() <= 0))
+ {
+ // debug code to draw a sphere in place of avatar
+ gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sWhiteImagep);
+ gGL.setColorMask(true, true);
+ LLVector3 pos = avatarp->getPositionAgent();
+ gGL.color4f(1.0f, 1.0f, 1.0f, 0.7f);
+
+ gGL.pushMatrix();
+ gGL.translatef((F32)(pos.mV[VX]),
+ (F32)(pos.mV[VY]),
+ (F32)(pos.mV[VZ]));
+ gGL.scalef(0.15f, 0.15f, 0.3f);
+
+ gSphere.renderGGL(); + + gGL.popMatrix(); + gGL.setColorMask(true, false); + } + // don't render please return; } - LLVOAvatar::AvatarOverallAppearance oa = avatarp->getOverallAppearance(); - bool impostor = !LLPipeline::sImpostorRender && avatarp->isImpostor(); - // no shadows if the shadows are causing this avatar to breach the limit. - if (avatarp->isTooSlow() || impostor || (oa == LLVOAvatar::AOA_INVISIBLE)) - { - // No shadows for impostored (including jellydolled) or invisible avs. - return; - } - - LLDrawPoolAvatar::sShadowPass = pass; - - if (pass == SHADOW_PASS_AVATAR_OPAQUE) - { - LLDrawPoolAvatar::sSkipTransparent = true; - avatarp->renderSkinned(); - LLDrawPoolAvatar::sSkipTransparent = false; - } - else if (pass == SHADOW_PASS_AVATAR_ALPHA_BLEND) - { - LLDrawPoolAvatar::sSkipOpaque = true; - avatarp->renderSkinned(); - LLDrawPoolAvatar::sSkipOpaque = false; - } - else if (pass == SHADOW_PASS_AVATAR_ALPHA_MASK) - { - LLDrawPoolAvatar::sSkipOpaque = true; - avatarp->renderSkinned(); - LLDrawPoolAvatar::sSkipOpaque = false; - } -} - -S32 LLDrawPoolAvatar::getNumPasses() -{ - return 3; -} - - -S32 LLDrawPoolAvatar::getNumDeferredPasses() -{ - return 3; -} - - -void LLDrawPoolAvatar::render(S32 pass) -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR; - if (LLPipeline::sImpostorRender) - { - renderAvatars(NULL, ++pass); - return; - } - - renderAvatars(NULL, pass); // render all avatars -} - -void LLDrawPoolAvatar::beginRenderPass(S32 pass) -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR; - //reset vertex buffer mappings - LLVertexBuffer::unbind(); - - if (LLPipeline::sImpostorRender) - { //impostor render does not have impostors or rigid rendering - ++pass; - } - - switch (pass) - { - case 0: - beginImpostor(); - break; - case 1: - beginRigid(); - break; - case 2: - beginSkinned(); - break; - } - - if (pass == 0) - { //make sure no stale colors are left over from a previous render - gGL.diffuseColor4f(1,1,1,1); - } -} - -void LLDrawPoolAvatar::endRenderPass(S32 pass) -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR; - - if (LLPipeline::sImpostorRender) - { - ++pass; - } - - switch (pass) - { - case 0: - endImpostor(); - break; - case 1: - endRigid(); - break; - case 2: - endSkinned(); - break; - } -} - -void LLDrawPoolAvatar::beginImpostor() -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR - - if (!LLPipeline::sReflectionRender) - { - LLVOAvatar::sRenderDistance = llclamp(LLVOAvatar::sRenderDistance, 16.f, 256.f); - LLVOAvatar::sNumVisibleAvatars = 0; - } - - gImpostorProgram.bind(); - gImpostorProgram.setMinimumAlpha(0.01f); - - gPipeline.enableLightsFullbright(); - sDiffuseChannel = 0; -} - -void LLDrawPoolAvatar::endImpostor() -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR - - gImpostorProgram.unbind(); - gPipeline.enableLightsDynamic(); -} - -void LLDrawPoolAvatar::beginRigid() -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR - - if (gPipeline.shadersLoaded()) - { - sVertexProgram = &gObjectAlphaMaskNoColorProgram; - - if (sVertexProgram != NULL) - { //eyeballs render with the specular shader - sVertexProgram->bind(); - sVertexProgram->setMinimumAlpha(LLDrawPoolAvatar::sMinimumAlpha); - } - } - else - { - sVertexProgram = NULL; - } -} - -void LLDrawPoolAvatar::endRigid() -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR - - sShaderLevel = mShaderLevel; - if (sVertexProgram != NULL) - { - sVertexProgram->unbind(); - } -} - -void LLDrawPoolAvatar::beginDeferredImpostor() -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR - - if (!LLPipeline::sReflectionRender) - { - LLVOAvatar::sRenderDistance = llclamp(LLVOAvatar::sRenderDistance, 16.f, 256.f); - LLVOAvatar::sNumVisibleAvatars = 0; - } - - sVertexProgram = &gDeferredImpostorProgram; - specular_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::SPECULAR_MAP); - normal_channel = sVertexProgram->enableTexture(LLViewerShaderMgr::DEFERRED_NORMAL); - sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); - sVertexProgram->bind(); - sVertexProgram->setMinimumAlpha(0.01f); -} - -void LLDrawPoolAvatar::endDeferredImpostor() -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR - - sShaderLevel = mShaderLevel; - sVertexProgram->disableTexture(LLViewerShaderMgr::DEFERRED_NORMAL); - sVertexProgram->disableTexture(LLViewerShaderMgr::SPECULAR_MAP); - sVertexProgram->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP); - gPipeline.unbindDeferredShader(*sVertexProgram); - sVertexProgram = NULL; - sDiffuseChannel = 0; -} - -void LLDrawPoolAvatar::beginDeferredRigid() -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR - - sVertexProgram = &gDeferredNonIndexedDiffuseAlphaMaskNoColorProgram; - sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); - sVertexProgram->bind(); - sVertexProgram->setMinimumAlpha(LLDrawPoolAvatar::sMinimumAlpha); -} - -void LLDrawPoolAvatar::endDeferredRigid() -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR - - sShaderLevel = mShaderLevel; - sVertexProgram->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP); - sVertexProgram->unbind(); - gGL.getTexUnit(0)->activate(); -} - - -void LLDrawPoolAvatar::beginSkinned() -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR - - // used for preview only - - sVertexProgram = &gAvatarProgram; - - sRenderingSkinned = true; - - sVertexProgram->bind(); - sVertexProgram->setMinimumAlpha(LLDrawPoolAvatar::sMinimumAlpha); -} - -void LLDrawPoolAvatar::endSkinned() -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR - - // if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done - if (sShaderLevel > 0) - { - sRenderingSkinned = false; - sVertexProgram->disableTexture(LLViewerShaderMgr::BUMP_MAP); - gGL.getTexUnit(0)->activate(); - sVertexProgram->unbind(); - sShaderLevel = mShaderLevel; - } - else - { - if(gPipeline.shadersLoaded()) - { - // software skinning, use a basic shader for windlight. - // TODO: find a better fallback method for software skinning. - sVertexProgram->unbind(); - } - } - - gGL.getTexUnit(0)->activate(); -} - -void LLDrawPoolAvatar::beginDeferredSkinned() -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR - - sShaderLevel = mShaderLevel; - sVertexProgram = &gDeferredAvatarProgram; - sRenderingSkinned = true; - - sVertexProgram->bind(); - sVertexProgram->setMinimumAlpha(LLDrawPoolAvatar::sMinimumAlpha); - sDiffuseChannel = sVertexProgram->enableTexture(LLViewerShaderMgr::DIFFUSE_MAP); - gGL.getTexUnit(0)->activate(); -} - -void LLDrawPoolAvatar::endDeferredSkinned() -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR - - // if we're in software-blending, remember to set the fence _after_ we draw so we wait till this rendering is done - sRenderingSkinned = false; - sVertexProgram->unbind(); - - sVertexProgram->disableTexture(LLViewerShaderMgr::DIFFUSE_MAP); - - sShaderLevel = mShaderLevel; - - gGL.getTexUnit(0)->activate(); -} - -void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass) -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR; //LL_RECORD_BLOCK_TIME(FTM_RENDER_CHARACTERS); - - if (pass == -1) - { - for (S32 i = 1; i < getNumPasses(); i++) - { //skip impostor pass - prerender(); - beginRenderPass(i); - renderAvatars(single_avatar, i); - endRenderPass(i); - } - - return; - } - - if (mDrawFace.empty() && !single_avatar) - { - return; - } - - LLVOAvatar *avatarp = NULL; - - if (single_avatar) - { - avatarp = single_avatar; - } - else - { - const LLFace *facep = mDrawFace[0]; - if (!facep->getDrawable()) - { - return; - } - avatarp = (LLVOAvatar *)facep->getDrawable()->getVObj().get(); - } - - if (avatarp->isDead() || avatarp->mDrawable.isNull()) - { - return; - } - - if (!single_avatar && !avatarp->isFullyLoaded() ) - { - if (pass==0 && (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_PARTICLES) || LLViewerPartSim::getMaxPartCount() <= 0)) - { - // debug code to draw a sphere in place of avatar - gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sWhiteImagep); - gGL.setColorMask(true, true); - LLVector3 pos = avatarp->getPositionAgent(); - gGL.color4f(1.0f, 1.0f, 1.0f, 0.7f); - - gGL.pushMatrix(); - gGL.translatef((F32)(pos.mV[VX]), - (F32)(pos.mV[VY]), - (F32)(pos.mV[VZ])); - gGL.scalef(0.15f, 0.15f, 0.3f); - - gSphere.renderGGL(); - - gGL.popMatrix(); - gGL.setColorMask(true, false); - } - // don't render please - return; - } - static LLCachedControl<bool> friends_only(gSavedSettings, "RenderAvatarFriendsOnly", false); - if (!single_avatar - && friends_only() - && !avatarp->isUIAvatar() - && !avatarp->isControlAvatar() - && !avatarp->isSelf() - && !avatarp->isBuddy()) - { - return; - } - - bool impostor = !LLPipeline::sImpostorRender && avatarp->isImpostor() && !single_avatar; - - if (( avatarp->isInMuteList() - || impostor - || (LLVOAvatar::AOA_NORMAL != avatarp->getOverallAppearance() && !avatarp->needsImpostorUpdate()) ) && pass != 0) -// || (LLVOAvatar::AV_DO_NOT_RENDER == avatarp->getVisualMuteSettings() && !avatarp->needsImpostorUpdate()) ) && pass != 0) - { //don't draw anything but the impostor for impostored avatars - return; - } - - if (pass == 0 && !impostor && LLPipeline::sUnderWaterRender) - { //don't draw foot shadows under water - return; - } - - LLVOAvatar *attached_av = avatarp->getAttachedAvatar(); - if (attached_av && (LLVOAvatar::AOA_NORMAL != attached_av->getOverallAppearance() || !gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_AVATAR))) - { - // Animesh attachment of a jellydolled or invisible parent - don't show - return; - } - - if (pass == 0) - { - if (!LLPipeline::sReflectionRender) - { - LLVOAvatar::sNumVisibleAvatars++; - } - -// if (impostor || (LLVOAvatar::AV_DO_NOT_RENDER == avatarp->getVisualMuteSettings() && !avatarp->needsImpostorUpdate())) - if (impostor || (LLVOAvatar::AOA_NORMAL != avatarp->getOverallAppearance() && !avatarp->needsImpostorUpdate())) - { - if (LLPipeline::sRenderDeferred && !LLPipeline::sReflectionRender && avatarp->mImpostor.isComplete()) - { - if (normal_channel > -1) - { - avatarp->mImpostor.bindTexture(2, normal_channel); - } - if (specular_channel > -1) - { - avatarp->mImpostor.bindTexture(1, specular_channel); - } - } - avatarp->renderImpostor(avatarp->getMutedAVColor(), sDiffuseChannel); - } - return; - } - - if (pass == 1) - { - // render rigid meshes (eyeballs) first - avatarp->renderRigid(); - return; - } - - if ((sShaderLevel >= SHADER_LEVEL_CLOTH)) - { - LLMatrix4 rot_mat; - LLViewerCamera::getInstance()->getMatrixToLocal(rot_mat); - LLMatrix4 cfr(OGL_TO_CFR_ROTATION); - rot_mat *= cfr; - - LLVector4 wind; - wind.setVec(avatarp->mWindVec); - wind.mV[VW] = 0; - wind = wind * rot_mat; - wind.mV[VW] = avatarp->mWindVec.mV[VW]; - - sVertexProgram->uniform4fv(LLViewerShaderMgr::AVATAR_WIND, 1, wind.mV); - F32 phase = -1.f * (avatarp->mRipplePhase); - - F32 freq = 7.f + (noise1(avatarp->mRipplePhase) * 2.f); - LLVector4 sin_params(freq, freq, freq, phase); - sVertexProgram->uniform4fv(LLViewerShaderMgr::AVATAR_SINWAVE, 1, sin_params.mV); - - LLVector4 gravity(0.f, 0.f, -CLOTHING_GRAVITY_EFFECT, 0.f); - gravity = gravity * rot_mat; - sVertexProgram->uniform4fv(LLViewerShaderMgr::AVATAR_GRAVITY, 1, gravity.mV); - } - - if( !single_avatar || (avatarp == single_avatar) ) - { - avatarp->renderSkinned(); - } -} - -static LLTrace::BlockTimerStatHandle FTM_RIGGED_VBO("Rigged VBO"); - -//----------------------------------------------------------------------------- -// getDebugTexture() -//----------------------------------------------------------------------------- -LLViewerTexture *LLDrawPoolAvatar::getDebugTexture() -{ - LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR - - if (mReferences.empty()) - { - return NULL; - } - LLFace *face = mReferences[0]; - if (!face->getDrawable()) - { - return NULL; - } - const LLViewerObject *objectp = face->getDrawable()->getVObj(); - - // Avatar should always have at least 1 (maybe 3?) TE's. - return objectp->getTEImage(0); -} - - -LLColor3 LLDrawPoolAvatar::getDebugColor() const -{ - return LLColor3(0.f, 1.f, 0.f); -} - - + if (!single_avatar
+ && friends_only()
+ && !avatarp->isUIAvatar()
+ && !avatarp->isControlAvatar()
+ && !avatarp->isSelf()
+ && !avatarp->isBuddy())
+ {
+ return;
+ }
+
+ bool impostor = !LLPipeline::sImpostorRender && avatarp->isImpostor() && !single_avatar;
+
+ if (( avatarp->isInMuteList()
+ || impostor
+ || (LLVOAvatar::AOA_NORMAL != avatarp->getOverallAppearance() && !avatarp->needsImpostorUpdate()) ) && pass != 0)
+// || (LLVOAvatar::AV_DO_NOT_RENDER == avatarp->getVisualMuteSettings() && !avatarp->needsImpostorUpdate()) ) && pass != 0)
+ { //don't draw anything but the impostor for impostored avatars
+ return;
+ }
+
+ if (pass == 0 && !impostor && LLPipeline::sUnderWaterRender)
+ { //don't draw foot shadows under water
+ return;
+ }
+
+ LLVOAvatar *attached_av = avatarp->getAttachedAvatar();
+ if (attached_av && (LLVOAvatar::AOA_NORMAL != attached_av->getOverallAppearance() || !gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_AVATAR)))
+ {
+ // Animesh attachment of a jellydolled or invisible parent - don't show
+ return;
+ }
+
+ if (pass == 0)
+ {
+ if (!LLPipeline::sReflectionRender)
+ {
+ LLVOAvatar::sNumVisibleAvatars++;
+ }
+
+// if (impostor || (LLVOAvatar::AV_DO_NOT_RENDER == avatarp->getVisualMuteSettings() && !avatarp->needsImpostorUpdate()))
+ if (impostor || (LLVOAvatar::AOA_NORMAL != avatarp->getOverallAppearance() && !avatarp->needsImpostorUpdate()))
+ {
+ if (LLPipeline::sRenderDeferred && !LLPipeline::sReflectionRender && avatarp->mImpostor.isComplete())
+ {
+ if (normal_channel > -1)
+ {
+ avatarp->mImpostor.bindTexture(2, normal_channel);
+ }
+ if (specular_channel > -1)
+ {
+ avatarp->mImpostor.bindTexture(1, specular_channel);
+ }
+ }
+ avatarp->renderImpostor(avatarp->getMutedAVColor(), sDiffuseChannel);
+ }
+ return;
+ }
+
+ if (pass == 1)
+ {
+ // render rigid meshes (eyeballs) first
+ avatarp->renderRigid();
+ return;
+ }
+
+ if ((sShaderLevel >= SHADER_LEVEL_CLOTH))
+ {
+ LLMatrix4 rot_mat;
+ LLViewerCamera::getInstance()->getMatrixToLocal(rot_mat);
+ LLMatrix4 cfr(OGL_TO_CFR_ROTATION);
+ rot_mat *= cfr;
+
+ LLVector4 wind;
+ wind.setVec(avatarp->mWindVec);
+ wind.mV[VW] = 0;
+ wind = wind * rot_mat;
+ wind.mV[VW] = avatarp->mWindVec.mV[VW];
+
+ sVertexProgram->uniform4fv(LLViewerShaderMgr::AVATAR_WIND, 1, wind.mV);
+ F32 phase = -1.f * (avatarp->mRipplePhase);
+
+ F32 freq = 7.f + (noise1(avatarp->mRipplePhase) * 2.f);
+ LLVector4 sin_params(freq, freq, freq, phase);
+ sVertexProgram->uniform4fv(LLViewerShaderMgr::AVATAR_SINWAVE, 1, sin_params.mV);
+
+ LLVector4 gravity(0.f, 0.f, -CLOTHING_GRAVITY_EFFECT, 0.f);
+ gravity = gravity * rot_mat;
+ sVertexProgram->uniform4fv(LLViewerShaderMgr::AVATAR_GRAVITY, 1, gravity.mV);
+ }
+
+ if( !single_avatar || (avatarp == single_avatar) )
+ {
+ avatarp->renderSkinned();
+ }
+}
+
+static LLTrace::BlockTimerStatHandle FTM_RIGGED_VBO("Rigged VBO");
+
+//-----------------------------------------------------------------------------
+// getDebugTexture()
+//-----------------------------------------------------------------------------
+LLViewerTexture *LLDrawPoolAvatar::getDebugTexture()
+{
+ LL_PROFILE_ZONE_SCOPED_CATEGORY_AVATAR
+
+ if (mReferences.empty())
+ {
+ return NULL;
+ }
+ LLFace *face = mReferences[0];
+ if (!face->getDrawable())
+ {
+ return NULL;
+ }
+ const LLViewerObject *objectp = face->getDrawable()->getVObj();
+
+ // Avatar should always have at least 1 (maybe 3?) TE's.
+ return objectp->getTEImage(0);
+}
+
+
+LLColor3 LLDrawPoolAvatar::getDebugColor() const
+{
+ return LLColor3(0.f, 1.f, 0.f);
+}
+
+
|