diff options
| author | Dave Parks <davep@lindenlab.com> | 2022-06-29 11:56:40 -0500 | 
|---|---|---|
| committer | Dave Parks <davep@lindenlab.com> | 2022-06-29 11:56:40 -0500 | 
| commit | 84bbe45fb582722619f77ae5ecaeef52a94abf27 (patch) | |
| tree | a1765024a64bdefbe8d95d5c64d4c255d49e2b87 | |
| parent | 5cfc336ba2917116492b9d74ed02748bbbd725fd (diff) | |
SL-17602 WIP - Texture uploads form material editor now work but the names are garbage and the resulting material asset has the wrong UUIDs
| -rw-r--r-- | indra/newview/llmaterialeditor.cpp | 90 | ||||
| -rw-r--r-- | indra/newview/llmaterialeditor.h | 20 | ||||
| -rw-r--r-- | indra/newview/llviewerassetupload.cpp | 47 | ||||
| -rw-r--r-- | indra/newview/llviewerassetupload.h | 30 | 
4 files changed, 175 insertions, 12 deletions
diff --git a/indra/newview/llmaterialeditor.cpp b/indra/newview/llmaterialeditor.cpp index ada5bb3882..2455ad2926 100644 --- a/indra/newview/llmaterialeditor.cpp +++ b/indra/newview/llmaterialeditor.cpp @@ -48,6 +48,9 @@  #include "llfloaterreg.h"  #include "llfilesystem.h"  #include "llsdserialize.h" +#include "llimagej2c.h" +#include "llviewertexturelist.h" +#include "llfloaterperms.h"  #include <strstream> @@ -316,6 +319,7 @@ void LLMaterialEditor::onCommitAlbedoTexture(LLUICtrl * ctrl, const LLSD & data)      }      else      { +        mAlbedoJ2C = nullptr;          childSetValue("albedo_upload_fee", getString("no_upload_fee_string"));      }      setHasUnsavedChanges(true); @@ -331,6 +335,7 @@ void LLMaterialEditor::onCommitMetallicTexture(LLUICtrl * ctrl, const LLSD & dat      }      else      { +        mMetallicRoughnessJ2C = nullptr;          childSetValue("metallic_upload_fee", getString("no_upload_fee_string"));      }      setHasUnsavedChanges(true); @@ -346,6 +351,7 @@ void LLMaterialEditor::onCommitEmissiveTexture(LLUICtrl * ctrl, const LLSD & dat      }      else      { +        mEmissiveJ2C = nullptr;          childSetValue("emissive_upload_fee", getString("no_upload_fee_string"));      }      setHasUnsavedChanges(true); @@ -361,6 +367,7 @@ void LLMaterialEditor::onCommitNormalTexture(LLUICtrl * ctrl, const LLSD & data)      }      else      { +        mNormalJ2C = nullptr;          childSetValue("normal_upload_fee", getString("no_upload_fee_string"));      }      setHasUnsavedChanges(true); @@ -395,7 +402,6 @@ static U32 write_texture(const LLUUID& id, tinygltf::Model& model)  void LLMaterialEditor::onClickSave()  {      applyToSelection(); -          saveIfNeeded();  } @@ -557,6 +563,8 @@ bool LLMaterialEditor::saveIfNeeded(LLInventoryItem* copyitem, bool sync)  {      std::string buffer = getEncodedAsset(); +    saveTextures(); +      const LLInventoryItem* item = getItem();      // save it out to database      if (item) @@ -615,6 +623,7 @@ bool LLMaterialEditor::saveIfNeeded(LLInventoryItem* copyitem, bool sync)      }      else      { //make a new inventory item +#if 1          // gen a new uuid for this asset          LLTransactionID tid;          tid.generate();     // timestamp-based randomization + uniquification @@ -651,6 +660,7 @@ bool LLMaterialEditor::saveIfNeeded(LLInventoryItem* copyitem, bool sync)                  }                  })          ); +#endif      }      return true; @@ -793,10 +803,9 @@ const tinygltf::Image* get_image_from_texture_index(const tinygltf::Model& model      return nullptr;  } -static LLImageRaw* get_texture(const std::string& folder, const tinygltf::Model& model, S32 texture_index) +static LLImageRaw* get_texture(const std::string& folder, const tinygltf::Model& model, S32 texture_index, std::string& name)  {      const tinygltf::Image* image = get_image_from_texture_index(model, texture_index); -      LLImageRaw* rawImage = nullptr;      if (image != nullptr &&  @@ -804,6 +813,7 @@ static LLImageRaw* get_texture(const std::string& folder, const tinygltf::Model&          !image->image.empty() &&          image->component <= 4)      { +        name = image->name;          rawImage = new LLImageRaw(&image->image[0], image->width, image->height, image->component);          rawImage->verticalFlip();      } @@ -850,18 +860,23 @@ static void pack_textures(tinygltf::Model& model, tinygltf::Material& material,      LLPointer<LLViewerFetchedTexture>& albedo_tex,      LLPointer<LLViewerFetchedTexture>& normal_tex,      LLPointer<LLViewerFetchedTexture>& mr_tex, -    LLPointer<LLViewerFetchedTexture>& emissive_tex) +    LLPointer<LLViewerFetchedTexture>& emissive_tex, +    LLPointer<LLImageJ2C>& albedo_j2c, +    LLPointer<LLImageJ2C>& normal_j2c, +    LLPointer<LLImageJ2C>& mr_j2c, +    LLPointer<LLImageJ2C>& emissive_j2c)  { -    // TODO: downscale if needed      if (albedo_img)      {          albedo_tex = LLViewerTextureManager::getFetchedTexture(albedo_img, FTType::FTT_LOCAL_FILE, true); +        albedo_j2c = LLViewerTextureList::convertToUploadFile(albedo_img);      }      if (normal_img)      {          strip_alpha_channel(normal_img);          normal_tex = LLViewerTextureManager::getFetchedTexture(normal_img, FTType::FTT_LOCAL_FILE, true); +        normal_j2c = LLViewerTextureList::convertToUploadFile(normal_img);      }      if (mr_img) @@ -895,12 +910,14 @@ static void pack_textures(tinygltf::Model& model, tinygltf::Material& material,      if (mr_img)      {          mr_tex = LLViewerTextureManager::getFetchedTexture(mr_img, FTType::FTT_LOCAL_FILE, true); +        mr_j2c = LLViewerTextureList::convertToUploadFile(mr_img);      }      if (emissive_img)      {          strip_alpha_channel(emissive_img);          emissive_tex = LLViewerTextureManager::getFetchedTexture(emissive_img, FTType::FTT_LOCAL_FILE, true); +        emissive_j2c = LLViewerTextureList::convertToUploadFile(emissive_img);      }  } @@ -966,18 +983,19 @@ void LLMaterialFilePicker::loadMaterial(const std::string& filename)      model_out.materials.resize(1);      // get albedo texture -    LLPointer<LLImageRaw> albedo_img = get_texture(folder, model_in, material_in.pbrMetallicRoughness.baseColorTexture.index); +    LLPointer<LLImageRaw> albedo_img = get_texture(folder, model_in, material_in.pbrMetallicRoughness.baseColorTexture.index, mME->mAlbedoName);      // get normal map -    LLPointer<LLImageRaw> normal_img = get_texture(folder, model_in, material_in.normalTexture.index); +    LLPointer<LLImageRaw> normal_img = get_texture(folder, model_in, material_in.normalTexture.index, mME->mNormalName);      // get metallic-roughness texture -    LLPointer<LLImageRaw> mr_img = get_texture(folder, model_in, material_in.pbrMetallicRoughness.metallicRoughnessTexture.index); +    LLPointer<LLImageRaw> mr_img = get_texture(folder, model_in, material_in.pbrMetallicRoughness.metallicRoughnessTexture.index, mME->mMetallicRoughnessName);      // get emissive texture -    LLPointer<LLImageRaw> emissive_img = get_texture(folder, model_in, material_in.emissiveTexture.index); +    LLPointer<LLImageRaw> emissive_img = get_texture(folder, model_in, material_in.emissiveTexture.index, mME->mEmissiveName);      // get occlusion map if needed      LLPointer<LLImageRaw> occlusion_img;      if (material_in.occlusionTexture.index != material_in.pbrMetallicRoughness.metallicRoughnessTexture.index)      { -        occlusion_img = get_texture(folder, model_in, material_in.occlusionTexture.index); +        std::string tmp; +        occlusion_img = get_texture(folder, model_in, material_in.occlusionTexture.index, tmp);      }      LLPointer<LLViewerFetchedTexture> albedo_tex; @@ -986,12 +1004,12 @@ void LLMaterialFilePicker::loadMaterial(const std::string& filename)      LLPointer<LLViewerFetchedTexture> emissive_tex;      pack_textures(model_in, material_in, albedo_img, normal_img, mr_img, emissive_img, occlusion_img, -        albedo_tex, normal_tex, mr_tex, emissive_tex); +        albedo_tex, normal_tex, mr_tex, emissive_tex, mME->mAlbedoJ2C, mME->mNormalJ2C, mME->mMetallicRoughnessJ2C, mME->mEmissiveJ2C);      LLUUID albedo_id;      if (albedo_tex != nullptr)      { -        albedo_tex->forceToSaveRawImage(0, F32_MAX);         +        albedo_tex->forceToSaveRawImage(0, F32_MAX);          albedo_id = albedo_tex->getID();      } @@ -1353,3 +1371,51 @@ void LLMaterialEditor::inventoryChanged(LLViewerObject* object,      loadAsset();  } + +void LLMaterialEditor::saveTexture(LLImageJ2C* img, const std::string& name, const LLUUID& asset_id) +{ +    if (img == nullptr || img->getDataSize() == 0) +    { +        return; +    } + +    // copy image bytes into string +    std::string buffer; +    buffer.assign((const char*) img->getData(), img->getDataSize()); + +    U32 expected_upload_cost = 10; // TODO: where do we get L$10 for textures from? + +    LLAssetStorage::LLStoreAssetCallback callback; + +    LLResourceUploadInfo::ptr_t uploadInfo(std::make_shared<LLNewBufferedResourceUploadInfo>( +        buffer, +        asset_id, +        name,  +        name,  +        0, +        LLFolderType::FT_TEXTURE,  +        LLInventoryType::IT_TEXTURE, +        LLAssetType::AT_TEXTURE, +        LLFloaterPerms::getNextOwnerPerms("Uploads"), +        LLFloaterPerms::getGroupPerms("Uploads"), +        LLFloaterPerms::getEveryonePerms("Uploads"), +        expected_upload_cost,  +        false)); + +    upload_new_resource(uploadInfo, callback, nullptr); +} + +void LLMaterialEditor::saveTextures() +{ +    saveTexture(mAlbedoJ2C, mAlbedoName, mAlbedoTextureUploadId); +    saveTexture(mNormalJ2C, mNormalName, mNormalTextureUploadId); +    saveTexture(mEmissiveJ2C, mEmissiveName, mEmissiveTextureUploadId); +    saveTexture(mMetallicRoughnessJ2C, mMetallicRoughnessName, mMetallicTextureUploadId); + +    // discard upload buffers once textures have been saved +    mAlbedoJ2C = nullptr; +    mNormalJ2C = nullptr; +    mEmissiveJ2C = nullptr; +    mMetallicRoughnessJ2C = nullptr; +} + diff --git a/indra/newview/llmaterialeditor.h b/indra/newview/llmaterialeditor.h index 4090ed120b..6ccb27cf27 100644 --- a/indra/newview/llmaterialeditor.h +++ b/indra/newview/llmaterialeditor.h @@ -28,6 +28,7 @@  #include "llpreview.h"  #include "llvoinventorylistener.h" +#include "llimagej2c.h"  class LLTextureCtrl; @@ -61,6 +62,11 @@ public:      void inventoryChanged(LLViewerObject* object, LLInventoryObject::object_list_t* inventory, S32 serial_num, void* user_data) override; +    void saveTexture(LLImageJ2C* img, const std::string& name, const LLUUID& asset_id); + +    // save textures to inventory if needed +    void saveTextures(); +      void onClickSave();      // get a dump of the json representation of the current state of the editor UI in GLTF format @@ -139,6 +145,8 @@ public:      void onCommitNormalTexture(LLUICtrl* ctrl, const LLSD& data);  private: +    friend class LLMaterialFilePicker; +      LLUUID mAssetID;      LLUUID mObjectID; @@ -153,6 +161,18 @@ private:      LLUUID mEmissiveTextureUploadId;      LLUUID mNormalTextureUploadId; +    // last known name of each texture +    std::string mAlbedoName; +    std::string mNormalName; +    std::string mMetallicRoughnessName; +    std::string mEmissiveName; + +    // J2C versions of packed buffers for uploading +    LLPointer<LLImageJ2C> mAlbedoJ2C; +    LLPointer<LLImageJ2C> mNormalJ2C; +    LLPointer<LLImageJ2C> mMetallicRoughnessJ2C; +    LLPointer<LLImageJ2C> mEmissiveJ2C; +      bool mHasUnsavedChanges;      std::string mMaterialName;  }; diff --git a/indra/newview/llviewerassetupload.cpp b/indra/newview/llviewerassetupload.cpp index 3f7e8531fb..c4211fcb19 100644 --- a/indra/newview/llviewerassetupload.cpp +++ b/indra/newview/llviewerassetupload.cpp @@ -497,6 +497,53 @@ LLSD LLNewFileResourceUploadInfo::exportTempFile()  }  //========================================================================= +LLNewBufferedResourceUploadInfo::LLNewBufferedResourceUploadInfo( +    const std::string& buffer, +    const LLAssetID& asset_id, +    std::string name, +    std::string description, +    S32 compressionInfo, +    LLFolderType::EType destinationType, +    LLInventoryType::EType inventoryType, +    LLAssetType::EType assetType, +    U32 nextOWnerPerms, +    U32 groupPerms, +    U32 everyonePerms, +    S32 expectedCost, +    bool show_inventory) : +    LLResourceUploadInfo(name, description, compressionInfo, +        destinationType, inventoryType, +        nextOWnerPerms, groupPerms, everyonePerms, expectedCost, show_inventory), +    mBuffer(buffer) +{ +    setAssetType(assetType); +    setAssetId(asset_id); +} + +LLSD LLNewBufferedResourceUploadInfo::prepareUpload() +{ +    if (getAssetId().isNull()) +        generateNewAssetId(); + +    LLSD result = exportTempFile(); +    if (result.has("error")) +        return result; + +    return LLResourceUploadInfo::prepareUpload(); +} + +LLSD LLNewBufferedResourceUploadInfo::exportTempFile() +{ +    std::string filename = gDirUtilp->getTempFilename(); + +    // copy buffer to the cache for upload     +    LLFileSystem file(getAssetId(), getAssetType(), LLFileSystem::APPEND); +    file.write((U8*) mBuffer.c_str(), mBuffer.size()); +         +    return LLSD(); +} + +//=========================================================================  LLBufferedAssetUploadInfo::LLBufferedAssetUploadInfo(LLUUID itemId, LLAssetType::EType assetType, std::string buffer, invnUploadFinish_f finish) :      LLResourceUploadInfo(std::string(), std::string(), 0, LLFolderType::FT_NONE, LLInventoryType::IT_NONE,          0, 0, 0, 0), diff --git a/indra/newview/llviewerassetupload.h b/indra/newview/llviewerassetupload.h index e56ba7d8f7..91ffa973fa 100644 --- a/indra/newview/llviewerassetupload.h +++ b/indra/newview/llviewerassetupload.h @@ -168,6 +168,36 @@ private:  };  //------------------------------------------------------------------------- +// use when you have a resource in memory and you want to make a new inventory item +class LLNewBufferedResourceUploadInfo : public LLResourceUploadInfo +{ +public: +    LLNewBufferedResourceUploadInfo( +        const std::string& buffer, +        const LLAssetID& asset_id, +        std::string name, +        std::string description, +        S32 compressionInfo, +        LLFolderType::EType destinationType, +        LLInventoryType::EType inventoryType, +        LLAssetType::EType assetType, +        U32 nextOWnerPerms, +        U32 groupPerms, +        U32 everyonePerms, +        S32 expectedCost, +        bool show_inventory = true); + +    virtual LLSD        prepareUpload(); + +protected: + +    virtual LLSD        exportTempFile(); + +private: +    std::string mBuffer; +}; + +//-------------------------------------------------------------------------  class LLBufferedAssetUploadInfo : public LLResourceUploadInfo  {  public:  | 
