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

master
Dave Parks 2022-09-22 17:27:41 -05:00
commit 0afc237de2
7 changed files with 142 additions and 52 deletions

View File

@ -32,6 +32,9 @@
#include "llagentbenefits.h"
#include "llappviewer.h"
#include "llcombobox.h"
#include "llfloaterreg.h"
#include "llfilesystem.h"
#include "llgltfmateriallist.h"
#include "llinventorymodel.h"
#include "llnotificationsutil.h"
#include "lltexturectrl.h"
@ -47,8 +50,6 @@
#include "llvovolume.h"
#include "roles_constants.h"
#include "llviewerobjectlist.h"
#include "llfloaterreg.h"
#include "llfilesystem.h"
#include "llsdserialize.h"
#include "llimagej2c.h"
#include "llviewertexturelist.h"
@ -1525,8 +1526,8 @@ void LLMaterialEditor::importMaterial()
class LLRemderMaterialFunctor : public LLSelectedTEFunctor
{
public:
LLRemderMaterialFunctor(LLGLTFMaterial *mat, const LLUUID &id)
: mMat(mat), mMatId(id)
LLRemderMaterialFunctor(const LLUUID &id)
: mMatId(id)
{
}
@ -1535,24 +1536,23 @@ public:
if (objectp && objectp->permModify() && objectp->getVolume())
{
LLVOVolume* vobjp = (LLVOVolume*)objectp;
vobjp->setRenderMaterialID(te, mMatId);
vobjp->getTE(te)->setGLTFMaterial(mMat);
vobjp->setRenderMaterialID(te, mMatId, false /*preview only*/);
vobjp->updateTEMaterialTextures(te);
}
return true;
}
private:
LLPointer<LLGLTFMaterial> mMat;
LLUUID mMatId;
};
void LLMaterialEditor::applyToSelection()
{
// Placehodler. Will be removed once override systems gets finished.
LLPointer<LLGLTFMaterial> mat = new LLGLTFMaterial();
getGLTFMaterial(mat);
const LLUUID placeholder("984e183e-7811-4b05-a502-d79c6f978a98");
LLUUID asset_id = mAssetID.notNull() ? mAssetID : placeholder;
LLRemderMaterialFunctor mat_func(mat, asset_id);
gGLTFMaterialList.addMaterial(placeholder, mat);
LLRemderMaterialFunctor mat_func(placeholder);
LLObjectSelectionHandle selected_objects = LLSelectMgr::getInstance()->getSelection();
selected_objects->applyToTEs(&mat_func);
}

View File

@ -3632,10 +3632,31 @@ private:
struct LLPanelFaceUpdateFunctor : public LLSelectedObjectFunctor
{
LLPanelFaceUpdateFunctor(bool update_media) : mUpdateMedia(update_media) {}
LLPanelFaceUpdateFunctor(bool update_media, bool update_pbr)
: mUpdateMedia(update_media)
, mUpdatePbr(update_pbr)
{}
virtual bool apply(LLViewerObject* object)
{
if (mUpdatePbr)
{
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();
if (mUpdateMedia)
{
LLVOVolume *vo = dynamic_cast<LLVOVolume*>(object);
@ -3648,6 +3669,7 @@ struct LLPanelFaceUpdateFunctor : public LLSelectedObjectFunctor
}
private:
bool mUpdateMedia;
bool mUpdatePbr;
};
struct LLPanelFaceNavigateHomeFunctor : public LLSelectedTEFunctor
@ -3783,7 +3805,7 @@ void LLPanelFace::onPasteColor()
LLPanelFacePasteTexFunctor paste_func(this, PASTE_COLOR);
selected_objects->applyToTEs(&paste_func);
LLPanelFaceUpdateFunctor sendfunc(false);
LLPanelFaceUpdateFunctor sendfunc(false, false);
selected_objects->applyToObjects(&sendfunc);
}
@ -3886,6 +3908,7 @@ void LLPanelFace::onCopyTexture()
te_data["te"]["bumpmap"] = tep->getBumpmap();
te_data["te"]["bumpshiny"] = tep->getBumpShiny();
te_data["te"]["bumpfullbright"] = tep->getBumpShinyFullbright();
te_data["te"]["pbr"] = objectp->getRenderMaterialID(te);
if (te_data["te"].has("imageid"))
{
@ -4139,7 +4162,7 @@ void LLPanelFace::onPasteTexture()
LLPanelFacePasteTexFunctor paste_func(this, PASTE_TEXTURE);
selected_objects->applyToTEs(&paste_func);
LLPanelFaceUpdateFunctor sendfunc(true);
LLPanelFaceUpdateFunctor sendfunc(true, true);
selected_objects->applyToObjects(&sendfunc);
LLPanelFaceNavigateHomeFunctor navigate_home_func;
@ -4273,6 +4296,14 @@ void LLPanelFace::onPasteTexture(LLViewerObject* objectp, S32 te)
{
objectp->setTEBumpShinyFullbright(te, (U8)te_data["te"]["bumpfullbright"].asInteger());
}
if (te_data["te"].has("pbr"))
{
objectp->setRenderMaterialID(te, te_data["te"]["pbr"].asUUID(), false);
}
else
{
objectp->setRenderMaterialID(te, LLUUID::null, false);
}
// Texture map
if (te_data["te"].has("scales") && te_data["te"].has("scalet"))

View File

@ -1091,6 +1091,14 @@ void LLPanelVolume::onCopyLight()
}
}
if (volobjp && volobjp->isReflectionProbe())
{
clipboard["reflection_probe"]["is_box"] = volobjp->getReflectionProbeIsBox();
clipboard["reflection_probe"]["ambiance"] = volobjp->getReflectionProbeAmbiance();
clipboard["reflection_probe"]["near_clip"] = volobjp->getReflectionProbeNearClip();
clipboard["reflection_probe"]["dynamic"] = volobjp->getReflectionProbeIsDynamic();
}
mClipboardParams["light"] = clipboard;
}
@ -1138,6 +1146,19 @@ void LLPanelVolume::onPasteLight()
spot_params.mV[2] = (F32)clipboard["spot"]["ambiance"].asReal();
volobjp->setSpotLightParams(spot_params);
}
if (clipboard.has("reflection_probe"))
{
volobjp->setIsReflectionProbe(TRUE);
volobjp->setReflectionProbeIsBox(clipboard["reflection_probe"]["is_box"].asBoolean());
volobjp->setReflectionProbeAmbiance((F32)clipboard["reflection_probe"]["ambiance"].asReal());
volobjp->setReflectionProbeNearClip((F32)clipboard["reflection_probe"]["near_clip"].asReal());
volobjp->setReflectionProbeIsDynamic(clipboard["reflection_probe"]["dynamic"].asBoolean());
}
else
{
volobjp->setIsReflectionProbe(false);
}
}
}

View File

@ -2198,30 +2198,7 @@ void LLSelectMgr::selectionRevertGLTFMaterials()
if (nodep && te < (S32)nodep->mSavedGLTFMaterials.size())
{
LLUUID asset_id = nodep->mSavedGLTFMaterials[te];
LLTextureEntry* tep = objectp->getTE(te);
if (asset_id.notNull())
{
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);
}
objectp->setRenderMaterialID(te, asset_id, false /*wait for bulk update*/);
}
return true;
}

View File

@ -1109,19 +1109,9 @@ void LLToolDragAndDrop::dropMaterialAllFaces(LLViewerObject* hit_obj,
{
return;
}
S32 num_faces = hit_obj->getNumTEs();
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();
}
hit_obj->setRenderMaterialIDs(asset_id);
dialog_refresh_all();
// send the update to the simulator
hit_obj->sendTEUpdate();
}

View File

@ -7075,7 +7075,7 @@ const LLUUID& LLViewerObject::getRenderMaterialID(U8 te) const
return LLUUID::null;
}
void LLViewerObject::setRenderMaterialID(U8 te, const LLUUID& id)
void LLViewerObject::setRenderMaterialID(U8 te, const LLUUID& id, bool update_server)
{
if (id.notNull())
{
@ -7084,7 +7084,12 @@ void LLViewerObject::setRenderMaterialID(U8 te, const LLUUID& id)
if (!hasRenderMaterialParams())
{
// make sure param section exists
setParameterEntryInUse(LLNetworkData::PARAMS_RENDER_MATERIAL, TRUE, false /*prevent an immediate update*/);
// but do not update server to avoid race conditions
ExtraParameter* param = getExtraParameterEntryCreate(LLNetworkData::PARAMS_RENDER_MATERIAL);
if (param)
{
param->in_use = true;
}
}
}
else
@ -7102,6 +7107,71 @@ void LLViewerObject::setRenderMaterialID(U8 te, const LLUUID& id)
if (param_block->isEmpty())
{ // might be empty if id is null
if (hasRenderMaterialParams())
{
if (update_server)
{
setParameterEntryInUse(LLNetworkData::PARAMS_RENDER_MATERIAL, FALSE, true);
}
else
{
ExtraParameter* param = getExtraParameterEntryCreate(LLNetworkData::PARAMS_RENDER_MATERIAL);
if (param)
{
param->in_use = false;
}
}
}
}
else if (update_server)
{
parameterChanged(LLNetworkData::PARAMS_RENDER_MATERIAL, true);
}
}
}
void LLViewerObject::setRenderMaterialIDs(const LLUUID& id)
{
if (id.notNull())
{
if (!hasRenderMaterialParams())
{
// make sure param section exists
// but do not update server to avoid race conditions
ExtraParameter* param = getExtraParameterEntryCreate(LLNetworkData::PARAMS_RENDER_MATERIAL);
if (param)
{
param->in_use = true;
}
}
}
LLRenderMaterialParams* param_block = nullptr;
if (hasRenderMaterialParams())
{
param_block = (LLRenderMaterialParams*)getParameterEntry(LLNetworkData::PARAMS_RENDER_MATERIAL);
}
LLGLTFMaterial* material = id.isNull() ? nullptr : gGLTFMaterialList.getMaterial(id);
const S32 num_tes = llmin((S32)getNumTEs(), (S32)getNumFaces());
for (S32 te = 0; te < num_tes; te++)
{
getTE(te)->setGLTFMaterial(material);
if (param_block)
{
param_block->setMaterial(te, id);
}
}
faceMappingChanged();
gPipeline.markTextured(mDrawable);
if (param_block)
{
if (param_block->isEmpty())
{
setHasRenderMaterialParams(false);
}
else

View File

@ -184,8 +184,8 @@ public:
void setHasRenderMaterialParams(bool has_params);
const LLUUID& getRenderMaterialID(U8 te) const;
void setRenderMaterialID(U8 te, const LLUUID& id);
void setRenderMaterialIDs(const LLRenderMaterialParams* material_params, bool local_origin);
void setRenderMaterialID(U8 te, const LLUUID& id, bool update_server = true);
void setRenderMaterialIDs(const LLUUID& id);
virtual BOOL isHUDAttachment() const { return FALSE; }
virtual BOOL isTempAttachment() const;
@ -220,6 +220,7 @@ public:
F32 getRotTime() { return mRotTime; }
private:
void resetRotTime();
void setRenderMaterialIDs(const LLRenderMaterialParams* material_params, bool local_origin);
public:
void resetRot();
void applyAngularVelocity(F32 dt);