diff options
| author | Dave Parks <davep@lindenlab.com> | 2022-10-20 13:56:16 -0500 | 
|---|---|---|
| committer | Dave Parks <davep@lindenlab.com> | 2022-10-20 13:56:16 -0500 | 
| commit | 581e40269cfb070c522e15016440a1b4239cc29d (patch) | |
| tree | a1f04b21be49ce94b4c152729d6dc4843ede779f | |
| parent | 40695bbd316ceb15db2c3eb203cbe35188a00aa9 (diff) | |
| parent | 2727eb207c2477c6d3e359285fc694fa6449813b (diff) | |
Merge branch 'DRTVWR-559' of ssh://bitbucket.org/lindenlab/viewer into DRTVWR-559
| -rw-r--r-- | indra/llprimitive/llgltfmaterial.cpp | 43 | ||||
| -rw-r--r-- | indra/llprimitive/llgltfmaterial.h | 44 | ||||
| -rw-r--r-- | indra/llprimitive/lltextureentry.h | 2 | ||||
| -rw-r--r-- | indra/newview/lllocalgltfmaterials.cpp | 79 | ||||
| -rw-r--r-- | indra/newview/lllocalgltfmaterials.h | 7 | 
5 files changed, 125 insertions, 50 deletions
| diff --git a/indra/llprimitive/llgltfmaterial.cpp b/indra/llprimitive/llgltfmaterial.cpp index b9ef2de61a..8f08a8b2cf 100644 --- a/indra/llprimitive/llgltfmaterial.cpp +++ b/indra/llprimitive/llgltfmaterial.cpp @@ -37,7 +37,7 @@ LLGLTFMaterial::LLGLTFMaterial(const LLGLTFMaterial& rhs)  LLGLTFMaterial& LLGLTFMaterial::operator=(const LLGLTFMaterial& rhs)  { -    //have to do a manual operator= because of LLRefCount  +    //have to do a manual operator= because of LLRefCount      mBaseColorId = rhs.mBaseColorId;      mNormalId = rhs.mNormalId;      mMetallicRoughnessId = rhs.mMetallicRoughnessId; @@ -53,10 +53,7 @@ LLGLTFMaterial& LLGLTFMaterial::operator=(const LLGLTFMaterial& rhs)      mDoubleSided = rhs.mDoubleSided;      mAlphaMode = rhs.mAlphaMode; -    for (S32 i = 0; i < 3; ++i) -    { -        mTextureTransform[i] = rhs.mTextureTransform[i]; -    } +    mTextureTransform = rhs.mTextureTransform;      return *this;  } @@ -285,16 +282,31 @@ void LLGLTFMaterial::setRoughnessFactor(F32 roughness)  void LLGLTFMaterial::setAlphaMode(S32 mode)  { -    mAlphaMode = (AlphaMode)llclamp(mode, (S32)ALPHA_MODE_OPAQUE, (S32)ALPHA_MODE_MASK); +    mAlphaMode = (AlphaMode) llclamp(mode, (S32) ALPHA_MODE_OPAQUE, (S32) ALPHA_MODE_MASK);  }  void LLGLTFMaterial::setDoubleSided(bool double_sided)  { -    // sure, no clamping will ever be needed for a bool, but include the  +    // sure, no clamping will ever be needed for a bool, but include the      // setter for consistency with the clamping API      mDoubleSided = double_sided;  } +void LLGLTFMaterial::setTextureOffset(TextureInfo texture_info, const LLVector2& offset) +{ +    mTextureTransform[texture_info].mOffset = offset; +} + +void LLGLTFMaterial::setTextureScale(TextureInfo texture_info, const LLVector2& scale) +{ +    mTextureTransform[texture_info].mScale = scale; +} + +void LLGLTFMaterial::setTextureRotation(TextureInfo texture_info, float rotation) +{ +    mTextureTransform[texture_info].mRotation = rotation; +} +  // Default value accessors  LLUUID LLGLTFMaterial::getDefaultBaseColorId() @@ -324,7 +336,7 @@ F32 LLGLTFMaterial::getDefaultAlphaCutoff()  S32 LLGLTFMaterial::getDefaultAlphaMode()  { -    return (S32)ALPHA_MODE_OPAQUE; +    return (S32) ALPHA_MODE_OPAQUE;  }  F32 LLGLTFMaterial::getDefaultMetallicFactor() @@ -352,6 +364,21 @@ bool LLGLTFMaterial::getDefaultDoubleSided()      return false;  } +LLVector2 LLGLTFMaterial::getDefaultTextureOffset() +{ +    return LLVector2(0.f, 0.f); +} + +LLVector2 LLGLTFMaterial::getDefaultTextureScale() +{ +    return LLVector2(1.f, 1.f); +} + +F32 LLGLTFMaterial::getDefaultTextureRotation() +{ +    return 0.f; +} +  void LLGLTFMaterial::writeOverridesToModel(tinygltf::Model& model, S32 mat_index, LLGLTFMaterial const* base_material) const  {      if (model.materials.size() < mat_index + 1) diff --git a/indra/llprimitive/llgltfmaterial.h b/indra/llprimitive/llgltfmaterial.h index 32695d92f4..ea7e402805 100644 --- a/indra/llprimitive/llgltfmaterial.h +++ b/indra/llprimitive/llgltfmaterial.h @@ -79,13 +79,30 @@ public:      bool mDoubleSided = false;      AlphaMode mAlphaMode = ALPHA_MODE_OPAQUE; -    enum TextureTransformIdx : U32 +    // get a UUID based on a hash of this LLGLTFMaterial +    LLUUID getHash() const +    { +        LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE; +        LLMD5 md5; +        md5.update((unsigned char*)this, sizeof(this)); +        md5.finalize(); +        LLUUID id; +        md5.raw_digest(id.mData); +        // *TODO: Hash the overrides +        return id; +    } + +    enum TextureInfo : U32      { -        TEXTURE_TRANSFORM_DIFFUSE_EMISSIVE, -        TEXTURE_TRANSFORM_NORMAL, -        TEXTURE_TRANSFORM_METALLIC_ROUGHNESS +        GLTF_TEXTURE_INFO_BASE_COLOR, +        GLTF_TEXTURE_INFO_NORMAL, +        GLTF_TEXTURE_INFO_METALLIC_ROUGHNESS, +        GLTF_TEXTURE_INFO_EMISSIVE, + +        GLTF_TEXTURE_INFO_COUNT      }; -    TextureTransform mTextureTransform[3]; + +    std::array<TextureTransform, GLTF_TEXTURE_INFO_COUNT> mTextureTransform;      //setters for various members (will clamp to acceptable ranges) @@ -101,6 +118,9 @@ public:      void setRoughnessFactor(F32 roughness);      void setAlphaMode(S32 mode);      void setDoubleSided(bool double_sided); +    void setTextureOffset(TextureInfo texture_info, const LLVector2& offset); +    void setTextureScale(TextureInfo texture_info, const LLVector2& scale); +    void setTextureRotation(TextureInfo texture_info, float rotation);      // Default value accessors      static LLUUID getDefaultBaseColorId(); @@ -114,6 +134,9 @@ public:      static LLColor4 getDefaultBaseColor();      static LLColor3 getDefaultEmissiveColor();      static bool getDefaultDoubleSided(); +    static LLVector2 getDefaultTextureOffset(); +    static LLVector2 getDefaultTextureScale(); +    static F32 getDefaultTextureRotation();      // set mAlphaMode from string.      // Anything otherthan "MASK" or "BLEND" sets mAlphaMode to ALPHA_MODE_OPAQUE @@ -161,17 +184,6 @@ public:      // write to given tinygltf::Model      void writeToModel(tinygltf::Model& model, S32 mat_index) const; -    // get a UUID based on a hash of this LLGLTFMaterial -    LLUUID getHash() const -    { -        LLMD5 md5; -        md5.update((unsigned char*)this, sizeof(this)); -        md5.finalize(); -        LLUUID id; -        md5.raw_digest(id.mData); -        return id; -    } -      // calculate the fields in this material that differ from a base material and write them out to a given tinygltf::Model      void writeOverridesToModel(tinygltf::Model& model, S32 mat_index, LLGLTFMaterial const* base_material) const; diff --git a/indra/llprimitive/lltextureentry.h b/indra/llprimitive/lltextureentry.h index 2c932a10df..8dc3434a01 100644 --- a/indra/llprimitive/lltextureentry.h +++ b/indra/llprimitive/lltextureentry.h @@ -204,7 +204,7 @@ public:      // GLTF render material      // nuanced behavior here -- if there is no render material, fall back to getGLTFMaterial, but ONLY for the getter, not the setter -    LLGLTFMaterial* getGLTFRenderMaterial() const { return mGLTFRenderMaterial.notNull() ? mGLTFRenderMaterial : getGLTFMaterial(); } +    LLGLTFMaterial* getGLTFRenderMaterial() const { return mGLTFRenderMaterial.notNull() ? mGLTFRenderMaterial.get() : getGLTFMaterial(); }      S32 setGLTFRenderMaterial(LLGLTFMaterial* mat);  public: diff --git a/indra/newview/lllocalgltfmaterials.cpp b/indra/newview/lllocalgltfmaterials.cpp index f292844313..f194226fa5 100644 --- a/indra/newview/lllocalgltfmaterials.cpp +++ b/indra/newview/lllocalgltfmaterials.cpp @@ -152,18 +152,7 @@ bool LLLocalGLTFMaterial::updateSelf()              if (mLastModified.asString() != new_last_modified.asString())              { -                LLPointer<LLFetchedGLTFMaterial> raw_material; -                if (mWorldID.notNull()) -                { -                    // update existing material -                    // will create a new one if material doesn't exist yet -                    raw_material = (LLFetchedGLTFMaterial*)gGLTFMaterialList.getMaterial(mWorldID); -                } -                else -                { -                    raw_material = new LLFetchedGLTFMaterial(); -                } -                if (loadMaterial(raw_material, mMaterialIndex)) +                if (loadMaterial())                  {                      // decode is successful, we can safely proceed.                      if (mWorldID.isNull()) @@ -172,8 +161,10 @@ bool LLLocalGLTFMaterial::updateSelf()                      }                      mLastModified = new_last_modified; -                    // will replace material if it already exists -                    gGLTFMaterialList.addMaterial(mWorldID, raw_material); +                    // addMaterial will replace material witha a new +                    // pointer if value already exists but we are +                    // reusing existing pointer, so it should add only. +                    gGLTFMaterialList.addMaterial(mWorldID, mGLTFMaterial);                      mUpdateRetries = LL_LOCAL_UPDATE_RETRIES;                      updated = true; @@ -223,10 +214,21 @@ bool LLLocalGLTFMaterial::updateSelf()      return updated;  } -bool LLLocalGLTFMaterial::loadMaterial(LLPointer<LLGLTFMaterial> mat, S32 index) +bool LLLocalGLTFMaterial::loadMaterial()  {      bool decode_successful = false; +    if (mWorldID.notNull()) +    { +        // We should already have it, but update mGLTFMaterial just in case +        // will create a new one if material doesn't exist yet +        mGLTFMaterial = (LLFetchedGLTFMaterial*)gGLTFMaterialList.getMaterial(mWorldID); +    } +    else +    { +        mGLTFMaterial = new LLFetchedGLTFMaterial(); +    } +      switch (mExtension)      {      case ET_MATERIAL_GLTF: @@ -261,19 +263,19 @@ bool LLLocalGLTFMaterial::loadMaterial(LLPointer<LLGLTFMaterial> mat, S32 index)                  break;              } -            if (model_in.materials.size() <= index) +            if (model_in.materials.size() <= mMaterialIndex)              {                  // materials are missing -                LL_WARNS() << "Cannot load Material, Material " << index << " is missing, " << mFilename << LL_ENDL; +                LL_WARNS() << "Cannot load Material, Material " << mMaterialIndex << " is missing, " << mFilename << LL_ENDL;                  decode_successful = false;                  break;              }              // sets everything, but textures will have inaccurate ids -            mat->setFromModel(model_in, index); +            mGLTFMaterial->setFromModel(model_in, mMaterialIndex);              std::string folder = gDirUtilp->getDirName(filename_lc); -            tinygltf::Material material_in = model_in.materials[index]; +            tinygltf::Material material_in = model_in.materials[mMaterialIndex];              if (!material_in.name.empty())              { @@ -302,19 +304,50 @@ bool LLLocalGLTFMaterial::loadMaterial(LLPointer<LLGLTFMaterial> mat, S32 index)              if (mBaseColorFetched)              { -                mat->mBaseColorId= mBaseColorFetched->getID(); +                mBaseColorFetched->addTextureStats(64.f * 64.f, TRUE); +                mGLTFMaterial->mBaseColorId = mBaseColorFetched->getID(); +                mGLTFMaterial->mBaseColorTexture = mBaseColorFetched; +            } +            else +            { +                mGLTFMaterial->mBaseColorId = LLUUID::null; +                mGLTFMaterial->mBaseColorTexture = nullptr;              } +              if (mNormalFetched)              { -                mat->mNormalId = mNormalFetched->getID(); +                mNormalFetched->addTextureStats(64.f * 64.f, TRUE); +                mGLTFMaterial->mNormalId = mNormalFetched->getID(); +                mGLTFMaterial->mNormalTexture = mBaseColorFetched;              } +            else +            { +                mGLTFMaterial->mNormalId = LLUUID::null; +                mGLTFMaterial->mNormalTexture = nullptr; +            } +              if (mMRFetched)              { -                mat->mMetallicRoughnessId = mMRFetched->getID(); +                mMRFetched->addTextureStats(64.f * 64.f, TRUE); +                mGLTFMaterial->mMetallicRoughnessId = mMRFetched->getID(); +                mGLTFMaterial->mMetallicRoughnessTexture = mBaseColorFetched;              } +            else +            { +                mGLTFMaterial->mMetallicRoughnessId = LLUUID::null; +                mGLTFMaterial->mMetallicRoughnessTexture = nullptr; +            } +              if (mEmissiveFetched)              { -                mat->mEmissiveId = mEmissiveFetched->getID(); +                mEmissiveFetched->addTextureStats(64.f * 64.f, TRUE); +                mGLTFMaterial->mEmissiveId = mEmissiveFetched->getID(); +                mGLTFMaterial->mEmissiveTexture = mBaseColorFetched; +            } +            else +            { +                mGLTFMaterial->mEmissiveId = LLUUID::null; +                mGLTFMaterial->mEmissiveTexture = nullptr;              }              break; diff --git a/indra/newview/lllocalgltfmaterials.h b/indra/newview/lllocalgltfmaterials.h index f762dcc2ce..097f2ea30a 100644 --- a/indra/newview/lllocalgltfmaterials.h +++ b/indra/newview/lllocalgltfmaterials.h @@ -34,6 +34,7 @@ class LLScrollListCtrl;  class LLGLTFMaterial;  class LLViewerObject;  class LLViewerFetchedTexture; +class LLFetchedGLTFMaterial;  class LLLocalGLTFMaterial  { @@ -53,7 +54,7 @@ public:      bool updateSelf();  private: -    bool loadMaterial(LLPointer<LLGLTFMaterial> raw, S32 index); +    bool loadMaterial();  private: /* private enums */      enum ELinkStatus @@ -80,7 +81,9 @@ private: /* members */      S32         mUpdateRetries;      S32         mMaterialIndex; // Single file can have more than one -    // material needs to maintain textures +    // Maintain textures and material pointers to +    // make sure they won't be deleted in any way +    LLPointer<LLFetchedGLTFMaterial> mGLTFMaterial;      LLPointer<LLViewerFetchedTexture> mBaseColorFetched;      LLPointer<LLViewerFetchedTexture> mNormalFetched;      LLPointer<LLViewerFetchedTexture> mMRFetched; | 
