Merge branch 'DRTVWR-559' of ssh://bitbucket.org/lindenlab/viewer into DRTVWR-559
commit
581e40269c
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
TEXTURE_TRANSFORM_DIFFUSE_EMISSIVE,
|
||||
TEXTURE_TRANSFORM_NORMAL,
|
||||
TEXTURE_TRANSFORM_METALLIC_ROUGHNESS
|
||||
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
|
||||
{
|
||||
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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue