From 5f03e197f4cfb43de93dc42b16b54beafccd376a Mon Sep 17 00:00:00 2001
From: Geenz <geenz@geenzo.com>
Date: Fri, 25 Jan 2013 17:54:38 -0500
Subject: Trying to set materials up for rendering! Yay!

---
 indra/newview/lldrawable.cpp       |  47 +++++++++++
 indra/newview/lldrawable.h         |   2 +
 indra/newview/lldrawpoolbump.cpp   |  13 ++-
 indra/newview/lldrawpoolbump.h     |   5 +-
 indra/newview/llface.cpp           |  42 ++++++++++
 indra/newview/llface.h             |   6 ++
 indra/newview/llselectmgr.cpp      |   2 +-
 indra/newview/llspatialpartition.h |  13 ++-
 indra/newview/llviewerobject.cpp   | 157 +++++++++++++++++++++++++++++++++++--
 indra/newview/llviewerobject.h     |  10 +++
 indra/newview/llvovolume.cpp       |  64 +++++++++++++--
 indra/newview/llvovolume.h         |   1 +
 12 files changed, 344 insertions(+), 18 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index 4894d63e13..1ca2344c41 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -300,6 +300,53 @@ LLFace*	LLDrawable::addFace(const LLTextureEntry *te, LLViewerTexture *texturep)
 
 }
 
+LLFace*	LLDrawable::addFace(const LLTextureEntry *te, LLViewerTexture *texturep, LLViewerTexture *normalp)
+{
+	LLMemType mt(LLMemType::MTYPE_DRAWABLE);
+	
+	LLFace *face;
+	face = new LLFace(this, mVObjp);
+	
+	face->setTEOffset(mFaces.size());
+	face->setTexture(texturep);
+	face->setNormalMap(normalp);
+	face->setPoolType(gPipeline.getPoolTypeFromTE(te, texturep));
+	
+	mFaces.push_back(face);
+	
+	if (isState(UNLIT))
+	{
+		face->setState(LLFace::FULLBRIGHT);
+	}
+	
+	return face;
+	
+}
+
+LLFace*	LLDrawable::addFace(const LLTextureEntry *te, LLViewerTexture *texturep, LLViewerTexture *normalp, LLViewerTexture *specularp)
+{
+	LLMemType mt(LLMemType::MTYPE_DRAWABLE);
+	
+	LLFace *face;
+	face = new LLFace(this, mVObjp);
+	
+	face->setTEOffset(mFaces.size());
+	face->setTexture(texturep);
+	face->setNormalMap(normalp);
+	face->setSpecularMap(specularp);
+	face->setPoolType(gPipeline.getPoolTypeFromTE(te, texturep));
+	
+	mFaces.push_back(face);
+	
+	if (isState(UNLIT))
+	{
+		face->setState(LLFace::FULLBRIGHT);
+	}
+	
+	return face;
+	
+}
+
 void LLDrawable::setNumFaces(const S32 newFaces, LLFacePool *poolp, LLViewerTexture *texturep)
 {
 	if (newFaces == (S32)mFaces.size())
diff --git a/indra/newview/lldrawable.h b/indra/newview/lldrawable.h
index b1e32bdb5b..13089f4f26 100644
--- a/indra/newview/lldrawable.h
+++ b/indra/newview/lldrawable.h
@@ -147,6 +147,8 @@ public:
 	//void                removeFace(const S32 i); // SJB: Avoid using this, it's slow
 	LLFace*				addFace(LLFacePool *poolp, LLViewerTexture *texturep);
 	LLFace*				addFace(const LLTextureEntry *te, LLViewerTexture *texturep);
+	LLFace*				addFace(const LLTextureEntry *te, LLViewerTexture *texturep, LLViewerTexture *normalp);
+	LLFace*				addFace(const LLTextureEntry *te, LLViewerTexture *texturep, LLViewerTexture *normalp, LLViewerTexture *specularp);
 	void				deleteFaces(S32 offset, S32 count);
 	void                setNumFaces(const S32 numFaces, LLFacePool *poolp, LLViewerTexture *texturep);
 	void                setNumFacesFast(const S32 numFaces, LLFacePool *poolp, LLViewerTexture *texturep);
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index 718133ba29..d613def1bd 100644
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -632,6 +632,11 @@ void LLDrawPoolBump::renderGroup(LLSpatialGroup* group, U32 type, U32 mask, BOOL
 BOOL LLDrawPoolBump::bindBumpMap(LLDrawInfo& params, S32 channel)
 {
 	U8 bump_code = params.mBump;
+	if (params.mNormalMap.notNull())
+	{
+		bump_code = BE_CUSTOM;
+		return bindBumpMap(bump_code, params.mNormalMap, params.mVSize, channel);
+	}
 
 	return bindBumpMap(bump_code, params.mTexture, params.mVSize, channel);
 }
@@ -670,7 +675,9 @@ BOOL LLDrawPoolBump::bindBumpMap(U8 bump_code, LLViewerTexture* texture, F32 vsi
 	case BE_DARKNESS:
 		bump = gBumpImageList.getBrightnessDarknessImage( tex, bump_code );		
 		break;
-
+	case BE_CUSTOM:
+		bump = tex;
+		break;
 	default:
 		if( bump_code < LLStandardBumpmap::sStandardBumpmapCount )
 		{
@@ -855,7 +862,9 @@ void LLDrawPoolBump::renderDeferred(S32 pass)
 	for (LLCullResult::drawinfo_iterator i = begin; i != end; ++i)	
 	{
 		LLDrawInfo& params = **i;
-
+		
+		gDeferredBumpProgram.uniform4fv(LLShaderMgr::SPECULAR_COLOR, 4, (GLfloat*)params.mSpecColor.mV);
+		
 		LLDrawPoolBump::bindBumpMap(params, bump_channel);
 		pushBatch(params, mask, TRUE);
 	}
diff --git a/indra/newview/lldrawpoolbump.h b/indra/newview/lldrawpoolbump.h
index 476b1d41b7..aaf0bdf36f 100644
--- a/indra/newview/lldrawpoolbump.h
+++ b/indra/newview/lldrawpoolbump.h
@@ -100,8 +100,9 @@ enum EBumpEffect
 	BE_NO_BUMP = 0,
 	BE_BRIGHTNESS = 1,
 	BE_DARKNESS = 2,
-	BE_STANDARD_0 = 3,  // Standard must always be the last one
-	BE_COUNT = 4
+	BE_CUSTOM = 3,
+	BE_STANDARD_0 = 4,  // Standard must always be the last one
+	BE_COUNT = 5
 };
 
 ////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 605cb81c10..01cbfafe16 100755
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -316,6 +316,48 @@ void LLFace::setTexture(LLViewerTexture* tex)
 	mTexture = tex ;
 }
 
+void LLFace::setNormalMap(LLViewerTexture* tex)
+{
+	if(mNormalMap == tex)
+	{
+		return ;
+	}
+	
+	if(mNormalMap.notNull())
+	{
+		mNormalMap->removeFace(this) ;
+		removeAtlas() ;
+	}
+	
+	if(tex)
+	{
+		tex->addFace(this) ;
+	}
+	
+	mNormalMap = tex ;
+}
+
+void LLFace::setSpecularMap(LLViewerTexture* tex)
+{
+	if(mSpecMap == tex)
+	{
+		return ;
+	}
+	
+	if(mSpecMap.notNull())
+	{
+		mSpecMap->removeFace(this) ;
+		removeAtlas() ;
+	}
+	
+	if(tex)
+	{
+		tex->addFace(this) ;
+	}
+	
+	mSpecMap = tex ;
+}
+
 void LLFace::dirtyTexture()
 {
 	LLDrawable* drawablep = getDrawable();
diff --git a/indra/newview/llface.h b/indra/newview/llface.h
index de4d03351c..cb76c6e8a6 100644
--- a/indra/newview/llface.h
+++ b/indra/newview/llface.h
@@ -111,6 +111,8 @@ public:
 	void			setTextureIndex(U8 index);
 	U8				getTextureIndex() const		{ return mTextureIndex; }
 	void			setTexture(LLViewerTexture* tex) ;
+	void			setNormalMap(LLViewerTexture* tex);
+	void			setSpecularMap(LLViewerTexture* tex);
 	void            switchTexture(LLViewerTexture* new_texture);
 	void            dirtyTexture();
 	LLXformMatrix*	getXform()			const	{ return mXform; }
@@ -266,6 +268,8 @@ public:
 	F32			mLastSkinTime;
 	F32			mLastMoveTime;
 	LLMatrix4*	mTextureMatrix;
+	LLMatrix4*	mSpecMapMatrix;
+	LLMatrix4*	mNormalMapMatrix;
 	LLDrawInfo* mDrawInfo;
 
 private:
@@ -285,6 +289,8 @@ private:
 
 	LLXformMatrix* mXform;
 	LLPointer<LLViewerTexture> mTexture;
+	LLPointer<LLViewerTexture> mSpecMap;
+	LLPointer<LLViewerTexture> mNormalMap;
 	LLPointer<LLDrawable> mDrawablep;
 	LLPointer<LLViewerObject> mVObjp;
 	S32			mTEOffset;
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index c3c37141ed..ff4c120623 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -1927,7 +1927,7 @@ void LLSelectMgr::selectionSetMedia(U8 media_type, const LLSD &media_data)
 					llassert(mMediaData.isMap());
 					const LLTextureEntry *texture_entry = object->getTE(te);
 					if (!mMediaData.isMap() ||
-						(NULL != texture_entry) && !texture_entry->hasMedia() && !mMediaData.has(LLMediaEntry::HOME_URL_KEY))
+						((NULL != texture_entry) && !texture_entry->hasMedia() && !mMediaData.has(LLMediaEntry::HOME_URL_KEY)))
 					{
 						// skip adding/updating media
 					}
diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h
index b1706d9d35..2c4f6754ec 100644
--- a/indra/newview/llspatialpartition.h
+++ b/indra/newview/llspatialpartition.h
@@ -119,6 +119,17 @@ public:
 	LL_ALIGN_16(LLFace* mFace); //associated face
 	F32 mDistance;
 	U32 mDrawMode;
+		
+	LLMaterialID *mMaterialID; // If this is false, the following parameters are unused.
+	LLPointer<LLViewerTexture> mSpecularMap;
+	const LLMatrix4* mSpecularMapMatrix;
+	LLPointer<LLViewerTexture> mNormalMap;
+	const LLMatrix4* mNormalMapMatrix;
+	LLVector4 mSpecColor; // XYZ = Specular RGB, W = Specular Exponent
+	F32  mEnvIntensity;
+	F32  mAlphaMaskCutoff;
+	U8   mDiffuseAlphaMode;
+
 
 	struct CompareTexture
 	{
@@ -169,7 +180,7 @@ public:
 		}
 
 	};
-
+	
 	struct CompareBump
 	{
 		bool operator()(const LLPointer<LLDrawInfo>& lhs, const LLPointer<LLDrawInfo>& rhs) 
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 347d82d492..4490e51493 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -202,6 +202,8 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
 	mTotalCRC(0),
 	mListIndex(-1),
 	mTEImages(NULL),
+	mTENormalMaps(NULL),
+	mTESpecularMaps(NULL),
 	mGLName(0),
 	mbCanSelect(TRUE),
 	mFlags(0),
@@ -322,6 +324,18 @@ void LLViewerObject::deleteTEImages()
 {
 	delete[] mTEImages;
 	mTEImages = NULL;
+	
+	if (mTENormalMaps != NULL)
+	{
+		delete[] mTENormalMaps;
+		mTENormalMaps = NULL;
+	}
+	
+	if (mTESpecularMaps != NULL)
+	{
+		delete[] mTESpecularMaps;
+		mTESpecularMaps = NULL;
+	}	
 }
 
 void LLViewerObject::markDead()
@@ -3935,25 +3949,39 @@ void LLViewerObject::setNumTEs(const U8 num_tes)
 		{
 			LLPointer<LLViewerTexture> *new_images;
 			new_images = new LLPointer<LLViewerTexture>[num_tes];
+			
+			LLPointer<LLViewerTexture> *new_normmaps;
+			new_normmaps = new LLPointer<LLViewerTexture>[num_tes];
+			
+			LLPointer<LLViewerTexture> *new_specmaps;
+			new_specmaps = new LLPointer<LLViewerTexture>[num_tes];
 			for (i = 0; i < num_tes; i++)
 			{
 				if (i < getNumTEs())
 				{
 					new_images[i] = mTEImages[i];
+					new_normmaps[i] = mTENormalMaps[i];
+					new_specmaps[i] = mTESpecularMaps[i];
 				}
 				else if (getNumTEs())
 				{
 					new_images[i] = mTEImages[getNumTEs()-1];
+					new_normmaps[i] = mTENormalMaps[i];
+					new_specmaps[i] = mTESpecularMaps[i];
 				}
 				else
 				{
 					new_images[i] = NULL;
+					new_normmaps[i] = NULL;
+					new_specmaps[i] = NULL;
 				}
 			}
 
 			deleteTEImages();
 			
 			mTEImages = new_images;
+			mTENormalMaps = new_normmaps;
+			mTESpecularMaps = new_specmaps;
 		}
 		else
 		{
@@ -4032,12 +4060,18 @@ void LLViewerObject::sendTEUpdate() const
 void LLViewerObject::setTE(const U8 te, const LLTextureEntry &texture_entry)
 {
 	LLPrimitive::setTE(te, texture_entry);
-//  This doesn't work, don't get any textures.
-//	if (mDrawable.notNull() && mDrawable->isVisible())
-//	{
-		const LLUUID& image_id = getTE(te)->getID();
-		mTEImages[te] = LLViewerTextureManager::getFetchedTexture(image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
-//	}
+
+	const LLUUID& image_id = getTE(te)->getID();
+	mTEImages[te] = LLViewerTextureManager::getFetchedTexture(image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+	
+	if (getTE(te)->getMaterialParams() != NULL)
+	{
+		const LLUUID& norm_id = getTE(te)->getMaterialParams()->getNormalID();
+		mTENormalMaps[te] = LLViewerTextureManager::getFetchedTexture(norm_id, TRUE, LLViewerTexture::BOOST_BUMP, LLViewerTexture::LOD_TEXTURE);
+		
+		const LLUUID& spec_id = getTE(te)->getMaterialParams()->getSpecularID();
+		mTESpecularMaps[te] = LLViewerTextureManager::getFetchedTexture(spec_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+	}
 }
 
 void LLViewerObject::setTEImage(const U8 te, LLViewerTexture *imagep)
@@ -4072,6 +4106,46 @@ S32 LLViewerObject::setTETextureCore(const U8 te, const LLUUID& uuid, LLHost hos
 	return retval;
 }
 
+S32 LLViewerObject::setTENormalMapCore(const U8 te, const LLUUID& uuid, LLHost host)
+{
+	LL_INFOS("Materials") << "Maybe normal maps! " << uuid << LL_ENDL;
+	S32 retval = 0;
+	if (uuid != getTE(te)->getMaterialParams()->getNormalID() ||
+		uuid == LLUUID::null)
+	{
+		LL_INFOS("Materials") << "Normal maps! " << uuid << LL_ENDL;
+		retval = TEM_CHANGE_TEXTURE;
+		getTE(te)->getMaterialParams()->setNormalID(uuid);
+		mTENormalMaps[te] = LLViewerTextureManager::getFetchedTexture(uuid, TRUE, LLViewerTexture::BOOST_BUMP, LLViewerTexture::LOD_TEXTURE, 0, 0, host);
+		setChanged(TEXTURE);
+		if (mDrawable.notNull())
+		{
+			gPipeline.markTextured(mDrawable);
+		}
+	}
+	return retval;
+}
+
+S32 LLViewerObject::setTESpecularMapCore(const U8 te, const LLUUID& uuid, LLHost host)
+{
+	LL_INFOS("Materials") << "Maybe specular maps! " << uuid << LL_ENDL;
+	S32 retval = 0;
+	if (uuid != getTE(te)->getMaterialParams()->getSpecularID()	||
+		uuid == LLUUID::null)
+	{
+		LL_INFOS("Materials") << "Specular maps! " << uuid << LL_ENDL;
+		retval = TEM_CHANGE_TEXTURE;
+		getTE(te)->getMaterialParams()->setSpecularID(uuid);
+		mTESpecularMaps[te] = LLViewerTextureManager::getFetchedTexture(uuid, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host);
+		setChanged(TEXTURE);
+		if (mDrawable.notNull())
+		{
+			gPipeline.markTextured(mDrawable);
+		}
+	}
+	return retval;
+}
+
 //virtual
 void LLViewerObject::changeTEImage(S32 index, LLViewerTexture* new_image) 
 {
@@ -4082,12 +4156,39 @@ void LLViewerObject::changeTEImage(S32 index, LLViewerTexture* new_image)
 	mTEImages[index] = new_image ;
 }
 
+void LLViewerObject::changeTENormalMap(S32 index, LLViewerTexture* new_image)
+{
+	if(index < 0 || index >= getNumTEs())
+	{
+		return ;
+	}
+	mTENormalMaps[index] = new_image ;
+}
+
+void LLViewerObject::changeTESpecularMap(S32 index, LLViewerTexture* new_image)
+{
+	if(index < 0 || index >= getNumTEs())
+	{
+		return ;
+	}
+	mTESpecularMaps[index] = new_image ;
+}
+
 S32 LLViewerObject::setTETexture(const U8 te, const LLUUID& uuid)
 {
 	// Invalid host == get from the agent's sim
 	return setTETextureCore(te, uuid, LLHost::invalid);
 }
 
+S32 LLViewerObject::setTENormalMap(const U8 te, const LLUUID& uuid)
+{
+	return setTENormalMapCore(te, uuid, LLHost::invalid);
+}
+
+S32 LLViewerObject::setTESpecularMap(const U8 te, const LLUUID& uuid)
+{
+	return setTESpecularMapCore(te, uuid, LLHost::invalid);
+}
 
 S32 LLViewerObject::setTEColor(const U8 te, const LLColor3& color)
 {
@@ -4369,6 +4470,50 @@ LLViewerTexture *LLViewerObject::getTEImage(const U8 face) const
 }
 
 
+LLViewerTexture *LLViewerObject::getTENormalMap(const U8 face) const
+{
+	//	llassert(mTEImages);
+	
+	if (face < getNumTEs())
+	{
+		LLViewerTexture* image = mTENormalMaps[face];
+		if (image)
+		{
+			return image;
+		}
+		else
+		{
+			return (LLViewerTexture*)(LLViewerFetchedTexture::sDefaultImagep);
+		}
+	}
+	
+	llerrs << llformat("Requested Image from invalid face: %d/%d",face,getNumTEs()) << llendl;
+	
+	return NULL;
+}
+
+LLViewerTexture *LLViewerObject::getTESpecularMap(const U8 face) const
+{
+	//	llassert(mTEImages);
+	
+	if (face < getNumTEs())
+	{
+		LLViewerTexture* image = mTESpecularMaps[face];
+		if (image)
+		{
+			return image;
+		}
+		else
+		{
+			return (LLViewerTexture*)(LLViewerFetchedTexture::sDefaultImagep);
+		}
+	}
+	
+	llerrs << llformat("Requested Image from invalid face: %d/%d",face,getNumTEs()) << llendl;
+	
+	return NULL;
+}
+
 void LLViewerObject::fitFaceTexture(const U8 face)
 {
 	llinfos << "fitFaceTexture not implemented" << llendl;
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index 255d0cd080..7b98c01243 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -292,7 +292,11 @@ public:
 	/*virtual*/	void	setNumTEs(const U8 num_tes);
 	/*virtual*/	void	setTE(const U8 te, const LLTextureEntry &texture_entry);
 	/*virtual*/ S32		setTETexture(const U8 te, const LLUUID &uuid);
+	/*virtual*/ S32		setTENormalMap(const U8 te, const LLUUID &uuid);
+	/*virtual*/ S32		setTESpecularMap(const U8 te, const LLUUID &uuid);
 	S32 setTETextureCore(const U8 te, const LLUUID& uuid, LLHost host);
+	S32 setTENormalMapCore(const U8 te, const LLUUID& uuid, LLHost host);
+	S32 setTESpecularMapCore(const U8 te, const LLUUID& uuid, LLHost host);
 	/*virtual*/ S32		setTEColor(const U8 te, const LLColor3 &color);
 	/*virtual*/ S32		setTEColor(const U8 te, const LLColor4 &color);
 	/*virtual*/ S32		setTEScale(const U8 te, const F32 s, const F32 t);
@@ -313,7 +317,11 @@ public:
 	/*virtual*/	BOOL	setMaterial(const U8 material);
 	virtual		void	setTEImage(const U8 te, LLViewerTexture *imagep); // Not derived from LLPrimitive
 	virtual     void    changeTEImage(S32 index, LLViewerTexture* new_image)  ;
+	virtual     void    changeTENormalMap(S32 index, LLViewerTexture* new_image)  ;
+	virtual     void    changeTESpecularMap(S32 index, LLViewerTexture* new_image)  ;
 	LLViewerTexture		*getTEImage(const U8 te) const;
+	LLViewerTexture		*getTENormalMap(const U8 te) const;
+	LLViewerTexture		*getTESpecularMap(const U8 te) const;
 	
 	void fitFaceTexture(const U8 face);
 	void sendTEUpdate() const;			// Sends packed representation of all texture entry information
@@ -588,6 +596,8 @@ public:
 	S32				mListIndex;
 
 	LLPointer<LLViewerTexture> *mTEImages;
+	LLPointer<LLViewerTexture> *mTENormalMaps;
+	LLPointer<LLViewerTexture> *mTESpecularMaps;
 
 	// Selection, picking and rendering variables
 	U32				mGLName;			// GL "name" used by selection code
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index a37dea4a60..c90ca48b01 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -77,6 +77,7 @@
 #include "llviewershadermgr.h"
 #include "llvoavatar.h"
 #include "llvocache.h"
+#include "llmaterialmgr.h"
 
 const S32 MIN_QUIET_FRAMES_COALESCE = 30;
 const F32 FORCE_SIMPLE_RENDER_AREA = 512.f;
@@ -919,6 +920,12 @@ LLFace* LLVOVolume::addFace(S32 f)
 {
 	const LLTextureEntry* te = getTE(f);
 	LLViewerTexture* imagep = getTEImage(f);
+	if (te->getMaterialParams() != NULL)
+	{
+		LLViewerTexture* normalp = getTENormalMap(f);
+		LLViewerTexture* specularp = getTESpecularMap(f);
+		return mDrawable->addFace(te, imagep, normalp, specularp);
+	}
 	return mDrawable->addFace(te, imagep);
 }
 
@@ -1404,6 +1411,11 @@ void LLVOVolume::regenFaces()
 
 		facep->setTEOffset(i);
 		facep->setTexture(getTEImage(i));
+		if (facep->getTextureEntry()->getMaterialParams() != NULL)
+		{
+			facep->setNormalMap(getTENormalMap(i));
+			facep->setSpecularMap(getTESpecularMap(i));
+		}
 		facep->setViewerObject(this);
 		
 		// If the face had media on it, this will have broken the link between the LLViewerMediaTexture and the face.
@@ -1979,13 +1991,33 @@ S32 LLVOVolume::setTEGlow(const U8 te, const F32 glow)
 
 S32 LLVOVolume::setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID)
 {
-	S32 res = LLViewerObject::setTEMaterialID(te, pMaterialID);
+	if (!pMaterialID.isNull())
+	{
+		LL_INFOS("Materials") << "Oh god it's a material! " << pMaterialID.asString() << LL_ENDL;
+		S32 res = LLViewerObject::setTEMaterialID(te, pMaterialID);
+		if (res)
+		{
+			LL_INFOS("Materials") << "We have a material!" << LL_ENDL;
+			LLMaterialPtr pMatParam = LLMaterialMgr::instance().get(getRegion()->getRegionID(), pMaterialID);
+			setTEMaterialParams(te, pMatParam);
+			gPipeline.markTextured(mDrawable);
+			mFaceMappingChanged = TRUE;
+		}
+		return  res;
+	}
+	return 0;
+}
+
+S32 LLVOVolume::setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams)
+{
+	S32 res = LLViewerObject::setTEMaterialParams(te, pMaterialParams);
 	if (res)
 	{
 		gPipeline.markTextured(mDrawable);
 		mFaceMappingChanged = TRUE;
 	}
-	return  res;
+	
+	return res;
 }
 
 S32 LLVOVolume::setTEScale(const U8 te, const F32 s, const F32 t)
@@ -4050,6 +4082,8 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
 	LLViewerTexture* tex = facep->getTexture();
 
 	U8 index = facep->getTextureIndex();
+	
+	LLMaterialID matid = facep->getTextureEntry()->getMaterialID();
 
 	bool batchable = false;
 
@@ -4106,12 +4140,30 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
 		U32 offset = facep->getIndicesStart();
 		U32 count = facep->getIndicesCount();
 		LLPointer<LLDrawInfo> draw_info = new LLDrawInfo(start,end,count,offset, tex, 
-			facep->getVertexBuffer(), fullbright, bump); 
+			facep->getVertexBuffer(), fullbright, bump);
 		draw_info->mGroup = group;
 		draw_info->mVSize = facep->getVirtualSize();
 		draw_vec.push_back(draw_info);
 		draw_info->mTextureMatrix = tex_mat;
 		draw_info->mModelMatrix = model_mat;
+		
+		if (!facep->getTextureEntry()->getMaterialID().isNull() && facep->getTextureEntry()->getMaterialParams() != NULL)
+		{
+			// We have a material.  Update our draw info accordingly.
+			//draw_info->mMaterialID = facep->getTextureEntry()->getMaterialID();
+			LLVector4 specColor;
+			specColor.mV[0] = facep->getTextureEntry()->getMaterialParams()->getSpecularLightColor().mV[0] * (1.0 / 255);
+			specColor.mV[1] = facep->getTextureEntry()->getMaterialParams()->getSpecularLightColor().mV[1] * (1.0 / 255);
+			specColor.mV[2] = facep->getTextureEntry()->getMaterialParams()->getSpecularLightColor().mV[2] * (1.0 / 255);
+			specColor.mV[3] = facep->getTextureEntry()->getMaterialParams()->getSpecularLightExponent() * (1.0 / 255);
+			draw_info->mSpecColor = specColor;
+			draw_info->mEnvIntensity = facep->getTextureEntry()->getMaterialParams()->getEnvironmentIntensity() * (1.0 / 255);
+			draw_info->mAlphaMaskCutoff = facep->getTextureEntry()->getMaterialParams()->getAlphaMaskCutoff() * (1.0 / 255);
+			draw_info->mDiffuseAlphaMode = facep->getTextureEntry()->getMaterialParams()->getDiffuseAlphaMode();
+			draw_info->mNormalMap = facep->getViewerObject()->getTENormalMap(facep->getTextureIndex());
+			draw_info->mSpecularMap = facep->getViewerObject()->getTESpecularMap(facep->getTextureIndex());
+		}
+		
 		if (type == LLRenderPass::PASS_ALPHA)
 		{ //for alpha sorting
 			facep->setDrawInfo(draw_info);
@@ -4267,7 +4319,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
 			}
 
 			if (vobj->isMesh() &&
-				(vobj->getVolume() && !vobj->getVolume()->isMeshAssetLoaded() || !gMeshRepo.meshRezEnabled()))
+				((vobj->getVolume() && !vobj->getVolume()->isMeshAssetLoaded()) || !gMeshRepo.meshRezEnabled()))
 			{
 				continue;
 			}
@@ -5134,7 +5186,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
 							registerFace(group, facep, LLRenderPass::PASS_POST_BUMP);
 						}
 					}
-					else if (te->getBumpmap())
+					else if (te->getBumpmap() || te->getMaterialParams() != NULL)
 					{ //register in deferred bump pass
 						registerFace(group, facep, LLRenderPass::PASS_BUMP);
 					}
@@ -5169,7 +5221,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
 				}
 				else
 				{
-					if (LLPipeline::sRenderDeferred && LLPipeline::sRenderBump && te->getBumpmap())
+					if (LLPipeline::sRenderDeferred && LLPipeline::sRenderBump && (te->getBumpmap() || te->getMaterialParams() != NULL))
 					{ //non-shiny or fullbright deferred bump
 						registerFace(group, facep, LLRenderPass::PASS_BUMP);
 					}
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index ff6dca9737..c996fac6f2 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -187,6 +187,7 @@ public:
 	/*virtual*/ S32		setTEMediaFlags(const U8 te, const U8 media_flags);
 	/*virtual*/ S32		setTEGlow(const U8 te, const F32 glow);
 	/*virtual*/ S32		setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID);
+	/*virtual*/ S32		setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams);
 	/*virtual*/ S32		setTEScale(const U8 te, const F32 s, const F32 t);
 	/*virtual*/ S32		setTEScaleS(const U8 te, const F32 s);
 	/*virtual*/ S32		setTEScaleT(const U8 te, const F32 t);
-- 
cgit v1.2.3


From 97f9ab80f9ddce8627b9e37f973f4e683d348ac3 Mon Sep 17 00:00:00 2001
From: Geenz <geenz@geenzo.com>
Date: Fri, 25 Jan 2013 18:45:40 -0500
Subject: setMaterialParams for LLViewerObject

---
 indra/newview/llviewerobject.cpp | 20 ++++++++++++++++++++
 indra/newview/llviewerobject.h   |  1 +
 2 files changed, 21 insertions(+)

(limited to 'indra/newview')

diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 4490e51493..5c684326e2 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -4369,6 +4369,26 @@ S32 LLViewerObject::setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID
 	return retval;
 }
 
+S32 LLViewerObject::setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams)
+{
+	S32 retval = 0;
+	const LLTextureEntry *tep = getTE(te);
+	if (!tep)
+	{
+		llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
+	}
+	else if (pMaterialParams != tep->getMaterialParams())
+	{
+		retval = LLPrimitive::setTEMaterialParams(te, pMaterialParams);
+		setChanged(TEXTURE);
+		if (mDrawable.notNull() && retval)
+		{
+			gPipeline.markTextured(mDrawable);
+		}
+	}
+	return retval;
+}
+
 
 S32 LLViewerObject::setTEScale(const U8 te, const F32 s, const F32 t)
 {
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index 7b98c01243..26160d14b3 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -314,6 +314,7 @@ public:
 	/*virtual*/	S32		setTEMediaFlags(const U8 te, const U8 media_flags );
 	/*virtual*/ S32     setTEGlow(const U8 te, const F32 glow);
 	/*virtual*/ S32     setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID);
+	/*virtual*/ S32		setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams);
 	/*virtual*/	BOOL	setMaterial(const U8 material);
 	virtual		void	setTEImage(const U8 te, LLViewerTexture *imagep); // Not derived from LLPrimitive
 	virtual     void    changeTEImage(S32 index, LLViewerTexture* new_image)  ;
-- 
cgit v1.2.3


From 66a01ba4c581d79227b0e67f5f75dc248fcaf7ab Mon Sep 17 00:00:00 2001
From: Geenz <geenz@geenzo.com>
Date: Mon, 28 Jan 2013 19:56:18 -0500
Subject: Basic normal mapping support.

---
 indra/newview/lldrawpoolbump.cpp   |  1 +
 indra/newview/llspatialpartition.h |  2 +-
 indra/newview/llviewerobject.cpp   |  5 ++--
 indra/newview/llvovolume.cpp       | 56 ++++++++++++++++++++++++--------------
 indra/newview/llvovolume.h         |  1 +
 5 files changed, 42 insertions(+), 23 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index d613def1bd..fcc81dc723 100644
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -677,6 +677,7 @@ BOOL LLDrawPoolBump::bindBumpMap(U8 bump_code, LLViewerTexture* texture, F32 vsi
 		break;
 	case BE_CUSTOM:
 		bump = tex;
+		bump->addTextureStats(vsize);
 		break;
 	default:
 		if( bump_code < LLStandardBumpmap::sStandardBumpmapCount )
diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h
index 2c4f6754ec..a71ca60d85 100644
--- a/indra/newview/llspatialpartition.h
+++ b/indra/newview/llspatialpartition.h
@@ -120,7 +120,7 @@ public:
 	F32 mDistance;
 	U32 mDrawMode;
 		
-	LLMaterialID *mMaterialID; // If this is false, the following parameters are unused.
+	const LLMaterialID *mMaterialID; // If this is false, the following parameters are unused.
 	LLPointer<LLViewerTexture> mSpecularMap;
 	const LLMatrix4* mSpecularMapMatrix;
 	LLPointer<LLViewerTexture> mNormalMap;
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 5c684326e2..78c5b3ac53 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -4110,8 +4110,8 @@ S32 LLViewerObject::setTENormalMapCore(const U8 te, const LLUUID& uuid, LLHost h
 {
 	LL_INFOS("Materials") << "Maybe normal maps! " << uuid << LL_ENDL;
 	S32 retval = 0;
-	if (uuid != getTE(te)->getMaterialParams()->getNormalID() ||
-		uuid == LLUUID::null)
+	//if (uuid != getTE(te)->getMaterialParams()->getNormalID() ||
+		//uuid == LLUUID::null)
 	{
 		LL_INFOS("Materials") << "Normal maps! " << uuid << LL_ENDL;
 		retval = TEM_CHANGE_TEXTURE;
@@ -4380,6 +4380,7 @@ S32 LLViewerObject::setTEMaterialParams(const U8 te, const LLMaterialPtr pMateri
 	else if (pMaterialParams != tep->getMaterialParams())
 	{
 		retval = LLPrimitive::setTEMaterialParams(te, pMaterialParams);
+		setTENormalMap(te, tep->getMaterialParams()->getNormalID());
 		setChanged(TEXTURE);
 		if (mDrawable.notNull() && retval)
 		{
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index c90ca48b01..8cf22d9808 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -1989,6 +1989,18 @@ S32 LLVOVolume::setTEGlow(const U8 te, const F32 glow)
 	return  res;
 }
 
+void LLVOVolume::setTEMaterialParamsCallback(const LLMaterialID &pMaterialID, const LLMaterialPtr pMaterialParams)
+{
+	for (U8 i = 0; i < getNumTEs(); i++)
+	{
+		if (getTE(i)->getMaterialID() == pMaterialID)
+		{
+			LL_INFOS("Materials") << "Material params callback triggered!" << LL_ENDL;
+			setTEMaterialParams(i, pMaterialParams);
+		}
+	}
+}
+
 S32 LLVOVolume::setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID)
 {
 	if (!pMaterialID.isNull())
@@ -1998,8 +2010,8 @@ S32 LLVOVolume::setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID)
 		if (res)
 		{
 			LL_INFOS("Materials") << "We have a material!" << LL_ENDL;
-			LLMaterialPtr pMatParam = LLMaterialMgr::instance().get(getRegion()->getRegionID(), pMaterialID);
-			setTEMaterialParams(te, pMatParam);
+			LLMaterialMgr::instance().get(getRegion()->getRegionID(), pMaterialID, boost::bind(&LLVOVolume::setTEMaterialParamsCallback, this, _1, _2));
+			//setTEMaterialParams(te, pMatParam);
 			gPipeline.markTextured(mDrawable);
 			mFaceMappingChanged = TRUE;
 		}
@@ -4083,7 +4095,7 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
 
 	U8 index = facep->getTextureIndex();
 	
-	LLMaterialID matid = facep->getTextureEntry()->getMaterialID();
+	const LLMaterialID* matid = &facep->getTextureEntry()->getMaterialID();
 
 	bool batchable = false;
 
@@ -4118,7 +4130,8 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
 		draw_vec[idx]->mFullbright == fullbright &&
 		draw_vec[idx]->mBump == bump &&
 		draw_vec[idx]->mTextureMatrix == tex_mat &&
-		draw_vec[idx]->mModelMatrix == model_mat)
+		draw_vec[idx]->mModelMatrix == model_mat &&
+		draw_vec[idx]->mMaterialID == matid)
 	{
 		draw_vec[idx]->mCount += facep->getIndicesCount();
 		draw_vec[idx]->mEnd += facep->getGeomCount();
@@ -4146,22 +4159,25 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
 		draw_vec.push_back(draw_info);
 		draw_info->mTextureMatrix = tex_mat;
 		draw_info->mModelMatrix = model_mat;
-		
-		if (!facep->getTextureEntry()->getMaterialID().isNull() && facep->getTextureEntry()->getMaterialParams() != NULL)
-		{
-			// We have a material.  Update our draw info accordingly.
-			//draw_info->mMaterialID = facep->getTextureEntry()->getMaterialID();
-			LLVector4 specColor;
-			specColor.mV[0] = facep->getTextureEntry()->getMaterialParams()->getSpecularLightColor().mV[0] * (1.0 / 255);
-			specColor.mV[1] = facep->getTextureEntry()->getMaterialParams()->getSpecularLightColor().mV[1] * (1.0 / 255);
-			specColor.mV[2] = facep->getTextureEntry()->getMaterialParams()->getSpecularLightColor().mV[2] * (1.0 / 255);
-			specColor.mV[3] = facep->getTextureEntry()->getMaterialParams()->getSpecularLightExponent() * (1.0 / 255);
-			draw_info->mSpecColor = specColor;
-			draw_info->mEnvIntensity = facep->getTextureEntry()->getMaterialParams()->getEnvironmentIntensity() * (1.0 / 255);
-			draw_info->mAlphaMaskCutoff = facep->getTextureEntry()->getMaterialParams()->getAlphaMaskCutoff() * (1.0 / 255);
-			draw_info->mDiffuseAlphaMode = facep->getTextureEntry()->getMaterialParams()->getDiffuseAlphaMode();
-			draw_info->mNormalMap = facep->getViewerObject()->getTENormalMap(facep->getTextureIndex());
-			draw_info->mSpecularMap = facep->getViewerObject()->getTESpecularMap(facep->getTextureIndex());
+		if (!facep->getTextureEntry()->getMaterialID().isNull())
+		{
+			
+			if (facep->getTextureEntry()->getMaterialParams() != NULL)
+			{
+				// We have a material.  Update our draw info accordingly.
+				draw_info->mMaterialID = &facep->getTextureEntry()->getMaterialID();
+				LLVector4 specColor;
+				specColor.mV[0] = facep->getTextureEntry()->getMaterialParams()->getSpecularLightColor().mV[0] * (1.0 / 255);
+				specColor.mV[1] = facep->getTextureEntry()->getMaterialParams()->getSpecularLightColor().mV[1] * (1.0 / 255);
+				specColor.mV[2] = facep->getTextureEntry()->getMaterialParams()->getSpecularLightColor().mV[2] * (1.0 / 255);
+				specColor.mV[3] = facep->getTextureEntry()->getMaterialParams()->getSpecularLightExponent() * (1.0 / 255);
+				draw_info->mSpecColor = specColor;
+				draw_info->mEnvIntensity = facep->getTextureEntry()->getMaterialParams()->getEnvironmentIntensity() * (1.0 / 255);
+				draw_info->mAlphaMaskCutoff = facep->getTextureEntry()->getMaterialParams()->getAlphaMaskCutoff() * (1.0 / 255);
+				draw_info->mDiffuseAlphaMode = facep->getTextureEntry()->getMaterialParams()->getDiffuseAlphaMode();
+				draw_info->mNormalMap = facep->getViewerObject()->getTENormalMap(facep->getTextureIndex());
+				draw_info->mSpecularMap = facep->getViewerObject()->getTESpecularMap(facep->getTextureIndex());
+			}
 		}
 		
 		if (type == LLRenderPass::PASS_ALPHA)
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index c996fac6f2..d1bfefdc70 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -187,6 +187,7 @@ public:
 	/*virtual*/ S32		setTEMediaFlags(const U8 te, const U8 media_flags);
 	/*virtual*/ S32		setTEGlow(const U8 te, const F32 glow);
 	/*virtual*/ S32		setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID);
+				void	setTEMaterialParamsCallback(const LLMaterialID& pMaterialID, const LLMaterialPtr pMaterialParams);
 	/*virtual*/ S32		setTEMaterialParams(const U8 te, const LLMaterialPtr pMaterialParams);
 	/*virtual*/ S32		setTEScale(const U8 te, const F32 s, const F32 t);
 	/*virtual*/ S32		setTEScaleS(const U8 te, const F32 s);
-- 
cgit v1.2.3


From aa1befd689703d9fea50399201911e0f8fca6ac6 Mon Sep 17 00:00:00 2001
From: Geenz <geenz@geenzo.com>
Date: Wed, 30 Jan 2013 12:17:04 -0500
Subject: Specular map support.  This is the vast majority of the material
 parameters implemented at this point for opaque geometry.

---
 .../shaders/class1/deferred/bumpF.glsl             | 21 +++++++++++-------
 .../shaders/class1/deferred/softenLightF.glsl      |  6 +++---
 .../shaders/class2/deferred/softenLightF.glsl      |  6 +++---
 indra/newview/lldrawpoolbump.cpp                   | 19 ++++++++++++----
 indra/newview/lldrawpoolbump.h                     |  5 ++---
 indra/newview/llface.cpp                           |  6 ++++--
 indra/newview/llspatialpartition.cpp               |  7 +++++-
 indra/newview/llviewerobject.cpp                   | 11 ++++------
 indra/newview/llvovolume.cpp                       | 18 ++++++++++++++--
 indra/newview/pipeline.cpp                         | 25 +++++++++-------------
 10 files changed, 76 insertions(+), 48 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl b/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl
index 23c4ea2fff..6e5cc69e39 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/bumpF.glsl
@@ -31,6 +31,9 @@ out vec4 frag_data[3];
 
 uniform sampler2D diffuseMap;
 uniform sampler2D bumpMap;
+uniform sampler2D specularMap;
+uniform float env_intensity;
+uniform vec4 specular_color;
 
 VARYING vec3 vary_mat0;
 VARYING vec3 vary_mat1;
@@ -42,15 +45,17 @@ VARYING vec2 vary_texcoord0;
 void main() 
 {
 	vec3 col = vertex_color.rgb * texture2D(diffuseMap, vary_texcoord0.xy).rgb;
-	vec3 norm = texture2D(bumpMap, vary_texcoord0.xy).rgb * 2.0 - 1.0;
+	vec4 spec = texture2D(specularMap, vary_texcoord0.xy);
+	vec4 norm = texture2D(bumpMap, vary_texcoord0.xy);
+	norm.xyz = norm.xyz * 2 - 1;
 
-	vec3 tnorm = vec3(dot(norm,vary_mat0),
-			  dot(norm,vary_mat1),
-			  dot(norm,vary_mat2));
-						
-	frag_data[0] = vec4(col, 0.0);
-	frag_data[1] = vertex_color.aaaa; // spec
+	vec3 tnorm = vec3(dot(norm.xyz,vary_mat0),
+			  dot(norm.xyz,vary_mat1),
+			  dot(norm.xyz,vary_mat2));
+	
+	frag_data[0] = vec4(col * (1 - spec.a * env_intensity), 0);
+	frag_data[1] = vec4(spec.xyz * specular_color.xyz, specular_color.a * norm.a); // spec
 	//frag_data[1] = vec4(vec3(vertex_color.a), vertex_color.a+(1.0-vertex_color.a)*vertex_color.a); // spec - from former class3 - maybe better, but not so well tested
 	vec3 nvn = normalize(tnorm);
-	frag_data[2] = vec4(nvn.xyz * 0.5 + 0.5, 0.0);
+	frag_data[2] = vec4(nvn.xyz * 0.5 + 0.5, spec.a * env_intensity);
 }
diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
index 87cdf1026f..2ec3fe4a52 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
@@ -280,8 +280,8 @@ void main()
 	vec2 tc = vary_fragcoord.xy;
 	float depth = texture2DRect(depthMap, tc.xy).r;
 	vec3 pos = getPosition_d(tc, depth).xyz;
-	vec3 norm = texture2DRect(normalMap, tc).xyz;
-	norm = (norm.xyz-0.5)*2.0; // unpack norm
+	vec4 norm = texture2DRect(normalMap, tc);
+	norm.xyz = (norm.xyz-0.5)*2.0; // unpack norm
 		
 	float da = max(dot(norm.xyz, sun_dir.xyz), 0.0);
 	
@@ -315,7 +315,7 @@ void main()
 			//add environmentmap
 			vec3 env_vec = env_mat * refnormpersp;
 			col = mix(col.rgb, samplesRGB(textureCube(environmentMap, env_vec).rgb) * 2.2, 
-				max(spec.a-diffuse.a*2.0, 0.0)); 
+				max(norm.a-diffuse.a*2.0, 0.0)); 
 		}
 	
 		col = atmosLighting(col);
diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
index bf4c476138..e95991a635 100644
--- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl
@@ -283,8 +283,8 @@ void main()
 	vec2 tc = vary_fragcoord.xy;
 	float depth = texture2DRect(depthMap, tc.xy).r;
 	vec3 pos = getPosition_d(tc, depth).xyz;
-	vec3 norm = texture2DRect(normalMap, tc).xyz;
-	norm = (norm.xyz-0.5)*2.0; // unpack norm
+	vec4 norm = texture2DRect(normalMap, tc);
+	norm.xyz = (norm.xyz-0.5)*2.0; // unpack norm
 		
 	float da = max(dot(norm.xyz, sun_dir.xyz), 0.0);
 	
@@ -324,7 +324,7 @@ void main()
 			//add environmentmap
 			vec3 env_vec = env_mat * refnormpersp;
 			col = mix(col.rgb, samplesRGB(textureCube(environmentMap, env_vec).rgb) * 2.2, 
-				max(spec.a-diffuse.a*2.0, 0.0)); 
+				max(norm.a-diffuse.a*2.0, 0.0)); 
 		}
 			
 		col = atmosLighting(col);
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index fcc81dc723..07384a136a 100644
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -72,7 +72,7 @@ static LLGLSLShader* shader = NULL;
 static S32 cube_channel = -1;
 static S32 diffuse_channel = -1;
 static S32 bump_channel = -1;
-
+static S32 spec_channel = -1;
 // static 
 void LLStandardBumpmap::init()
 {
@@ -634,7 +634,7 @@ BOOL LLDrawPoolBump::bindBumpMap(LLDrawInfo& params, S32 channel)
 	U8 bump_code = params.mBump;
 	if (params.mNormalMap.notNull())
 	{
-		bump_code = BE_CUSTOM;
+		bump_code = 99;
 		return bindBumpMap(bump_code, params.mNormalMap, params.mVSize, channel);
 	}
 
@@ -675,7 +675,7 @@ BOOL LLDrawPoolBump::bindBumpMap(U8 bump_code, LLViewerTexture* texture, F32 vsi
 	case BE_DARKNESS:
 		bump = gBumpImageList.getBrightnessDarknessImage( tex, bump_code );		
 		break;
-	case BE_CUSTOM:
+	case 99:
 		bump = tex;
 		bump->addTextureStats(vsize);
 		break;
@@ -828,6 +828,7 @@ void LLDrawPoolBump::beginDeferredPass(S32 pass)
 	gDeferredBumpProgram.bind();
 	diffuse_channel = gDeferredBumpProgram.enableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
 	bump_channel = gDeferredBumpProgram.enableTexture(LLViewerShaderMgr::BUMP_MAP);
+	spec_channel = gDeferredBumpProgram.enableTexture(LLViewerShaderMgr::SPECULAR_MAP);
 	gGL.getTexUnit(diffuse_channel)->unbind(LLTexUnit::TT_TEXTURE);
 	gGL.getTexUnit(bump_channel)->unbind(LLTexUnit::TT_TEXTURE);
 }
@@ -842,6 +843,7 @@ void LLDrawPoolBump::endDeferredPass(S32 pass)
 	mShiny = FALSE;
 	gDeferredBumpProgram.disableTexture(LLViewerShaderMgr::DIFFUSE_MAP);
 	gDeferredBumpProgram.disableTexture(LLViewerShaderMgr::BUMP_MAP);
+	gDeferredBumpProgram.disableTexture(LLViewerShaderMgr::SPECULAR_MAP);
 	gDeferredBumpProgram.unbind();
 	gGL.getTexUnit(0)->activate();
 }
@@ -864,7 +866,16 @@ void LLDrawPoolBump::renderDeferred(S32 pass)
 	{
 		LLDrawInfo& params = **i;
 		
-		gDeferredBumpProgram.uniform4fv(LLShaderMgr::SPECULAR_COLOR, 4, (GLfloat*)params.mSpecColor.mV);
+		gDeferredBumpProgram.uniform4f(LLShaderMgr::SPECULAR_COLOR, params.mSpecColor.mV[0], params.mSpecColor.mV[1], params.mSpecColor.mV[2], params.mSpecColor.mV[3]);
+		gDeferredBumpProgram.uniform1f(LLShaderMgr::ENVIRONMENT_INTENSITY, params.mEnvIntensity);
+		
+		if (params.mSpecularMap)
+		{
+			params.mSpecularMap->addTextureStats(params.mVSize);
+			gGL.getTexUnit(spec_channel)->bind(params.mSpecularMap);
+		} else {
+			gGL.getTexUnit(spec_channel)->bind(LLViewerFetchedTexture::sWhiteImagep);
+		}
 		
 		LLDrawPoolBump::bindBumpMap(params, bump_channel);
 		pushBatch(params, mask, TRUE);
diff --git a/indra/newview/lldrawpoolbump.h b/indra/newview/lldrawpoolbump.h
index aaf0bdf36f..476b1d41b7 100644
--- a/indra/newview/lldrawpoolbump.h
+++ b/indra/newview/lldrawpoolbump.h
@@ -100,9 +100,8 @@ enum EBumpEffect
 	BE_NO_BUMP = 0,
 	BE_BRIGHTNESS = 1,
 	BE_DARKNESS = 2,
-	BE_CUSTOM = 3,
-	BE_STANDARD_0 = 4,  // Standard must always be the last one
-	BE_COUNT = 5
+	BE_STANDARD_0 = 3,  // Standard must always be the last one
+	BE_COUNT = 4
 };
 
 ////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 01cbfafe16..cd84815295 100755
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -2077,9 +2077,11 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
 			LLFastTimer t(FTM_FACE_GEOM_BINORMAL);
 			mVertexBuffer->getBinormalStrider(binorm, mGeomIndex, mGeomCount, map_range);
 			F32* binormals = (F32*) binorm.get();
-		
+			
+			mVObjp->getVolume()->genBinormals(f);
+			
 			for (S32 i = 0; i < num_vertices; i++)
-			{	
+			{
 				LLVector4a binormal;
 				mat_normal.rotate(vf.mBinormals[i], binormal);
 				binormal.normalize3fast();
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 2083afdcf5..8a62f22985 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -4672,7 +4672,12 @@ LLDrawInfo::LLDrawInfo(U16 start, U16 end, U32 count, U32 offset,
 	mGroup(NULL),
 	mFace(NULL),
 	mDistance(0.f),
-	mDrawMode(LLRender::TRIANGLES)
+	mDrawMode(LLRender::TRIANGLES),
+	mSpecColor(1.0f, 1.0f, 1.0f, 0.5f),
+	mEnvIntensity(0.0f),
+	mAlphaMaskCutoff(0.5f),
+	mDiffuseAlphaMode(0),
+	mMaterialID(NULL)
 {
 	mVertexBuffer->validateRange(mStart, mEnd, mCount, mOffset);
 	
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 78c5b3ac53..b8de345a9a 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -4108,12 +4108,10 @@ S32 LLViewerObject::setTETextureCore(const U8 te, const LLUUID& uuid, LLHost hos
 
 S32 LLViewerObject::setTENormalMapCore(const U8 te, const LLUUID& uuid, LLHost host)
 {
-	LL_INFOS("Materials") << "Maybe normal maps! " << uuid << LL_ENDL;
 	S32 retval = 0;
 	//if (uuid != getTE(te)->getMaterialParams()->getNormalID() ||
-		//uuid == LLUUID::null)
+	//	uuid == LLUUID::null)
 	{
-		LL_INFOS("Materials") << "Normal maps! " << uuid << LL_ENDL;
 		retval = TEM_CHANGE_TEXTURE;
 		getTE(te)->getMaterialParams()->setNormalID(uuid);
 		mTENormalMaps[te] = LLViewerTextureManager::getFetchedTexture(uuid, TRUE, LLViewerTexture::BOOST_BUMP, LLViewerTexture::LOD_TEXTURE, 0, 0, host);
@@ -4128,12 +4126,10 @@ S32 LLViewerObject::setTENormalMapCore(const U8 te, const LLUUID& uuid, LLHost h
 
 S32 LLViewerObject::setTESpecularMapCore(const U8 te, const LLUUID& uuid, LLHost host)
 {
-	LL_INFOS("Materials") << "Maybe specular maps! " << uuid << LL_ENDL;
 	S32 retval = 0;
-	if (uuid != getTE(te)->getMaterialParams()->getSpecularID()	||
-		uuid == LLUUID::null)
+	//if (uuid != getTE(te)->getMaterialParams()->getSpecularID()	||
+	//	uuid == LLUUID::null)
 	{
-		LL_INFOS("Materials") << "Specular maps! " << uuid << LL_ENDL;
 		retval = TEM_CHANGE_TEXTURE;
 		getTE(te)->getMaterialParams()->setSpecularID(uuid);
 		mTESpecularMaps[te] = LLViewerTextureManager::getFetchedTexture(uuid, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE, 0, 0, host);
@@ -4381,6 +4377,7 @@ S32 LLViewerObject::setTEMaterialParams(const U8 te, const LLMaterialPtr pMateri
 	{
 		retval = LLPrimitive::setTEMaterialParams(te, pMaterialParams);
 		setTENormalMap(te, tep->getMaterialParams()->getNormalID());
+		setTESpecularMap(te, tep->getMaterialParams()->getSpecularID());
 		setChanged(TEXTURE);
 		if (mDrawable.notNull() && retval)
 		{
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 8cf22d9808..c9d6a34b8a 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -4172,12 +4172,26 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
 				specColor.mV[2] = facep->getTextureEntry()->getMaterialParams()->getSpecularLightColor().mV[2] * (1.0 / 255);
 				specColor.mV[3] = facep->getTextureEntry()->getMaterialParams()->getSpecularLightExponent() * (1.0 / 255);
 				draw_info->mSpecColor = specColor;
+				LL_INFOS("Materials") << "Specular Color: " << specColor << LL_ENDL;
 				draw_info->mEnvIntensity = facep->getTextureEntry()->getMaterialParams()->getEnvironmentIntensity() * (1.0 / 255);
 				draw_info->mAlphaMaskCutoff = facep->getTextureEntry()->getMaterialParams()->getAlphaMaskCutoff() * (1.0 / 255);
 				draw_info->mDiffuseAlphaMode = facep->getTextureEntry()->getMaterialParams()->getDiffuseAlphaMode();
 				draw_info->mNormalMap = facep->getViewerObject()->getTENormalMap(facep->getTextureIndex());
 				draw_info->mSpecularMap = facep->getViewerObject()->getTESpecularMap(facep->getTextureIndex());
 			}
+		} else {
+			U8 shiny = facep->getTextureEntry()->getShiny();
+			float alpha[4] =
+			{
+				0.00f,
+				0.25f,
+				0.5f,
+				0.75f
+			};
+			float spec = alpha[shiny];
+			LLVector4 specColor(spec, spec, spec, spec);
+			draw_info->mSpecColor = specColor;
+			draw_info->mEnvIntensity = spec;
 		}
 		
 		if (type == LLRenderPass::PASS_ALPHA)
@@ -4631,7 +4645,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
 						if (gPipeline.canUseWindLightShadersOnObjects()
 							&& LLPipeline::sRenderBump)
 						{
-							if (te->getBumpmap())
+							if (te->getBumpmap() || te->getMaterialParams()	!= NULL)
 							{ //needs normal + binormal
 								bump_faces.push_back(facep);
 							}
@@ -5237,7 +5251,7 @@ void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::
 				}
 				else
 				{
-					if (LLPipeline::sRenderDeferred && LLPipeline::sRenderBump && (te->getBumpmap() || te->getMaterialParams() != NULL))
+					if (LLPipeline::sRenderDeferred && LLPipeline::sRenderBump && (te->getBumpmap() || te->getMaterialParams()))
 					{ //non-shiny or fullbright deferred bump
 						registerFace(group, facep, LLRenderPass::PASS_BUMP);
 					}
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 07246391e3..ea7de6f399 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -1262,31 +1262,26 @@ void LLPipeline::createLUTBuffers()
 			U32 lightResY = gSavedSettings.getU32("RenderSpecularResY");
 			F32* ls = new F32[lightResX*lightResY];
 			//F32 specExp = gSavedSettings.getF32("RenderSpecularExponent"); // Note: only use this when creating new specular lighting functions.
-            // Calculate the (normalized) Gaussian specular lookup texture. (with a few tweaks)
+            // Calculate the (normalized) blinn-phong specular lookup texture. (with a few tweaks)
 			for (U32 y = 0; y < lightResY; ++y)
 			{
 				for (U32 x = 0; x < lightResX; ++x)
 				{
 					ls[y*lightResX+x] = 0;
 					F32 sa = (F32) x/(lightResX-1);
-					F32 spec = (F32) y/(lightResY);
-					F32 n = spec;
+					F32 spec = (F32) y/(lightResY-1);
+					F32 n = spec * spec * 368;
 					
-					float angleNormalHalf = acosf(sa);
-					float exponent = angleNormalHalf / ((1 - n));
-					exponent = -(exponent * exponent);
-					spec = expf(exponent);
+					// Nothing special here.  Just your typical blinn-phong term.
+					spec = powf(sa, n);
 					
 					// Apply our normalization function.
-					// This is based around the phong normalization function, trading n+2 for n+1 instead.
-					// Since we're using a gaussian model here, we actually don't really need as large of an exponent as blinn-phong shading.
-					// Instead, we assume that the correct exponent is 8 here.
-					// This was achieved through much tweaking to find a decent "middleground" with our specular highlights with the gaussian term.
-					// Bigger highlights don't look too soft, smaller highlights don't look too bright, and everything in the middle seems to have a well maintained highlight curvature.
-					// There isn't really much theory behind this one.  This was done purely to produce a nice and mostly customizable BRDF.
-					
-					spec = lerpf(spec, spec * (n * 8 + 1) / 4.5, n);
+					// Note: This is the full equation that applies the full normalization curve, not an approximation.
+					// This is fine, given we only need to create our LUT once per buffer initialization.
+					spec *= (((n + 2) * (n + 4)) / (8 * F_PI * (powf(2, -n/2) + n)));
 					
+					// Since we use R16F, we no longer have a dynamic range issue we need to work around here.
+					// Though some older drivers may not like this, newer drivers shouldn't have this problem.
 					ls[y*lightResX+x] = spec;
 				}
 			}
-- 
cgit v1.2.3


From d53f69b67f2aed05fd763932f25cc8b5c40ec774 Mon Sep 17 00:00:00 2001
From: Tonya Souther <tonya.souther@gmail.com>
Date: Thu, 31 Jan 2013 00:36:23 -0600
Subject: Control reorganization and bugfixes.

---
 indra/newview/llpanelface.cpp | 215 ++++++++++++++++++++++++++----------------
 indra/newview/llpanelface.h   |   2 +
 indra/newview/llselectmgr.cpp |   1 +
 3 files changed, 139 insertions(+), 79 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index 024265b377..4f61d5bbb6 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -699,7 +699,7 @@ void LLPanelFace::getState()
 				{
 					llwarns << "failed childGetSelectionInterface for 'combobox alphamode'" << llendl;
 				}
-				onCommitAlphaMode(getChild<LLComboBox>("combobox alphamode"),this);
+				updateAlphaControls(getChild<LLComboBox>("combobox alphamode"),this);
 			}
 			
 			if (identical)
@@ -712,10 +712,10 @@ void LLPanelFace::getState()
 					texture_ctrl->setImageAssetID( id );
 					shinytexture_ctrl->setTentative( FALSE );
 					shinytexture_ctrl->setEnabled( editable );
-					shinytexture_ctrl->setImageAssetID( id );
+					shinytexture_ctrl->setImageAssetID( LLUUID::null );
 					bumpytexture_ctrl->setTentative( FALSE );
 					bumpytexture_ctrl->setEnabled( editable );
-					bumpytexture_ctrl->setImageAssetID( id );
+					bumpytexture_ctrl->setImageAssetID( LLUUID::null );
 					getChildView("combobox alphamode")->setEnabled(editable && mIsAlpha);
 					getChildView("label alphamode")->setEnabled(editable && mIsAlpha);
 					getChildView("maskcutoff")->setEnabled(editable && mIsAlpha);
@@ -751,10 +751,10 @@ void LLPanelFace::getState()
 						texture_ctrl->setImageAssetID( id );
 						shinytexture_ctrl->setTentative( TRUE );
 						shinytexture_ctrl->setEnabled( editable );
-						shinytexture_ctrl->setImageAssetID( id );
+						shinytexture_ctrl->setImageAssetID( LLUUID::null );
 						bumpytexture_ctrl->setTentative( TRUE );
 						bumpytexture_ctrl->setEnabled( editable );
-						bumpytexture_ctrl->setImageAssetID( id );
+						bumpytexture_ctrl->setImageAssetID( LLUUID::null );
 						getChildView("combobox alphamode")->setEnabled(editable && mIsAlpha);
 						getChildView("label alphamode")->setEnabled(editable && mIsAlpha);
 						getChildView("maskcutoff")->setEnabled(editable && mIsAlpha);
@@ -1091,11 +1091,6 @@ void LLPanelFace::getState()
 			getChild<LLUICtrl>("checkbox fullbright")->setTentative(!identical);
 		}
 		
-		// Repeats per meter label
-		{
-			getChildView("rpt")->setEnabled(editable);
-		}
-
 		// Repeats per meter
 		{
 			F32 repeats = 1.f;
@@ -1126,7 +1121,7 @@ void LLPanelFace::getState()
 		// Materials
 		{
 			mMaterialID = LLMaterialID::null;
-			//mMaterial = LLMaterialPtr();
+			mMaterial.reset();
 			struct f1 : public LLSelectedTEGetFunctor<LLMaterialID>
 			{
 				LLMaterialID get(LLViewerObject* object, S32 te_index)
@@ -1142,6 +1137,7 @@ void LLPanelFace::getState()
 				<< (mMaterialID.isNull()?"TRUE":"FALSE") << llendl;
 			if (!mMaterialID.isNull() && editable)
 			{
+				llinfos << "Requesting material ID " << mMaterialID.asString() << llendl;
 				LLMaterialMgr::getInstance()->get(objectp->getRegion()->getRegionID(),mMaterialID,boost::bind(&LLPanelFace::onMaterialLoaded, this, _1, _2));
 			}
 		}
@@ -1209,14 +1205,25 @@ void LLPanelFace::refresh()
 
 void LLPanelFace::onMaterialLoaded(const LLMaterialID& material_id, const LLMaterialPtr material)
 {
-	llinfos << "Material loaded: " << material_id.asString()
-		<< ", LLSD: " << material->asLLSD() << llendl;
 	mMaterial = material;
-	getChild<LLUICtrl>("maskcutoff")->setValue(material->getAlphaMaskCutoff());
-	getChild<LLColorSwatchCtrl>("shinycolorswatch")->setOriginal(material->getSpecularLightColor());
-	getChild<LLColorSwatchCtrl>("shinycolorswatch")->set(material->getSpecularLightColor(),TRUE);
-	getChild<LLUICtrl>("glossiness")->setValue((F32)(material->getSpecularLightExponent())/255.0);
-	getChild<LLUICtrl>("environment")->setValue((F32)(material->getEnvironmentIntensity())/255.0);
+#if 0
+	static LLMaterialID old_material_id = LLMaterialID::null;
+	if (material_id == old_material_id)
+	{
+		llinfos << "Material ID " << material_id.asString()
+			<< " unchanged, not updating" << llendl;
+		return;
+	}
+	else
+	{
+		llinfos << "Material ID changed, old " << old_material_id.asString()
+			<< ", new " << material_id.asString()
+			<< ", updating controls: " << material->asLLSD()
+			<< llendl;
+	}
+	old_material_id = material_id;
+#endif
+	// Alpha
 	LLCtrlSelectionInterface* combobox_alphamode =
 	      childGetSelectionInterface("combobox alphamode");
 	if (combobox_alphamode)
@@ -1227,17 +1234,18 @@ void LLPanelFace::onMaterialLoaded(const LLMaterialID& material_id, const LLMate
 	{
 		llwarns << "failed childGetSelectionInterface for 'combobox alphamode'" << llendl;
 	}
-	onCommitAlphaMode(getChild<LLComboBox>("combobox alphamode"),this);
-	LLComboBox* comboMaterialType = getChild<LLComboBox>("combobox mattype");
+	getChild<LLUICtrl>("maskcutoff")->setValue(material->getAlphaMaskCutoff());
+	updateAlphaControls(getChild<LLComboBox>("combobox alphamode"),this);
+
+	// Shiny (specular)
 	F32 offset_x, offset_y, repeat_x, repeat_y, rot;
-	if ((comboMaterialType->getCurrentIndex() == MATTYPE_SPECULAR) &&
-		!material->getSpecularID().isNull())
+	LLTextureCtrl* texture_ctrl = getChild<LLTextureCtrl>("shinytexture control");
+	texture_ctrl->setImageAssetID(material->getSpecularID());
+	if (!material->getSpecularID().isNull())
 	{
 		material->getSpecularOffset(offset_x,offset_y);
 		material->getSpecularRepeat(repeat_x,repeat_y);
 		rot = material->getSpecularRotation();
-		LLTextureCtrl*	texture_ctrl = getChild<LLTextureCtrl>("shinytexture control");
-		texture_ctrl->setImageAssetID(material->getSpecularID());
 		LLCtrlSelectionInterface* combobox_shininess =
 		      childGetSelectionInterface("combobox shininess");
 		if (combobox_shininess)
@@ -1253,15 +1261,20 @@ void LLPanelFace::onMaterialLoaded(const LLMaterialID& material_id, const LLMate
 		getChild<LLUICtrl>("shinyRot")->setValue(rot);
 		getChild<LLUICtrl>("shinyOffsetU")->setValue(offset_x);
 		getChild<LLUICtrl>("shinyOffsetV")->setValue(offset_y);
+		getChild<LLColorSwatchCtrl>("shinycolorswatch")->setOriginal(material->getSpecularLightColor());
+		getChild<LLColorSwatchCtrl>("shinycolorswatch")->set(material->getSpecularLightColor(),TRUE);
+		getChild<LLUICtrl>("glossiness")->setValue((F32)(material->getSpecularLightExponent())/255.0);
+		getChild<LLUICtrl>("environment")->setValue((F32)(material->getEnvironmentIntensity())/255.0);
 	}
-	if ((comboMaterialType->getCurrentIndex() == MATTYPE_NORMAL) &&
-		!material->getNormalID().isNull())
+
+	// Bumpy (normal)
+	texture_ctrl = getChild<LLTextureCtrl>("bumpytexture control");
+	texture_ctrl->setImageAssetID(material->getNormalID());
+	if (!material->getNormalID().isNull())
 	{
 		material->getNormalOffset(offset_x,offset_y);
 		material->getNormalRepeat(repeat_x,repeat_y);
 		rot = material->getNormalRotation();
-		LLTextureCtrl*	texture_ctrl = getChild<LLTextureCtrl>("bumpytexture control");
-		texture_ctrl->setImageAssetID(material->getNormalID());
 		LLCtrlSelectionInterface* combobox_bumpiness =
 		      childGetSelectionInterface("combobox bumpiness");
 		if (combobox_bumpiness)
@@ -1289,42 +1302,69 @@ void LLPanelFace::updateMaterial()
 	{
 		return;
 	}
-	if ((mIsAlpha && (comboAlphaMode->getCurrentIndex() != ALPHAMODE_BLEND))
-		|| (comboBumpiness->getCurrentIndex() != BUMPY_TEXTURE)
-		|| (comboShininess->getCurrentIndex() != SHINY_TEXTURE))
+	U32 alpha_mode = comboAlphaMode->getCurrentIndex();
+	U32 bumpiness = comboBumpiness->getCurrentIndex();
+	U32 shininess = comboShininess->getCurrentIndex();
+	if ((mIsAlpha && (alpha_mode != ALPHAMODE_BLEND))
+		|| (bumpiness == BUMPY_TEXTURE)
+		|| (shininess == SHINY_TEXTURE))
 	{
 		// The user's specified something that needs a material.
 		if (!mMaterial)
 		{
 			mMaterial = LLMaterialPtr(new LLMaterial());
 		}
-		mMaterial->setNormalID(getChild<LLTextureCtrl>("bumpytexture control")->getImageAssetID());
-		mMaterial->setNormalOffset(getChild<LLUICtrl>("bumpyOffsetU")->getValue().asReal(),
-						getChild<LLUICtrl>("bumpyOffsetV")->getValue().asReal());
-		mMaterial->setNormalRepeat(getChild<LLUICtrl>("bumpyScaleU")->getValue().asReal(),
-						getChild<LLUICtrl>("bumpyScaleV")->getValue().asReal());
-		mMaterial->setNormalRotation(getChild<LLUICtrl>("bumpyRot")->getValue().asReal());
-		mMaterial->setSpecularID(getChild<LLTextureCtrl>("shinytexture control")->getImageAssetID());
-		mMaterial->setSpecularOffset(getChild<LLUICtrl>("shinyOffsetU")->getValue().asReal(),
-						getChild<LLUICtrl>("shinyOffsetV")->getValue().asReal());
-		mMaterial->setSpecularRepeat(getChild<LLUICtrl>("shinyScaleU")->getValue().asReal(),
-						getChild<LLUICtrl>("shinyScaleV")->getValue().asReal());
-		mMaterial->setSpecularRotation(getChild<LLUICtrl>("shinyRot")->getValue().asReal());
+		if (bumpiness == BUMPY_TEXTURE)
+		{
+			mMaterial->setNormalID(getChild<LLTextureCtrl>("bumpytexture control")->getImageAssetID());
+			mMaterial->setNormalOffset(getChild<LLUICtrl>("bumpyOffsetU")->getValue().asReal(),
+							getChild<LLUICtrl>("bumpyOffsetV")->getValue().asReal());
+			mMaterial->setNormalRepeat(getChild<LLUICtrl>("bumpyScaleU")->getValue().asReal(),
+							getChild<LLUICtrl>("bumpyScaleV")->getValue().asReal());
+			mMaterial->setNormalRotation(getChild<LLUICtrl>("bumpyRot")->getValue().asReal());
+		}
+		else
+		{
+			mMaterial->setNormalID(LLUUID());
+			mMaterial->setNormalOffset(0.0f,0.0f);
+			mMaterial->setNormalRepeat(1.0f,1.0f);
+			mMaterial->setNormalRotation(0.0f);
+		}
+		if (shininess == SHINY_TEXTURE)
+		{
+			mMaterial->setSpecularID(getChild<LLTextureCtrl>("shinytexture control")->getImageAssetID());
+			mMaterial->setSpecularOffset(getChild<LLUICtrl>("shinyOffsetU")->getValue().asReal(),
+							getChild<LLUICtrl>("shinyOffsetV")->getValue().asReal());
+			mMaterial->setSpecularRepeat(getChild<LLUICtrl>("shinyScaleU")->getValue().asReal(),
+							getChild<LLUICtrl>("shinyScaleV")->getValue().asReal());
+			mMaterial->setSpecularRotation(getChild<LLUICtrl>("shinyRot")->getValue().asReal());
+		}
+		else
+		{
+			mMaterial->setSpecularID(LLUUID());
+			mMaterial->setSpecularOffset(0.0f,0.0f);
+			mMaterial->setSpecularRepeat(1.0f,1.0f);
+			mMaterial->setSpecularRotation(0.0f);
+		}
 		mMaterial->setSpecularLightColor(getChild<LLColorSwatchCtrl>("shinycolorswatch")->get());
 		mMaterial->setSpecularLightExponent((U8)(255*getChild<LLUICtrl>("glossiness")->getValue().asReal()));
 		mMaterial->setEnvironmentIntensity((U8)(255*getChild<LLUICtrl>("environment")->getValue().asReal()));
 		mMaterial->setDiffuseAlphaMode(getChild<LLComboBox>("combobox alphamode")->getCurrentIndex());
 		mMaterial->setAlphaMaskCutoff((U8)(getChild<LLUICtrl>("maskcutoff")->getValue().asInteger()));
+		llinfos << "Updating material: " << mMaterial->asLLSD() << llendl;
+		LLSelectMgr::getInstance()->selectionSetMaterial( *mMaterial );
 	}
 	else
 	{
 		// The user has specified settings that don't need a material.
-		if (mMaterial)
+		if (mMaterial || !mMaterialID.isNull())
 		{
+			llinfos << "Resetting material entry" << llendl;
 			mMaterial.reset();
+			mMaterialID = LLMaterialID::null;
+			// Delete existing material entry...
 		}
 	}
-	LLSelectMgr::getInstance()->selectionSetMaterial( *mMaterial );
 }
 
 //
@@ -1345,7 +1385,8 @@ void LLPanelFace::onCommitColor(const LLSD& data)
 
 void LLPanelFace::onCommitShinyColor(const LLSD& data)
 {
-	updateMaterial();
+	llinfos << "updating material" << llendl;
+	//updateMaterial();
 }
 
 void LLPanelFace::onCommitAlpha(const LLSD& data)
@@ -1368,23 +1409,21 @@ void LLPanelFace::onSelectColor(const LLSD& data)
 void LLPanelFace::onCommitMaterialsMedia(LLUICtrl* ctrl, void* userdata)
 {
 	LLPanelFace* self = (LLPanelFace*) userdata;
-	// Get material info so we can use it later
-	if (self->mMaterial)
-	{
-		self->onMaterialLoaded(self->mMaterialID,self->mMaterial);
-	}
-	LLComboBox* comboMaterialsMedia = self->getChild<LLComboBox>("combobox matmedia");
-	LLComboBox* comboMaterialType = self->getChild<LLComboBox>("combobox mattype");
-	if (!comboMaterialType || !comboMaterialsMedia)
+	LLComboBox* combo_matmedia = self->getChild<LLComboBox>("combobox matmedia");
+	LLComboBox* combo_mattype = self->getChild<LLComboBox>("combobox mattype");
+	LLComboBox* combo_shininess = self->getChild<LLComboBox>("combobox shininess");
+	LLComboBox* combo_bumpiness = self->getChild<LLComboBox>("combobox bumpiness");
+	if (!combo_mattype || !combo_matmedia || !combo_shininess || !combo_bumpiness)
 	{
+		llwarns << "Combo box not found...exiting." << llendl;
 		return;
 	}
-	U32 materials_media = comboMaterialsMedia->getCurrentIndex();
-	U32 material_type = comboMaterialType->getCurrentIndex();
-	bool show_media = (materials_media == MATMEDIA_MEDIA) && comboMaterialsMedia->getEnabled();
-	bool show_texture = (!show_media) && (material_type == MATTYPE_DIFFUSE) && comboMaterialsMedia->getEnabled();
-	bool show_bumpiness = (!show_media) && (material_type == MATTYPE_NORMAL) && comboMaterialsMedia->getEnabled();
-	bool show_shininess = (!show_media) && (material_type == MATTYPE_SPECULAR) && comboMaterialsMedia->getEnabled();
+	U32 materials_media = combo_matmedia->getCurrentIndex();
+	U32 material_type = combo_mattype->getCurrentIndex();
+	bool show_media = (materials_media == MATMEDIA_MEDIA) && combo_matmedia->getEnabled();
+	bool show_texture = (!show_media) && (material_type == MATTYPE_DIFFUSE) && combo_matmedia->getEnabled();
+	bool show_bumpiness = (!show_media) && (material_type == MATTYPE_NORMAL) && combo_matmedia->getEnabled();
+	bool show_shininess = (!show_media) && (material_type == MATTYPE_SPECULAR) && combo_matmedia->getEnabled();
 	self->getChildView("combobox mattype")->setVisible(!show_media);
 	self->getChildView("rptctrl")->setVisible(!show_media);
 
@@ -1402,7 +1441,7 @@ void LLPanelFace::onCommitMaterialsMedia(LLUICtrl* ctrl, void* userdata)
 	self->getChildView("maskcutoff")->setVisible(false);
 	if (show_texture)
 	{
-		onCommitAlphaMode(ctrl, userdata);
+		updateAlphaControls(ctrl, userdata);
 	}
 	self->getChildView("TexScaleU")->setVisible(show_texture);
 	self->getChildView("TexScaleV")->setVisible(show_texture);
@@ -1422,7 +1461,7 @@ void LLPanelFace::onCommitMaterialsMedia(LLUICtrl* ctrl, void* userdata)
 	self->getChildView("shinycolorswatch")->setVisible(false);
 	if (show_shininess)
 	{
-		onCommitShiny(ctrl, userdata);
+		updateShinyControls(ctrl, userdata);
 	}
 	self->getChildView("shinyScaleU")->setVisible(show_shininess);
 	self->getChildView("shinyScaleV")->setVisible(show_shininess);
@@ -1442,13 +1481,9 @@ void LLPanelFace::onCommitMaterialsMedia(LLUICtrl* ctrl, void* userdata)
 
 	// Enable texture scale/rotation/offset parameters if there's one
 	// present to set for
-	bool texParmsEnable = show_texture;
-	if (self->mMaterial)
-	{
-		texParmsEnable = texParmsEnable ||
-				(!self->mMaterial->getNormalID().isNull() && show_bumpiness) ||
-				(!self->mMaterial->getSpecularID().isNull() && show_shininess);
-	}
+	bool texParmsEnable = show_texture ||
+		(show_shininess && (combo_shininess->getCurrentIndex() == SHINY_TEXTURE)) ||
+		(show_bumpiness && (combo_bumpiness->getCurrentIndex() == BUMPY_TEXTURE));
 	self->getChildView("tex gen")->setEnabled(texParmsEnable);
 	self->getChildView("combobox texgen")->setEnabled(texParmsEnable);
 	self->getChildView("rptctrl")->setEnabled(texParmsEnable);
@@ -1491,8 +1526,9 @@ void LLPanelFace::onCommitTexGen(LLUICtrl* ctrl, void* userdata)
 }
 
 // static
-void LLPanelFace::onCommitShiny(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::updateShinyControls(LLUICtrl* ctrl, void* userdata)
 {
+	llinfos << "Entered." << llendl;
 	LLPanelFace* self = (LLPanelFace*) userdata;
 	LLComboBox* comboShiny = self->getChild<LLComboBox>("combobox shininess");
 	if (!comboShiny)
@@ -1507,12 +1543,21 @@ void LLPanelFace::onCommitShiny(LLUICtrl* ctrl, void* userdata)
 	self->getChildView("environment")->setVisible(show_shinyctrls);
 	self->getChildView("label shinycolor")->setVisible(show_shinyctrls);
 	self->getChildView("shinycolorswatch")->setVisible(show_shinyctrls);
+}
+
+// static
+void LLPanelFace::onCommitShiny(LLUICtrl* ctrl, void* userdata)
+{
+	LLPanelFace* self = (LLPanelFace*) userdata;
 	self->sendShiny();
+	llinfos << "updating material" << llendl;
+	//self->updateMaterial();
 }
 
 // static
-void LLPanelFace::onCommitAlphaMode(LLUICtrl* ctrl, void* userdata)
+void LLPanelFace::updateAlphaControls(LLUICtrl* ctrl, void* userdata)
 {
+	llinfos << "Entered." << llendl;
 	LLPanelFace* self = (LLPanelFace*) userdata;
 	LLComboBox* comboAlphaMode = self->getChild<LLComboBox>("combobox alphamode");
 	if (!comboAlphaMode)
@@ -1523,7 +1568,15 @@ void LLPanelFace::onCommitAlphaMode(LLUICtrl* ctrl, void* userdata)
 	bool show_alphactrls = (alpha_value == ALPHAMODE_MASK); // Alpha masking
 	self->getChildView("label maskcutoff")->setVisible(show_alphactrls);
 	self->getChildView("maskcutoff")->setVisible(show_alphactrls);
-	self->updateMaterial();
+}
+
+// static
+void LLPanelFace::onCommitAlphaMode(LLUICtrl* ctrl, void* userdata)
+{
+	LLPanelFace* self = (LLPanelFace*) userdata;
+	self->updateAlphaControls(ctrl,userdata);
+	llinfos << "updating material" << llendl;
+	//self->updateMaterial();
 }
 
 // static
@@ -1577,25 +1630,29 @@ void LLPanelFace::onSelectTexture(const LLSD& data)
 
 void LLPanelFace::onCommitMaterialTexture( const LLSD& data )
 {
-	updateMaterial();
+	llinfos << "updating material" << llendl;
+	//updateMaterial();
 }
 
 void LLPanelFace::onCancelMaterialTexture(const LLSD& data)
 {
 	// not sure what to do here other than
-	updateMaterial();
+	llinfos << "updating material" << llendl;
+	//updateMaterial();
 }
 
 void LLPanelFace::onSelectMaterialTexture(const LLSD& data)
 {
-	updateMaterial();
+	llinfos << "updating material" << llendl;
+	//updateMaterial();
 }
 
 //static
 void LLPanelFace::onCommitMaterial(LLUICtrl* ctrl, void* userdata)
 {
-	LLPanelFace* self = (LLPanelFace*) userdata;
-	self->updateMaterial();
+	llinfos << "updating material" << llendl;
+	//LLPanelFace* self = (LLPanelFace*) userdata;
+	//self->updateMaterial();
 }
 
 // static
@@ -1699,10 +1756,10 @@ void LLPanelFace::onTextureSelectionChanged(LLInventoryItem* itemp)
 	switch (mattype)
 	{
 		case MATTYPE_SPECULAR:
-			which_control = "shinytexture_control";
+			which_control = "shinytexture control";
 			break;
 		case MATTYPE_NORMAL:
-			which_control = "bumpytexture_control";
+			which_control = "bumpytexture control";
 			break;
 		// no default needed
 	}
diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h
index c6322d59b2..62aa632821 100644
--- a/indra/newview/llpanelface.h
+++ b/indra/newview/llpanelface.h
@@ -93,7 +93,9 @@ protected:
 	static void		onCommitMaterialType(		LLUICtrl* ctrl, void* userdata);
 	static void		onCommitBump(			LLUICtrl* ctrl, void* userdata);
 	static void		onCommitTexGen(			LLUICtrl* ctrl, void* userdata);
+	static void		updateShinyControls(		LLUICtrl* ctrl, void* userdata);
 	static void		onCommitShiny(			LLUICtrl* ctrl, void* userdata);
+	static void		updateAlphaControls(		LLUICtrl* ctrl, void* userdata);
 	static void		onCommitAlphaMode(		LLUICtrl* ctrl, void* userdata);
 	static void		onCommitFullbright(		LLUICtrl* ctrl, void* userdata);
 	static void     onCommitGlow(           LLUICtrl* ctrl, void *userdata);
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 9f9e39527f..6f855ad30d 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -2020,6 +2020,7 @@ void LLSelectMgr::selectionSetMaterial(LLMaterial& material)
 		{
 			if (object->permModify())
 			{
+			        llinfos << "Putting material on object " << object->getID() << " face " << face << ", material: " << mMaterial.asLLSD() << llendl;
 				LLMaterialMgr::getInstance()->put(object->getID(),face,mMaterial);
 			}
 			return true;
-- 
cgit v1.2.3


From 132db13fb6bb6dd802d3ee000a10e91127403547 Mon Sep 17 00:00:00 2001
From: Tonya Souther <tonya.souther@gmail.com>
Date: Thu, 31 Jan 2013 14:49:11 -0600
Subject: Fixing VC++ compile error: calling a static routine doesn't need the
 "this" pointer

---
 indra/newview/llpanelface.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index 4f61d5bbb6..474fa9d58e 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -1573,8 +1573,8 @@ void LLPanelFace::updateAlphaControls(LLUICtrl* ctrl, void* userdata)
 // static
 void LLPanelFace::onCommitAlphaMode(LLUICtrl* ctrl, void* userdata)
 {
-	LLPanelFace* self = (LLPanelFace*) userdata;
-	self->updateAlphaControls(ctrl,userdata);
+	//LLPanelFace* self = (LLPanelFace*) userdata;
+	updateAlphaControls(ctrl,userdata);
 	llinfos << "updating material" << llendl;
 	//self->updateMaterial();
 }
-- 
cgit v1.2.3


From 510a68134110b06779f34d2dd896a337911d5fef Mon Sep 17 00:00:00 2001
From: Oz Linden <oz@lindenlab.com>
Date: Thu, 31 Jan 2013 16:00:57 -0500
Subject: make logging tag for Materials uniform

---
 indra/newview/llmaterialmgr.cpp | 28 ++++++++++++++--------------
 1 file changed, 14 insertions(+), 14 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llmaterialmgr.cpp b/indra/newview/llmaterialmgr.cpp
index 3138bfd4e1..3895411bb9 100644
--- a/indra/newview/llmaterialmgr.cpp
+++ b/indra/newview/llmaterialmgr.cpp
@@ -96,10 +96,10 @@ void LLMaterialsResponder::result(const LLSD& pContent)
 
 void LLMaterialsResponder::error(U32 pStatus, const std::string& pReason)
 {
-	LL_WARNS("debugMaterials") << "--------------------------------------------------------------------------" << LL_ENDL;
-	LL_WARNS("debugMaterials") << mMethod << " Error[" << pStatus << "] cannot access cap '" << MATERIALS_CAPABILITY_NAME
+	LL_WARNS("Materials") << "--------------------------------------------------------------------------" << LL_ENDL;
+	LL_WARNS("Materials") << mMethod << " Error[" << pStatus << "] cannot access cap '" << MATERIALS_CAPABILITY_NAME
 		<< "' with url '" << mCapabilityURL	<< "' because " << pReason << LL_ENDL;
-	LL_WARNS("debugMaterials") << "--------------------------------------------------------------------------" << LL_ENDL;
+	LL_WARNS("Materials") << "--------------------------------------------------------------------------" << LL_ENDL;
 
 	LLSD emptyResult;
 	mCallback(false, emptyResult);
@@ -271,7 +271,7 @@ void LLMaterialMgr::onGetResponse(bool success, const LLSD& content, const LLUUI
 	LLSD response_data;
 	if (!unzip_llsd(response_data, content_stream, content_binary.size()))
 	{
-		LL_ERRS("debugMaterials") << "Cannot unzip LLSD binary content" << LL_ENDL;
+		LL_ERRS("Materials") << "Cannot unzip LLSD binary content" << LL_ENDL;
 		return;
 	}
 
@@ -311,7 +311,7 @@ void LLMaterialMgr::onGetAllResponse(bool success, const LLSD& content, const LL
 	LLSD response_data;
 	if (!unzip_llsd(response_data, content_stream, content_binary.size()))
 	{
-		LL_ERRS("debugMaterials") << "Cannot unzip LLSD binary content" << LL_ENDL;
+		LL_ERRS("Materials") << "Cannot unzip LLSD binary content" << LL_ENDL;
 		return;
 	}
 
@@ -375,7 +375,7 @@ void LLMaterialMgr::onPutResponse(bool success, const LLSD& content)
 	LLSD response_data;
 	if (!unzip_llsd(response_data, content_stream, content_binary.size()))
 	{
-		LL_ERRS("debugMaterials") << "Cannot unzip LLSD binary content" << LL_ENDL;
+		LL_ERRS("Materials") << "Cannot unzip LLSD binary content" << LL_ENDL;
 		return;
 	}
 	else
@@ -446,7 +446,7 @@ void LLMaterialMgr::processGetQueue()
 		const LLViewerRegion* regionp = LLWorld::instance().getRegionFromID(region_id);
 		if (!regionp)
 		{
-			LL_WARNS("debugMaterials") << "Unknown region with id " << region_id.asString() << LL_ENDL;
+			LL_WARNS("Materials") << "Unknown region with id " << region_id.asString() << LL_ENDL;
 			mGetQueue.erase(itRegionQueue);
 			continue;
 		}
@@ -463,7 +463,7 @@ void LLMaterialMgr::processGetQueue()
 		const std::string capURL = regionp->getCapability(MATERIALS_CAPABILITY_NAME);
 		if (capURL.empty())
 		{
-			LL_WARNS("debugMaterials") << "Capability '" << MATERIALS_CAPABILITY_NAME
+			LL_WARNS("Materials") << "Capability '" << MATERIALS_CAPABILITY_NAME
 				<< "' is not defined on region '" << regionp->getName() << "'" << LL_ENDL;
 			mGetQueue.erase(itRegionQueue);
 			continue;
@@ -486,7 +486,7 @@ void LLMaterialMgr::processGetQueue()
 		S32 materialSize = materialString.size();
 		if (materialSize <= 0)
 		{
-			LL_ERRS("debugMaterials") << "cannot zip LLSD binary content" << LL_ENDL;
+			LL_ERRS("Materials") << "cannot zip LLSD binary content" << LL_ENDL;
 			return;
 		}
 
@@ -513,7 +513,7 @@ void LLMaterialMgr::processGetAllQueue()
 		LLViewerRegion* regionp = LLWorld::instance().getRegionFromID(region_id);
 		if (regionp == NULL)
 		{
-			LL_WARNS("debugMaterials") << "Unknown region with id " << region_id.asString() << LL_ENDL;
+			LL_WARNS("Materials") << "Unknown region with id " << region_id.asString() << LL_ENDL;
 			mGetAllQueue.erase(itRegion);
 			continue;
 		}
@@ -525,7 +525,7 @@ void LLMaterialMgr::processGetAllQueue()
 		std::string capURL = regionp->getCapability(MATERIALS_CAPABILITY_NAME);
 		if (capURL.empty())
 		{
-			LL_WARNS("debugMaterials") << "Capability '" << MATERIALS_CAPABILITY_NAME
+			LL_WARNS("Materials") << "Capability '" << MATERIALS_CAPABILITY_NAME
 				<< "' is not defined on the current region '" << regionp->getName() << "'" << LL_ENDL;
 			mGetAllQueue.erase(itRegion);
 			continue;
@@ -549,7 +549,7 @@ void LLMaterialMgr::processPutQueue()
 		const LLViewerObject* objectp = gObjectList.findObject(object_id);
 		if ( (!objectp) || (!objectp->getRegion()) )
 		{
-			LL_WARNS("debugMaterials") << "Object or object region is NULL" << LL_ENDL;
+			LL_WARNS("Materials") << "Object or object region is NULL" << LL_ENDL;
 
 			mPutQueue.erase(itQueue);
 			continue;
@@ -564,7 +564,7 @@ void LLMaterialMgr::processPutQueue()
 		std::string capURL = regionp->getCapability(MATERIALS_CAPABILITY_NAME);
 		if (capURL.empty())
 		{
-			LL_WARNS("debugMaterials") << "Capability '" << MATERIALS_CAPABILITY_NAME
+			LL_WARNS("Materials") << "Capability '" << MATERIALS_CAPABILITY_NAME
 				<< "' is not defined on region '" << regionp->getName() << "'" << LL_ENDL;
 
 			mPutQueue.erase(itQueue);
@@ -592,7 +592,7 @@ void LLMaterialMgr::processPutQueue()
 		S32 materialSize = materialString.size();
 		if (materialSize <= 0)
 		{
-			LL_ERRS("debugMaterials") << "cannot zip LLSD binary content" << LL_ENDL;
+			LL_ERRS("Materials") << "cannot zip LLSD binary content" << LL_ENDL;
 
 			mPutQueue.erase(itQueue);
 			continue;
-- 
cgit v1.2.3


From 90bf22ef24fbb8ff3497dd271abc7f7555a4f758 Mon Sep 17 00:00:00 2001
From: Oz Linden <oz@lindenlab.com>
Date: Fri, 1 Feb 2013 10:20:44 -0500
Subject: add debug logging, ostream support for material ids, and some minor
 cleanup

---
 indra/newview/llmaterialmgr.cpp | 47 +++++++++++++++++++++++++++++------------
 1 file changed, 33 insertions(+), 14 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llmaterialmgr.cpp b/indra/newview/llmaterialmgr.cpp
index 3895411bb9..aa98748dbe 100644
--- a/indra/newview/llmaterialmgr.cpp
+++ b/indra/newview/llmaterialmgr.cpp
@@ -2,9 +2,9 @@
  * @file llmaterialmgr.cpp
  * @brief Material manager
  *
- * $LicenseInfo:firstyear=2006&license=viewerlgpl$
+ * $LicenseInfo:firstyear=2013&license=viewerlgpl$
  * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * Copyright (C) 2013, 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
@@ -128,23 +128,31 @@ bool LLMaterialMgr::isGetPending(const LLUUID& region_id, const LLMaterialID& ma
 
 const LLMaterialPtr LLMaterialMgr::get(const LLUUID& region_id, const LLMaterialID& material_id)
 {
+	LL_DEBUGS("Materials") << "region " << region_id << " material id " << material_id << LL_ENDL;
+	LLMaterialPtr material;
 	material_map_t::const_iterator itMaterial = mMaterials.find(material_id);
 	if (mMaterials.end() != itMaterial)
 	{
-		return itMaterial->second;
+		material = itMaterial->second;
+		LL_DEBUGS("Materials") << " found material " << LL_ENDL;
 	}
-
-	if (!isGetPending(region_id, material_id))
+	else
 	{
-		get_queue_t::iterator itQueue = mGetQueue.find(region_id);
-		if (mGetQueue.end() == itQueue)
+		if (!isGetPending(region_id, material_id))
 		{
-			std::pair<get_queue_t::iterator, bool> ret = mGetQueue.insert(std::pair<LLUUID, material_queue_t>(region_id, material_queue_t()));
-			itQueue = ret.first;
+			LL_DEBUGS("Materials") << " material pending " << material_id << LL_ENDL;
+			get_queue_t::iterator itQueue = mGetQueue.find(region_id);
+			if (mGetQueue.end() == itQueue)
+			{
+				std::pair<get_queue_t::iterator, bool> ret = mGetQueue.insert(std::pair<LLUUID, material_queue_t>(region_id, material_queue_t()));
+				itQueue = ret.first;
+			}
+			itQueue->second.insert(material_id);
 		}
-		itQueue->second.insert(material_id);
+		LL_DEBUGS("Materials") << " returning empty material " << LL_ENDL;
+		material = LLMaterialPtr();
 	}
-	return LLMaterialPtr();
+	return material;
 }
 
 boost::signals2::connection LLMaterialMgr::get(const LLUUID& region_id, const LLMaterialID& material_id, LLMaterialMgr::get_callback_t::slot_type cb)
@@ -188,8 +196,13 @@ void LLMaterialMgr::getAll(const LLUUID& region_id)
 {
 	if (!isGetAllPending(region_id))
 	{
+		LL_DEBUGS("Materials") << "queuing for region " << region_id << LL_ENDL;
 		mGetAllQueue.insert(region_id);
 	}
+	else
+	{
+		LL_DEBUGS("Materials") << "already pending for region " << region_id << LL_ENDL;
+	}
 }
 
 boost::signals2::connection LLMaterialMgr::getAll(const LLUUID& region_id, LLMaterialMgr::getall_callback_t::slot_type cb)
@@ -210,6 +223,7 @@ boost::signals2::connection LLMaterialMgr::getAll(const LLUUID& region_id, LLMat
 
 void LLMaterialMgr::put(const LLUUID& object_id, const U8 te, const LLMaterial& material)
 {
+	LL_DEBUGS("Materials") << "object " << object_id << LL_ENDL;
 	put_queue_t::iterator itQueue = mPutQueue.find(object_id);
 	if (mPutQueue.end() == itQueue)
 	{
@@ -230,9 +244,11 @@ void LLMaterialMgr::put(const LLUUID& object_id, const U8 te, const LLMaterial&
 
 const LLMaterialPtr LLMaterialMgr::setMaterial(const LLUUID& region_id, const LLMaterialID& material_id, const LLSD& material_data)
 {
+	LL_DEBUGS("Materials") << "region " << region_id << " material id " << material_id << LL_ENDL;
 	material_map_t::const_iterator itMaterial = mMaterials.find(material_id);
 	if (mMaterials.end() == itMaterial)
 	{
+		LL_DEBUGS("Materials") << "new material" << LL_ENDL;
 		LLMaterialPtr newMaterial(new LLMaterial(material_data));
 		std::pair<material_map_t::const_iterator, bool> ret = mMaterials.insert(std::pair<LLMaterialID, LLMaterialPtr>(material_id, newMaterial));
 		itMaterial = ret.first;
@@ -257,6 +273,7 @@ void LLMaterialMgr::onGetResponse(bool success, const LLSD& content, const LLUUI
 	if (!success)
 	{
 		// *TODO: is there any kind of error handling we can do here?
+		LL_WARNS("Materials")<< "failed"<<LL_ENDL;
 		return;
 	}
 
@@ -271,7 +288,7 @@ void LLMaterialMgr::onGetResponse(bool success, const LLSD& content, const LLUUI
 	LLSD response_data;
 	if (!unzip_llsd(response_data, content_stream, content_binary.size()))
 	{
-		LL_ERRS("Materials") << "Cannot unzip LLSD binary content" << LL_ENDL;
+		LL_WARNS("Materials") << "Cannot unzip LLSD binary content" << LL_ENDL;
 		return;
 	}
 
@@ -297,6 +314,7 @@ void LLMaterialMgr::onGetAllResponse(bool success, const LLSD& content, const LL
 	if (!success)
 	{
 		// *TODO: is there any kind of error handling we can do here?
+		LL_WARNS("Materials")<< "failed"<<LL_ENDL;
 		return;
 	}
 
@@ -311,7 +329,7 @@ void LLMaterialMgr::onGetAllResponse(bool success, const LLSD& content, const LL
 	LLSD response_data;
 	if (!unzip_llsd(response_data, content_stream, content_binary.size()))
 	{
-		LL_ERRS("Materials") << "Cannot unzip LLSD binary content" << LL_ENDL;
+		LL_WARNS("Materials") << "Cannot unzip LLSD binary content" << LL_ENDL;
 		return;
 	}
 
@@ -361,6 +379,7 @@ void LLMaterialMgr::onPutResponse(bool success, const LLSD& content)
 	if (!success)
 	{
 		// *TODO: is there any kind of error handling we can do here?
+		LL_WARNS("Materials")<< "failed"<<LL_ENDL;
 		return;
 	}
 
@@ -375,7 +394,7 @@ void LLMaterialMgr::onPutResponse(bool success, const LLSD& content)
 	LLSD response_data;
 	if (!unzip_llsd(response_data, content_stream, content_binary.size()))
 	{
-		LL_ERRS("Materials") << "Cannot unzip LLSD binary content" << LL_ENDL;
+		LL_WARNS("Materials") << "Cannot unzip LLSD binary content" << LL_ENDL;
 		return;
 	}
 	else
-- 
cgit v1.2.3


From 7cc7ae873c5aeca9b5939176fb70677365e25395 Mon Sep 17 00:00:00 2001
From: Oz Linden <oz@lindenlab.com>
Date: Mon, 4 Feb 2013 09:35:12 -0500
Subject: improve and clarify logging

---
 indra/newview/llmaterialmgr.cpp  |  6 +++++-
 indra/newview/llviewerobject.cpp | 13 ++++++++++++-
 indra/newview/llvovolume.cpp     |  2 +-
 3 files changed, 18 insertions(+), 3 deletions(-)

(limited to 'indra/newview')

diff --git a/indra/newview/llmaterialmgr.cpp b/indra/newview/llmaterialmgr.cpp
index aa98748dbe..d74cc0c6ed 100644
--- a/indra/newview/llmaterialmgr.cpp
+++ b/indra/newview/llmaterialmgr.cpp
@@ -293,6 +293,7 @@ void LLMaterialMgr::onGetResponse(bool success, const LLSD& content, const LLUUI
 	}
 
 	llassert(response_data.isArray());
+	LL_DEBUGS("Materials") << "response has "<< response_data.size() << " materials" << LL_ENDL;
 	for (LLSD::array_const_iterator itMaterial = response_data.beginArray(); itMaterial != response_data.endArray(); ++itMaterial)
 	{
 		const LLSD& material_data = *itMaterial;
@@ -337,6 +338,7 @@ void LLMaterialMgr::onGetAllResponse(bool success, const LLSD& content, const LL
 	material_map_t materials;
 
 	llassert(response_data.isArray());
+	LL_DEBUGS("Materials") << "response has "<< response_data.size() << " materials" << LL_ENDL;
 	for (LLSD::array_const_iterator itMaterial = response_data.beginArray(); itMaterial != response_data.endArray(); ++itMaterial)
 	{
 		const LLSD& material_data = *itMaterial;
@@ -400,7 +402,7 @@ void LLMaterialMgr::onPutResponse(bool success, const LLSD& content)
 	else
 	{
 		llassert(response_data.isArray());
-
+		LL_DEBUGS("Materials") << "response has "<< response_data.size() << " materials" << LL_ENDL;
 		for (LLSD::array_const_iterator faceIter = response_data.beginArray(); faceIter != response_data.endArray(); ++faceIter)
 		{
 #           ifndef LL_RELEASE_FOR_DOWNLOAD
@@ -550,6 +552,7 @@ void LLMaterialMgr::processGetAllQueue()
 			continue;
 		}
 
+		LL_DEBUGS("Materials") << "getAll for region " << region_id << LL_ENDL;
 		LLHTTPClient::ResponderPtr materialsResponder = new LLMaterialsResponder("GET", capURL, boost::bind(&LLMaterialMgr::onGetAllResponse, this, _1, _2, *itRegion));
 		LLHTTPClient::get(capURL, materialsResponder);
 		mGetAllPending.insert(std::pair<LLUUID, F64>(region_id, LLFrameTimer::getTotalSeconds()));
@@ -625,6 +628,7 @@ void LLMaterialMgr::processPutQueue()
 			LLSD putData = LLSD::emptyMap();
 			putData[MATERIALS_CAP_ZIP_FIELD] = materialBinary;
 
+			LL_DEBUGS("Materials") << "put for " << facesData.size() << " faces; object " << object_id << LL_ENDL;
 			LLHTTPClient::ResponderPtr materialsResponder = new LLMaterialsResponder("PUT", capURL, boost::bind(&LLMaterialMgr::onPutResponse, this, _1, _2));
 			LLHTTPClient::put(capURL, putData, materialsResponder);
 		}
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index b8de345a9a..4c6d655058 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -4351,10 +4351,17 @@ S32 LLViewerObject::setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID
 	const LLTextureEntry *tep = getTE(te);
 	if (!tep)
 	{
-		llwarns << "No texture entry for te " << (S32)te << ", object " << mID << llendl;
+		LL_WARNS("Material") << "No texture entry for te " << (S32)te
+							 << ", object " << mID
+							 << ", material " << pMaterialID
+							 << LL_ENDL;
 	}
 	else if (pMaterialID != tep->getMaterialID())
 	{
+		LL_DEBUGS("Material") << "Changing texture entry for te " << (S32)te
+							 << ", object " << mID
+							 << ", material " << pMaterialID
+							 << LL_ENDL;
 		retval = LLPrimitive::setTEMaterialID(te, pMaterialID);
 		setChanged(TEXTURE);
 		if (mDrawable.notNull() && retval)
@@ -4376,6 +4383,10 @@ S32 LLViewerObject::setTEMaterialParams(const U8 te, const LLMaterialPtr pMateri
 	else if (pMaterialParams != tep->getMaterialParams())
 	{
 		retval = LLPrimitive::setTEMaterialParams(te, pMaterialParams);
+		LL_DEBUGS("Material") << "Changing material params for te " << (S32)te
+							  << ", object " << mID
+			                  << " (" << retval << ")"
+							  << LL_ENDL;
 		setTENormalMap(te, tep->getMaterialParams()->getNormalID());
 		setTESpecularMap(te, tep->getMaterialParams()->getSpecularID());
 		setChanged(TEXTURE);
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index 6c073a8e20..94799f8bbd 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -2005,7 +2005,7 @@ S32 LLVOVolume::setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID)
 {
 	if (!pMaterialID.isNull())
 	{
-		LL_INFOS("Materials") << "Oh god it's a material! " << pMaterialID.asString() << LL_ENDL;
+		LL_INFOS("Materials") << " " << pMaterialID.asString() << LL_ENDL;
 		S32 res = LLViewerObject::setTEMaterialID(te, pMaterialID);
 		if (res)
 		{
-- 
cgit v1.2.3