SL-17653 Local gltf materials #2
parent
4bb419031c
commit
0d217dc73c
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Reference in New Issue