diff options
| -rw-r--r-- | indra/newview/llface.cpp | 125 | ||||
| -rw-r--r-- | indra/newview/llface.h | 1 | ||||
| -rw-r--r-- | indra/newview/llselectmgr.cpp | 225 | ||||
| -rw-r--r-- | indra/newview/llselectmgr.h | 1 | 
4 files changed, 179 insertions, 173 deletions
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp index 4f18cda92f..32280d3d90 100644 --- a/indra/newview/llface.cpp +++ b/indra/newview/llface.cpp @@ -36,6 +36,8 @@  #include "llmatrix4a.h"  #include "v3color.h" +#include "lldefs.h" +  #include "lldrawpoolavatar.h"  #include "lldrawpoolbump.h"  #include "llgl.h" @@ -601,6 +603,129 @@ void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color)  } +void renderFace(LLDrawable* drawable, LLFace *face) +{ +    LLVOVolume* vobj = drawable->getVOVolume(); +    if (vobj) +    { +        LLVertexBuffer::unbind(); +        gGL.pushMatrix(); +        gGL.multMatrix((F32*)vobj->getRelativeXform().mMatrix); + +        LLVolume* volume = NULL; + +        if (drawable->isState(LLDrawable::RIGGED)) +        { +            vobj->updateRiggedVolume(); +            volume = vobj->getRiggedVolume(); +        } +        else +        { +            volume = vobj->getVolume(); +        } + +        if (volume) +        { +            const LLVolumeFace& vol_face = volume->getVolumeFace(face->getTEOffset()); +            LLVertexBuffer::drawElements(LLRender::TRIANGLES, vol_face.mPositions, NULL, vol_face.mNumIndices, vol_face.mIndices); +        } + +        gGL.popMatrix(); +    } +} + +void LLFace::renderOneWireframe(const LLColor4 &color, F32 fogCfx, bool bSelected, bool wireframe_selection, bool bRenderHiddenSelections) +{ +    //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 = mVObjp->isHUDAttachment(); + +    if (mDrawablep->isActive()) +    { +        gGL.loadMatrix(gGLModelView); +        gGL.multMatrix((F32*)mVObjp->getRenderMatrix().mMatrix); +    } +    else if (!is_hud_object) +    { +        gGL.loadIdentity(); +        gGL.multMatrix(gGLModelView); +        LLVector3 trans = mVObjp->getRegion()->getOriginAgent(); +        gGL.translatef(trans.mV[0], trans.mV[1], trans.mV[2]); +    } + +    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + + +    if (bRenderHiddenSelections) +    { +        gGL.blendFunc(LLRender::BF_SOURCE_COLOR, LLRender::BF_ONE); +        LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE, GL_GEQUAL); +        if (shader) +        { +            gGL.diffuseColor4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.4f); +            renderFace(mDrawablep, this); +        } +        else +        { +            LLGLEnable fog(GL_FOG); +            glFogi(GL_FOG_MODE, GL_LINEAR); +            float d = (LLViewerCamera::getInstance()->getPointOfInterest() - LLViewerCamera::getInstance()->getOrigin()).magVec(); +            LLColor4 fogCol = color * fogCfx; +            glFogf(GL_FOG_START, d); +            glFogf(GL_FOG_END, d*(1 + (LLViewerCamera::getInstance()->getView() / LLViewerCamera::getInstance()->getDefaultFOV()))); +            glFogfv(GL_FOG_COLOR, fogCol.mV); + +            gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); +            { +                gGL.diffuseColor4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.4f); +                renderFace(mDrawablep, this); +            } +        } +    } + +    gGL.flush(); +    gGL.setSceneBlendType(LLRender::BT_ALPHA); + +    gGL.diffuseColor4f(color.mV[VRED] * 2, color.mV[VGREEN] * 2, color.mV[VBLUE] * 2, color.mV[VALPHA]); + +    { +        LLGLDisable depth(wireframe_selection ? 0 : GL_BLEND); +        LLGLEnable stencil(wireframe_selection ? 0 : GL_STENCIL_TEST); + +        if (!wireframe_selection) +        { //modify wireframe into outline selection mode +            glStencilFunc(GL_NOTEQUAL, 2, 0xffff); +            glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); +        } + +        LLGLEnable offset(GL_POLYGON_OFFSET_LINE); +        glPolygonOffset(3.f, 3.f); +        glLineWidth(5.f); +        glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); +        renderFace(mDrawablep, this); +    } + +    glLineWidth(1.f); +    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); +    gGL.popMatrix(); + +    if (shader) +    { +        shader->bind(); +    } +} +  /* removed in lieu of raycast uv detection  void LLFace::renderSelectedUV()  { diff --git a/indra/newview/llface.h b/indra/newview/llface.h index ee545acb94..7e68e81862 100644 --- a/indra/newview/llface.h +++ b/indra/newview/llface.h @@ -198,6 +198,7 @@ public:  	void		renderSelectedUV();  	void		renderSelected(LLViewerTexture *image, const LLColor4 &color); +	void		renderOneWireframe(const LLColor4 &color, F32 fogCfx, bool bSelected, bool wireframe_selection, bool bRenderHiddenSelections);  	F32			getKey()					const	{ return mDistance; } diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 20445ba56f..9c6be001f6 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -5837,6 +5837,7 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)  		gGL.translatef(-hud_bbox.getCenterLocal().mV[VX] + (depth *0.5f), 0.f, 0.f);  		gGL.scalef(cur_zoom, cur_zoom, cur_zoom);  	} +  	if (mSelectedObjects->getNumNodes())  	{  		LLUUID inspect_item_id= LLUUID::null; @@ -5854,6 +5855,9 @@ 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++)  		{ @@ -5864,35 +5868,53 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)  				LLViewerObject* objectp = node->getObject();  				if (!objectp)  					continue; -				if (objectp->isHUDAttachment() != for_hud) -				{ -					continue; -				} -				if (objectp->getID() == focus_item_id) -				{ -					node->renderOneSilhouette(gFocusMgr.getFocusColor()); -				} -				else if(objectp->getID() == inspect_item_id) -				{ -					node->renderOneSilhouette(sHighlightInspectColor); -				} -				else if (node->isTransient()) -				{ -					BOOL oldHidden = LLSelectMgr::sRenderHiddenSelections; -					LLSelectMgr::sRenderHiddenSelections = FALSE; -					node->renderOneSilhouette(sContextSilhouetteColor); -					LLSelectMgr::sRenderHiddenSelections = oldHidden; -				} -				else if (objectp->isRootEdit()) -				{ -					node->renderOneSilhouette(sSilhouetteParentColor); -				} -				else -				{ -					node->renderOneSilhouette(sSilhouetteChildColor); -				} -			} -		} + +                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) +                    { +                        bool bSelected = node->isTESelected(te) && getTEMode(); + +                        objectp->mDrawable->getFace(te)->renderOneWireframe( +                            !bSelected ? LLColor4(sSilhouetteParentColor[VRED], sSilhouetteParentColor[VGREEN], sSilhouetteParentColor[VBLUE], LLSelectMgr::sHighlightAlpha * 2) : sHighlightInspectColor +                            , fogCfx, bSelected, wireframe_selection, node->isTransient() ? FALSE : LLSelectMgr::sRenderHiddenSelections); +                    } +                } +                else +                { +                    if (objectp->isHUDAttachment() != for_hud) +                    { +                        continue; +                    } +                    if (objectp->getID() == focus_item_id) +                    { +                        node->renderOneSilhouette(gFocusMgr.getFocusColor()); +                    } +                    else if (objectp->getID() == inspect_item_id) +                    { +                        node->renderOneSilhouette(sHighlightInspectColor); +                    } +                    else if (node->isTransient()) +                    { +                        BOOL oldHidden = LLSelectMgr::sRenderHiddenSelections; +                        LLSelectMgr::sRenderHiddenSelections = FALSE; +                        node->renderOneSilhouette(sContextSilhouetteColor); +                        LLSelectMgr::sRenderHiddenSelections = oldHidden; +                    } +                    else if (objectp->isRootEdit()) +                    { +                        node->renderOneSilhouette(sSilhouetteParentColor); +                    } +                    else +                    { +                        node->renderOneSilhouette(sSilhouetteChildColor); +                    } +                } +			} //for all selected node's +		} //for pass  	}  	if (mHighlightedObjects->getNumNodes()) @@ -6278,148 +6300,6 @@ BOOL LLSelectNode::allowOperationOnNode(PermissionBit op, U64 group_proxy_power)  	return (mPermissions->allowOperationBy(op, proxy_agent_id, group_id));  } - -//helper function for pushing relevant vertices from drawable to GL -void pushWireframe(LLDrawable* drawable) -{ -	LLVOVolume* vobj = drawable->getVOVolume(); -	if (vobj) -	{ -		LLVertexBuffer::unbind(); -		gGL.pushMatrix(); -		gGL.multMatrix((F32*) vobj->getRelativeXform().mMatrix); - -		LLVolume* volume = NULL; - -		if (drawable->isState(LLDrawable::RIGGED)) -		{ -				vobj->updateRiggedVolume(); -				volume = vobj->getRiggedVolume(); -		} -		else -		{ -			volume = vobj->getVolume(); -		} - -		if (volume) -		{ -			for (S32 i = 0; i < volume->getNumVolumeFaces(); ++i) -			{ -				const LLVolumeFace& face = volume->getVolumeFace(i); -				LLVertexBuffer::drawElements(LLRender::TRIANGLES, face.mPositions, NULL, face.mNumIndices, face.mIndices); -			} -		} - -		gGL.popMatrix(); -	} -	 -} - -void LLSelectNode::renderOneWireframe(const LLColor4& color) -{ -    //Need to because crash on ATI 3800 (and similar cards) MAINT-5018  -    LLGLDisable multisample(LLPipeline::RenderFSAASamples > 0 ? GL_MULTISAMPLE_ARB : 0); - -    LLViewerObject* objectp = getObject(); -    if (!objectp) -    { -        return; -    } - -    LLDrawable* drawable = objectp->mDrawable; -    if (!drawable) -    { -        return; -    } - -    LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr; - -    if (shader) -    { -        gDebugProgram.bind(); -    } - -    gGL.matrixMode(LLRender::MM_MODELVIEW); -    gGL.pushMatrix(); - -    BOOL is_hud_object = objectp->isHUDAttachment(); - -    if (drawable->isActive()) -    { -        gGL.loadMatrix(gGLModelView); -        gGL.multMatrix((F32*)objectp->getRenderMatrix().mMatrix); -    } -    else if (!is_hud_object) -    { -        gGL.loadIdentity(); -        gGL.multMatrix(gGLModelView); -        LLVector3 trans = objectp->getRegion()->getOriginAgent(); -        gGL.translatef(trans.mV[0], trans.mV[1], trans.mV[2]); -    } - -    glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - -    bool wireframe_selection = (gFloaterTools && gFloaterTools->getVisible()) || LLSelectMgr::sRenderHiddenSelections; - -    if (LLSelectMgr::sRenderHiddenSelections) -    { -        gGL.blendFunc(LLRender::BF_SOURCE_COLOR, LLRender::BF_ONE); -        LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE, GL_GEQUAL); -        if (shader) -        { -            gGL.diffuseColor4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.4f); -            pushWireframe(drawable); -        } -        else -        { -            LLGLEnable fog(GL_FOG); -            glFogi(GL_FOG_MODE, GL_LINEAR); -            float d = (LLViewerCamera::getInstance()->getPointOfInterest() - LLViewerCamera::getInstance()->getOrigin()).magVec(); -            LLColor4 fogCol = color * (F32)llclamp((LLSelectMgr::getInstance()->getSelectionCenterGlobal() - gAgentCamera.getCameraPositionGlobal()).magVec() / (LLSelectMgr::getInstance()->getBBoxOfSelection().getExtentLocal().magVec() * 4), 0.0, 1.0); -            glFogf(GL_FOG_START, d); -            glFogf(GL_FOG_END, d*(1 + (LLViewerCamera::getInstance()->getView() / LLViewerCamera::getInstance()->getDefaultFOV()))); -            glFogfv(GL_FOG_COLOR, fogCol.mV); - -            gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT); -            { -                gGL.diffuseColor4f(color.mV[VRED], color.mV[VGREEN], color.mV[VBLUE], 0.4f); -                pushWireframe(drawable); -            } -        } -    } - -    gGL.flush(); -    gGL.setSceneBlendType(LLRender::BT_ALPHA); - -    gGL.diffuseColor4f(color.mV[VRED] * 2, color.mV[VGREEN] * 2, color.mV[VBLUE] * 2, LLSelectMgr::sHighlightAlpha * 2); - -    { -        LLGLDisable depth(wireframe_selection ? 0 : GL_BLEND); -        LLGLEnable stencil(wireframe_selection ? 0 : GL_STENCIL_TEST); - -        if (!wireframe_selection) -        { //modify wireframe into outline selection mode -            glStencilFunc(GL_NOTEQUAL, 2, 0xffff); -            glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); -        } - -        LLGLEnable offset(GL_POLYGON_OFFSET_LINE); -        glPolygonOffset(3.f, 3.f); -        glLineWidth(5.f); -        glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); -        pushWireframe(drawable); -    } - -    glLineWidth(1.f); -    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); -    gGL.popMatrix(); - -    if (shader) -    { -        shader->bind(); -    } -} -  //-----------------------------------------------------------------------------  // renderOneSilhouette()  //----------------------------------------------------------------------------- @@ -6440,7 +6320,8 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)  	LLVOVolume* vobj = drawable->getVOVolume();  	if (vobj && vobj->isMesh())  	{ -		renderOneWireframe(color); +		//This check (if(...)) with assert here just for ensure that this situation will not happens, and can be removed later. For example on the next release. +		llassert(!"renderOneWireframe() was removed SL-10194");  		return;  	} diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h index f362497b03..303a984bd0 100644 --- a/indra/newview/llselectmgr.h +++ b/indra/newview/llselectmgr.h @@ -177,7 +177,6 @@ public:  	S32 getLastSelectedTE();  	S32 getLastOperatedTE();  	S32 getTESelectMask() { return mTESelectMask; } -	void renderOneWireframe(const LLColor4& color);  	void renderOneSilhouette(const LLColor4 &color);  	void setTransient(BOOL transient) { mTransient = transient; }  	BOOL isTransient() { return mTransient; }  | 
