SL-18727 Save material to Inventoryshould prioritize picked face
parent
78feca373e
commit
9f7967fcdc
|
|
@ -51,7 +51,7 @@ LLDrawPoolSky::LLDrawPoolSky()
|
|||
void LLDrawPoolSky::prerender()
|
||||
{
|
||||
mShaderLevel = LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_ENVIRONMENT);
|
||||
if (gSky.mVOSkyp->mDrawable)
|
||||
if (gSky.mVOSkyp && gSky.mVOSkyp->mDrawable)
|
||||
{
|
||||
gSky.mVOSkyp->updateGeometry(gSky.mVOSkyp->mDrawable);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -93,27 +93,27 @@ LLLocalGLTFMaterial::~LLLocalGLTFMaterial()
|
|||
}
|
||||
|
||||
/* accessors */
|
||||
std::string LLLocalGLTFMaterial::getFilename()
|
||||
std::string LLLocalGLTFMaterial::getFilename() const
|
||||
{
|
||||
return mFilename;
|
||||
}
|
||||
|
||||
std::string LLLocalGLTFMaterial::getShortName()
|
||||
std::string LLLocalGLTFMaterial::getShortName() const
|
||||
{
|
||||
return mShortName;
|
||||
}
|
||||
|
||||
LLUUID LLLocalGLTFMaterial::getTrackingID()
|
||||
LLUUID LLLocalGLTFMaterial::getTrackingID() const
|
||||
{
|
||||
return mTrackingID;
|
||||
}
|
||||
|
||||
LLUUID LLLocalGLTFMaterial::getWorldID()
|
||||
LLUUID LLLocalGLTFMaterial::getWorldID() const
|
||||
{
|
||||
return mWorldID;
|
||||
}
|
||||
|
||||
S32 LLLocalGLTFMaterial::getIndexInFile()
|
||||
S32 LLLocalGLTFMaterial::getIndexInFile() const
|
||||
{
|
||||
return mMaterialIndex;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -42,11 +42,11 @@ public: /* main */
|
|||
virtual ~LLLocalGLTFMaterial();
|
||||
|
||||
public: /* accessors */
|
||||
std::string getFilename();
|
||||
std::string getShortName();
|
||||
LLUUID getTrackingID();
|
||||
LLUUID getWorldID();
|
||||
S32 getIndexInFile();
|
||||
std::string getFilename() const;
|
||||
std::string getShortName() const;
|
||||
LLUUID getTrackingID() const;
|
||||
LLUUID getWorldID() const;
|
||||
S32 getIndexInFile() const;
|
||||
|
||||
public:
|
||||
bool updateSelf();
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@
|
|||
#include "llsdutil.h"
|
||||
#include "llselectmgr.h"
|
||||
#include "llstatusbar.h" // can_afford_transaction()
|
||||
#include "lltoolpie.h"
|
||||
#include "llviewerinventory.h"
|
||||
#include "llinventory.h"
|
||||
#include "llviewerregion.h"
|
||||
|
|
@ -322,9 +323,17 @@ bool LLSelectedTEGetMatData::apply(LLViewerObject* objectp, S32 te_index)
|
|||
mLocalMaterial = local_mat;
|
||||
}
|
||||
mMaterial = tep->getGLTFRenderMaterial();
|
||||
|
||||
if (mMaterial.isNull())
|
||||
{
|
||||
// Shouldn't be possible?
|
||||
LL_WARNS("MaterialEditor") << "Object has material id, but no material" << LL_ENDL;
|
||||
mMaterial = gGLTFMaterialList.getMaterial(mat_id);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
///----------------------------------------------------------------------------
|
||||
|
|
@ -1816,58 +1825,95 @@ void LLMaterialEditor::loadLive()
|
|||
|
||||
void LLMaterialEditor::saveObjectsMaterialAs()
|
||||
{
|
||||
|
||||
// Find an applicable material.
|
||||
// Do this before showing message, because
|
||||
// message is going to drop selection.
|
||||
LLSelectedTEGetMatData func(false);
|
||||
LLSelectMgr::getInstance()->getSelection()->applyToTEs(&func, true /*first applicable*/);
|
||||
saveMaterialAs(func.mMaterial, func.mLocalMaterial);
|
||||
}
|
||||
void LLMaterialEditor::savePickedMaterialAs()
|
||||
{
|
||||
LLPickInfo pick = LLToolPie::getInstance()->getPick();
|
||||
if (pick.mPickType != LLPickInfo::PICK_OBJECT || !pick.getObject())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (func.mLocalMaterial.notNull())
|
||||
LLPointer<LLGLTFMaterial> render_material;
|
||||
LLPointer<LLLocalGLTFMaterial> local_material;
|
||||
|
||||
LLViewerObject *objectp = pick.getObject();
|
||||
LLUUID mat_id = objectp->getRenderMaterialID(pick.mObjectFace);
|
||||
if (mat_id.notNull() && objectp->permCopy())
|
||||
{
|
||||
// Try a face user picked first
|
||||
// (likely the only method we need, but in such case
|
||||
// enable_object_save_gltf_material will need to check this)
|
||||
LLTextureEntry *tep = objectp->getTE(pick.mObjectFace);
|
||||
LLGLTFMaterial *mat = tep->getGLTFMaterial();
|
||||
LLLocalGLTFMaterial *local_mat = dynamic_cast<LLLocalGLTFMaterial*>(mat);
|
||||
|
||||
if (local_mat)
|
||||
{
|
||||
local_material = local_mat;
|
||||
}
|
||||
render_material = tep->getGLTFRenderMaterial();
|
||||
}
|
||||
else
|
||||
{
|
||||
// Find an applicable material.
|
||||
// Do this before showing message, because
|
||||
// message is going to drop selection.
|
||||
LLSelectedTEGetMatData func(false);
|
||||
LLSelectMgr::getInstance()->getSelection()->applyToTEs(&func, true /*first applicable*/);
|
||||
local_material = func.mLocalMaterial;
|
||||
render_material = func.mMaterial;
|
||||
}
|
||||
|
||||
saveMaterialAs(render_material, local_material);
|
||||
}
|
||||
|
||||
void LLMaterialEditor::saveMaterialAs(const LLGLTFMaterial* render_material, const LLLocalGLTFMaterial *local_material)
|
||||
{
|
||||
if (local_material)
|
||||
{
|
||||
// This is a local material, reload it from file
|
||||
// so that user won't end up with grey textures
|
||||
// on next login.
|
||||
LLMaterialEditor::loadMaterialFromFile(func.mLocalMaterial->getFilename(), func.mLocalMaterial->getIndexInFile());
|
||||
LLMaterialEditor::loadMaterialFromFile(local_material->getFilename(), local_material->getIndexInFile());
|
||||
|
||||
LLMaterialEditor* me = (LLMaterialEditor*)LLFloaterReg::getInstance("material_editor");
|
||||
if (me)
|
||||
{
|
||||
// apply differences on top
|
||||
LLGLTFMaterial* local_mat = func.mLocalMaterial.get();
|
||||
// don't use override mat here, it has 'hacked ids'
|
||||
// and values, use end result.
|
||||
LLGLTFMaterial* cmp_mat = func.mMaterial.get();
|
||||
|
||||
me->setBaseColor(cmp_mat->mBaseColor);
|
||||
me->setMetalnessFactor(cmp_mat->mMetallicFactor);
|
||||
me->setRoughnessFactor(cmp_mat->mRoughnessFactor);
|
||||
me->setEmissiveColor(cmp_mat->mEmissiveColor);
|
||||
me->setDoubleSided(cmp_mat->mDoubleSided);
|
||||
me->setAlphaMode(cmp_mat->getAlphaMode());
|
||||
me->setAlphaCutoff(cmp_mat->mAlphaCutoff);
|
||||
// don't use override material here, it has 'hacked ids'
|
||||
// and values, use end result, apply it on top of local.
|
||||
me->setBaseColor(render_material->mBaseColor);
|
||||
me->setMetalnessFactor(render_material->mMetallicFactor);
|
||||
me->setRoughnessFactor(render_material->mRoughnessFactor);
|
||||
me->setEmissiveColor(render_material->mEmissiveColor);
|
||||
me->setDoubleSided(render_material->mDoubleSided);
|
||||
me->setAlphaMode(render_material->getAlphaMode());
|
||||
me->setAlphaCutoff(render_material->mAlphaCutoff);
|
||||
|
||||
// most things like colors we can apply without verifying
|
||||
// but texture ids are going to be different from both, base and override
|
||||
// so only apply override id if there is actually a difference
|
||||
if (local_mat->mBaseColorId != cmp_mat->mBaseColorId)
|
||||
if (local_material->mBaseColorId != render_material->mBaseColorId)
|
||||
{
|
||||
me->setBaseColorId(cmp_mat->mBaseColorId);
|
||||
me->setBaseColorId(render_material->mBaseColorId);
|
||||
me->childSetValue("base_color_upload_fee", me->getString("no_upload_fee_string"));
|
||||
}
|
||||
if (local_mat->mNormalId != cmp_mat->mNormalId)
|
||||
if (local_material->mNormalId != render_material->mNormalId)
|
||||
{
|
||||
me->setNormalId(cmp_mat->mNormalId);
|
||||
me->setNormalId(render_material->mNormalId);
|
||||
me->childSetValue("normal_upload_fee", me->getString("no_upload_fee_string"));
|
||||
}
|
||||
if (local_mat->mMetallicRoughnessId != cmp_mat->mMetallicRoughnessId)
|
||||
if (local_material->mMetallicRoughnessId != render_material->mMetallicRoughnessId)
|
||||
{
|
||||
me->setMetallicRoughnessId(cmp_mat->mMetallicRoughnessId);
|
||||
me->setMetallicRoughnessId(render_material->mMetallicRoughnessId);
|
||||
me->childSetValue("metallic_upload_fee", me->getString("no_upload_fee_string"));
|
||||
}
|
||||
if (local_mat->mEmissiveId != cmp_mat->mEmissiveId)
|
||||
if (local_material->mEmissiveId != render_material->mEmissiveId)
|
||||
{
|
||||
me->setEmissiveId(cmp_mat->mEmissiveId);
|
||||
me->setEmissiveId(render_material->mEmissiveId);
|
||||
me->childSetValue("emissive_upload_fee", me->getString("no_upload_fee_string"));
|
||||
}
|
||||
|
||||
|
|
@ -1879,9 +1925,9 @@ void LLMaterialEditor::saveObjectsMaterialAs()
|
|||
}
|
||||
|
||||
LLSD payload;
|
||||
if (func.mMaterial.notNull())
|
||||
if (render_material)
|
||||
{
|
||||
payload["data"] = func.mMaterial->asJSON();
|
||||
payload["data"] = render_material->asJSON();
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@ class LLButton;
|
|||
class LLColorSwatchCtrl;
|
||||
class LLComboBox;
|
||||
class LLGLTFMaterial;
|
||||
class LLLocalGLTFMaterial;
|
||||
class LLTextureCtrl;
|
||||
class LLTextBox;
|
||||
|
||||
|
|
@ -111,6 +112,7 @@ public:
|
|||
static void loadLive();
|
||||
|
||||
static void saveObjectsMaterialAs();
|
||||
static void savePickedMaterialAs();
|
||||
static void onSaveObjectsMaterialAsMsgCallback(const LLSD& notification, const LLSD& response);
|
||||
|
||||
static void loadFromGLTFMaterial(LLUUID &asset_id);
|
||||
|
|
@ -232,6 +234,8 @@ public:
|
|||
static bool capabilitiesAvailable();
|
||||
|
||||
private:
|
||||
static void saveMaterialAs(const LLGLTFMaterial *render_material, const LLLocalGLTFMaterial *local_material);
|
||||
|
||||
static bool updateInventoryItem(const std::string &buffer, const LLUUID &item_id, const LLUUID &task_id);
|
||||
static void createInventoryItem(const std::string &buffer, const std::string &name, const std::string &desc);
|
||||
|
||||
|
|
|
|||
|
|
@ -2962,7 +2962,7 @@ void handle_object_edit_gltf_material()
|
|||
|
||||
void handle_object_save_gltf_material()
|
||||
{
|
||||
LLMaterialEditor::saveObjectsMaterialAs();
|
||||
LLMaterialEditor::savePickedMaterialAs();
|
||||
}
|
||||
|
||||
void handle_attachment_edit(const LLUUID& inv_item_id)
|
||||
|
|
|
|||
|
|
@ -135,7 +135,6 @@ bool anyone_copy_selection(LLSelectNode* nodep);
|
|||
// *TODO: Move to separate file
|
||||
bool for_sale_selection(LLSelectNode* nodep);
|
||||
|
||||
void handle_save_snapshot(void *);
|
||||
void handle_toggle_flycam();
|
||||
|
||||
void handle_object_sit_or_stand();
|
||||
|
|
|
|||
Loading…
Reference in New Issue