summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorKitty Barnett <develop@catznip.com>2013-05-10 10:50:50 +0200
committerKitty Barnett <develop@catznip.com>2013-05-10 10:50:50 +0200
commit269b8b7de53f368791fbffde8a6f8d47d9cbbcdc (patch)
treeecf0e433fb897a2e30d1e283004e8cdb69c0fbbc /indra
parentd8f2ecd5b3f0cb8475fa1d092cc7a315ca1e8ca9 (diff)
NORSPEC-102 Rapid materials updates are not smooth to viewer which is editing the object
Diffstat (limited to 'indra')
-rw-r--r--indra/llprimitive/llprimitive.cpp18
-rw-r--r--indra/llprimitive/llprimitive.h2
-rw-r--r--indra/llprimitive/lltextureentry.cpp20
-rw-r--r--indra/llprimitive/lltextureentry.h6
-rw-r--r--indra/newview/llpanelface.cpp44
-rw-r--r--indra/newview/llpanelface.h3
-rw-r--r--indra/newview/llselectmgr.cpp6
-rw-r--r--indra/newview/llviewerobject.cpp20
-rw-r--r--indra/newview/llviewerobject.h2
9 files changed, 84 insertions, 37 deletions
diff --git a/indra/llprimitive/llprimitive.cpp b/indra/llprimitive/llprimitive.cpp
index 0578f0b192..3f57dbe26d 100644
--- a/indra/llprimitive/llprimitive.cpp
+++ b/indra/llprimitive/llprimitive.cpp
@@ -373,6 +373,24 @@ S32 LLPrimitive::setTEMaterialParams(const U8 index, const LLMaterialPtr pMateri
return mTextureList.setMaterialParams(index, pMaterialParams);
}
+void LLPrimitive::setAllTESelected(bool sel)
+{
+ for (int i = 0, cnt = getNumTEs(); i < cnt; i++)
+ {
+ setTESelected(i, sel);
+ }
+}
+
+void LLPrimitive::setTESelected(const U8 te, bool sel)
+{
+ LLTextureEntry* tep = getTE(te);
+ if ( (tep) && (tep->setSelected(sel)) && (!sel) && (tep->hasPendingMaterialUpdate()) )
+ {
+ LLMaterialID material_id = tep->getMaterialID();
+ setTEMaterialID(te, material_id);
+ }
+}
+
LLPCode LLPrimitive::legacyToPCode(const U8 legacy)
{
// TODO: Should this default to something valid?
diff --git a/indra/llprimitive/llprimitive.h b/indra/llprimitive/llprimitive.h
index 6a9c5e9639..dc21af2649 100644
--- a/indra/llprimitive/llprimitive.h
+++ b/indra/llprimitive/llprimitive.h
@@ -332,6 +332,7 @@ public:
LLTextureEntry* getTE(const U8 te_num) const;
virtual void setNumTEs(const U8 num_tes);
+ virtual void setAllTESelected(bool sel);
virtual void setAllTETextures(const LLUUID &tex_id);
virtual void setTE(const U8 index, const LLTextureEntry& te);
virtual S32 setTEColor(const U8 te, const LLColor4 &color);
@@ -357,6 +358,7 @@ public:
virtual S32 setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID);
virtual S32 setTEMaterialParams(const U8 index, const LLMaterialPtr pMaterialParams);
virtual BOOL setMaterial(const U8 material); // returns TRUE if material changed
+ virtual void setTESelected(const U8 te, bool sel);
void copyTEs(const LLPrimitive *primitive);
S32 packTEField(U8 *cur_ptr, U8 *data_ptr, U8 data_size, U8 last_face_index, EMsgVariableType type) const;
diff --git a/indra/llprimitive/lltextureentry.cpp b/indra/llprimitive/lltextureentry.cpp
index 691216e035..6e5d27bb94 100644
--- a/indra/llprimitive/lltextureentry.cpp
+++ b/indra/llprimitive/lltextureentry.cpp
@@ -61,18 +61,24 @@ LLTextureEntry* LLTextureEntry::newTextureEntry()
//===============================================================
LLTextureEntry::LLTextureEntry()
: mMediaEntry(NULL)
+ , mSelected(false)
+ , mMaterialUpdatePending(false)
{
init(LLUUID::null,1.f,1.f,0.f,0.f,0.f,DEFAULT_BUMP_CODE);
}
LLTextureEntry::LLTextureEntry(const LLUUID& tex_id)
: mMediaEntry(NULL)
+ , mSelected(false)
+ , mMaterialUpdatePending(false)
{
init(tex_id,1.f,1.f,0.f,0.f,0.f,DEFAULT_BUMP_CODE);
}
LLTextureEntry::LLTextureEntry(const LLTextureEntry &rhs)
: mMediaEntry(NULL)
+ , mSelected(false)
+ , mMaterialUpdatePending(false)
{
mID = rhs.mID;
mScaleS = rhs.mScaleS;
@@ -532,8 +538,16 @@ S32 LLTextureEntry::setGlow(F32 glow)
S32 LLTextureEntry::setMaterialID(const LLMaterialID& pMaterialID)
{
- if (mMaterialID != pMaterialID)
+ if ( (mMaterialID != pMaterialID) || (mMaterialUpdatePending && !mSelected) )
{
+ if (mSelected)
+ {
+ mMaterialUpdatePending = true;
+ mMaterialID = pMaterialID;
+ return TEM_CHANGE_NONE;
+ }
+
+ mMaterialUpdatePending = false;
mMaterialID = pMaterialID;
if (mMaterialID.isNull())
{
@@ -548,6 +562,10 @@ S32 LLTextureEntry::setMaterialParams(const LLMaterialPtr pMaterialParams)
{
if (mMaterial != pMaterialParams)
{
+ if (mSelected)
+ {
+ mMaterialUpdatePending = true;
+ }
mMaterial = pMaterialParams;
return TEM_CHANGE_TEXTURE;
}
diff --git a/indra/llprimitive/lltextureentry.h b/indra/llprimitive/lltextureentry.h
index c443ebcb30..f867f45819 100644
--- a/indra/llprimitive/lltextureentry.h
+++ b/indra/llprimitive/lltextureentry.h
@@ -99,6 +99,10 @@ public:
virtual LLTextureEntry* newCopy() const;
void init(const LLUUID& tex_id, F32 scale_s, F32 scale_t, F32 offset_s, F32 offset_t, F32 rotation, U8 bump);
+
+ bool hasPendingMaterialUpdate() const { return mMaterialUpdatePending; }
+ bool isSelected() const { return mSelected; }
+ bool setSelected(bool sel) { bool prev_sel = mSelected; mSelected = sel; return prev_sel; }
// These return a TEM_ flag from above to indicate if something changed.
S32 setID (const LLUUID &tex_id);
@@ -194,11 +198,13 @@ public:
static const char* TEXTURE_MEDIA_DATA_KEY;
protected:
+ bool mSelected;
LLUUID mID; // Texture GUID
LLColor4 mColor;
U8 mBump; // Bump map, shiny, and fullbright
U8 mMediaFlags; // replace with web page, movie, etc.
F32 mGlow;
+ bool mMaterialUpdatePending;
LLMaterialID mMaterialID;
LLMaterialPtr mMaterial;
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index a0f2fb702e..032d066c48 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -262,7 +262,6 @@ BOOL LLPanelFace::postBuild()
LLPanelFace::LLPanelFace()
: LLPanel(),
- mMaterialID(LLMaterialID::null),
mMaterial(LLMaterialPtr()),
mIsAlpha(false)
{
@@ -1575,26 +1574,23 @@ void LLPanelFace::getState()
// Materials
{
- mMaterialID = LLMaterialID::null;
- mMaterial = NULL;
-
- struct f1 : public LLSelectedTEGetFunctor<LLMaterialID>
+ struct f1 : public LLSelectedTEGetFunctor<LLMaterialPtr>
{
- LLMaterialID get(LLViewerObject* object, S32 te_index)
+ LLMaterialPtr get(LLViewerObject* object, S32 te_index)
{
LLMaterialID material_id;
- return object->getTE(te_index)->getMaterialID();
+ return object->getTE(te_index)->getMaterialParams();
}
} func;
- identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, mMaterialID );
- llinfos << "Material ID returned: '"
- << mMaterialID.asString() << "', isNull? "
- << (mMaterialID.isNull()?"TRUE":"FALSE") << llendl;
- if (!mMaterialID.isNull() && editable)
+
+ LLMaterialPtr material;
+ identical = LLSelectMgr::getInstance()->getSelection()->getSelectedTEValue( &func, material );
+
+ mMaterial = (material) ? new LLMaterial(*material) : NULL;
+ if (mMaterial && editable)
{
- llinfos << "Requesting material ID " << mMaterialID.asString() << llendl;
- LLMaterialMgr::getInstance()->get(objectp->getRegion()->getRegionID(),mMaterialID,boost::bind(&LLPanelFace::onMaterialLoaded, this, _1, _2));
+ onMaterialLoaded(mMaterial);
}
}
@@ -1659,15 +1655,8 @@ void LLPanelFace::refresh()
getState();
}
-void LLPanelFace::onMaterialLoaded(const LLMaterialID& material_id, const LLMaterialPtr material)
+void LLPanelFace::onMaterialLoaded(const LLMaterialPtr material)
{ //laying out UI based on material parameters (calls setVisible on various components)
- LL_DEBUGS("Materials") << "Loaded material " << material_id.asString() << material->asLLSD() << LL_ENDL;
-
- //make a local copy of the material for editing
- // (prevents local edits from overwriting client state on shared materials)
- mMaterial = new LLMaterial(*material);
- mMaterialID = material_id;
-
// Alpha
LLCtrlSelectionInterface* combobox_alphamode =
childGetSelectionInterface("combobox alphamode");
@@ -1780,13 +1769,9 @@ void LLPanelFace::updateMaterial()
|| (shininess == SHINY_TEXTURE))
{
// The user's specified something that needs a material.
- bool new_material = false;
- if (!mMaterial)
- {
- new_material = true;
- mMaterial = LLMaterialPtr(new LLMaterial());
- }
+ bool new_material = !mMaterial;
+ mMaterial = LLMaterialPtr(new LLMaterial());
mMaterial->setDiffuseAlphaMode(getChild<LLComboBox>("combobox alphamode")->getCurrentIndex());
mMaterial->setAlphaMaskCutoff((U8)(getChild<LLUICtrl>("maskcutoff")->getValue().asInteger()));
@@ -1866,11 +1851,10 @@ void LLPanelFace::updateMaterial()
else
{
// The user has specified settings that don't need a material.
- if (mMaterial || !mMaterialID.isNull())
+ if (mMaterial)
{
LL_DEBUGS("Materials") << "Resetting material entry" << LL_ENDL;
mMaterial = NULL;
- mMaterialID = LLMaterialID::null;
// Delete existing material entry...
LLSelectMgr::getInstance()->selectionRemoveMaterial();
}
diff --git a/indra/newview/llpanelface.h b/indra/newview/llpanelface.h
index 2138319365..470da10bee 100644
--- a/indra/newview/llpanelface.h
+++ b/indra/newview/llpanelface.h
@@ -84,7 +84,7 @@ protected:
void onCommitAlpha(const LLSD& data);
void onCancelColor(const LLSD& data);
void onSelectColor(const LLSD& data);
- void onMaterialLoaded(const LLMaterialID& material_id, const LLMaterialPtr material);
+ void onMaterialLoaded(const LLMaterialPtr material);
void updateMaterial();
static void onCommitTextureInfo( LLUICtrl* ctrl, void* userdata);
@@ -115,7 +115,6 @@ private:
*/
void onTextureSelectionChanged(LLInventoryItem* itemp);
- LLMaterialID mMaterialID;
LLMaterialPtr mMaterial;
bool mIsAlpha;
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 5089570319..8ef56af379 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -816,6 +816,7 @@ void LLSelectMgr::addAsFamily(std::vector<LLViewerObject*>& objects, BOOL add_to
if (objectp->getNumTEs() > 0)
{
nodep->selectAllTEs(TRUE);
+ objectp->setAllTESelected(true);
}
else
{
@@ -873,10 +874,12 @@ void LLSelectMgr::addAsIndividual(LLViewerObject *objectp, S32 face, BOOL undoab
else if (face == SELECT_ALL_TES)
{
nodep->selectAllTEs(TRUE);
+ objectp->setAllTESelected(true);
}
else if (0 <= face && face < SELECT_MAX_TES)
{
nodep->selectTE(face, TRUE);
+ objectp->setTESelected(face, true);
}
else
{
@@ -1096,6 +1099,7 @@ LLObjectSelectionHandle LLSelectMgr::selectHighlightedObjects()
// flag this object as selected
objectp->setSelected(TRUE);
+ objectp->setAllTESelected(true);
mSelectedObjects->mSelectType = getSelectTypeForObject(objectp);
@@ -1321,6 +1325,7 @@ void LLSelectMgr::remove(LLViewerObject *objectp, S32 te, BOOL undoable)
if (nodep->isTESelected(te))
{
nodep->selectTE(te, FALSE);
+ objectp->setTESelected(te, false);
}
else
{
@@ -5751,6 +5756,7 @@ void LLSelectNode::selectTE(S32 te_index, BOOL selected)
{
return;
}
+
S32 mask = 0x1 << te_index;
if(selected)
{
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 286604e367..4a112d3ab3 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -531,6 +531,17 @@ void LLViewerObject::setNameValueList(const std::string& name_value_list)
}
}
+void LLViewerObject::setSelected(BOOL sel)
+{
+ mUserSelected = sel;
+ resetRot();
+
+ if (!sel)
+ {
+ setAllTESelected(false);
+ }
+}
+
// This method returns true if the object is over land owned by the
// agent.
bool LLViewerObject::isReturnable()
@@ -4354,10 +4365,13 @@ S32 LLViewerObject::setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID
<< ", material " << pMaterialID
<< LL_ENDL;
retval = LLPrimitive::setTEMaterialID(te, pMaterialID);
- setChanged(TEXTURE);
- if (mDrawable.notNull() && retval)
+ if (retval)
{
- gPipeline.markTextured(mDrawable);
+ setChanged(TEXTURE);
+ if (mDrawable.notNull() && retval)
+ {
+ gPipeline.markTextured(mDrawable);
+ }
}
}
return retval;
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index a6569740bb..05b2e0361b 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -200,7 +200,7 @@ public:
LLViewerRegion* getRegion() const { return mRegionp; }
BOOL isSelected() const { return mUserSelected; }
- virtual void setSelected(BOOL sel) { mUserSelected = sel; resetRot();}
+ virtual void setSelected(BOOL sel);
const LLUUID &getID() const { return mID; }
U32 getLocalID() const { return mLocalID; }