Merge branch 'DRTVWR-559' of https://bitbucket.org/lindenlab/viewer
commit
45fd8ee26b
|
|
@ -53,6 +53,8 @@ public:
|
|||
|
||||
F32 mMetallicFactor = 0.f;
|
||||
F32 mRoughnessFactor = 0.f;
|
||||
F32 mAlphaCutoff = 0.f;
|
||||
|
||||
bool mDoubleSided = false;
|
||||
AlphaMode mAlphaMode = ALPHA_MODE_OPAQUE;
|
||||
|
||||
|
|
|
|||
|
|
@ -1714,7 +1714,7 @@ BOOL LLNetworkData::isValid(U16 param_type, U32 size)
|
|||
case PARAMS_EXTENDED_MESH:
|
||||
return (size == 4);
|
||||
case PARAMS_RENDER_MATERIAL:
|
||||
return (size == 16);
|
||||
return (size > 1);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
|
|
@ -2326,18 +2326,32 @@ LLRenderMaterialParams::LLRenderMaterialParams()
|
|||
mType = PARAMS_RENDER_MATERIAL;
|
||||
}
|
||||
|
||||
BOOL LLRenderMaterialParams::pack(LLDataPacker &dp) const
|
||||
BOOL LLRenderMaterialParams::pack(LLDataPacker& dp) const
|
||||
{
|
||||
return dp.packUUID(mMaterial, "material");
|
||||
U8 count = (U8)llmin((S32)mEntries.size(), 14); //limited to 255 bytes, no more than 14 material ids
|
||||
|
||||
// return TRUE;
|
||||
dp.packU8(count, "count");
|
||||
for (auto& entry : mEntries)
|
||||
{
|
||||
dp.packU8(entry.te_idx, "te_idx");
|
||||
dp.packUUID(entry.id, "id");
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
BOOL LLRenderMaterialParams::unpack(LLDataPacker &dp)
|
||||
BOOL LLRenderMaterialParams::unpack(LLDataPacker& dp)
|
||||
{
|
||||
return dp.unpackUUID(mMaterial, "material");
|
||||
U8 count;
|
||||
dp.unpackU8(count, "count");
|
||||
mEntries.resize(count);
|
||||
for (auto& entry : mEntries)
|
||||
{
|
||||
dp.unpackU8(entry.te_idx, "te_idx");
|
||||
dp.unpackUUID(entry.id, "te_id");
|
||||
}
|
||||
|
||||
// return TRUE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
bool LLRenderMaterialParams::operator==(const LLNetworkData& data) const
|
||||
|
|
@ -2347,40 +2361,99 @@ bool LLRenderMaterialParams::operator==(const LLNetworkData& data) const
|
|||
return false;
|
||||
}
|
||||
|
||||
const LLRenderMaterialParams ¶m = static_cast<const LLRenderMaterialParams&>(data);
|
||||
const LLRenderMaterialParams& param = static_cast<const LLRenderMaterialParams&>(data);
|
||||
|
||||
return param.mMaterial == mMaterial;
|
||||
if (param.mEntries.size() != mEntries.size())
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
for (auto& entry : mEntries)
|
||||
{
|
||||
if (param.getMaterial(entry.te_idx) != entry.id)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void LLRenderMaterialParams::copy(const LLNetworkData& data)
|
||||
{
|
||||
llassert_always(data.mType == PARAMS_RENDER_MATERIAL);
|
||||
const LLRenderMaterialParams ¶m = static_cast<const LLRenderMaterialParams&>(data);
|
||||
mMaterial = param.mMaterial;
|
||||
const LLRenderMaterialParams& param = static_cast<const LLRenderMaterialParams&>(data);
|
||||
mEntries = param.mEntries;
|
||||
}
|
||||
|
||||
LLSD LLRenderMaterialParams::asLLSD() const
|
||||
{
|
||||
return llsd::map("material", mMaterial);
|
||||
LLSD ret;
|
||||
|
||||
for (int i = 0; i < mEntries.size(); ++i)
|
||||
{
|
||||
ret[i]["te_idx"] = mEntries[i].te_idx;
|
||||
ret[i]["id"] = mEntries[i].id;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool LLRenderMaterialParams::fromLLSD(LLSD& sd)
|
||||
{
|
||||
if (sd.has("material"))
|
||||
if (sd.isArray())
|
||||
{
|
||||
setMaterial(sd["material"]);
|
||||
mEntries.resize(sd.size());
|
||||
for (int i = 0; i < sd.size(); ++i)
|
||||
{
|
||||
if (sd[i].has("te_idx") && sd.has("id"))
|
||||
{
|
||||
mEntries[i].te_idx = sd[i]["te_idx"].asInteger();
|
||||
mEntries[i].id = sd[i]["id"].asUUID();
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void LLRenderMaterialParams::setMaterial(const LLUUID & id)
|
||||
void LLRenderMaterialParams::setMaterial(U8 te, const LLUUID& id)
|
||||
{
|
||||
mMaterial = id;
|
||||
for (int i = 0; i < mEntries.size(); ++i)
|
||||
{
|
||||
if (mEntries[i].te_idx == te)
|
||||
{
|
||||
if (id.isNull())
|
||||
{
|
||||
mEntries.erase(mEntries.begin() + i);
|
||||
}
|
||||
else
|
||||
{
|
||||
mEntries[i].id = id;
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
mEntries.push_back({ te, id });
|
||||
}
|
||||
|
||||
LLUUID LLRenderMaterialParams::getMaterial() const
|
||||
const LLUUID& LLRenderMaterialParams::getMaterial(U8 te) const
|
||||
{
|
||||
return mMaterial;
|
||||
for (int i = 0; i < mEntries.size(); ++i)
|
||||
{
|
||||
if (mEntries[i].te_idx == te)
|
||||
{
|
||||
return mEntries[i].id;
|
||||
}
|
||||
}
|
||||
|
||||
return LLUUID::null;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -377,22 +377,30 @@ public:
|
|||
class LLRenderMaterialParams : public LLNetworkData
|
||||
{
|
||||
private:
|
||||
LLUUID mMaterial;
|
||||
struct Entry
|
||||
{
|
||||
U8 te_idx;
|
||||
LLUUID id;
|
||||
};
|
||||
std::vector< Entry > mEntries;
|
||||
|
||||
public:
|
||||
LLRenderMaterialParams();
|
||||
BOOL pack(LLDataPacker &dp) const override;
|
||||
BOOL unpack(LLDataPacker &dp) override;
|
||||
BOOL pack(LLDataPacker& dp) const override;
|
||||
BOOL unpack(LLDataPacker& dp) override;
|
||||
bool operator==(const LLNetworkData& data) const override;
|
||||
void copy(const LLNetworkData& data) override;
|
||||
LLSD asLLSD() const;
|
||||
operator LLSD() const { return asLLSD(); }
|
||||
bool fromLLSD(LLSD& sd);
|
||||
|
||||
void setMaterial(const LLUUID & id);
|
||||
LLUUID getMaterial() const;
|
||||
void setMaterial(U8 te_idx, const LLUUID& id);
|
||||
const LLUUID& getMaterial(U8 te_idx) const;
|
||||
|
||||
bool isEmpty() { return mEntries.empty(); }
|
||||
};
|
||||
|
||||
|
||||
// This code is not naming-standards compliant. Leaving it like this for
|
||||
// now to make the connection to code in
|
||||
// BOOL packTEMessage(LLDataPacker &dp) const;
|
||||
|
|
@ -489,12 +497,12 @@ public:
|
|||
virtual S32 setTEMediaFlags(const U8 te, const U8 flags);
|
||||
virtual S32 setTEGlow(const U8 te, const F32 glow);
|
||||
virtual S32 setTEMaterialID(const U8 te, const LLMaterialID& pMaterialID);
|
||||
virtual S32 setTEMaterialParams(const U8 index, const LLMaterialPtr pMaterialParams);
|
||||
virtual S32 setTEMaterialParams(const U8 index, const LLMaterialPtr pMaterialParams);
|
||||
virtual BOOL setMaterial(const U8 material); // returns TRUE if material changed
|
||||
virtual void setTESelected(const U8 te, bool sel);
|
||||
|
||||
LLMaterialPtr getTEMaterialParams(const U8 index);
|
||||
|
||||
|
||||
void copyTEs(const LLPrimitive *primitive);
|
||||
S32 packTEField(U8 *cur_ptr, U8 *data_ptr, U8 data_size, U8 last_face_index, EMsgVariableType type) const;
|
||||
BOOL packTEMessage(LLMessageSystem *mesgsys) const;
|
||||
|
|
@ -572,6 +580,8 @@ public:
|
|||
static LLPCode legacyToPCode(const U8 legacy);
|
||||
static U8 pCodeToLegacy(const LLPCode pcode);
|
||||
static bool getTESTAxes(const U8 face, U32* s_axis, U32* t_axis);
|
||||
|
||||
BOOL hasRenderMaterialParams() const;
|
||||
|
||||
inline static BOOL isPrimitive(const LLPCode pcode);
|
||||
inline static BOOL isApp(const LLPCode pcode);
|
||||
|
|
|
|||
|
|
@ -460,6 +460,7 @@ set(viewer_SOURCE_FILES
|
|||
llgesturemgr.cpp
|
||||
llgiveinventory.cpp
|
||||
llglsandbox.cpp
|
||||
llgltfmateriallist.cpp
|
||||
llgroupactions.cpp
|
||||
llgroupiconctrl.cpp
|
||||
llgrouplist.cpp
|
||||
|
|
@ -1243,6 +1244,7 @@ set(viewer_HEADER_FILES
|
|||
llgesturelistener.h
|
||||
llgesturemgr.h
|
||||
llgiveinventory.h
|
||||
llgltfmateriallist.h
|
||||
llgroupactions.h
|
||||
llgroupiconctrl.h
|
||||
llgrouplist.h
|
||||
|
|
|
|||
|
|
@ -23,6 +23,7 @@
|
|||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#define PBR_GGX_APPROX 1
|
||||
#define DEBUG_PBR_PACKORM0 0 // Rough=0, Metal=0
|
||||
#define DEBUG_PBR_PACKORM1 0 // Rough=1, Metal=1
|
||||
#define DEBUG_PBR_TANGENT1 1 // Tangent = 1,0,0
|
||||
|
|
@ -47,12 +48,20 @@
|
|||
|
||||
#define DEBUG_PBR_BRDF_SCALE_BIAS 0 // Output: red green BRDF Scale Bias (GGX output)
|
||||
#define DEBUG_PBR_BRDF_UV 0 // Output: red green BRDF UV (GGX input)
|
||||
#define DEBUG_PBR_DIFFUSE_K 0 // Output: diffuse FssEssLambert + FmsEms
|
||||
#define DEBUG_PBR_FE_GGX 0 // Output: FssEssGGX
|
||||
|
||||
// Diffuse
|
||||
#define DEBUG_PBR_DIFFUSE_C 0 // Output: diffuse non metal mix
|
||||
#define DEBUG_PBR_IRRADIANCE 0 // Output: Diffuse Irradiance
|
||||
#define DEBUG_PBR_FE_LAMBERT 0 // Output: FssEssLambert
|
||||
#define DEBUG_PBR_EMS 0 // Output: Ems
|
||||
#define DEBUG_PBR_AVG 0 // Output: Avg
|
||||
#define DEBUG_PBR_EMS_FMS 0 // Output: FmsEms
|
||||
#define DEBUG_PBR_DIFFUSE_K 0 // Output: diffuse FssEssLambert + FmsEms
|
||||
#define DEBUG_PBR_DIFFUSE_PRE_AO 0 // Output: diffuse pre AO
|
||||
|
||||
#define DEBUG_PBR_FE_GGX 0 // Output: FssEssGGX
|
||||
#define DEBUG_PBR_FRESNEL 0 // Output: roughness dependent fresnel
|
||||
#define DEBUG_PBR_IOR 0 // Output: grayscale IOR
|
||||
#define DEBUG_PBR_IRRADIANCE 0 // Output: Diffuse Irradiance
|
||||
#define DEBUG_PBR_KSPEC 0 // Output: K spec
|
||||
#define DEBUG_PBR_REFLECT0_BASE 0 // Output: black reflect0 default from ior
|
||||
#define DEBUG_PBR_REFLECT0_MIX 0 // Output: diffuse reflect0 calculated from ior
|
||||
|
|
@ -60,6 +69,7 @@
|
|||
#define DEBUG_PBR_REFLECTION 0 // Output: reflection dir
|
||||
#define DEBUG_PBR_SPEC 0 // Output: Final spec
|
||||
#define DEBUG_PBR_SPEC_REFLECTION 0 // Output: environment reflection
|
||||
#define DEBUG_PBR_SPEC_WEIGHT 0 // Output: specWeight
|
||||
#define DEBUG_PBR_V2C_RAW 0 // Output: vertex2camera
|
||||
#define DEBUG_PBR_V2C_REMAP 0 // Output: vertex2camera (remap [-1,1] -> [0,1])
|
||||
#extension GL_ARB_texture_rectangle : enable
|
||||
|
|
@ -141,7 +151,9 @@ vec2 getGGX( vec2 brdfPoint )
|
|||
{
|
||||
// TODO: use GGXLUT
|
||||
// texture2D(GGXLUT, brdfPoint).rg;
|
||||
#if PBR_GGX_APPROX
|
||||
return getGGXApprox( brdfPoint);
|
||||
#endif
|
||||
}
|
||||
|
||||
vec3 calcBaseReflect0(float ior)
|
||||
|
|
@ -222,6 +234,7 @@ void main()
|
|||
#endif
|
||||
|
||||
float metal = packedORM.b;
|
||||
vec3 c_diff = mix(diffuse.rgb,vec3(0),metal);
|
||||
vec3 reflect90 = vec3(0);
|
||||
vec3 v = -normalize(pos.xyz);
|
||||
#if DEBUG_PBR_VERT2CAM1
|
||||
|
|
@ -273,12 +286,17 @@ void main()
|
|||
// Reference: getIBLRadianceLambertian
|
||||
vec3 FssEssLambert = specWeight * kSpec * vScaleBias.x + vScaleBias.y; // NOTE: Very similar to FssEssRadiance but with extra specWeight term
|
||||
float Ems = (1.0 - vScaleBias.x + vScaleBias.y);
|
||||
#if PBR_GGX_APPROX
|
||||
Ems = alphaRough; // With GGX approximation Ems = 0 so use substitute
|
||||
#endif
|
||||
vec3 avg = specWeight * (reflect0 + (1.0 - reflect0) / 21.0);
|
||||
vec3 AvgEms = avg * Ems;
|
||||
vec3 FmsEms = AvgEms * FssEssLambert / (1.0 - AvgEms);
|
||||
vec3 kDiffuse = colorDiffuse * (1.0 - FssEssLambert + FmsEms);
|
||||
vec3 kDiffuse = c_diff * (1.0 - FssEssLambert + FmsEms);
|
||||
colorDiffuse += (FmsEms + kDiffuse) * irradiance;
|
||||
|
||||
#if DEBUG_PBR_DIFFUSE_PRE_AO
|
||||
vec3 debug_diffuse = colorDiffuse;
|
||||
#endif
|
||||
colorDiffuse *= packedORM.r; // Occlusion -- NOTE: pbropaque will need occlusion_strength pre-multiplied into spec.r
|
||||
|
||||
color.rgb = colorDiffuse + colorEmissive + colorSpec;
|
||||
|
|
@ -324,18 +342,36 @@ void main()
|
|||
color.rgb = vec3(dotBV);
|
||||
#endif
|
||||
|
||||
#if DEBUG_PBR_AVG
|
||||
color.rgb = avg;
|
||||
#endif
|
||||
#if DEBUG_PBR_BRDF_UV
|
||||
color.rgb = vec3(brdfPoint,0.0);
|
||||
#endif
|
||||
#if DEBUG_PBR_BRDF_SCALE_BIAS
|
||||
color.rgb = vec3(vScaleBias,0.0);
|
||||
#endif
|
||||
#if DEBUG_PBR_DIFFUSE_C
|
||||
color.rgb = c_diff;
|
||||
#endif
|
||||
#if DEBUG_PBR_DIFFUSE_K
|
||||
color.rgb = kDiffuse;
|
||||
#endif
|
||||
#if DEBUG_PBR_DIFFUSE_MAP
|
||||
color.rgb = diffuse.rgb;
|
||||
#endif
|
||||
#if DEBUG_PBR_DIFFUSE_PRE_AO
|
||||
color.rgb = debug_diffuse;
|
||||
#endif
|
||||
#if DEBUG_PBR_EMS
|
||||
color.rgb = vec3(Ems);
|
||||
#endif
|
||||
#if DEBUG_PBR_EMS_AVG
|
||||
color.rgb = AvgEms;
|
||||
#endif
|
||||
#if DEBUG_PBR_EMS_FMS
|
||||
color.rgb = FmsEms;
|
||||
#endif
|
||||
#if DEBUG_PBR_FE_GGX
|
||||
color.rgb = FssEssGGX; // spec
|
||||
#endif
|
||||
|
|
@ -372,6 +408,9 @@ void main()
|
|||
#if DEBUG_PBR_SPEC_REFLECTION
|
||||
color.rgb = specLight;
|
||||
#endif
|
||||
#if DEBUG_PBR_SPEC_WEIGHT
|
||||
color.rgb = vec3(specWeight);
|
||||
#endif
|
||||
#if DEBUG_PBR_V2C_RAW
|
||||
color.rgb = v;
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -0,0 +1,186 @@
|
|||
/**
|
||||
* @file llgltfmateriallist.cpp
|
||||
*
|
||||
* $LicenseInfo:firstyear=2022&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2022, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
#include "llviewerprecompiledheaders.h"
|
||||
|
||||
#include "llgltfmateriallist.h"
|
||||
|
||||
#include "llassetstorage.h"
|
||||
#include "llfilesystem.h"
|
||||
#include "llsdserialize.h"
|
||||
|
||||
#include "tinygltf/tiny_gltf.h"
|
||||
#include <strstream>
|
||||
|
||||
LLGLTFMaterialList gGLTFMaterialList;
|
||||
|
||||
static LLColor4 get_color(const std::vector<double>& in)
|
||||
{
|
||||
LLColor4 out;
|
||||
for (S32 i = 0; i < llmin((S32)in.size(), 4); ++i)
|
||||
{
|
||||
out.mV[i] = in[i];
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
static void set_from_model(LLGLTFMaterial* mat, tinygltf::Model& model)
|
||||
{
|
||||
|
||||
S32 index;
|
||||
|
||||
auto& material_in = model.materials[0];
|
||||
|
||||
// get albedo texture
|
||||
index = material_in.pbrMetallicRoughness.baseColorTexture.index;
|
||||
if (index >= 0)
|
||||
{
|
||||
mat->mAlbedoId.set(model.images[index].uri);
|
||||
}
|
||||
else
|
||||
{
|
||||
mat->mAlbedoId.setNull();
|
||||
}
|
||||
|
||||
// get normal map
|
||||
index = material_in.normalTexture.index;
|
||||
if (index >= 0)
|
||||
{
|
||||
mat->mNormalId.set(model.images[index].uri);
|
||||
}
|
||||
else
|
||||
{
|
||||
mat->mNormalId.setNull();
|
||||
}
|
||||
|
||||
// get metallic-roughness texture
|
||||
index = material_in.pbrMetallicRoughness.metallicRoughnessTexture.index;
|
||||
if (index >= 0)
|
||||
{
|
||||
mat->mMetallicRoughnessId.set(model.images[index].uri);
|
||||
}
|
||||
else
|
||||
{
|
||||
mat->mMetallicRoughnessId.setNull();
|
||||
}
|
||||
|
||||
// get emissive texture
|
||||
index = material_in.emissiveTexture.index;
|
||||
if (index >= 0)
|
||||
{
|
||||
mat->mEmissiveId.set(model.images[index].uri);
|
||||
}
|
||||
else
|
||||
{
|
||||
mat->mEmissiveId.setNull();
|
||||
}
|
||||
|
||||
mat->setAlphaMode(material_in.alphaMode);
|
||||
mat->mAlphaCutoff = material_in.alphaCutoff;
|
||||
|
||||
mat->mAlbedoColor = get_color(material_in.pbrMetallicRoughness.baseColorFactor);
|
||||
mat->mEmissiveColor = get_color(material_in.emissiveFactor);
|
||||
|
||||
mat->mMetallicFactor = material_in.pbrMetallicRoughness.metallicFactor;
|
||||
mat->mRoughnessFactor = material_in.pbrMetallicRoughness.roughnessFactor;
|
||||
|
||||
mat->mDoubleSided = material_in.doubleSided;
|
||||
}
|
||||
|
||||
LLGLTFMaterial* LLGLTFMaterialList::getMaterial(const LLUUID& id)
|
||||
{
|
||||
List::iterator iter = mList.find(id);
|
||||
if (iter == mList.end())
|
||||
{
|
||||
LLGLTFMaterial* mat = new LLGLTFMaterial();
|
||||
mList[id] = mat;
|
||||
|
||||
mat->ref();
|
||||
|
||||
gAssetStorage->getAssetData(id, LLAssetType::AT_MATERIAL,
|
||||
[=](const LLUUID& id, LLAssetType::EType asset_type, void* user_data, S32 status, LLExtStat ext_status)
|
||||
{
|
||||
if (status)
|
||||
{
|
||||
LL_WARNS() << "Error getting material asset data: " << LLAssetStorage::getErrorString(status) << " (" << status << ")" << LL_ENDL;
|
||||
}
|
||||
|
||||
LLFileSystem file(id, asset_type, LLFileSystem::READ);
|
||||
|
||||
std::vector<char> buffer;
|
||||
buffer.resize(file.getSize());
|
||||
file.read((U8*)&buffer[0], buffer.size());
|
||||
|
||||
LLSD asset;
|
||||
|
||||
// read file into buffer
|
||||
std::istrstream str(&buffer[0], buffer.size());
|
||||
|
||||
if (LLSDSerialize::deserialize(asset, str, buffer.size()))
|
||||
{
|
||||
if (asset.has("version") && asset["version"] == "1.0")
|
||||
{
|
||||
if (asset.has("type") && asset["type"].asString() == "GLTF 2.0")
|
||||
{
|
||||
if (asset.has("data") && asset["data"].isString())
|
||||
{
|
||||
std::string data = asset["data"];
|
||||
|
||||
tinygltf::TinyGLTF gltf;
|
||||
tinygltf::TinyGLTF loader;
|
||||
std::string error_msg;
|
||||
std::string warn_msg;
|
||||
|
||||
tinygltf::Model model_in;
|
||||
|
||||
if (loader.LoadASCIIFromString(&model_in, &error_msg, &warn_msg, data.c_str(), data.length(), ""))
|
||||
{
|
||||
set_from_model(mat, model_in);
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << "Failed to decode material asset: " << LL_ENDL;
|
||||
LL_WARNS() << warn_msg << LL_ENDL;
|
||||
LL_WARNS() << error_msg << LL_ENDL;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << "Failed to deserialize material LLSD" << LL_ENDL;
|
||||
}
|
||||
|
||||
mat->unref();
|
||||
}, nullptr);
|
||||
|
||||
return mat;
|
||||
}
|
||||
|
||||
return iter->second;
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
/**
|
||||
* @file llgltfmateriallist.h
|
||||
*
|
||||
* $LicenseInfo:firstyear=2022&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2022, Linden Research, Inc.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation;
|
||||
* version 2.1 of the License only.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*
|
||||
* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
|
||||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "llgltfmaterial.h"
|
||||
#include "llpointer.h"
|
||||
|
||||
#include <unordered_map>
|
||||
|
||||
class LLGLTFMaterialList
|
||||
{
|
||||
public:
|
||||
LLGLTFMaterialList() {}
|
||||
|
||||
typedef std::unordered_map<LLUUID, LLPointer<LLGLTFMaterial > > List;
|
||||
List mList;
|
||||
|
||||
LLGLTFMaterial* getMaterial(const LLUUID& id);
|
||||
|
||||
};
|
||||
|
||||
extern LLGLTFMaterialList gGLTFMaterialList;
|
||||
|
||||
|
||||
|
|
@ -4880,6 +4880,7 @@ BOOL LLFolderBridge::dragOrDrop(MASK mask, BOOL drop,
|
|||
case DAD_GESTURE:
|
||||
case DAD_MESH:
|
||||
case DAD_SETTINGS:
|
||||
case DAD_MATERIAL:
|
||||
accept = dragItemIntoFolder(inv_item, drop, tooltip_msg);
|
||||
break;
|
||||
case DAD_LINK:
|
||||
|
|
@ -6667,6 +6668,7 @@ BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop,
|
|||
case DAD_GESTURE:
|
||||
case DAD_MESH:
|
||||
case DAD_SETTINGS:
|
||||
case DAD_MATERIAL:
|
||||
{
|
||||
LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data;
|
||||
const LLPermissions& perm = inv_item->getPermissions();
|
||||
|
|
|
|||
|
|
@ -43,7 +43,6 @@
|
|||
#include "llviewerregion.h"
|
||||
#include "llvovolume.h"
|
||||
#include "roles_constants.h"
|
||||
#include "tinygltf/tiny_gltf.h"
|
||||
#include "llviewerobjectlist.h"
|
||||
#include "llfloaterreg.h"
|
||||
#include "llfilesystem.h"
|
||||
|
|
@ -52,6 +51,7 @@
|
|||
#include "llviewertexturelist.h"
|
||||
#include "llfloaterperms.h"
|
||||
|
||||
#include "tinygltf/tiny_gltf.h"
|
||||
#include <strstream>
|
||||
|
||||
///----------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -158,6 +158,7 @@ BOOL LLGroupDropTarget::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
|
|||
case DAD_CALLINGCARD:
|
||||
case DAD_MESH:
|
||||
case DAD_SETTINGS:
|
||||
case DAD_MATERIAL:
|
||||
{
|
||||
LLViewerInventoryItem* inv_item = (LLViewerInventoryItem*)cargo_data;
|
||||
if(gInventory.getItem(inv_item->getUUID())
|
||||
|
|
|
|||
|
|
@ -835,6 +835,7 @@ BOOL LLTaskCategoryBridge::dragOrDrop(MASK mask, BOOL drop,
|
|||
case DAD_CALLINGCARD:
|
||||
case DAD_MESH:
|
||||
case DAD_SETTINGS:
|
||||
case DAD_MATERIAL:
|
||||
accept = LLToolDragAndDrop::isInventoryDropAcceptable(object, (LLViewerInventoryItem*)cargo_data);
|
||||
if(accept && drop)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -265,7 +265,8 @@ LLToolDragAndDrop::LLDragAndDropDictionary::LLDragAndDropDictionary()
|
|||
// |-------------------------------|----------------------------------------------|-----------------------------------------------|---------------------------------------------------|--------------------------------|
|
||||
addEntry(DAD_NONE, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL));
|
||||
addEntry(DAD_TEXTURE, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dTextureObject, &LLToolDragAndDrop::dad3dNULL));
|
||||
addEntry(DAD_SOUND, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
|
||||
addEntry(DAD_MATERIAL, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dMaterialObject, &LLToolDragAndDrop::dad3dNULL));
|
||||
addEntry(DAD_SOUND, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
|
||||
addEntry(DAD_CALLINGCARD, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
|
||||
addEntry(DAD_LANDMARK, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
|
||||
addEntry(DAD_SCRIPT, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dRezScript, &LLToolDragAndDrop::dad3dNULL));
|
||||
|
|
@ -280,6 +281,7 @@ LLToolDragAndDrop::LLDragAndDropDictionary::LLDragAndDropDictionary()
|
|||
addEntry(DAD_LINK, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL));
|
||||
addEntry(DAD_MESH, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dMeshObject, &LLToolDragAndDrop::dad3dNULL));
|
||||
addEntry(DAD_SETTINGS, new DragAndDropEntry(&LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dNULL, &LLToolDragAndDrop::dad3dGiveInventory, &LLToolDragAndDrop::dad3dUpdateInventory, &LLToolDragAndDrop::dad3dNULL));
|
||||
|
||||
// TODO: animation on self could play it? edit it?
|
||||
// TODO: gesture on self could play it? edit it?
|
||||
};
|
||||
|
|
@ -1071,6 +1073,64 @@ void LLToolDragAndDrop::dropTextureAllFaces(LLViewerObject* hit_obj,
|
|||
hit_obj->sendTEUpdate();
|
||||
}
|
||||
|
||||
|
||||
void LLToolDragAndDrop::dropMaterialOneFace(LLViewerObject* hit_obj,
|
||||
S32 hit_face,
|
||||
LLInventoryItem* item,
|
||||
LLToolDragAndDrop::ESource source,
|
||||
const LLUUID& src_id)
|
||||
{
|
||||
if (hit_face == -1) return;
|
||||
if (!item || item->getInventoryType() != LLInventoryType::IT_MATERIAL)
|
||||
{
|
||||
LL_WARNS() << "LLToolDragAndDrop::dropTextureOneFace no material item." << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
LLUUID asset_id = item->getAssetUUID();
|
||||
BOOL success = handleDropTextureProtections(hit_obj, item, source, src_id);
|
||||
if (!success)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
hit_obj->setRenderMaterialID(hit_face, asset_id);
|
||||
|
||||
dialog_refresh_all();
|
||||
|
||||
// send the update to the simulator
|
||||
hit_obj->sendTEUpdate();
|
||||
}
|
||||
|
||||
|
||||
void LLToolDragAndDrop::dropMaterialAllFaces(LLViewerObject* hit_obj,
|
||||
LLInventoryItem* item,
|
||||
LLToolDragAndDrop::ESource source,
|
||||
const LLUUID& src_id)
|
||||
{
|
||||
if (!item || item->getInventoryType() != LLInventoryType::IT_MATERIAL)
|
||||
{
|
||||
LL_WARNS() << "LLToolDragAndDrop::dropTextureAllFaces no material item." << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
LLUUID asset_id = item->getAssetUUID();
|
||||
BOOL success = handleDropTextureProtections(hit_obj, item, source, src_id);
|
||||
if (!success)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
S32 num_faces = hit_obj->getNumTEs();
|
||||
for (S32 face = 0; face < num_faces; face++)
|
||||
{
|
||||
// update viewer side material in anticipation of update from simulator
|
||||
hit_obj->setRenderMaterialID(face, asset_id);
|
||||
dialog_refresh_all();
|
||||
}
|
||||
// send the update to the simulator
|
||||
hit_obj->sendTEUpdate();
|
||||
}
|
||||
|
||||
|
||||
void LLToolDragAndDrop::dropMesh(LLViewerObject* hit_obj,
|
||||
LLInventoryItem* item,
|
||||
LLToolDragAndDrop::ESource source,
|
||||
|
|
@ -1676,6 +1736,7 @@ bool LLToolDragAndDrop::handleGiveDragAndDrop(LLUUID dest_agent, LLUUID session_
|
|||
case DAD_MESH:
|
||||
case DAD_CATEGORY:
|
||||
case DAD_SETTINGS:
|
||||
case DAD_MATERIAL:
|
||||
{
|
||||
LLInventoryObject* inv_obj = (LLInventoryObject*)cargo_data;
|
||||
if(gInventory.getCategory(inv_obj->getUUID()) || (gInventory.getItem(inv_obj->getUUID())
|
||||
|
|
@ -2066,6 +2127,17 @@ EAcceptance LLToolDragAndDrop::dad3dApplyToObject(
|
|||
dropTextureOneFace(obj, face, item, mSource, mSourceID);
|
||||
}
|
||||
}
|
||||
else if (cargo_type == DAD_MATERIAL)
|
||||
{
|
||||
if ((mask & MASK_SHIFT))
|
||||
{
|
||||
dropMaterialAllFaces(obj, item, mSource, mSourceID);
|
||||
}
|
||||
else
|
||||
{
|
||||
dropMaterialOneFace(obj, face, item, mSource, mSourceID);
|
||||
}
|
||||
}
|
||||
else if (cargo_type == DAD_MESH)
|
||||
{
|
||||
dropMesh(obj, item, mSource, mSourceID);
|
||||
|
|
@ -2094,6 +2166,12 @@ EAcceptance LLToolDragAndDrop::dad3dTextureObject(
|
|||
return dad3dApplyToObject(obj, face, mask, drop, DAD_TEXTURE);
|
||||
}
|
||||
|
||||
EAcceptance LLToolDragAndDrop::dad3dMaterialObject(
|
||||
LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
|
||||
{
|
||||
return dad3dApplyToObject(obj, face, mask, drop, DAD_MATERIAL);
|
||||
}
|
||||
|
||||
EAcceptance LLToolDragAndDrop::dad3dMeshObject(
|
||||
LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -168,6 +168,8 @@ protected:
|
|||
MASK mask, BOOL drop);
|
||||
EAcceptance dad3dTextureObject(LLViewerObject* obj, S32 face,
|
||||
MASK mask, BOOL drop);
|
||||
EAcceptance dad3dMaterialObject(LLViewerObject* obj, S32 face,
|
||||
MASK mask, BOOL drop);
|
||||
EAcceptance dad3dMeshObject(LLViewerObject* obj, S32 face,
|
||||
MASK mask, BOOL drop);
|
||||
// EAcceptance dad3dTextureSelf(LLViewerObject* obj, S32 face,
|
||||
|
|
@ -249,6 +251,14 @@ public:
|
|||
LLInventoryItem* item,
|
||||
ESource source,
|
||||
const LLUUID& src_id);
|
||||
static void dropMaterialOneFace(LLViewerObject* hit_obj, S32 hit_face,
|
||||
LLInventoryItem* item,
|
||||
ESource source,
|
||||
const LLUUID& src_id);
|
||||
static void dropMaterialAllFaces(LLViewerObject* hit_obj,
|
||||
LLInventoryItem* item,
|
||||
ESource source,
|
||||
const LLUUID& src_id);
|
||||
static void dropMesh(LLViewerObject* hit_obj,
|
||||
LLInventoryItem* item,
|
||||
ESource source,
|
||||
|
|
|
|||
|
|
@ -107,6 +107,7 @@
|
|||
#include "llcleanup.h"
|
||||
#include "llcallstack.h"
|
||||
#include "llmeshrepository.h"
|
||||
#include "llgltfmateriallist.h"
|
||||
#include "llgl.h"
|
||||
// [RLVa:KB] - Checked: 2011-05-22 (RLVa-1.3.1a)
|
||||
#include "rlvactions.h"
|
||||
|
|
@ -5075,6 +5076,18 @@ void LLViewerObject::updateTEMaterialTextures(U8 te)
|
|||
};
|
||||
|
||||
LLGLTFMaterial* mat = getTE(te)->getGLTFMaterial();
|
||||
LLUUID mat_id = getRenderMaterialID(te);
|
||||
if (mat == nullptr && mat_id.notNull())
|
||||
{
|
||||
mat = gGLTFMaterialList.getMaterial(mat_id);
|
||||
getTE(te)->setGLTFMaterial(mat);
|
||||
}
|
||||
else if (mat_id.isNull() && mat != nullptr)
|
||||
{
|
||||
mat = nullptr;
|
||||
getTE(te)->setGLTFMaterial(nullptr);
|
||||
}
|
||||
|
||||
if (mat != nullptr)
|
||||
{
|
||||
mGLTFAlbedoMaps[te] = fetch_texture(mat->mAlbedoId);
|
||||
|
|
@ -5082,6 +5095,14 @@ void LLViewerObject::updateTEMaterialTextures(U8 te)
|
|||
mGLTFMetallicRoughnessMaps[te] = fetch_texture(mat->mMetallicRoughnessId);
|
||||
mGLTFEmissiveMaps[te] = fetch_texture(mat->mEmissiveId);
|
||||
}
|
||||
else
|
||||
{
|
||||
mGLTFAlbedoMaps[te] = nullptr;
|
||||
mGLTFNormalMaps[te] = nullptr;
|
||||
mGLTFMetallicRoughnessMaps[te] = nullptr;
|
||||
mGLTFEmissiveMaps[te] = nullptr;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void LLViewerObject::refreshBakeTexture()
|
||||
|
|
@ -7174,6 +7195,69 @@ LLVOAvatar* LLViewerObject::getAvatar() const
|
|||
return NULL;
|
||||
}
|
||||
|
||||
bool LLViewerObject::hasRenderMaterialParams() const
|
||||
{
|
||||
return getParameterEntryInUse(LLNetworkData::PARAMS_RENDER_MATERIAL);
|
||||
}
|
||||
|
||||
void LLViewerObject::setHasRenderMaterialParams(bool has_materials)
|
||||
{
|
||||
bool had_materials = hasRenderMaterialParams();
|
||||
|
||||
if (had_materials != has_materials)
|
||||
{
|
||||
if (has_materials)
|
||||
{
|
||||
setParameterEntryInUse(LLNetworkData::PARAMS_RENDER_MATERIAL, TRUE, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
setParameterEntryInUse(LLNetworkData::PARAMS_RENDER_MATERIAL, FALSE, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const LLUUID& LLViewerObject::getRenderMaterialID(U8 te) const
|
||||
{
|
||||
LLRenderMaterialParams* param_block = (LLRenderMaterialParams*)getParameterEntry(LLNetworkData::PARAMS_RENDER_MATERIAL);
|
||||
if (param_block)
|
||||
{
|
||||
return param_block->getMaterial(te);
|
||||
}
|
||||
|
||||
return LLUUID::null;
|
||||
}
|
||||
|
||||
void LLViewerObject::setRenderMaterialID(U8 te, const LLUUID& id)
|
||||
{
|
||||
if (id.notNull())
|
||||
{
|
||||
getTE(te)->setGLTFMaterial(gGLTFMaterialList.getMaterial(id));
|
||||
setHasRenderMaterialParams(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
getTE(te)->setGLTFMaterial(nullptr);
|
||||
}
|
||||
|
||||
faceMappingChanged();
|
||||
gPipeline.markTextured(mDrawable);
|
||||
|
||||
LLRenderMaterialParams* param_block = (LLRenderMaterialParams*)getParameterEntry(LLNetworkData::PARAMS_RENDER_MATERIAL);
|
||||
if (param_block)
|
||||
{
|
||||
param_block->setMaterial(te, id);
|
||||
|
||||
if (param_block->isEmpty())
|
||||
{ // might be empty if id is null
|
||||
setHasRenderMaterialParams(false);
|
||||
}
|
||||
else
|
||||
{
|
||||
parameterChanged(LLNetworkData::PARAMS_RENDER_MATERIAL, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class ObjectPhysicsProperties : public LLHTTPNode
|
||||
{
|
||||
|
|
|
|||
|
|
@ -181,6 +181,13 @@ public:
|
|||
const std::string& getAttachmentItemName() const;
|
||||
|
||||
virtual LLVOAvatar* getAvatar() const; //get the avatar this object is attached to, or NULL if object is not an attachment
|
||||
|
||||
bool hasRenderMaterialParams() const;
|
||||
void setHasRenderMaterialParams(bool has_params);
|
||||
|
||||
const LLUUID& getRenderMaterialID(U8 te) const;
|
||||
void setRenderMaterialID(U8 te, const LLUUID& id);
|
||||
|
||||
virtual BOOL isHUDAttachment() const { return FALSE; }
|
||||
virtual BOOL isTempAttachment() const;
|
||||
|
||||
|
|
@ -203,6 +210,7 @@ public:
|
|||
|
||||
// Graphical stuff for objects - maybe broken out into render class later?
|
||||
virtual void updateTextures();
|
||||
virtual void faceMappingChanged() {}
|
||||
virtual void boostTexturePriority(BOOL boost_children = TRUE); // When you just want to boost priority of this object
|
||||
|
||||
virtual LLDrawable* createDrawable(LLPipeline *pipeline);
|
||||
|
|
|
|||
|
|
@ -956,6 +956,7 @@ BOOL LLViewerTextEditor::handleDragAndDrop(S32 x, S32 y, MASK mask,
|
|||
case DAD_ANIMATION:
|
||||
case DAD_GESTURE:
|
||||
case DAD_MESH:
|
||||
case DAD_MATERIAL:
|
||||
{
|
||||
supported = true;
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -2353,6 +2353,7 @@ void LLVOVolume::setNumTEs(const U8 num_tes)
|
|||
return ;
|
||||
}
|
||||
|
||||
|
||||
//virtual
|
||||
void LLVOVolume::changeTEImage(S32 index, LLViewerTexture* imagep)
|
||||
{
|
||||
|
|
@ -3692,6 +3693,11 @@ F32 LLVOVolume::getLightCutoff() const
|
|||
}
|
||||
}
|
||||
|
||||
BOOL LLVOVolume::isReflectionProbe() const
|
||||
{
|
||||
return getParameterEntryInUse(LLNetworkData::PARAMS_REFLECTION_PROBE);
|
||||
}
|
||||
|
||||
void LLVOVolume::setIsReflectionProbe(BOOL is_probe)
|
||||
{
|
||||
BOOL was_probe = isReflectionProbe();
|
||||
|
|
@ -3762,25 +3768,6 @@ void LLVOVolume::setReflectionProbeIsDynamic(bool is_dynamic)
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
BOOL LLVOVolume::isReflectionProbe() const
|
||||
{
|
||||
// HACK - make this object a Reflection Probe if a certain UUID is detected
|
||||
static LLCachedControl<std::string> reflection_probe_id(gSavedSettings, "RenderReflectionProbeTextureHackID", "");
|
||||
LLUUID probe_id(reflection_probe_id);
|
||||
|
||||
for (U8 i = 0; i < getNumTEs(); ++i)
|
||||
{
|
||||
if (getTE(i)->getID() == probe_id)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
// END HACK
|
||||
|
||||
return getParameterEntryInUse(LLNetworkData::PARAMS_REFLECTION_PROBE);
|
||||
}
|
||||
|
||||
F32 LLVOVolume::getReflectionProbeAmbiance() const
|
||||
{
|
||||
const LLReflectionProbeParams* param_block = (const LLReflectionProbeParams*)getParameterEntry(LLNetworkData::PARAMS_REFLECTION_PROBE);
|
||||
|
|
@ -6195,6 +6182,8 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
|
|||
continue;
|
||||
}
|
||||
|
||||
// HACK -- brute force this check every time a drawable gets rebuilt
|
||||
vobj->updateTEMaterialTextures(i);
|
||||
#if 0
|
||||
#if LL_RELEASE_WITH_DEBUG_INFO
|
||||
const LLUUID pbr_id( "49c88210-7238-2a6b-70ac-92d4f35963cf" );
|
||||
|
|
|
|||
|
|
@ -177,7 +177,7 @@ public:
|
|||
|
||||
void markForUpdate(BOOL priority) override;
|
||||
void markForUnload() { LLViewerObject::markForUnload(TRUE); mVolumeChanged = TRUE; }
|
||||
void faceMappingChanged() { mFaceMappingChanged=TRUE; };
|
||||
void faceMappingChanged() override { mFaceMappingChanged=TRUE; }
|
||||
|
||||
/*virtual*/ void onShift(const LLVector4a &shift_vector) override; // Called when the drawable shifts
|
||||
|
||||
|
|
@ -289,7 +289,7 @@ public:
|
|||
F32 getLightRadius() const;
|
||||
F32 getLightFalloff(const F32 fudge_factor = 1.f) const;
|
||||
F32 getLightCutoff() const;
|
||||
|
||||
|
||||
// Reflection Probes
|
||||
void setIsReflectionProbe(BOOL is_probe);
|
||||
void setReflectionProbeAmbiance(F32 ambiance);
|
||||
|
|
|
|||
Loading…
Reference in New Issue