summaryrefslogtreecommitdiff
path: root/indra/newview/llselectmgr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/llselectmgr.cpp')
-rw-r--r--indra/newview/llselectmgr.cpp128
1 files changed, 102 insertions, 26 deletions
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 4c268ae273..26984ca1dc 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -227,7 +227,7 @@ LLSelectMgr::LLSelectMgr()
sHighlightThickness = gSavedSettings.getF32("SelectionHighlightThickness");
sHighlightUScale = gSavedSettings.getF32("SelectionHighlightUScale");
sHighlightVScale = gSavedSettings.getF32("SelectionHighlightVScale");
- sHighlightAlpha = gSavedSettings.getF32("SelectionHighlightAlpha");
+ sHighlightAlpha = gSavedSettings.getF32("SelectionHighlightAlpha") * 2;
sHighlightAlphaTest = gSavedSettings.getF32("SelectionHighlightAlphaTest");
sHighlightUAnim = gSavedSettings.getF32("SelectionHighlightUAnim");
sHighlightVAnim = gSavedSettings.getF32("SelectionHighlightVAnim");
@@ -5926,6 +5926,84 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
gGL.scalef(cur_zoom, cur_zoom, cur_zoom);
}
+ bool wireframe_selection = (gFloaterTools && gFloaterTools->getVisible()) || LLSelectMgr::sRenderHiddenSelections;
+ F32 fogCfx = (F32)llclamp((LLSelectMgr::getInstance()->getSelectionCenterGlobal() - gAgentCamera.getCameraPositionGlobal()).magVec() / (LLSelectMgr::getInstance()->getBBoxOfSelection().getExtentLocal().magVec() * 4), 0.0, 1.0);
+
+ static LLColor4 sParentColor = LLColor4(sSilhouetteParentColor[VRED], sSilhouetteParentColor[VGREEN], sSilhouetteParentColor[VBLUE], LLSelectMgr::sHighlightAlpha);
+ static LLColor4 sChildColor = LLColor4(sSilhouetteChildColor[VRED], sSilhouetteChildColor[VGREEN], sSilhouetteChildColor[VBLUE], LLSelectMgr::sHighlightAlpha);
+
+ auto renderMeshSelection_f = [fogCfx, wireframe_selection](LLSelectNode* node, LLViewerObject* objectp, LLColor4 hlColor)
+ {
+ //Need to because crash on ATI 3800 (and similar cards) MAINT-5018
+ LLGLDisable multisample(LLPipeline::RenderFSAASamples > 0 ? GL_MULTISAMPLE_ARB : 0);
+
+ LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
+
+ if (shader)
+ {
+ gDebugProgram.bind();
+ }
+
+ gGL.matrixMode(LLRender::MM_MODELVIEW);
+ gGL.pushMatrix();
+
+ BOOL is_hud_object = objectp->isHUDAttachment();
+
+ if (!is_hud_object)
+ {
+ gGL.loadIdentity();
+ gGL.multMatrix(gGLModelView);
+ }
+
+ if (objectp->mDrawable->isActive())
+ {
+ gGL.multMatrix((F32*)objectp->getRenderMatrix().mMatrix);
+ }
+ else if (!is_hud_object)
+ {
+ LLVector3 trans = objectp->getRegion()->getOriginAgent();
+ gGL.translatef(trans.mV[0], trans.mV[1], trans.mV[2]);
+ }
+
+ bool bRenderHidenSelection = node->isTransient() ? false : LLSelectMgr::sRenderHiddenSelections;
+
+
+ LLVOVolume* vobj = objectp->mDrawable->getVOVolume();
+ if (vobj)
+ {
+ LLVertexBuffer::unbind();
+ gGL.pushMatrix();
+ gGL.multMatrix((F32*)vobj->getRelativeXform().mMatrix);
+
+ if (objectp->mDrawable->isState(LLDrawable::RIGGED))
+ {
+ vobj->updateRiggedVolume(true);
+ }
+ }
+
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+
+ S32 num_tes = llmin((S32)objectp->getNumTEs(), (S32)objectp->getNumFaces()); // avatars have TEs but no faces
+ for (S32 te = 0; te < num_tes; ++te)
+ {
+ if (node->isTESelected(te))
+ {
+ objectp->mDrawable->getFace(te)->renderOneWireframe(hlColor, fogCfx, wireframe_selection, bRenderHidenSelection, nullptr != shader);
+ }
+ }
+
+ gGL.popMatrix();
+ gGL.popMatrix();
+
+ glLineWidth(1.f);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+
+ if (shader)
+ {
+ shader->bind();
+ }
+ };
+
if (mSelectedObjects->getNumNodes())
{
LLUUID inspect_item_id= LLUUID::null;
@@ -5943,9 +6021,6 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
}
}
- bool wireframe_selection = (gFloaterTools && gFloaterTools->getVisible()) || LLSelectMgr::sRenderHiddenSelections;
- F32 fogCfx = (F32)llclamp((LLSelectMgr::getInstance()->getSelectionCenterGlobal() - gAgentCamera.getCameraPositionGlobal()).magVec() / (LLSelectMgr::getInstance()->getBBoxOfSelection().getExtentLocal().magVec() * 4), 0.0, 1.0);
-
LLUUID focus_item_id = LLViewerMediaFocus::getInstance()->getFocusedObjectID();
for (S32 pass = 0; pass < 2; pass++)
{
@@ -5953,33 +6028,28 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
iter != mSelectedObjects->end(); iter++)
{
LLSelectNode* node = *iter;
+
+ if (getTEMode() && !node->hasSelectedTE())
+ continue;
+
LLViewerObject* objectp = node->getObject();
if (!objectp)
continue;
- if(getTEMode() && !node->hasSelectedTE())
- continue;
-
if (objectp->mDrawable
&& objectp->mDrawable->getVOVolume()
&& objectp->mDrawable->getVOVolume()->isMesh())
{
- S32 num_tes = llmin((S32)objectp->getNumTEs(), (S32)objectp->getNumFaces()); // avatars have TEs but no faces
- for (S32 te = 0; te < num_tes; ++te)
+ LLColor4 hlColor = objectp->isRootEdit() ? sParentColor : sChildColor;
+ if (objectp->getID() == inspect_item_id)
{
- if (!getTEMode())
- {
- objectp->mDrawable->getFace(te)->renderOneWireframe(
- LLColor4(sSilhouetteParentColor[VRED], sSilhouetteParentColor[VGREEN], sSilhouetteParentColor[VBLUE], LLSelectMgr::sHighlightAlpha * 2)
- , fogCfx, wireframe_selection, node->isTransient() ? FALSE : LLSelectMgr::sRenderHiddenSelections);
- }
- else if(node->isTESelected(te))
- {
- objectp->mDrawable->getFace(te)->renderOneWireframe(
- LLColor4(sSilhouetteParentColor[VRED], sSilhouetteParentColor[VGREEN], sSilhouetteParentColor[VBLUE], LLSelectMgr::sHighlightAlpha * 2)
- , fogCfx, wireframe_selection, node->isTransient() ? FALSE : LLSelectMgr::sRenderHiddenSelections);
- }
+ hlColor = sHighlightInspectColor;
}
+ else if (node->isTransient())
+ {
+ hlColor = sContextSilhouetteColor;
+ }
+ renderMeshSelection_f(node, objectp, hlColor);
}
else
{
@@ -6032,14 +6102,20 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
{
continue;
}
-
- if (subtracting_from_selection)
+
+ LLColor4 highlight_color = objectp->isRoot() ? sHighlightParentColor : sHighlightChildColor;
+ if (objectp->mDrawable
+ && objectp->mDrawable->getVOVolume()
+ && objectp->mDrawable->getVOVolume()->isMesh())
+ {
+ renderMeshSelection_f(node, objectp, subtracting_from_selection ? LLColor4::red : highlight_color);
+ }
+ else if (subtracting_from_selection)
{
node->renderOneSilhouette(LLColor4::red);
}
else if (!objectp->isSelected())
{
- LLColor4 highlight_color = objectp->isRoot() ? sHighlightParentColor : sHighlightChildColor;
node->renderOneSilhouette(highlight_color);
}
}
@@ -6538,7 +6614,7 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
gGL.texCoord2fv(tc[0].mV);
gGL.vertex3fv( v[0].mV );
- gGL.color4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha*2);
+ gGL.color4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha);
gGL.texCoord2fv( tc[1].mV );
gGL.vertex3fv( v[1].mV );
@@ -6548,7 +6624,7 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
gGL.vertex3fv( v[2].mV );
- gGL.color4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha*2);
+ gGL.color4f(color.mV[VRED]*2, color.mV[VGREEN]*2, color.mV[VBLUE]*2, LLSelectMgr::sHighlightAlpha);
gGL.texCoord2fv( tc[1].mV );
gGL.vertex3fv( v[1].mV );