SL-17653 Local gltf materials #2

meow-7.2.2
Andrey Kleshchev 2022-08-20 01:04:42 +03:00
parent 4bb419031c
commit 0d217dc73c
21 changed files with 337 additions and 221 deletions

View File

@ -394,7 +394,7 @@ set(viewer_SOURCE_FILES
lllistcontextmenu.cpp
lllistview.cpp
lllocalbitmaps.cpp
lllocalrendermaterials.cpp
lllocalgltfmaterials.cpp
lllocationhistory.cpp
lllocationinputctrl.cpp
lllogchat.cpp
@ -608,7 +608,7 @@ set(viewer_SOURCE_FILES
lltextureinfodetails.cpp
lltexturestats.cpp
lltextureview.cpp
lltinygltfhelper.cpp
lltinygltfhelper.cpp
lltoast.cpp
lltoastalertpanel.cpp
lltoastgroupnotifypanel.cpp
@ -1038,7 +1038,7 @@ set(viewer_HEADER_FILES
lllistcontextmenu.h
lllistview.h
lllocalbitmaps.h
lllocalrendermaterials.h
lllocalgltfmaterials.h
lllocationhistory.h
lllocationinputctrl.h
lllogchat.h
@ -1243,7 +1243,7 @@ set(viewer_HEADER_FILES
lltextureinfodetails.h
lltexturestats.h
lltextureview.h
lltinygltfhelper.h
lltinygltfhelper.h
lltoast.h
lltoastalertpanel.h
lltoastgroupnotifypanel.h

View File

@ -350,7 +350,7 @@ void LLFloaterAutoReplaceSettings::onDeleteEntry()
// called when the Import List button is pressed
void LLFloaterAutoReplaceSettings::onImportList()
{
(new LLFilePickerReplyThread(boost::bind(&LLFloaterAutoReplaceSettings::loadListFromFile, this, _1), LLFilePicker::FFLOAD_XML, false))->getFile();
LLFilePickerReplyThread::startPicker(boost::bind(&LLFloaterAutoReplaceSettings::loadListFromFile, this, _1), LLFilePicker::FFLOAD_XML, false);
}
void LLFloaterAutoReplaceSettings::loadListFromFile(const std::vector<std::string>& filenames)
@ -537,7 +537,7 @@ void LLFloaterAutoReplaceSettings::onExportList()
{
std::string listName=mListNames->getFirstSelected()->getColumn(0)->getValue().asString();
std::string listFileName = listName + ".xml";
(new LLFilePickerReplyThread(boost::bind(&LLFloaterAutoReplaceSettings::saveListToFile, this, _1, listName), LLFilePicker::FFSAVE_XML, listFileName))->getFile();
LLFilePickerReplyThread::startPicker(boost::bind(&LLFloaterAutoReplaceSettings::saveListToFile, this, _1, listName), LLFilePicker::FFSAVE_XML, listFileName);
}
void LLFloaterAutoReplaceSettings::saveListToFile(const std::vector<std::string>& filenames, std::string listName)

View File

@ -1523,7 +1523,7 @@ bool LLFloaterEditExtDayCycle::isAddingFrameAllowed()
void LLFloaterEditExtDayCycle::doImportFromDisk()
{ // Load a a legacy Windlight XML from disk.
(new LLFilePickerReplyThread(boost::bind(&LLFloaterEditExtDayCycle::loadSettingFromFile, this, _1), LLFilePicker::FFLOAD_XML, false))->getFile();
LLFilePickerReplyThread::startPicker(boost::bind(&LLFloaterEditExtDayCycle::loadSettingFromFile, this, _1), LLFilePicker::FFLOAD_XML, false);
}
void LLFloaterEditExtDayCycle::loadSettingFromFile(const std::vector<std::string>& filenames)

View File

@ -439,7 +439,7 @@ void LLFloaterFixedEnvironmentWater::onOpen(const LLSD& key)
void LLFloaterFixedEnvironmentWater::doImportFromDisk()
{ // Load a a legacy Windlight XML from disk.
(new LLFilePickerReplyThread(boost::bind(&LLFloaterFixedEnvironmentWater::loadWaterSettingFromFile, this, _1), LLFilePicker::FFLOAD_XML, false))->getFile();
LLFilePickerReplyThread::startPicker(boost::bind(&LLFloaterFixedEnvironmentWater::loadWaterSettingFromFile, this, _1), LLFilePicker::FFLOAD_XML, false);
}
void LLFloaterFixedEnvironmentWater::loadWaterSettingFromFile(const std::vector<std::string>& filenames)
@ -525,7 +525,7 @@ void LLFloaterFixedEnvironmentSky::onClose(bool app_quitting)
void LLFloaterFixedEnvironmentSky::doImportFromDisk()
{ // Load a a legacy Windlight XML from disk.
(new LLFilePickerReplyThread(boost::bind(&LLFloaterFixedEnvironmentSky::loadSkySettingFromFile, this, _1), LLFilePicker::FFLOAD_XML, false))->getFile();
LLFilePickerReplyThread::startPicker(boost::bind(&LLFloaterFixedEnvironmentSky::loadSkySettingFromFile, this, _1), LLFilePicker::FFLOAD_XML, false);
}
void LLFloaterFixedEnvironmentSky::loadSkySettingFromFile(const std::vector<std::string>& filenames)

View File

@ -259,7 +259,7 @@ BOOL LLFloaterSpellCheckerImport::postBuild(void)
void LLFloaterSpellCheckerImport::onBtnBrowse()
{
(new LLFilePickerReplyThread(boost::bind(&LLFloaterSpellCheckerImport::importSelectedDictionary, this, _1), LLFilePicker::FFLOAD_DICTIONARY, false))->getFile();
LLFilePickerReplyThread::startPicker(boost::bind(&LLFloaterSpellCheckerImport::importSelectedDictionary, this, _1), LLFilePicker::FFLOAD_DICTIONARY, false);
}
void LLFloaterSpellCheckerImport::importSelectedDictionary(const std::vector<std::string>& filenames)

View File

@ -1023,7 +1023,7 @@ void LLFloaterUIPreview::onClickEditFloater()
void LLFloaterUIPreview::onClickBrowseForEditor()
{
// Let the user choose an executable through the file picker dialog box
(new LLFilePickerReplyThread(boost::bind(&LLFloaterUIPreview::getExecutablePath, this, _1), LLFilePicker::FFLOAD_EXE, false))->getFile();
LLFilePickerReplyThread::startPicker(boost::bind(&LLFloaterUIPreview::getExecutablePath, this, _1), LLFilePicker::FFLOAD_EXE, false);
}
void LLFloaterUIPreview::getExecutablePath(const std::vector<std::string>& filenames)
@ -1077,7 +1077,7 @@ void LLFloaterUIPreview::getExecutablePath(const std::vector<std::string>& filen
void LLFloaterUIPreview::onClickBrowseForDiffs()
{
// create load dialog box
(new LLFilePickerReplyThread(boost::bind(&LLFloaterUIPreview::getDiffsFilePath, this, _1), LLFilePicker::FFLOAD_XML, false))->getFile();
LLFilePickerReplyThread::startPicker(boost::bind(&LLFloaterUIPreview::getDiffsFilePath, this, _1), LLFilePicker::FFLOAD_XML, false);
}
void LLFloaterUIPreview::getDiffsFilePath(const std::vector<std::string>& filenames)

View File

@ -62,6 +62,7 @@
#include "pipeline.h"
#include "llmaterialmgr.h"
#include "llimagedimensionsinfo.h"
#include "llinventoryicon.h"
#include "llviewercontrol.h"
#include "lltrans.h"
#include "llviewerdisplay.h"
@ -931,32 +932,7 @@ bool LLLocalBitmapMgr::addUnit()
std::string filename = picker.getFirstFile();
while(!filename.empty())
{
if(!checkTextureDimensions(filename))
{
filename = picker.getNextFile();
continue;
}
LLLocalBitmap* unit = new LLLocalBitmap(filename);
if (unit->getValid())
{
mBitmapList.push_back(unit);
add_successful = true;
}
else
{
LL_WARNS() << "Attempted to add invalid or unreadable image file, attempt cancelled.\n"
<< "Filename: " << filename << LL_ENDL;
LLSD notif_args;
notif_args["FNAME"] = filename;
LLNotificationsUtil::add("LocalBitmapsVerifyFail", notif_args);
delete unit;
unit = NULL;
}
add_successful |= addUnit(filename);
filename = picker.getNextFile();
}
@ -965,6 +941,49 @@ bool LLLocalBitmapMgr::addUnit()
return add_successful;
}
bool LLLocalBitmapMgr::addUnit(const std::vector<std::string>& filenames)
{
bool add_successful = false;
std::vector<std::string>::const_iterator iter = filenames.begin();
while (iter != filenames.end())
{
if (!iter->empty())
{
add_successful |= addUnit(*iter);
}
iter++;
}
return add_successful;
}
bool LLLocalBitmapMgr::addUnit(const std::string& filename)
{
if (!checkTextureDimensions(filename))
{
return false;
}
LLLocalBitmap* unit = new LLLocalBitmap(filename);
if (unit->getValid())
{
mBitmapList.push_back(unit);
return true;
}
else
{
LL_WARNS() << "Attempted to add invalid or unreadable image file, attempt cancelled.\n"
<< "Filename: " << filename << LL_ENDL;
LLSD notif_args;
notif_args["FNAME"] = filename;
LLNotificationsUtil::add("LocalBitmapsVerifyFail", notif_args);
delete unit;
unit = NULL;
return false;
}
}
bool LLLocalBitmapMgr::checkTextureDimensions(std::string filename)
{
@ -1071,7 +1090,9 @@ void LLLocalBitmapMgr::feedScrollList(LLScrollListCtrl* ctrl)
{
if (ctrl)
{
ctrl->clearRows();
std::string icon_name = LLInventoryIcon::getIconName(
LLAssetType::AT_TEXTURE,
LLInventoryType::IT_NONE);
if (!mBitmapList.empty())
{
@ -1079,13 +1100,18 @@ void LLLocalBitmapMgr::feedScrollList(LLScrollListCtrl* ctrl)
iter != mBitmapList.end(); iter++)
{
LLSD element;
element["columns"][0]["column"] = "unit_name";
element["columns"][0]["type"] = "text";
element["columns"][0]["value"] = (*iter)->getShortName();
element["columns"][1]["column"] = "unit_id_HIDDEN";
element["columns"][1]["type"] = "text";
element["columns"][1]["value"] = (*iter)->getTrackingID();
element["columns"][0]["column"] = "icon";
element["columns"][0]["type"] = "icon";
element["columns"][0]["value"] = icon_name;
element["columns"][1]["column"] = "unit_name";
element["columns"][1]["type"] = "text";
element["columns"][1]["value"] = (*iter)->getShortName();
element["columns"][2]["column"] = "unit_id_HIDDEN";
element["columns"][2]["type"] = "text";
element["columns"][2]["value"] = (*iter)->getTrackingID();
ctrl->addElement(element);
}

View File

@ -116,6 +116,8 @@ class LLLocalBitmapMgr : public LLSingleton<LLLocalBitmapMgr>
~LLLocalBitmapMgr();
public:
bool addUnit();
bool addUnit(const std::vector<std::string>& filenames);
bool addUnit(const std::string& filename);
void delUnit(LLUUID tracking_id);
bool checkTextureDimensions(std::string filename);

View File

@ -28,7 +28,7 @@
#include "llviewerprecompiledheaders.h"
/* own header */
#include "lllocalrendermaterials.h"
#include "lllocalgltfmaterials.h"
/* boost: will not compile unless equivalent is undef'd, beware. */
#include "fix_macros.h"
@ -44,6 +44,7 @@
#include "llfilepicker.h"
#include "llgltfmateriallist.h"
#include "llimagedimensionsinfo.h"
#include "llinventoryicon.h"
#include "lllocaltextureobject.h"
#include "llmaterialmgr.h"
#include "llnotificationsutil.h"
@ -55,9 +56,6 @@
#include "llviewerdisplay.h"
#include "llviewerobjectlist.h"
#include "llviewerobject.h"
#include "llviewerwearable.h"
#include "llvoavatarself.h"
#include "llvovolume.h"
#include "pipeline.h"
#include "tinygltf/tiny_gltf.h"
@ -111,13 +109,6 @@ LLLocalGLTFMaterial::LLLocalGLTFMaterial(std::string filename)
LLLocalGLTFMaterial::~LLLocalGLTFMaterial()
{
// replace IDs with defaults, if set to do so.
if(LL_LOCAL_REPLACE_ON_DEL && mValid && gAgentAvatarp) // fix for STORM-1837
{
replaceIDs(mWorldID, IMG_DEFAULT);
LLLocalGLTFMaterialMgr::getInstance()->doRebake();
}
// delete self from material list
gGLTFMaterialList.removeMaterial(mWorldID);
}
@ -312,10 +303,22 @@ bool LLLocalGLTFMaterial::loadMaterial(LLPointer<LLGLTFMaterial> mat)
albedo_img, normal_img, mr_img, emissive_img, occlusion_img,
mAlbedoFetched, mNormalFetched, mMRFetched, mEmissiveFetched);
mat->mAlbedoId = mAlbedoFetched->getID();
mat->mNormalId = mNormalFetched->getID();
mat->mMetallicRoughnessId = mMRFetched->getID();
mat->mEmissiveId = mEmissiveFetched->getID();
if (mAlbedoFetched)
{
mat->mAlbedoId = mAlbedoFetched->getID();
}
if (mNormalFetched)
{
mat->mNormalId = mNormalFetched->getID();
}
if (mMRFetched)
{
mat->mMetallicRoughnessId = mMRFetched->getID();
}
if (mEmissiveFetched)
{
mat->mEmissiveId = mEmissiveFetched->getID();
}
break;
}
@ -533,39 +536,14 @@ bool LLLocalGLTFMaterialMgr::addUnit()
bool add_successful = false;
LLFilePicker& picker = LLFilePicker::instance();
if (picker.getMultipleOpenFiles(LLFilePicker::FFLOAD_IMAGE))
if (picker.getMultipleOpenFiles(LLFilePicker::FFLOAD_MATERIAL))
{
mTimer.stopTimer();
std::string filename = picker.getFirstFile();
while (!filename.empty())
{
if (!checkTextureDimensions(filename))
{
filename = picker.getNextFile();
continue;
}
LLLocalGLTFMaterial* unit = new LLLocalGLTFMaterial(filename);
if (unit->getValid())
{
mMaterialList.push_back(unit);
add_successful = true;
}
else
{
LL_WARNS() << "Attempted to add invalid or unreadable image file, attempt cancelled.\n"
<< "Filename: " << filename << LL_ENDL;
LLSD notif_args;
notif_args["FNAME"] = filename;
LLNotificationsUtil::add("LocalBitmapsVerifyFail", notif_args);
delete unit;
unit = NULL;
}
add_successful |= addUnit(filename);
filename = picker.getNextFile();
}
@ -575,35 +553,44 @@ bool LLLocalGLTFMaterialMgr::addUnit()
return add_successful;
}
bool LLLocalGLTFMaterialMgr::checkTextureDimensions(std::string filename)
bool LLLocalGLTFMaterialMgr::addUnit(const std::vector<std::string>& filenames)
{
std::string exten = gDirUtilp->getExtension(filename);
U32 codec = LLImageBase::getCodecFromExtension(exten);
std::string mImageLoadError;
LLImageDimensionsInfo image_info;
if (!image_info.load(filename, codec))
bool add_successful = false;
std::vector<std::string>::const_iterator iter = filenames.begin();
while (iter != filenames.end())
{
return false;
if (!iter->empty())
{
add_successful |= addUnit(*iter);
}
iter++;
}
return add_successful;
}
S32 max_width = gSavedSettings.getS32("max_texture_dimension_X");
S32 max_height = gSavedSettings.getS32("max_texture_dimension_Y");
bool LLLocalGLTFMaterialMgr::addUnit(const std::string& filename)
{
LLLocalGLTFMaterial* unit = new LLLocalGLTFMaterial(filename);
if ((image_info.getWidth() > max_width) || (image_info.getHeight() > max_height))
if (unit->getValid())
{
LLStringUtil::format_map_t args;
args["WIDTH"] = llformat("%d", max_width);
args["HEIGHT"] = llformat("%d", max_height);
mImageLoadError = LLTrans::getString("texture_load_dimensions_error", args);
mMaterialList.push_back(unit);
return true;
}
else
{
LL_WARNS() << "Attempted to add invalid or unreadable image file, attempt cancelled.\n"
<< "Filename: " << filename << LL_ENDL;
LLSD notif_args;
notif_args["REASON"] = mImageLoadError;
LLNotificationsUtil::add("CannotUploadTexture", notif_args);
notif_args["FNAME"] = filename;
LLNotificationsUtil::add("LocalBitmapsVerifyFail", notif_args);
delete unit;
unit = NULL;
return false;
}
return true;
}
void LLLocalGLTFMaterialMgr::delUnit(LLUUID tracking_id)
@ -680,21 +667,28 @@ void LLLocalGLTFMaterialMgr::feedScrollList(LLScrollListCtrl* ctrl)
{
if (ctrl)
{
ctrl->clearRows();
if (!mMaterialList.empty())
{
std::string icon_name = LLInventoryIcon::getIconName(
LLAssetType::AT_MATERIAL,
LLInventoryType::IT_NONE);
for (local_list_iter iter = mMaterialList.begin();
iter != mMaterialList.end(); iter++)
{
LLSD element;
element["columns"][0]["column"] = "unit_name";
element["columns"][0]["type"] = "text";
element["columns"][0]["value"] = (*iter)->getShortName();
element["columns"][1]["column"] = "unit_id_HIDDEN";
element["columns"][0]["column"] = "icon";
element["columns"][0]["type"] = "icon";
element["columns"][0]["value"] = icon_name;
element["columns"][1]["column"] = "unit_name";
element["columns"][1]["type"] = "text";
element["columns"][1]["value"] = (*iter)->getTrackingID();
element["columns"][1]["value"] = (*iter)->getShortName();
element["columns"][2]["column"] = "unit_id_HIDDEN";
element["columns"][2]["type"] = "text";
element["columns"][2]["value"] = (*iter)->getTrackingID();
ctrl->addElement(element);
}
@ -707,28 +701,12 @@ void LLLocalGLTFMaterialMgr::doUpdates()
{
// preventing theoretical overlap in cases with huge number of loaded images.
mTimer.stopTimer();
mNeedsRebake = false;
for (local_list_iter iter = mMaterialList.begin(); iter != mMaterialList.end(); iter++)
{
(*iter)->updateSelf();
}
doRebake();
mTimer.startTimer();
}
void LLLocalGLTFMaterialMgr::setNeedsRebake()
{
mNeedsRebake = true;
}
void LLLocalGLTFMaterialMgr::doRebake()
{ /* separated that from doUpdates to insure a rebake can be called separately during deletion */
if (mNeedsRebake)
{
gAgentAvatarp->forceBakeAllTextures(LL_LOCAL_SLAM_FOR_DEBUG);
mNeedsRebake = false;
}
}

View File

@ -24,8 +24,8 @@
* $/LicenseInfo$
*/
#ifndef LL_LOCALRENDERMATERIALS_H
#define LL_LOCALRENDERMATERIALS_H
#ifndef LL_LOCALGLTFMATERIALS_H
#define LL_LOCALGLTFMATERIALS_H
#include "lleventtimer.h"
#include "llpointer.h"
@ -113,8 +113,9 @@ class LLLocalGLTFMaterialMgr : public LLSingleton<LLLocalGLTFMaterialMgr>
~LLLocalGLTFMaterialMgr();
public:
bool addUnit();
bool addUnit(const std::vector<std::string>& filenames);
bool addUnit(const std::string& filename);
void delUnit(LLUUID tracking_id);
bool checkTextureDimensions(std::string filename);
LLUUID getWorldID(LLUUID tracking_id);
bool isLocal(LLUUID world_id);
@ -122,15 +123,12 @@ public:
void feedScrollList(LLScrollListCtrl* ctrl);
void doUpdates();
void setNeedsRebake();
void doRebake();
private:
std::list<LLLocalGLTFMaterial*> mMaterialList;
LLLocalGLTFMaterialTimer mTimer;
bool mNeedsRebake;
typedef std::list<LLLocalGLTFMaterial*>::iterator local_list_iter;
};
#endif // LL_LOCALRENDERMATERIALS_H
#endif // LL_LOCALGLTFMATERIALS_H

View File

@ -1019,18 +1019,15 @@ void LLMaterialEditor::onCancelMsgCallback(const LLSD& notification, const LLSD&
class LLMaterialFilePicker : public LLFilePickerThread
{
public:
LLMaterialFilePicker(LLMaterialEditor* me);
LLMaterialFilePicker();
virtual void notify(const std::vector<std::string>& filenames);
void loadMaterial(const std::string& filename);
static void textureLoadedCallback(BOOL success, LLViewerFetchedTexture* src_vi, LLImageRaw* src, LLImageRaw* src_aux, S32 discard_level, BOOL final, void* userdata);
private:
LLMaterialEditor* mME;
};
LLMaterialFilePicker::LLMaterialFilePicker(LLMaterialEditor* me)
LLMaterialFilePicker::LLMaterialFilePicker()
: LLFilePickerThread(LLFilePicker::FFLOAD_MATERIAL)
{
mME = me;
}
void LLMaterialFilePicker::notify(const std::vector<std::string>& filenames)
@ -1043,7 +1040,11 @@ void LLMaterialFilePicker::notify(const std::vector<std::string>& filenames)
if (filenames.size() > 0)
{
loadMaterial(filenames[0]);
LLMaterialEditor* me = (LLMaterialEditor*)LLFloaterReg::getInstance("material_editor");
if (me)
{
me->loadMaterialFromFile(filenames[0]);
}
}
}
@ -1114,7 +1115,7 @@ void LLMaterialFilePicker::textureLoadedCallback(BOOL success, LLViewerFetchedTe
}
void LLMaterialFilePicker::loadMaterial(const std::string& filename)
void LLMaterialEditor::loadMaterialFromFile(const std::string& filename)
{
tinygltf::TinyGLTF loader;
std::string error_msg;
@ -1160,13 +1161,13 @@ void LLMaterialFilePicker::loadMaterial(const std::string& filename)
model_out.materials.resize(1);
// get albedo texture
LLPointer<LLImageRaw> albedo_img = LLTinyGLTFHelper::getTexture(folder, model_in, material_in.pbrMetallicRoughness.baseColorTexture.index, mME->mAlbedoName);
LLPointer<LLImageRaw> albedo_img = LLTinyGLTFHelper::getTexture(folder, model_in, material_in.pbrMetallicRoughness.baseColorTexture.index, mAlbedoName);
// get normal map
LLPointer<LLImageRaw> normal_img = LLTinyGLTFHelper::getTexture(folder, model_in, material_in.normalTexture.index, mME->mNormalName);
LLPointer<LLImageRaw> normal_img = LLTinyGLTFHelper::getTexture(folder, model_in, material_in.normalTexture.index, mNormalName);
// get metallic-roughness texture
LLPointer<LLImageRaw> mr_img = LLTinyGLTFHelper::getTexture(folder, model_in, material_in.pbrMetallicRoughness.metallicRoughnessTexture.index, mME->mMetallicRoughnessName);
LLPointer<LLImageRaw> mr_img = LLTinyGLTFHelper::getTexture(folder, model_in, material_in.pbrMetallicRoughness.metallicRoughnessTexture.index, mMetallicRoughnessName);
// get emissive texture
LLPointer<LLImageRaw> emissive_img = LLTinyGLTFHelper::getTexture(folder, model_in, material_in.emissiveTexture.index, mME->mEmissiveName);
LLPointer<LLImageRaw> emissive_img = LLTinyGLTFHelper::getTexture(folder, model_in, material_in.emissiveTexture.index, mEmissiveName);
// get occlusion map if needed
LLPointer<LLImageRaw> occlusion_img;
if (material_in.occlusionTexture.index != material_in.pbrMetallicRoughness.metallicRoughnessTexture.index)
@ -1176,75 +1177,75 @@ void LLMaterialFilePicker::loadMaterial(const std::string& filename)
}
LLTinyGLTFHelper::initFetchedTextures(material_in, albedo_img, normal_img, mr_img, emissive_img, occlusion_img,
mME->mAlbedoFetched, mME->mNormalFetched, mME->mMetallicRoughnessFetched, mME->mEmissiveFetched);
mAlbedoFetched, mNormalFetched, mMetallicRoughnessFetched, mEmissiveFetched);
pack_textures(albedo_img, normal_img, mr_img, emissive_img, occlusion_img,
mME->mAlbedoJ2C, mME->mNormalJ2C, mME->mMetallicRoughnessJ2C, mME->mEmissiveJ2C);
mAlbedoJ2C, mNormalJ2C, mMetallicRoughnessJ2C, mEmissiveJ2C);
LLUUID albedo_id;
if (mME->mAlbedoFetched.notNull())
if (mAlbedoFetched.notNull())
{
mME->mAlbedoFetched->forceToSaveRawImage(0, F32_MAX);
albedo_id = mME->mAlbedoFetched->getID();
mAlbedoFetched->forceToSaveRawImage(0, F32_MAX);
albedo_id = mAlbedoFetched->getID();
if (mME->mAlbedoName.empty())
if (mAlbedoName.empty())
{
mME->mAlbedoName = MATERIAL_ALBEDO_DEFAULT_NAME;
mAlbedoName = MATERIAL_ALBEDO_DEFAULT_NAME;
}
}
LLUUID normal_id;
if (mME->mNormalFetched.notNull())
if (mNormalFetched.notNull())
{
mME->mNormalFetched->forceToSaveRawImage(0, F32_MAX);
normal_id = mME->mNormalFetched->getID();
mNormalFetched->forceToSaveRawImage(0, F32_MAX);
normal_id = mNormalFetched->getID();
if (mME->mNormalName.empty())
if (mNormalName.empty())
{
mME->mNormalName = MATERIAL_NORMAL_DEFAULT_NAME;
mNormalName = MATERIAL_NORMAL_DEFAULT_NAME;
}
}
LLUUID mr_id;
if (mME->mMetallicRoughnessFetched.notNull())
if (mMetallicRoughnessFetched.notNull())
{
mME->mMetallicRoughnessFetched->forceToSaveRawImage(0, F32_MAX);
mr_id = mME->mMetallicRoughnessFetched->getID();
mMetallicRoughnessFetched->forceToSaveRawImage(0, F32_MAX);
mr_id = mMetallicRoughnessFetched->getID();
if (mME->mMetallicRoughnessName.empty())
if (mMetallicRoughnessName.empty())
{
mME->mMetallicRoughnessName = MATERIAL_METALLIC_DEFAULT_NAME;
mMetallicRoughnessName = MATERIAL_METALLIC_DEFAULT_NAME;
}
}
LLUUID emissive_id;
if (mME->mEmissiveFetched.notNull())
if (mEmissiveFetched.notNull())
{
mME->mEmissiveFetched->forceToSaveRawImage(0, F32_MAX);
emissive_id = mME->mEmissiveFetched->getID();
mEmissiveFetched->forceToSaveRawImage(0, F32_MAX);
emissive_id = mEmissiveFetched->getID();
if (mME->mEmissiveName.empty())
if (mEmissiveName.empty())
{
mME->mEmissiveName = MATERIAL_EMISSIVE_DEFAULT_NAME;
mEmissiveName = MATERIAL_EMISSIVE_DEFAULT_NAME;
}
}
mME->setAlbedoId(albedo_id);
mME->setAlbedoUploadId(albedo_id);
mME->setMetallicRoughnessId(mr_id);
mME->setMetallicRoughnessUploadId(mr_id);
mME->setEmissiveId(emissive_id);
mME->setEmissiveUploadId(emissive_id);
mME->setNormalId(normal_id);
mME->setNormalUploadId(normal_id);
setAlbedoId(albedo_id);
setAlbedoUploadId(albedo_id);
setMetallicRoughnessId(mr_id);
setMetallicRoughnessUploadId(mr_id);
setEmissiveId(emissive_id);
setEmissiveUploadId(emissive_id);
setNormalId(normal_id);
setNormalUploadId(normal_id);
mME->setFromGltfModel(model_in);
setFromGltfModel(model_in);
mME->setFromGltfMetaData(filename_lc, model_in);
setFromGltfMetaData(filename_lc, model_in);
mME->setHasUnsavedChanges(true);
mME->openFloater();
setHasUnsavedChanges(true);
openFloater();
mME->applyToSelection();
applyToSelection();
}
bool LLMaterialEditor::setFromGltfModel(tinygltf::Model& model, bool set_textures)
@ -1533,7 +1534,7 @@ void LLMaterialEditor::setFromGltfMetaData(const std::string& filename, tinygltf
void LLMaterialEditor::importMaterial()
{
(new LLMaterialFilePicker(this))->getFile();
(new LLMaterialFilePicker())->getFile();
}
class LLRemderMaterialFunctor : public LLSelectedTEFunctor

View File

@ -50,7 +50,7 @@ public:
void setFromGltfMetaData(const std::string& filename, tinygltf::Model& model);
// open a file dialog and select a gltf/glb file for import
void importMaterial();
static void importMaterial();
// for live preview, apply current material to currently selected object
void applyToSelection();
@ -60,6 +60,7 @@ public:
void setFromGLTFMaterial(LLGLTFMaterial* mat);
void loadAsset() override;
void loadMaterialFromFile(const std::string& filename);
static void onLoadComplete(const LLUUID& asset_uuid, LLAssetType::EType type, void* user_data, S32 status, LLExtStat ext_status);

View File

@ -1177,7 +1177,7 @@ void LLOutfitGallery::uploadPhoto(LLUUID outfit_id)
{
return;
}
(new LLFilePickerReplyThread(boost::bind(&LLOutfitGallery::uploadOutfitImage, this, _1, outfit_id), LLFilePicker::FFLOAD_IMAGE, false))->getFile();
LLFilePickerReplyThread::startPicker(boost::bind(&LLOutfitGallery::uploadOutfitImage, this, _1, outfit_id), LLFilePicker::FFLOAD_IMAGE, false);
}
void LLOutfitGallery::uploadOutfitImage(const std::vector<std::string>& filenames, LLUUID outfit_id)

View File

@ -1199,7 +1199,7 @@ BOOL LLScriptEdCore::handleKeyHere(KEY key, MASK mask)
void LLScriptEdCore::onBtnLoadFromFile( void* data )
{
(new LLFilePickerReplyThread(boost::bind(&LLScriptEdCore::loadScriptFromFile, _1, data), LLFilePicker::FFLOAD_SCRIPT, false))->getFile();
LLFilePickerReplyThread::startPicker(boost::bind(&LLScriptEdCore::loadScriptFromFile, _1, data), LLFilePicker::FFLOAD_SCRIPT, false);
}
void LLScriptEdCore::loadScriptFromFile(const std::vector<std::string>& filenames, void* data)
@ -1240,7 +1240,7 @@ void LLScriptEdCore::onBtnSaveToFile( void* userdata )
if( self->mSaveCallback )
{
(new LLFilePickerReplyThread(boost::bind(&LLScriptEdCore::saveScriptToFile, _1, userdata), LLFilePicker::FFSAVE_SCRIPT, self->mScriptName))->getFile();
LLFilePickerReplyThread::startPicker(boost::bind(&LLScriptEdCore::saveScriptToFile, _1, userdata), LLFilePicker::FFSAVE_SCRIPT, self->mScriptName);
}
}

View File

@ -296,7 +296,7 @@ void LLPreviewTexture::saveAs()
return;
std::string filename = getItem() ? LLDir::getScrubbedFileName(getItem()->getName()) : LLStringUtil::null;
(new LLFilePickerReplyThread(boost::bind(&LLPreviewTexture::saveTextureToFile, this, _1), LLFilePicker::FFSAVE_TGAPNG, filename))->getFile();
LLFilePickerReplyThread::startPicker(boost::bind(&LLPreviewTexture::saveTextureToFile, this, _1), LLFilePicker::FFSAVE_TGAPNG, filename);
}
void LLPreviewTexture::saveTextureToFile(const std::vector<std::string>& filenames)

View File

@ -41,12 +41,15 @@
#include "llfolderviewmodel.h"
#include "llinventory.h"
#include "llinventoryfunctions.h"
#include "llinventoryicon.h"
#include "llinventorymodelbackgroundfetch.h"
#include "llinventoryobserver.h"
#include "llinventorypanel.h"
#include "lllineeditor.h"
#include "llmaterialeditor.h"
#include "llui.h"
#include "llviewerinventory.h"
#include "llviewermenufile.h" // LLFilePickerReplyThread
#include "llpermissions.h"
#include "llsaleinfo.h"
#include "llassetstorage.h"
@ -69,12 +72,14 @@
#include "llradiogroup.h"
#include "llfloaterreg.h"
#include "lllocalbitmaps.h"
#include "lllocalgltfmaterials.h"
#include "llerror.h"
#include "llavatarappearancedefines.h"
static const S32 LOCAL_TRACKING_ID_COLUMN = 1;
static const S32 LOCAL_ICON_ID_COLUMN = 0;
static const S32 LOCAL_TRACKING_ID_COLUMN = 2;
//static const char CURRENT_IMAGE_NAME[] = "Current Texture";
//static const char WHITE_IMAGE_NAME[] = "Blank Texture";
@ -472,7 +477,9 @@ BOOL LLFloaterTexturePicker::postBuild()
mLocalScrollCtrl = getChild<LLScrollListCtrl>("l_name_list");
mLocalScrollCtrl->setCommitCallback(onLocalScrollCommit, this);
mLocalScrollCtrl->clearRows();
LLLocalBitmapMgr::getInstance()->feedScrollList(mLocalScrollCtrl);
LLLocalGLTFMaterialMgr::getInstance()->feedScrollList(mLocalScrollCtrl);
mNoCopyTextureSelected = FALSE;
@ -749,8 +756,21 @@ void LLFloaterTexturePicker::onBtnSelect(void* userdata)
{
if (self->mLocalScrollCtrl->getVisible() && !self->mLocalScrollCtrl->getAllSelected().empty())
{
std::string icon_name = self->mLocalScrollCtrl->getFirstSelected()->getColumn(LOCAL_ICON_ID_COLUMN)->getValue().asString();
LLUUID temp_id = self->mLocalScrollCtrl->getFirstSelected()->getColumn(LOCAL_TRACKING_ID_COLUMN)->getValue().asUUID();
local_id = LLLocalBitmapMgr::getInstance()->getWorldID(temp_id);
std::string mat_icon_name = LLInventoryIcon::getIconName(
LLAssetType::AT_MATERIAL,
LLInventoryType::IT_NONE);
if (mat_icon_name == icon_name)
{
local_id = LLLocalGLTFMaterialMgr::getInstance()->getWorldID(temp_id);
}
else
{
local_id = LLLocalBitmapMgr::getInstance()->getWorldID(temp_id);
}
}
}
@ -898,11 +918,9 @@ void LLFloaterTexturePicker::onModeSelect(LLUICtrl* ctrl, void *userdata)
// static
void LLFloaterTexturePicker::onBtnAdd(void* userdata)
{
if (LLLocalBitmapMgr::getInstance()->addUnit() == true)
{
LLFloaterTexturePicker* self = (LLFloaterTexturePicker*) userdata;
LLLocalBitmapMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl);
}
LLFloaterTexturePicker* self = (LLFloaterTexturePicker*)userdata;
LLFilePickerReplyThread::startPicker(boost::bind(&onPickerCallback, _1, self->getHandle()), LLFilePicker::FFLOAD_ALL, true);
}
// static
@ -913,22 +931,37 @@ void LLFloaterTexturePicker::onBtnRemove(void* userdata)
if (!selected_items.empty())
{
std::string mat_icon_name = LLInventoryIcon::getIconName(
LLAssetType::AT_MATERIAL,
LLInventoryType::IT_NONE);
for(std::vector<LLScrollListItem*>::iterator iter = selected_items.begin();
iter != selected_items.end(); iter++)
{
LLScrollListItem* list_item = *iter;
if (list_item)
{
LLUUID tracking_id = list_item->getColumn(LOCAL_TRACKING_ID_COLUMN)->getValue().asUUID();
LLLocalBitmapMgr::getInstance()->delUnit(tracking_id);
std::string icon_name = list_item->getColumn(LOCAL_ICON_ID_COLUMN)->getValue().asString();
LLUUID tracking_id = list_item->getColumn(LOCAL_TRACKING_ID_COLUMN)->getValue().asUUID();
// todo: works, but need a better way to distinguish material from texture
if (icon_name == mat_icon_name)
{
LLLocalGLTFMaterialMgr::getInstance()->delUnit(tracking_id);
}
else
{
LLLocalBitmapMgr::getInstance()->delUnit(tracking_id);
}
}
}
self->getChild<LLButton>("l_rem_btn")->setEnabled(false);
self->getChild<LLButton>("l_upl_btn")->setEnabled(false);
self->mLocalScrollCtrl->clearRows();
LLLocalBitmapMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl);
LLLocalGLTFMaterialMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl);
}
}
// static
@ -944,15 +977,34 @@ void LLFloaterTexturePicker::onBtnUpload(void* userdata)
/* currently only allows uploading one by one, picks the first item from the selection list. (not the vector!)
in the future, it might be a good idea to check the vector size and if more than one units is selected - opt for multi-image upload. */
std::string icon_name = self->mLocalScrollCtrl->getFirstSelected()->getColumn(LOCAL_ICON_ID_COLUMN)->getValue().asString();
LLUUID tracking_id = (LLUUID)self->mLocalScrollCtrl->getSelectedItemLabel(LOCAL_TRACKING_ID_COLUMN);
std::string filename = LLLocalBitmapMgr::getInstance()->getFilename(tracking_id);
if (!filename.empty())
{
LLFloaterReg::showInstance("upload_image", LLSD(filename));
}
std::string mat_icon_name = LLInventoryIcon::getIconName(
LLAssetType::AT_MATERIAL,
LLInventoryType::IT_NONE);
if (mat_icon_name == icon_name)
{
std::string filename = LLLocalGLTFMaterialMgr::getInstance()->getFilename(tracking_id);
if (!filename.empty())
{
LLMaterialEditor* me = (LLMaterialEditor*)LLFloaterReg::getInstance("material_editor");
if (me)
{
me->loadMaterialFromFile(filename);
}
}
}
else
{
std::string filename = LLLocalBitmapMgr::getInstance()->getFilename(tracking_id);
if (!filename.empty())
{
LLFloaterReg::showInstance("upload_image", LLSD(filename));
}
}
}
//static
@ -968,8 +1020,23 @@ void LLFloaterTexturePicker::onLocalScrollCommit(LLUICtrl* ctrl, void* userdata)
if (has_selection)
{
LLUUID tracking_id = (LLUUID)self->mLocalScrollCtrl->getSelectedItemLabel(LOCAL_TRACKING_ID_COLUMN);
LLUUID inworld_id = LLLocalBitmapMgr::getInstance()->getWorldID(tracking_id);
std::string icon_name = self->mLocalScrollCtrl->getFirstSelected()->getColumn(LOCAL_ICON_ID_COLUMN)->getValue().asString();
LLUUID tracking_id = (LLUUID)self->mLocalScrollCtrl->getSelectedItemLabel(LOCAL_TRACKING_ID_COLUMN);
LLUUID inworld_id;
std::string mat_icon_name = LLInventoryIcon::getIconName(
LLAssetType::AT_MATERIAL,
LLInventoryType::IT_NONE);
if (icon_name == mat_icon_name)
{
inworld_id = LLLocalGLTFMaterialMgr::getInstance()->getWorldID(tracking_id);
}
else
{
inworld_id = LLLocalBitmapMgr::getInstance()->getWorldID(tracking_id);
}
if (self->mSetImageAssetIDCallback)
{
self->mSetImageAssetIDCallback(inworld_id);
@ -1202,6 +1269,36 @@ void LLFloaterTexturePicker::setBakeTextureEnabled(BOOL enabled)
onModeSelect(0, this);
}
void LLFloaterTexturePicker::onPickerCallback(const std::vector<std::string>& filenames, LLHandle<LLFloater> handle)
{
std::vector<std::string>::const_iterator iter = filenames.begin();
while (iter != filenames.end())
{
if (!iter->empty())
{
std::string temp_exten = gDirUtilp->getExtension(*iter);
if (temp_exten == "gltf" || temp_exten == "glb")
{
LLLocalGLTFMaterialMgr::getInstance()->addUnit(*iter);
}
else
{
LLLocalBitmapMgr::getInstance()->addUnit(*iter);
}
}
iter++;
}
// Todo: this should referesh all pickers, not just a current one
if (!handle.isDead())
{
LLFloaterTexturePicker* self = (LLFloaterTexturePicker*)handle.get();
self->mLocalScrollCtrl->clearRows();
LLLocalBitmapMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl);
LLLocalGLTFMaterialMgr::getInstance()->feedScrollList(self->mLocalScrollCtrl);
}
}
void LLFloaterTexturePicker::onTextureSelect( const LLTextureEntry& te )
{
LLUUID inventory_item_id = findItemID(te.getID(), TRUE);

View File

@ -345,6 +345,8 @@ public:
void setLocalTextureEnabled(BOOL enabled);
void setBakeTextureEnabled(BOOL enabled);
static void onPickerCallback(const std::vector<std::string>& filenames, LLHandle<LLFloater> handle);
protected:
LLPointer<LLViewerTexture> mTexturep;
LLView* mOwner;

View File

@ -249,6 +249,16 @@ LLFilePickerReplyThread::~LLFilePickerReplyThread()
delete mFailureSignal;
}
void LLFilePickerReplyThread::startPicker(const file_picked_signal_t::slot_type & cb, LLFilePicker::ELoadFilter filter, bool get_multiple, const file_picked_signal_t::slot_type & failure_cb)
{
(new LLFilePickerReplyThread(cb, filter, get_multiple, failure_cb))->getFile();
}
void LLFilePickerReplyThread::startPicker(const file_picked_signal_t::slot_type & cb, LLFilePicker::ESaveFilter filter, const std::string & proposed_name, const file_picked_signal_t::slot_type & failure_cb)
{
(new LLFilePickerReplyThread(cb, filter, proposed_name, failure_cb))->getFile();
}
void LLFilePickerReplyThread::notify(const std::vector<std::string>& filenames)
{
if (filenames.empty())
@ -571,7 +581,7 @@ class LLFileUploadImage : public view_listener_t
{
gAgentCamera.changeCameraToDefault();
}
(new LLFilePickerReplyThread(boost::bind(&upload_single_file, _1, _2), LLFilePicker::FFLOAD_IMAGE, false))->getFile();
LLFilePickerReplyThread::startPicker(boost::bind(&upload_single_file, _1, _2), LLFilePicker::FFLOAD_IMAGE, false);
return true;
}
};
@ -589,11 +599,7 @@ class LLFileUploadMaterial : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
LLMaterialEditor* me = (LLMaterialEditor*)LLFloaterReg::getInstance("material_editor");
if (me)
{
me->importMaterial();
}
LLMaterialEditor::importMaterial();
return TRUE;
}
};
@ -606,7 +612,7 @@ class LLFileUploadSound : public view_listener_t
{
gAgentCamera.changeCameraToDefault();
}
(new LLFilePickerReplyThread(boost::bind(&upload_single_file, _1, _2), LLFilePicker::FFLOAD_WAV, false))->getFile();
LLFilePickerReplyThread::startPicker(boost::bind(&upload_single_file, _1, _2), LLFilePicker::FFLOAD_WAV, false);
return true;
}
};
@ -619,7 +625,7 @@ class LLFileUploadAnim : public view_listener_t
{
gAgentCamera.changeCameraToDefault();
}
(new LLFilePickerReplyThread(boost::bind(&upload_single_file, _1, _2), LLFilePicker::FFLOAD_ANIM, false))->getFile();
LLFilePickerReplyThread::startPicker(boost::bind(&upload_single_file, _1, _2), LLFilePicker::FFLOAD_ANIM, false);
return true;
}
};
@ -632,7 +638,7 @@ class LLFileUploadBulk : public view_listener_t
{
gAgentCamera.changeCameraToDefault();
}
(new LLFilePickerReplyThread(boost::bind(&upload_bulk, _1, _2), LLFilePicker::FFLOAD_ALL, true))->getFile();
LLFilePickerReplyThread::startPicker(boost::bind(&upload_bulk, _1, _2), LLFilePicker::FFLOAD_ALL, true);
return true;
}
};

View File

@ -115,13 +115,17 @@ class LLFilePickerReplyThread : public LLFilePickerThread
public:
typedef boost::signals2::signal<void(const std::vector<std::string>& filenames, LLFilePicker::ELoadFilter load_filter, LLFilePicker::ESaveFilter save_filter)> file_picked_signal_t;
LLFilePickerReplyThread(const file_picked_signal_t::slot_type& cb, LLFilePicker::ELoadFilter filter, bool get_multiple, const file_picked_signal_t::slot_type& failure_cb = file_picked_signal_t());
LLFilePickerReplyThread(const file_picked_signal_t::slot_type& cb, LLFilePicker::ESaveFilter filter, const std::string &proposed_name, const file_picked_signal_t::slot_type& failure_cb = file_picked_signal_t());
~LLFilePickerReplyThread();
static void startPicker(const file_picked_signal_t::slot_type& cb, LLFilePicker::ELoadFilter filter, bool get_multiple, const file_picked_signal_t::slot_type& failure_cb = file_picked_signal_t());
static void startPicker(const file_picked_signal_t::slot_type& cb, LLFilePicker::ESaveFilter filter, const std::string &proposed_name, const file_picked_signal_t::slot_type& failure_cb = file_picked_signal_t());
virtual void notify(const std::vector<std::string>& filenames);
private:
LLFilePickerReplyThread(const file_picked_signal_t::slot_type& cb, LLFilePicker::ELoadFilter filter, bool get_multiple, const file_picked_signal_t::slot_type& failure_cb = file_picked_signal_t());
LLFilePickerReplyThread(const file_picked_signal_t::slot_type& cb, LLFilePicker::ESaveFilter filter, const std::string &proposed_name, const file_picked_signal_t::slot_type& failure_cb = file_picked_signal_t());
~LLFilePickerReplyThread();
private:
LLFilePicker::ELoadFilter mLoadFilter;
LLFilePicker::ESaveFilter mSaveFilter;

View File

@ -4667,8 +4667,8 @@ void LLViewerWindow::saveImageNumbered(LLImageFormatted *image, BOOL force_picke
else
pick_type = LLFilePicker::FFSAVE_ALL;
(new LLFilePickerReplyThread(boost::bind(&LLViewerWindow::onDirectorySelected, this, _1, formatted_image, success_cb, failure_cb), pick_type, proposed_name,
boost::bind(&LLViewerWindow::onSelectionFailure, this, failure_cb)))->getFile();
LLFilePickerReplyThread::startPicker(boost::bind(&LLViewerWindow::onDirectorySelected, this, _1, formatted_image, success_cb, failure_cb), pick_type, proposed_name,
boost::bind(&LLViewerWindow::onSelectionFailure, this, failure_cb));
}
else
{

View File

@ -240,6 +240,7 @@
multi_select="true"
search_column="1"
visible="false">
<column name="icon" label="" width="20" />
<column name="unit_name" label="Name" dynamicwidth="true" />
<column name="unit_id_HIDDEN" label="ID" width="0" />
</scroll_list>