Merge branch 'DRTVWR-559' of ssh://bitbucket.org/lindenlab/viewer into DRTVWR-559

meow-7.2.2
Dave Parks 2022-09-13 18:41:43 -05:00
commit 93389059d5
6 changed files with 142 additions and 66 deletions

View File

@ -539,4 +539,4 @@ void pbrDirectionalLight(inout vec3 colorDiffuse,
colorDiffuse += sunDiffuse;
colorSpec += sunSpec;
}
}

View File

@ -82,6 +82,11 @@ void LLReflectionMap::autoAdjustOrigin()
// cast a ray towards 8 corners of bounding box
// nudge origin towards center of empty space
if (!node)
{
return;
}
if (node->isLeaf() || node->getChildCount() > 1 || node->getData().size() > 0)
{ // use center of object bounding box for leaf nodes or nodes with multiple child nodes
mOrigin = bounds[0];

View File

@ -63,6 +63,7 @@
#include "llfloatertools.h"
#include "llframetimer.h"
#include "llfocusmgr.h"
#include "llgltfmateriallist.h"
#include "llhudeffecttrail.h"
#include "llhudmanager.h"
#include "llinventorymodel.h"
@ -1792,16 +1793,56 @@ void LLSelectMgr::selectionSetGLTFMaterial(const LLUUID& mat_id)
asset_id = mItem->getAssetUUID();
}
if (asset_id.notNull() && !objectp->hasRenderMaterialParams())
{
// make sure param section exists
objectp->setParameterEntryInUse(LLNetworkData::PARAMS_RENDER_MATERIAL, TRUE, false /*prevent an update*/);
}
if (te != -1)
{
objectp->setRenderMaterialID(te, asset_id);
LLTextureEntry* tep = objectp->getTE(te);
if (asset_id.notNull())
{
tep->setGLTFMaterial(gGLTFMaterialList.getMaterial(asset_id));
}
else
{
tep->setGLTFMaterial(nullptr);
}
objectp->faceMappingChanged();
gPipeline.markTextured(objectp->mDrawable);
LLRenderMaterialParams* param_block = (LLRenderMaterialParams*)objectp->getParameterEntry(LLNetworkData::PARAMS_RENDER_MATERIAL);
if (param_block)
{
param_block->setMaterial(te, asset_id);
}
}
else
else // Shouldn't happen?
{
S32 num_faces = objectp->getNumTEs();
for (S32 face = 0; face < num_faces; face++)
{
objectp->setRenderMaterialID(face, asset_id);
LLTextureEntry* tep = objectp->getTE(face);
if (asset_id.notNull())
{
tep->setGLTFMaterial(gGLTFMaterialList.getMaterial(asset_id));
}
else
{
tep->setGLTFMaterial(nullptr);
}
objectp->faceMappingChanged();
gPipeline.markTextured(objectp->mDrawable);
LLRenderMaterialParams* param_block = (LLRenderMaterialParams*)objectp->getParameterEntry(LLNetworkData::PARAMS_RENDER_MATERIAL);
if (param_block)
{
param_block->setMaterial(face, asset_id);
}
}
}
@ -1809,26 +1850,43 @@ void LLSelectMgr::selectionSetGLTFMaterial(const LLUUID& mat_id)
}
};
if (item && !item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID()))
// TODO: once PBR starts supporting permissions, implement/figure this out
/*if (item && !item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID()))
{
getSelection()->applyNoCopyTextureToTEs(item);
}
else
else*/
{
f setfunc(item, mat_id);
getSelection()->applyToTEs(&setfunc);
}
struct g : public LLSelectedObjectFunctor
{
LLViewerInventoryItem* mItem;
g(LLViewerInventoryItem* item) : mItem(item) {}
virtual bool apply(LLViewerObject* object)
{
if (object && !object->permModify())
{
return false;
}
LLRenderMaterialParams* param_block = (LLRenderMaterialParams*)object->getParameterEntry(LLNetworkData::PARAMS_RENDER_MATERIAL);
if (param_block)
{
if (param_block->isEmpty())
{
object->setHasRenderMaterialParams(false);
}
else
{
object->parameterChanged(LLNetworkData::PARAMS_RENDER_MATERIAL, true);
}
}
if (!mItem)
{
object->sendTEUpdate();
// 1 particle effect per object
LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
effectp->setSourceObject(gAgentAvatarp);
@ -1836,6 +1894,8 @@ void LLSelectMgr::selectionSetGLTFMaterial(const LLUUID& mat_id)
effectp->setDuration(LL_HUD_DUR_SHORT);
effectp->setColor(LLColor4U(gAgent.getEffectColor()));
}
object->sendTEUpdate();
return true;
}
} sendfunc(item);
@ -2025,15 +2085,40 @@ void LLSelectMgr::selectionRevertGLTFMaterials()
{
LLObjectSelectionHandle mSelectedObjects;
f(LLObjectSelectionHandle sel) : mSelectedObjects(sel) {}
bool apply(LLViewerObject* object, S32 te)
bool apply(LLViewerObject* objectp, S32 te)
{
if (object->permModify())
if (objectp && !objectp->permModify())
{
LLSelectNode* nodep = mSelectedObjects->findNode(object);
if (nodep && te < (S32)nodep->mSavedGLTFMaterials.size())
return false;
}
LLSelectNode* nodep = mSelectedObjects->findNode(objectp);
if (nodep && te < (S32)nodep->mSavedGLTFMaterials.size())
{
LLUUID asset_id = nodep->mSavedGLTFMaterials[te];
LLTextureEntry* tep = objectp->getTE(te);
if (asset_id.notNull())
{
LLUUID id = nodep->mSavedGLTFMaterials[te];
object->setRenderMaterialID(te, id);
tep->setGLTFMaterial(gGLTFMaterialList.getMaterial(asset_id));
if (!objectp->hasRenderMaterialParams())
{
// make sure param section exists
objectp->setParameterEntryInUse(LLNetworkData::PARAMS_RENDER_MATERIAL, TRUE, false /*prevent an immediate update*/);
}
}
else
{
tep->setGLTFMaterial(nullptr);
}
objectp->faceMappingChanged();
gPipeline.markTextured(objectp->mDrawable);
LLRenderMaterialParams* param_block = (LLRenderMaterialParams*)objectp->getParameterEntry(LLNetworkData::PARAMS_RENDER_MATERIAL);
if (param_block)
{
param_block->setMaterial(te, asset_id);
}
}
return true;
@ -2041,7 +2126,32 @@ void LLSelectMgr::selectionRevertGLTFMaterials()
} setfunc(mSelectedObjects);
getSelection()->applyToTEs(&setfunc);
LLSelectMgrSendFunctor sendfunc;
struct g : public LLSelectedObjectFunctor
{
virtual bool apply(LLViewerObject* object)
{
if (object && !object->permModify())
{
return false;
}
LLRenderMaterialParams* param_block = (LLRenderMaterialParams*)object->getParameterEntry(LLNetworkData::PARAMS_RENDER_MATERIAL);
if (param_block)
{
if (param_block->isEmpty())
{
object->setHasRenderMaterialParams(false);
}
else
{
object->parameterChanged(LLNetworkData::PARAMS_RENDER_MATERIAL, true);
}
}
object->sendTEUpdate();
return true;
}
} sendfunc;
getSelection()->applyToObjects(&sendfunc);
}

View File

@ -1665,56 +1665,7 @@ void LLTextureCtrl::onFloaterCommit(ETexturePickOp op, LLUUID id)
if (op == TEXTURE_SELECT && mOnSelectCallback)
{
// determine if the selected item in inventory is a material
// by finding the item in inventory and inspecting its (IT_) type
LLUUID item_id = floaterp->findItemID(floaterp->getAssetID(), FALSE);
LLInventoryItem* item = gInventory.getItem(item_id);
if (item)
{
if (item->getInventoryType() == LLInventoryType::IT_MATERIAL)
{
// ask the selection manager for the list of selected objects
// to which the material will be applied.
LLObjectSelectionHandle selectedObjectsHandle = LLSelectMgr::getInstance()->getSelection();
if (selectedObjectsHandle.notNull())
{
LLObjectSelection* selectedObjects = selectedObjectsHandle.get();
if (!selectedObjects->isEmpty())
{
// we have a selection - iterate over it
for (LLObjectSelection::valid_iterator obj_iter = selectedObjects->valid_begin();
obj_iter != selectedObjects->valid_end();
++obj_iter)
{
LLSelectNode* object = *obj_iter;
LLViewerObject* viewer_object = object->getObject();
if (viewer_object)
{
// the asset ID of the material we want to apply
// the the selected objects
LLUUID asset_id = item->getAssetUUID();
// iterate over the faces in the object
// TODO: consider the case where user has
// selected only certain faces
S32 num_faces = viewer_object->getNumTEs();
for (S32 face = 0; face < num_faces; face++)
{
viewer_object->setRenderMaterialID(face, asset_id);
dialog_refresh_all();
}
viewer_object->sendTEUpdate();
}
}
}
}
}
}
else
// original behavior for textures, not materials
{
mOnSelectCallback(this, LLSD());
}
mOnSelectCallback(this, LLSD());
}
else if (op == TEXTURE_CANCEL && mOnCancelCallback)
{

View File

@ -1114,6 +1114,11 @@ void LLToolDragAndDrop::dropMaterialAllFaces(LLViewerObject* hit_obj,
for (S32 face = 0; face < num_faces; face++)
{
// update viewer side material in anticipation of update from simulator
// TODO: fix this!
// Calling setRenderMaterialID multiple times sends material param
// updates multiple times and can create race condition.
// Send update only once!
hit_obj->setRenderMaterialID(face, asset_id);
dialog_refresh_all();
}

View File

@ -7057,7 +7057,12 @@ void LLViewerObject::setRenderMaterialID(U8 te, const LLUUID& id)
if (id.notNull())
{
getTE(te)->setGLTFMaterial(gGLTFMaterialList.getMaterial(id));
setHasRenderMaterialParams(true);
if (!hasRenderMaterialParams())
{
// make sure param section exists
setParameterEntryInUse(LLNetworkData::PARAMS_RENDER_MATERIAL, TRUE, false /*prevent an immediate update*/);
}
}
else
{