Merge branch 'DRTVWR-559' of https://github.com/secondlife/viewer
# Conflicts: # indra/newview/app_settings/settings.xml # scripts/messages/message_template.msg.sha1master
commit
0514918bed
|
|
@ -15,9 +15,6 @@ jobs:
|
|||
configuration: [ReleaseOS]
|
||||
addrsize: [64]
|
||||
include:
|
||||
- runner: windows-large
|
||||
configuration: ReleaseOS
|
||||
addrsize: 32
|
||||
- runner: macos-12-xl
|
||||
developer_dir: "/Applications/Xcode_14.0.1.app/Contents/Developer"
|
||||
runs-on: ${{ matrix.runner }}
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@
|
|||
#include "llfasttimer.h"
|
||||
#include "v3colorutil.h"
|
||||
|
||||
|
||||
//=========================================================================
|
||||
namespace
|
||||
{
|
||||
|
|
@ -135,6 +136,8 @@ const std::string LLSettingsSky::SETTING_REFLECTION_PROBE_AMBIANCE("reflection_p
|
|||
|
||||
const LLUUID LLSettingsSky::DEFAULT_ASSET_ID("651510b8-5f4d-8991-1592-e7eeab2a5a06");
|
||||
|
||||
F32 LLSettingsSky::sAutoAdjustProbeAmbiance = 1.f;
|
||||
|
||||
static const LLUUID DEFAULT_SUN_ID("32bfbcea-24b1-fb9d-1ef9-48a28a63730f"); // dataserver
|
||||
static const LLUUID DEFAULT_MOON_ID("d07f6eed-b96a-47cd-b51d-400ad4a1c428"); // dataserver
|
||||
static const LLUUID DEFAULT_CLOUD_ID("1dc1368f-e8fe-f02d-a08d-9d9f11c1af6b");
|
||||
|
|
@ -1442,7 +1445,7 @@ F32 LLSettingsSky::getReflectionProbeAmbiance(bool auto_adjust) const
|
|||
{
|
||||
if (auto_adjust && canAutoAdjust())
|
||||
{
|
||||
return 1.f;
|
||||
return sAutoAdjustProbeAmbiance;
|
||||
}
|
||||
|
||||
return mSettings[SETTING_REFLECTION_PROBE_AMBIANCE].asReal();
|
||||
|
|
@ -1450,6 +1453,7 @@ F32 LLSettingsSky::getReflectionProbeAmbiance(bool auto_adjust) const
|
|||
|
||||
F32 LLSettingsSky::getTotalReflectionProbeAmbiance(F32 cloud_shadow_scale, bool auto_adjust) const
|
||||
{
|
||||
#if 0
|
||||
// feed cloud shadow back into reflection probe ambiance to mimic pre-reflection-probe behavior
|
||||
// without brightening dark/interior spaces
|
||||
F32 probe_ambiance = getReflectionProbeAmbiance(auto_adjust);
|
||||
|
|
@ -1460,6 +1464,9 @@ F32 LLSettingsSky::getTotalReflectionProbeAmbiance(F32 cloud_shadow_scale, bool
|
|||
}
|
||||
|
||||
return probe_ambiance;
|
||||
#else
|
||||
return getReflectionProbeAmbiance(auto_adjust);
|
||||
#endif
|
||||
}
|
||||
|
||||
F32 LLSettingsSky::getSkyBottomRadius() const
|
||||
|
|
|
|||
|
|
@ -103,6 +103,8 @@ public:
|
|||
|
||||
static const LLUUID DEFAULT_ASSET_ID;
|
||||
|
||||
static F32 sAutoAdjustProbeAmbiance;
|
||||
|
||||
typedef PTR_NAMESPACE::shared_ptr<LLSettingsSky> ptr_t;
|
||||
|
||||
//---------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@ set(llmessage_SOURCE_FILES
|
|||
lldispatcher.cpp
|
||||
llexperiencecache.cpp
|
||||
llfiltersd2xmlrpc.cpp
|
||||
llgenericstreamingmessage.cpp
|
||||
llhost.cpp
|
||||
llhttpnode.cpp
|
||||
llhttpsdhandler.cpp
|
||||
|
|
@ -120,6 +121,7 @@ set(llmessage_HEADER_FILES
|
|||
llextendedstatus.h
|
||||
llfiltersd2xmlrpc.h
|
||||
llfollowcamparams.h
|
||||
llgenericstreamingmessage.h
|
||||
llhost.h
|
||||
llhttpnode.h
|
||||
llhttpnodeadapter.h
|
||||
|
|
|
|||
|
|
@ -0,0 +1,72 @@
|
|||
/**
|
||||
* @file llgenericstreamingmessage.cpp
|
||||
* @brief Generic Streaming Message helpers. Shared between viewer and simulator.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2023&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2023, 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 "linden_common.h"
|
||||
|
||||
#include "llgenericstreamingmessage.h"
|
||||
|
||||
#include "message.h"
|
||||
|
||||
void LLGenericStreamingMessage::send(LLMessageSystem* msg)
|
||||
{
|
||||
#if 0 // viewer cannot send GenericStreamingMessage
|
||||
msg->newMessageFast(_PREHASH_GenericStreamingMessage);
|
||||
|
||||
if (mData.size() < 1024 * 7)
|
||||
{ // disable warning about big messages unless we're sending a REALLY big message
|
||||
msg->tempDisableWarnAboutBigMessage();
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS("Messaging") << "Attempted to send too large GenericStreamingMessage, dropping." << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
msg->nextBlockFast(_PREHASH_MethodData);
|
||||
msg->addU16Fast(_PREHASH_Method, mMethod);
|
||||
msg->nextBlockFast(_PREHASH_DataBlock);
|
||||
msg->addStringFast(_PREHASH_Data, mData.c_str());
|
||||
#endif
|
||||
}
|
||||
|
||||
void LLGenericStreamingMessage::unpack(LLMessageSystem* msg)
|
||||
{
|
||||
U16* m = (U16*)&mMethod; // squirrely pass enum as U16 by reference
|
||||
msg->getU16Fast(_PREHASH_MethodData, _PREHASH_Method, *m);
|
||||
|
||||
constexpr int MAX_SIZE = 7 * 1024;
|
||||
|
||||
char buffer[MAX_SIZE];
|
||||
|
||||
// NOTE: don't use getStringFast to avoid 1200 byte truncation
|
||||
U32 size = msg->getSizeFast(_PREHASH_DataBlock, _PREHASH_Data);
|
||||
msg->getBinaryDataFast(_PREHASH_DataBlock, _PREHASH_Data, buffer, size, 0, MAX_SIZE);
|
||||
|
||||
mData.assign(buffer, size);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
/**
|
||||
* @file llgenericstreamingmessage.h
|
||||
* @brief Generic Streaming Message helpers. Shared between viewer and simulator.
|
||||
*
|
||||
* $LicenseInfo:firstyear=2023&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2023, 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 <string>
|
||||
#include "stdtypes.h"
|
||||
|
||||
class LLMessageSystem;
|
||||
|
||||
class LLGenericStreamingMessage
|
||||
{
|
||||
public:
|
||||
enum Method : U16
|
||||
{
|
||||
METHOD_GLTF_MATERIAL_OVERRIDE = 0x4175,
|
||||
METHOD_UNKNOWN = 0xFFFF,
|
||||
};
|
||||
|
||||
void send(LLMessageSystem* msg);
|
||||
void unpack(LLMessageSystem* msg);
|
||||
|
||||
Method mMethod = METHOD_UNKNOWN;
|
||||
std::string mData;
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -1370,6 +1370,7 @@ char const* const _PREHASH_MuteType = LLMessageStringTable::getInstance()->getSt
|
|||
char const* const _PREHASH_IMViaEMail = LLMessageStringTable::getInstance()->getString("IMViaEMail");
|
||||
char const* const _PREHASH_RentPrice = LLMessageStringTable::getInstance()->getString("RentPrice");
|
||||
char const* const _PREHASH_GenericMessage = LLMessageStringTable::getInstance()->getString("GenericMessage");
|
||||
char const* const _PREHASH_GenericStreamingMessage = LLMessageStringTable::getInstance()->getString("GenericStreamingMessage");
|
||||
char const* const _PREHASH_ChildAgentAlive = LLMessageStringTable::getInstance()->getString("ChildAgentAlive");
|
||||
char const* const _PREHASH_AssetType = LLMessageStringTable::getInstance()->getString("AssetType");
|
||||
char const* const _PREHASH_SpawnPointBlock = LLMessageStringTable::getInstance()->getString("SpawnPointBlock");
|
||||
|
|
|
|||
|
|
@ -1370,6 +1370,7 @@ extern char const* const _PREHASH_MuteType;
|
|||
extern char const* const _PREHASH_IMViaEMail;
|
||||
extern char const* const _PREHASH_RentPrice;
|
||||
extern char const* const _PREHASH_GenericMessage;
|
||||
extern char const* const _PREHASH_GenericStreamingMessage;
|
||||
extern char const* const _PREHASH_ChildAgentAlive;
|
||||
extern char const* const _PREHASH_AssetType;
|
||||
extern char const* const _PREHASH_SpawnPointBlock;
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@
|
|||
#include "linden_common.h"
|
||||
|
||||
#include "llgltfmaterial.h"
|
||||
#include "llsdserialize.h"
|
||||
|
||||
// NOTE -- this should be the one and only place tiny_gltf.h is included
|
||||
#include "tinygltf/tiny_gltf.h"
|
||||
|
|
@ -693,6 +694,177 @@ void LLGLTFMaterial::applyOverride(const LLGLTFMaterial& override_mat)
|
|||
}
|
||||
}
|
||||
|
||||
void LLGLTFMaterial::getOverrideLLSD(const LLGLTFMaterial& override_mat, LLSD& data)
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED;
|
||||
llassert(data.isUndefined());
|
||||
|
||||
// make every effort to shave bytes here
|
||||
|
||||
for (int i = 0; i < GLTF_TEXTURE_INFO_COUNT; ++i)
|
||||
{
|
||||
LLUUID& texture_id = mTextureId[i];
|
||||
const LLUUID& override_texture_id = override_mat.mTextureId[i];
|
||||
if (override_texture_id.notNull() && override_texture_id != texture_id)
|
||||
{
|
||||
data["tex"][i] = LLSD::UUID(override_texture_id);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (override_mat.mBaseColor != getDefaultBaseColor())
|
||||
{
|
||||
data["bc"] = override_mat.mBaseColor.getValue();
|
||||
}
|
||||
|
||||
if (override_mat.mEmissiveColor != getDefaultEmissiveColor())
|
||||
{
|
||||
data["ec"] = override_mat.mEmissiveColor.getValue();
|
||||
}
|
||||
|
||||
if (override_mat.mMetallicFactor != getDefaultMetallicFactor())
|
||||
{
|
||||
data["mf"] = override_mat.mMetallicFactor;
|
||||
}
|
||||
|
||||
if (override_mat.mRoughnessFactor != getDefaultRoughnessFactor())
|
||||
{
|
||||
data["rf"] = override_mat.mRoughnessFactor;
|
||||
}
|
||||
|
||||
if (override_mat.mAlphaMode != getDefaultAlphaMode() || override_mat.mOverrideAlphaMode)
|
||||
{
|
||||
data["am"] = override_mat.mAlphaMode;
|
||||
}
|
||||
|
||||
if (override_mat.mAlphaCutoff != getDefaultAlphaCutoff())
|
||||
{
|
||||
data["ac"] = override_mat.mAlphaCutoff;
|
||||
}
|
||||
|
||||
if (override_mat.mDoubleSided != getDefaultDoubleSided() || override_mat.mOverrideDoubleSided)
|
||||
{
|
||||
data["ds"] = override_mat.mDoubleSided;
|
||||
}
|
||||
|
||||
for (int i = 0; i < GLTF_TEXTURE_INFO_COUNT; ++i)
|
||||
{
|
||||
if (override_mat.mTextureTransform[i].mOffset != getDefaultTextureOffset())
|
||||
{
|
||||
data["ti"][i]["o"] = override_mat.mTextureTransform[i].mOffset.getValue();
|
||||
}
|
||||
|
||||
if (override_mat.mTextureTransform[i].mScale != getDefaultTextureScale())
|
||||
{
|
||||
data["ti"][i]["s"] = override_mat.mTextureTransform[i].mScale.getValue();
|
||||
}
|
||||
|
||||
if (override_mat.mTextureTransform[i].mRotation != getDefaultTextureRotation())
|
||||
{
|
||||
data["ti"][i]["r"] = override_mat.mTextureTransform[i].mRotation;
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
{
|
||||
std::ostringstream ostr;
|
||||
LLSDSerialize::serialize(data, ostr, LLSDSerialize::LLSD_NOTATION);
|
||||
std::string param_str(ostr.str());
|
||||
LL_INFOS() << param_str << LL_ENDL;
|
||||
LL_INFOS() << "Notation size: " << param_str.size() << LL_ENDL;
|
||||
}
|
||||
|
||||
{
|
||||
std::ostringstream ostr;
|
||||
LLSDSerialize::serialize(data, ostr, LLSDSerialize::LLSD_BINARY);
|
||||
std::string param_str(ostr.str());
|
||||
LL_INFOS() << "Binary size: " << param_str.size() << LL_ENDL;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
void LLGLTFMaterial::applyOverrideLLSD(const LLSD& data)
|
||||
{
|
||||
const LLSD& tex = data["tex"];
|
||||
|
||||
if (tex.isArray())
|
||||
{
|
||||
for (int i = 0; i < tex.size(); ++i)
|
||||
{
|
||||
mTextureId[i] = tex[i].asUUID();
|
||||
}
|
||||
}
|
||||
|
||||
const LLSD& bc = data["bc"];
|
||||
if (bc.isDefined())
|
||||
{
|
||||
mBaseColor.setValue(bc);
|
||||
}
|
||||
|
||||
const LLSD& ec = data["ec"];
|
||||
if (ec.isDefined())
|
||||
{
|
||||
mEmissiveColor.setValue(ec);
|
||||
}
|
||||
|
||||
const LLSD& mf = data["mf"];
|
||||
if (mf.isReal())
|
||||
{
|
||||
mMetallicFactor = mf.asReal();
|
||||
}
|
||||
|
||||
const LLSD& rf = data["rf"];
|
||||
if (rf.isReal())
|
||||
{
|
||||
mRoughnessFactor = rf.asReal();
|
||||
}
|
||||
|
||||
const LLSD& am = data["am"];
|
||||
if (am.isInteger())
|
||||
{
|
||||
mAlphaMode = (AlphaMode) am.asInteger();
|
||||
}
|
||||
|
||||
const LLSD& ac = data["ac"];
|
||||
if (ac.isReal())
|
||||
{
|
||||
mAlphaCutoff = ac.asReal();
|
||||
}
|
||||
|
||||
const LLSD& ds = data["ds"];
|
||||
if (data.isBoolean())
|
||||
{
|
||||
mDoubleSided = ds.asBoolean();
|
||||
mOverrideDoubleSided = true;
|
||||
}
|
||||
|
||||
const LLSD& ti = data["ti"];
|
||||
if (ti.isArray())
|
||||
{
|
||||
for (int i = 0; i < GLTF_TEXTURE_INFO_COUNT; ++i)
|
||||
{
|
||||
const LLSD& o = ti[i]["o"];
|
||||
if (o.isDefined())
|
||||
{
|
||||
mTextureTransform[i].mOffset.setValue(o);
|
||||
}
|
||||
|
||||
const LLSD& s = ti[i]["s"];
|
||||
if (s.isDefined())
|
||||
{
|
||||
mTextureTransform[i].mScale.setValue(s);
|
||||
}
|
||||
|
||||
const LLSD& r = ti[i]["r"];
|
||||
if (r.isReal())
|
||||
{
|
||||
mTextureTransform[i].mRotation = r.asReal();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LLUUID LLGLTFMaterial::getHash() const
|
||||
{
|
||||
LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE;
|
||||
|
|
|
|||
|
|
@ -176,6 +176,7 @@ public:
|
|||
// get the contents of this LLGLTFMaterial as a json string
|
||||
std::string asJSON(bool prettyprint = false) const;
|
||||
|
||||
|
||||
// initialize from given tinygltf::Model
|
||||
// model - the model to reference
|
||||
// mat_index - index of material in model's material array
|
||||
|
|
@ -185,6 +186,14 @@ public:
|
|||
void writeToModel(tinygltf::Model& model, S32 mat_index) const;
|
||||
|
||||
void applyOverride(const LLGLTFMaterial& override_mat);
|
||||
|
||||
// apply the given LLSD override data
|
||||
void applyOverrideLLSD(const LLSD& data);
|
||||
|
||||
// Get the given override on this LLGLTFMaterial as LLSD
|
||||
// override_mat -- the override source data
|
||||
// data -- output LLSD object (should be passed in empty)
|
||||
void getOverrideLLSD(const LLGLTFMaterial& override_mat, LLSD& data);
|
||||
|
||||
// For base materials only (i.e. assets). Clears transforms to
|
||||
// default since they're not supported in assets yet.
|
||||
|
|
|
|||
|
|
@ -996,8 +996,8 @@ void LLRender::syncLightState()
|
|||
shader->uniform3fv(LLShaderMgr::LIGHT_AMBIENT, 1, mAmbientLightColor.mV);
|
||||
shader->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_primary[0] ? 1 : 0);
|
||||
//shader->uniform3fv(LLShaderMgr::AMBIENT, 1, mAmbientLightColor.mV);
|
||||
shader->uniform3fv(LLShaderMgr::SUNLIGHT_COLOR, 1, diffuse[0].mV);
|
||||
shader->uniform3fv(LLShaderMgr::MOONLIGHT_COLOR, 1, diffuse_b[0].mV);
|
||||
//shader->uniform3fv(LLShaderMgr::SUNLIGHT_COLOR, 1, diffuse[0].mV);
|
||||
//shader->uniform3fv(LLShaderMgr::MOONLIGHT_COLOR, 1, diffuse_b[0].mV);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1273,6 +1273,8 @@ void LLShaderMgr::initAttribsAndUniforms()
|
|||
mReservedUniforms.push_back("sunlight_color");
|
||||
mReservedUniforms.push_back("ambient_color");
|
||||
mReservedUniforms.push_back("sky_hdr_scale");
|
||||
mReservedUniforms.push_back("sky_sunlight_scale");
|
||||
mReservedUniforms.push_back("sky_ambient_scale");
|
||||
mReservedUniforms.push_back("blue_horizon");
|
||||
mReservedUniforms.push_back("blue_density");
|
||||
mReservedUniforms.push_back("haze_horizon");
|
||||
|
|
|
|||
|
|
@ -103,6 +103,8 @@ public:
|
|||
SUNLIGHT_COLOR, // "sunlight_color"
|
||||
AMBIENT, // "ambient_color"
|
||||
SKY_HDR_SCALE, // "sky_hdr_scale"
|
||||
SKY_SUNLIGHT_SCALE, // "sky_sunlight_scale"
|
||||
SKY_AMBIENT_SCALE, // "sky_ambient_scale"
|
||||
BLUE_HORIZON, // "blue_horizon"
|
||||
BLUE_DENSITY, // "blue_density"
|
||||
HAZE_HORIZON, // "haze_horizon"
|
||||
|
|
|
|||
|
|
@ -13765,7 +13765,7 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>0.5</real>
|
||||
<real>1.0</real>
|
||||
</map>
|
||||
<key>RenderSkyAutoAdjustHDRScale</key>
|
||||
<map>
|
||||
|
|
@ -13778,6 +13778,73 @@ Change of this parameter will affect the layout of buttons in notification toast
|
|||
<key>Value</key>
|
||||
<real>2.0</real>
|
||||
</map>
|
||||
<key>RendeSkyAutoAdjustBlueHorizonScale</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Blue Horizon Scale value to use when auto-adjusting legacy skies</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>1.0</real>
|
||||
</map>
|
||||
<key>RendeSkyAutoAdjustBlueDensityScale</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Blue Horizon Scale value to use when auto-adjusting legacy skies</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>1.0</real>
|
||||
</map>
|
||||
<key>RenderSkyAutoAdjustSunColorScale</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Sun color scalar when auto-adjusting legacy skies</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>1.0</real>
|
||||
</map>
|
||||
<key>RenderSkyAutoAdjustProbeAmbiance</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Probe ambiance value when auto-adjusting legacy skies</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>0.001</real>
|
||||
</map>
|
||||
<key>RenderSkySunlightScale</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Sunlight scale fudge factor for matching with pre-PBR viewer</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>1.0</real>
|
||||
</map>
|
||||
<key>RenderSkyAmbientScale</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Ambient scale fudge factor for matching with pre-PBR viewer</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>0.7</real>
|
||||
</map>
|
||||
|
||||
<key>RenderReflectionProbeMaxLocalLightAmbiance</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
|
|
@ -105,7 +105,8 @@ vec3 toneMap(vec3 color)
|
|||
|
||||
color *= exposure * exp_scale;
|
||||
|
||||
color = toneMapACES_Hill(color);
|
||||
// mix ACES and Linear here as a compromise to avoid over-darkening legacy content
|
||||
color = mix(toneMapACES_Hill(color), color, 0.333);
|
||||
#endif
|
||||
|
||||
return color;
|
||||
|
|
|
|||
|
|
@ -39,7 +39,8 @@ uniform float max_y;
|
|||
uniform vec3 glow;
|
||||
uniform float scene_light_strength;
|
||||
uniform float sun_moon_glow_factor;
|
||||
uniform float sky_hdr_scale;
|
||||
uniform float sky_sunlight_scale;
|
||||
uniform float sky_ambient_scale;
|
||||
|
||||
float getAmbientClamp() { return 1.0f; }
|
||||
|
||||
|
|
@ -148,12 +149,9 @@ void calcAtmosphericVarsLinear(vec3 inPositionEye, vec3 norm, vec3 light_dir, ou
|
|||
|
||||
// multiply to get similar colors as when the "scaleSoftClip" implementation was doubling color values
|
||||
// (allows for mixing of light sources other than sunlight e.g. reflection probes)
|
||||
sunlit *= 1.5;
|
||||
amblit *= 0.5;
|
||||
sunlit *= sky_sunlight_scale;
|
||||
amblit *= sky_ambient_scale;
|
||||
|
||||
// override amblit with ambient_color if sky probe ambiance is not zero
|
||||
amblit = mix(amblit, ambient_color, clamp(sky_hdr_scale-1.0, 0.0, 1.0));
|
||||
|
||||
amblit = srgb_to_linear(amblit);
|
||||
amblit *= ambientLighting(norm, light_dir);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@ float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen);
|
|||
float getAmbientClamp();
|
||||
|
||||
void sampleReflectionProbesLegacy(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv,
|
||||
vec2 tc, vec3 pos, vec3 norm, float glossiness, float envIntensity, bool transparent);
|
||||
vec2 tc, vec3 pos, vec3 norm, float glossiness, float envIntensity, bool transparent, vec3 amblit_linear);
|
||||
|
||||
vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 diffuse, vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight, float ambiance)
|
||||
{
|
||||
|
|
@ -251,7 +251,7 @@ void main()
|
|||
vec3 irradiance;
|
||||
vec3 glossenv;
|
||||
vec3 legacyenv;
|
||||
sampleReflectionProbesLegacy(irradiance, glossenv, legacyenv, frag, pos.xyz, norm.xyz, 0.0, 0.0, true);
|
||||
sampleReflectionProbesLegacy(irradiance, glossenv, legacyenv, frag, pos.xyz, norm.xyz, 0.0, 0.0, true, amblit_linear);
|
||||
|
||||
|
||||
float da = dot(norm.xyz, light_dir.xyz);
|
||||
|
|
@ -266,7 +266,7 @@ void main()
|
|||
|
||||
vec3 sun_contrib = min(final_da, shadow) * sunlit_linear;
|
||||
|
||||
color.rgb = max(amblit, irradiance);
|
||||
color.rgb = irradiance;
|
||||
|
||||
color.rgb += sun_contrib;
|
||||
|
||||
|
|
|
|||
|
|
@ -92,7 +92,7 @@ void calcHalfVectors(vec3 lv, vec3 n, vec3 v, out vec3 h, out vec3 l, out float
|
|||
float calcLegacyDistanceAttenuation(float distance, float falloff);
|
||||
float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen);
|
||||
void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv,
|
||||
vec2 tc, vec3 pos, vec3 norm, float glossiness, bool transparent);
|
||||
vec2 tc, vec3 pos, vec3 norm, float glossiness, bool transparent, vec3 amblit_linear);
|
||||
|
||||
void waterClip(vec3 pos);
|
||||
|
||||
|
|
@ -224,11 +224,8 @@ void main()
|
|||
float gloss = 1.0 - perceptualRoughness;
|
||||
vec3 irradiance = vec3(0);
|
||||
vec3 radiance = vec3(0);
|
||||
sampleReflectionProbes(irradiance, radiance, vary_position.xy*0.5+0.5, pos.xyz, norm.xyz, gloss, true);
|
||||
// Take maximium of legacy ambient vs irradiance sample as irradiance
|
||||
// NOTE: ao is applied in pbrIbl (see pbrBaseLight), do not apply here
|
||||
irradiance = max(amblit,irradiance);
|
||||
|
||||
sampleReflectionProbes(irradiance, radiance, vary_position.xy*0.5+0.5, pos.xyz, norm.xyz, gloss, true, amblit);
|
||||
|
||||
vec3 diffuseColor;
|
||||
vec3 specularColor;
|
||||
calcDiffuseSpecular(col.rgb, metallic, diffuseColor, specularColor);
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ uniform mat3 env_mat;
|
|||
vec3 srgb_to_linear(vec3 c);
|
||||
|
||||
void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv,
|
||||
vec2 tc, vec3 pos, vec3 norm, float glossiness, bool transparent)
|
||||
vec2 tc, vec3 pos, vec3 norm, float glossiness, bool transparent, vec3 amblit_linear)
|
||||
{
|
||||
ambenv = vec3(reflection_probe_ambiance * 0.25);
|
||||
|
||||
|
|
@ -44,9 +44,9 @@ void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv,
|
|||
}
|
||||
|
||||
void sampleReflectionProbesWater(inout vec3 ambenv, inout vec3 glossenv,
|
||||
vec2 tc, vec3 pos, vec3 norm, float glossiness)
|
||||
vec2 tc, vec3 pos, vec3 norm, float glossiness, vec3 amblit_linear)
|
||||
{
|
||||
sampleReflectionProbes(ambenv, glossenv, tc, pos, norm, glossiness, false);
|
||||
sampleReflectionProbes(ambenv, glossenv, tc, pos, norm, glossiness, false, amblit_linear);
|
||||
}
|
||||
|
||||
vec4 sampleReflectionProbesDebug(vec3 pos)
|
||||
|
|
@ -56,7 +56,7 @@ vec4 sampleReflectionProbesDebug(vec3 pos)
|
|||
}
|
||||
|
||||
void sampleReflectionProbesLegacy(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv,
|
||||
vec2 tc, vec3 pos, vec3 norm, float glossiness, float envIntensity, bool transparent)
|
||||
vec2 tc, vec3 pos, vec3 norm, float glossiness, float envIntensity, bool transparent, vec3 amblit_linear)
|
||||
{
|
||||
ambenv = vec3(reflection_probe_ambiance * 0.25);
|
||||
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ vec3 srgb_to_linear(vec3 c);
|
|||
|
||||
// reflection probe interface
|
||||
void sampleReflectionProbesLegacy(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv,
|
||||
vec2 tc, vec3 pos, vec3 norm, float glossiness, float envIntensity, bool transparent);
|
||||
vec2 tc, vec3 pos, vec3 norm, float glossiness, float envIntensity, bool transparent, vec3 amblit_linear);
|
||||
|
||||
void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity);
|
||||
|
||||
|
|
@ -80,7 +80,7 @@ void main()
|
|||
vec3 legacyenv;
|
||||
vec3 norm = normalize(vary_texcoord1.xyz);
|
||||
vec4 spec = vec4(0,0,0,0);
|
||||
sampleReflectionProbesLegacy(ambenv, glossenv, legacyenv, vec2(0), pos.xyz, norm.xyz, spec.a, env_intensity, false);
|
||||
sampleReflectionProbesLegacy(ambenv, glossenv, legacyenv, vec2(0), pos.xyz, norm.xyz, spec.a, env_intensity, false, amblit);
|
||||
|
||||
color.rgb = legacy_adjust(color.rgb);
|
||||
color.rgb = srgb_to_linear(color.rgb);
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen);
|
|||
#endif
|
||||
|
||||
void sampleReflectionProbesLegacy(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv,
|
||||
vec2 tc, vec3 pos, vec3 norm, float glossiness, float envIntensity, bool transparent);
|
||||
vec2 tc, vec3 pos, vec3 norm, float glossiness, float envIntensity, bool transparent, vec3 amblit_linear);
|
||||
void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm);
|
||||
void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity);
|
||||
|
||||
|
|
@ -339,10 +339,9 @@ void main()
|
|||
vec3 ambenv;
|
||||
vec3 glossenv;
|
||||
vec3 legacyenv;
|
||||
sampleReflectionProbesLegacy(ambenv, glossenv, legacyenv, pos.xy*0.5+0.5, pos.xyz, norm.xyz, glossiness, env, true);
|
||||
sampleReflectionProbesLegacy(ambenv, glossenv, legacyenv, pos.xy*0.5+0.5, pos.xyz, norm.xyz, glossiness, env, true, amblit_linear);
|
||||
|
||||
// use sky settings ambient or irradiance map sample, whichever is brighter
|
||||
color = max(amblit_linear, ambenv);
|
||||
color = ambenv;
|
||||
|
||||
float da = clamp(dot(norm.xyz, light_dir.xyz), 0.0, 1.0);
|
||||
vec3 sun_contrib = min(da, shadow) * sunlit_linear;
|
||||
|
|
|
|||
|
|
@ -530,7 +530,7 @@ vec3 tapRefMap(vec3 pos, vec3 dir, out float w, out float dw, float lod, vec3 c,
|
|||
// w - weight of sample (distance and angular attenuation)
|
||||
// dw - weight of sample (distance only)
|
||||
// i - index of probe
|
||||
vec3 tapIrradianceMap(vec3 pos, vec3 dir, out float w, out float dw, vec3 c, int i)
|
||||
vec3 tapIrradianceMap(vec3 pos, vec3 dir, out float w, out float dw, vec3 c, int i, vec3 amblit)
|
||||
{
|
||||
// parallax adjustment
|
||||
vec3 v;
|
||||
|
|
@ -556,9 +556,12 @@ vec3 tapIrradianceMap(vec3 pos, vec3 dir, out float w, out float dw, vec3 c, int
|
|||
|
||||
v -= c;
|
||||
v = env_mat * v;
|
||||
{
|
||||
return textureLod(irradianceProbes, vec4(v.xyz, refIndex[i].x), 0).rgb * refParams[i].x;
|
||||
}
|
||||
|
||||
vec3 col = textureLod(irradianceProbes, vec4(v.xyz, refIndex[i].x), 0).rgb * refParams[i].x;
|
||||
|
||||
col = mix(amblit, col, min(refParams[i].x, 1.0));
|
||||
|
||||
return col;
|
||||
}
|
||||
|
||||
vec3 sampleProbes(vec3 pos, vec3 dir, float lod)
|
||||
|
|
@ -619,7 +622,7 @@ vec3 sampleProbes(vec3 pos, vec3 dir, float lod)
|
|||
return col[1]+col[0];
|
||||
}
|
||||
|
||||
vec3 sampleProbeAmbient(vec3 pos, vec3 dir)
|
||||
vec3 sampleProbeAmbient(vec3 pos, vec3 dir, vec3 amblit)
|
||||
{
|
||||
// modified copy/paste of sampleProbes follows, will likely diverge from sampleProbes further
|
||||
// as irradiance map mixing is tuned independently of radiance map mixing
|
||||
|
|
@ -649,7 +652,7 @@ vec3 sampleProbeAmbient(vec3 pos, vec3 dir)
|
|||
float w = 0;
|
||||
float dw = 0;
|
||||
|
||||
vec3 refcol = tapIrradianceMap(pos, dir, w, dw, refSphere[i].xyz, i);
|
||||
vec3 refcol = tapIrradianceMap(pos, dir, w, dw, refSphere[i].xyz, i, amblit);
|
||||
|
||||
col[p] += refcol*w;
|
||||
wsum[p] += w;
|
||||
|
|
@ -679,14 +682,14 @@ vec3 sampleProbeAmbient(vec3 pos, vec3 dir)
|
|||
}
|
||||
|
||||
void doProbeSample(inout vec3 ambenv, inout vec3 glossenv,
|
||||
vec2 tc, vec3 pos, vec3 norm, float glossiness, bool transparent)
|
||||
vec2 tc, vec3 pos, vec3 norm, float glossiness, bool transparent, vec3 amblit)
|
||||
{
|
||||
// TODO - don't hard code lods
|
||||
float reflection_lods = max_probe_lod;
|
||||
|
||||
vec3 refnormpersp = reflect(pos.xyz, norm.xyz);
|
||||
|
||||
ambenv = sampleProbeAmbient(pos, norm);
|
||||
ambenv = sampleProbeAmbient(pos, norm, amblit);
|
||||
|
||||
float lod = (1.0-glossiness)*reflection_lods;
|
||||
glossenv = sampleProbes(pos, normalize(refnormpersp), lod);
|
||||
|
|
@ -712,14 +715,14 @@ void doProbeSample(inout vec3 ambenv, inout vec3 glossenv,
|
|||
}
|
||||
|
||||
void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv,
|
||||
vec2 tc, vec3 pos, vec3 norm, float glossiness, bool transparent)
|
||||
vec2 tc, vec3 pos, vec3 norm, float glossiness, bool transparent, vec3 amblit)
|
||||
{
|
||||
preProbeSample(pos);
|
||||
doProbeSample(ambenv, glossenv, tc, pos, norm, glossiness, transparent);
|
||||
doProbeSample(ambenv, glossenv, tc, pos, norm, glossiness, transparent, amblit);
|
||||
}
|
||||
|
||||
void sampleReflectionProbesWater(inout vec3 ambenv, inout vec3 glossenv,
|
||||
vec2 tc, vec3 pos, vec3 norm, float glossiness)
|
||||
vec2 tc, vec3 pos, vec3 norm, float glossiness, vec3 amblit)
|
||||
{
|
||||
// don't sample automatic probes for water
|
||||
sample_automatic = false;
|
||||
|
|
@ -728,7 +731,7 @@ void sampleReflectionProbesWater(inout vec3 ambenv, inout vec3 glossenv,
|
|||
// always include void probe on water
|
||||
probeIndex[probeInfluences++] = 0;
|
||||
|
||||
doProbeSample(ambenv, glossenv, tc, pos, norm, glossiness, false);
|
||||
doProbeSample(ambenv, glossenv, tc, pos, norm, glossiness, false, amblit);
|
||||
|
||||
// fudge factor to get PBR water at a similar luminance ot legacy water
|
||||
glossenv *= 0.4;
|
||||
|
|
@ -783,14 +786,14 @@ vec4 sampleReflectionProbesDebug(vec3 pos)
|
|||
}
|
||||
|
||||
void sampleReflectionProbesLegacy(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv,
|
||||
vec2 tc, vec3 pos, vec3 norm, float glossiness, float envIntensity, bool transparent)
|
||||
vec2 tc, vec3 pos, vec3 norm, float glossiness, float envIntensity, bool transparent, vec3 amblit)
|
||||
{
|
||||
float reflection_lods = max_probe_lod;
|
||||
preProbeSample(pos);
|
||||
|
||||
vec3 refnormpersp = reflect(pos.xyz, norm.xyz);
|
||||
|
||||
ambenv = sampleProbeAmbient(pos, norm);
|
||||
ambenv = sampleProbeAmbient(pos, norm, amblit);
|
||||
|
||||
if (glossiness > 0.0)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -69,9 +69,9 @@ vec3 scaleSoftClipFragLinear(vec3 l);
|
|||
|
||||
// reflection probe interface
|
||||
void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv,
|
||||
vec2 tc, vec3 pos, vec3 norm, float glossiness, bool transparent);
|
||||
vec2 tc, vec3 pos, vec3 norm, float glossiness, bool transparent, vec3 amblit_linear);
|
||||
void sampleReflectionProbesLegacy(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv,
|
||||
vec2 tc, vec3 pos, vec3 norm, float glossiness, float envIntensity, bool transparent);
|
||||
vec2 tc, vec3 pos, vec3 norm, float glossiness, float envIntensity, bool transparent, vec3 amblit_linear);
|
||||
void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm);
|
||||
void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity);
|
||||
float getDepth(vec2 pos_screen);
|
||||
|
|
@ -117,10 +117,10 @@ vec3 pbrPunctual(vec3 diffuseColor, vec3 specularColor,
|
|||
vec3 l); //surface point to light
|
||||
|
||||
|
||||
void adjustIrradiance(inout vec3 irradiance, vec3 amblit_linear, float ambocc)
|
||||
void adjustIrradiance(inout vec3 irradiance, float ambocc)
|
||||
{
|
||||
// use sky settings ambient or irradiance map sample, whichever is brighter
|
||||
irradiance = max(amblit_linear, irradiance);
|
||||
//irradiance = max(amblit_linear, irradiance);
|
||||
|
||||
#if defined(HAS_SSAO)
|
||||
irradiance = mix(ssao_effect_mat * min(irradiance.rgb*ssao_irradiance_scale, vec3(ssao_irradiance_max)), irradiance.rgb, ambocc);
|
||||
|
|
@ -194,9 +194,9 @@ void main()
|
|||
// PBR IBL
|
||||
float gloss = 1.0 - perceptualRoughness;
|
||||
|
||||
sampleReflectionProbes(irradiance, radiance, tc, pos.xyz, norm.xyz, gloss, false);
|
||||
sampleReflectionProbes(irradiance, radiance, tc, pos.xyz, norm.xyz, gloss, false, amblit_linear);
|
||||
|
||||
adjustIrradiance(irradiance, amblit_linear, ambocc);
|
||||
adjustIrradiance(irradiance, ambocc);
|
||||
|
||||
vec3 diffuseColor;
|
||||
vec3 specularColor;
|
||||
|
|
@ -232,9 +232,9 @@ void main()
|
|||
vec3 glossenv = vec3(0);
|
||||
vec3 legacyenv = vec3(0);
|
||||
|
||||
sampleReflectionProbesLegacy(irradiance, glossenv, legacyenv, tc, pos.xyz, norm.xyz, spec.a, envIntensity, false);
|
||||
sampleReflectionProbesLegacy(irradiance, glossenv, legacyenv, tc, pos.xyz, norm.xyz, spec.a, envIntensity, false, amblit_linear);
|
||||
|
||||
adjustIrradiance(irradiance, amblit_linear, ambocc);
|
||||
adjustIrradiance(irradiance, ambocc);
|
||||
|
||||
// apply lambertian IBL only (see pbrIbl)
|
||||
color.rgb = irradiance;
|
||||
|
|
|
|||
|
|
@ -124,7 +124,7 @@ vec3 transform_normal(vec3 vNt)
|
|||
}
|
||||
|
||||
void sampleReflectionProbesWater(inout vec3 ambenv, inout vec3 glossenv,
|
||||
vec2 tc, vec3 pos, vec3 norm, float glossiness);
|
||||
vec2 tc, vec3 pos, vec3 norm, float glossiness, vec3 amblit_linear);
|
||||
|
||||
vec3 getPositionWithNDC(vec3 ndc);
|
||||
|
||||
|
|
@ -237,7 +237,7 @@ void main()
|
|||
|
||||
vec3 irradiance = vec3(0);
|
||||
vec3 radiance = vec3(0);
|
||||
sampleReflectionProbesWater(irradiance, radiance, distort2, pos.xyz, wave_ibl.xyz, gloss);
|
||||
sampleReflectionProbesWater(irradiance, radiance, distort2, pos.xyz, wave_ibl.xyz, gloss, amblit);
|
||||
|
||||
irradiance = vec3(0);
|
||||
|
||||
|
|
|
|||
|
|
@ -4920,7 +4920,7 @@ U32 LLAppViewer::getObjectCacheVersion()
|
|||
{
|
||||
// Viewer object cache version, change if object update
|
||||
// format changes. JC
|
||||
const U32 INDRA_OBJECT_CACHE_VERSION = 16;
|
||||
const U32 INDRA_OBJECT_CACHE_VERSION = 17;
|
||||
|
||||
return INDRA_OBJECT_CACHE_VERSION;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -160,9 +160,9 @@ public:
|
|||
// sides - array of S32 indices of texture entries
|
||||
// gltf_json - array of corresponding Strings of GLTF json for override data
|
||||
|
||||
|
||||
LLSD message;
|
||||
bool success = true;
|
||||
#if 0 //deprecated
|
||||
for(const std::string& llsdRaw : strings)
|
||||
{
|
||||
std::istringstream llsdData(llsdRaw);
|
||||
|
|
@ -198,6 +198,7 @@ public:
|
|||
applyData(object_override);
|
||||
}
|
||||
|
||||
#endif
|
||||
return success;
|
||||
}
|
||||
|
||||
|
|
@ -213,6 +214,7 @@ public:
|
|||
{
|
||||
// Parse the data
|
||||
|
||||
#if 0 // DEPRECATED
|
||||
LL::WorkQueue::ptr_t main_queue = LL::WorkQueue::getInstance("mainloop");
|
||||
LL::WorkQueue::ptr_t general_queue = LL::WorkQueue::getInstance("General");
|
||||
|
||||
|
|
@ -235,24 +237,17 @@ public:
|
|||
|
||||
results.reserve(sides.size());
|
||||
// parse json
|
||||
std::unordered_map<S32, std::string>::const_iterator iter = sides.begin();
|
||||
std::unordered_map<S32, std::string>::const_iterator end = sides.end();
|
||||
std::unordered_map<S32, LLSD>::const_iterator iter = sides.begin();
|
||||
std::unordered_map<S32, LLSD>::const_iterator end = sides.end();
|
||||
while (iter != end)
|
||||
{
|
||||
std::string warn_msg, error_msg;
|
||||
|
||||
ReturnData result;
|
||||
|
||||
bool success = result.mMaterial.fromJSON(iter->second, warn_msg, error_msg);
|
||||
|
||||
result.mSuccess = success;
|
||||
result.mMaterial.applyOverrideLLSD(iter->second);
|
||||
|
||||
result.mSuccess = true;
|
||||
result.mSide = iter->first;
|
||||
|
||||
if (!success)
|
||||
{
|
||||
LL_WARNS("GLTF") << "failed to parse GLTF override data. errors: " << error_msg << " | warnings: " << warn_msg << LL_ENDL;
|
||||
}
|
||||
|
||||
results.push_back(result);
|
||||
iter++;
|
||||
}
|
||||
|
|
@ -318,6 +313,7 @@ public:
|
|||
}
|
||||
});
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
private:
|
||||
|
|
@ -330,6 +326,70 @@ namespace
|
|||
LLGLTFMaterialOverrideDispatchHandler handle_gltf_override_message;
|
||||
}
|
||||
|
||||
void LLGLTFMaterialList::applyOverrideMessage(LLMessageSystem* msg, const std::string& data_in)
|
||||
{
|
||||
std::istringstream str(data_in);
|
||||
|
||||
LLSD data;
|
||||
|
||||
LLSDSerialize::fromNotation(data, str, data_in.length());
|
||||
|
||||
const LLHost& host = msg->getSender();
|
||||
|
||||
LLViewerRegion* region = LLWorld::instance().getRegion(host);
|
||||
llassert(region);
|
||||
|
||||
if (region)
|
||||
{
|
||||
U32 local_id = data.get("id").asInteger();
|
||||
LLUUID id;
|
||||
gObjectList.getUUIDFromLocal(id, local_id, host.getAddress(), host.getPort());
|
||||
LLViewerObject* obj = gObjectList.findObject(id);
|
||||
|
||||
// NOTE: obj may be null if the viewer hasn't heard about the object yet, cache update in any case
|
||||
|
||||
if (obj && gShowObjectUpdates)
|
||||
{ // display a cyan blip for override updates when "Show Updates to Objects" enabled
|
||||
LLColor4 color(0.f, 1.f, 1.f, 1.f);
|
||||
gPipeline.addDebugBlip(obj->getPositionAgent(), color);
|
||||
}
|
||||
|
||||
const LLSD& tes = data["te"];
|
||||
const LLSD& od = data["od"];
|
||||
|
||||
if (tes.isArray())
|
||||
{
|
||||
LLGLTFOverrideCacheEntry cache;
|
||||
cache.mLocalId = local_id;
|
||||
cache.mObjectId = id;
|
||||
cache.mRegionHandle = region->getHandle();
|
||||
|
||||
for (int i = 0; i < tes.size(); ++i)
|
||||
{
|
||||
LLGLTFMaterial* mat = new LLGLTFMaterial(); // setTEGLTFMaterialOverride and cache will take ownership
|
||||
mat->applyOverrideLLSD(od[i]);
|
||||
|
||||
S32 te = tes[i].asInteger();
|
||||
|
||||
cache.mSides[te] = od[i];
|
||||
cache.mGLTFMaterial[te] = mat;
|
||||
|
||||
if (obj)
|
||||
{
|
||||
obj->setTEGLTFMaterialOverride(te, mat);
|
||||
if (obj->getTE(te) && obj->getTE(te)->isSelected())
|
||||
{
|
||||
handle_gltf_override_message.doSelectionCallbacks(id, te);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
region->cacheFullUpdateGLTFOverride(cache);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void LLGLTFMaterialList::queueOverrideUpdate(const LLUUID& id, S32 side, LLGLTFMaterial* override_data)
|
||||
{
|
||||
#if 0
|
||||
|
|
|
|||
|
|
@ -101,6 +101,9 @@ public:
|
|||
|
||||
static void loadCacheOverrides(const LLGLTFOverrideCacheEntry& override);
|
||||
|
||||
// Apply an override update with the given data
|
||||
void applyOverrideMessage(LLMessageSystem* msg, const std::string& data);
|
||||
|
||||
private:
|
||||
friend class LLGLTFMaterialOverrideDispatchHandler;
|
||||
// save an override update that we got from the simulator for later (for example, if an override arrived for an unknown object)
|
||||
|
|
|
|||
|
|
@ -157,6 +157,10 @@ void LLReflectionMap::autoAdjustOrigin()
|
|||
}
|
||||
|
||||
mRadius = llmax(sqrtf(r2.getF32()), 8.f);
|
||||
|
||||
// make sure near clip doesn't poke through ground
|
||||
fp[2] = llmax(fp[2], height+mRadius*0.5f);
|
||||
|
||||
}
|
||||
}
|
||||
else if (mViewerObject)
|
||||
|
|
@ -204,6 +208,14 @@ F32 LLReflectionMap::getNearClip()
|
|||
{
|
||||
ret = ((LLVOVolume*)mViewerObject)->getReflectionProbeNearClip();
|
||||
}
|
||||
else if (mGroup)
|
||||
{
|
||||
ret = mRadius * 0.5f; // default to half radius for automatic object probes
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = 1.f; // default to 1m for automatic terrain probes
|
||||
}
|
||||
|
||||
return llmax(ret, MINIMUM_NEAR_CLIP);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -721,6 +721,15 @@ void LLSettingsVOSky::applySpecial(void *ptarget, bool force)
|
|||
static LLCachedControl<bool> should_auto_adjust(gSavedSettings, "RenderSkyAutoAdjustLegacy", true);
|
||||
static LLCachedControl<F32> auto_adjust_ambient_scale(gSavedSettings, "RenderSkyAutoAdjustAmbientScale", 0.75f);
|
||||
static LLCachedControl<F32> auto_adjust_hdr_scale(gSavedSettings, "RenderSkyAutoAdjustHDRScale", 2.f);
|
||||
static LLCachedControl<F32> auto_adjust_blue_horizon_scale(gSavedSettings, "RenderSkyAutoAdjustBlueHorizonScale", 1.f);
|
||||
static LLCachedControl<F32> auto_adjust_blue_density_scale(gSavedSettings, "RenderSkyAutoAdjustBlueDensityScale", 1.f);
|
||||
static LLCachedControl<F32> auto_adjust_sun_color_scale(gSavedSettings, "RenderSkyAutoAdjustSunColorScale", 1.f);
|
||||
static LLCachedControl<F32> auto_adjust_probe_ambiance(gSavedSettings, "RenderSkyAutoAdjustProbeAmbiance", 1.f);
|
||||
static LLCachedControl<F32> sunlight_scale(gSavedSettings, "RenderSkySunlightScale", 1.5f);
|
||||
static LLCachedControl<F32> ambient_scale(gSavedSettings, "RenderSkyAmbientScale", 1.5f);
|
||||
|
||||
shader->uniform1f(LLShaderMgr::SKY_SUNLIGHT_SCALE, sunlight_scale);
|
||||
shader->uniform1f(LLShaderMgr::SKY_AMBIENT_SCALE, ambient_scale);
|
||||
|
||||
static LLCachedControl<F32> cloud_shadow_scale(gSavedSettings, "RenderCloudShadowAmbianceFactor", 0.125f);
|
||||
F32 probe_ambiance = getTotalReflectionProbeAmbiance(cloud_shadow_scale);
|
||||
|
|
@ -733,14 +742,23 @@ void LLSettingsVOSky::applySpecial(void *ptarget, bool force)
|
|||
{
|
||||
if (psky->getReflectionProbeAmbiance() != 0.f)
|
||||
{
|
||||
shader->uniform3fv(LLShaderMgr::AMBIENT, getAmbientColor().mV);
|
||||
shader->uniform3fv(LLShaderMgr::AMBIENT, LLVector3(ambient.mV));
|
||||
shader->uniform1f(LLShaderMgr::SKY_HDR_SCALE, sqrtf(g)*2.0); // use a modifier here so 1.0 maps to the "most desirable" default and the maximum value doesn't go off the rails
|
||||
}
|
||||
else if (psky->canAutoAdjust() && should_auto_adjust)
|
||||
{ // auto-adjust legacy sky to take advantage of probe ambiance
|
||||
shader->uniform3fv(LLShaderMgr::AMBIENT, (ambient * auto_adjust_ambient_scale).mV);
|
||||
shader->uniform1f(LLShaderMgr::SKY_HDR_SCALE, auto_adjust_hdr_scale);
|
||||
probe_ambiance = 1.f; // NOTE -- must match LLSettingsSky::getReflectionProbeAmbiance value for "auto_adjust" true
|
||||
LLColor3 blue_horizon = getBlueHorizon() * auto_adjust_blue_horizon_scale;
|
||||
LLColor3 blue_density = getBlueDensity() * auto_adjust_blue_density_scale;
|
||||
LLColor3 sun_diffuse = getSunDiffuse() * auto_adjust_sun_color_scale;
|
||||
|
||||
shader->uniform3fv(LLShaderMgr::SUNLIGHT_COLOR, sun_diffuse.mV);
|
||||
shader->uniform3fv(LLShaderMgr::BLUE_DENSITY, blue_density.mV);
|
||||
shader->uniform3fv(LLShaderMgr::BLUE_HORIZON, blue_horizon.mV);
|
||||
|
||||
LLSettingsSky::sAutoAdjustProbeAmbiance = auto_adjust_probe_ambiance;
|
||||
probe_ambiance = auto_adjust_probe_ambiance; // NOTE -- must match LLSettingsSky::getReflectionProbeAmbiance value for "auto_adjust" true
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -755,7 +773,7 @@ void LLSettingsVOSky::applySpecial(void *ptarget, bool force)
|
|||
shader->uniform1f(LLShaderMgr::SUN_MOON_GLOW_FACTOR, getSunMoonGlowFactor());
|
||||
shader->uniform1f(LLShaderMgr::DENSITY_MULTIPLIER, getDensityMultiplier());
|
||||
shader->uniform1f(LLShaderMgr::DISTANCE_MULTIPLIER, getDistanceMultiplier());
|
||||
|
||||
|
||||
shader->uniform1f(LLShaderMgr::GAMMA, g);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -3629,6 +3629,7 @@ void register_viewer_callbacks(LLMessageSystem* msg)
|
|||
msg->setHandlerFunc("InitiateDownload", process_initiate_download);
|
||||
msg->setHandlerFunc("LandStatReply", LLFloaterTopObjects::handle_land_reply);
|
||||
msg->setHandlerFunc("GenericMessage", process_generic_message);
|
||||
msg->setHandlerFunc("GenericStreamingMessage", process_generic_streaming_message);
|
||||
msg->setHandlerFunc("LargeGenericMessage", process_large_generic_message);
|
||||
|
||||
msg->setHandlerFuncFast(_PREHASH_FeatureDisabled, process_feature_disabled_message);
|
||||
|
|
|
|||
|
|
@ -32,9 +32,10 @@
|
|||
#include "lldispatcher.h"
|
||||
#include "lluuid.h"
|
||||
#include "message.h"
|
||||
#include "llgenericstreamingmessage.h"
|
||||
|
||||
#include "llagent.h"
|
||||
|
||||
#include "llgltfmateriallist.h"
|
||||
|
||||
LLDispatcher gGenericDispatcher;
|
||||
|
||||
|
|
@ -92,6 +93,21 @@ void process_generic_message(LLMessageSystem* msg, void**)
|
|||
}
|
||||
}
|
||||
|
||||
void process_generic_streaming_message(LLMessageSystem* msg, void**)
|
||||
{
|
||||
LLGenericStreamingMessage data;
|
||||
data.unpack(msg);
|
||||
switch (data.mMethod)
|
||||
{
|
||||
case LLGenericStreamingMessage::METHOD_GLTF_MATERIAL_OVERRIDE:
|
||||
gGLTFMaterialList.applyOverrideMessage(msg, data.mData);
|
||||
break;
|
||||
default:
|
||||
LL_WARNS_ONCE() << "Received unknown method" << LL_ENDL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void process_large_generic_message(LLMessageSystem* msg, void**)
|
||||
{
|
||||
LLUUID agent_id;
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ void send_generic_message(const std::string& method,
|
|||
const LLUUID& invoice = LLUUID::null);
|
||||
|
||||
void process_generic_message(LLMessageSystem* msg, void**);
|
||||
void process_generic_streaming_message(LLMessageSystem* msg, void**);
|
||||
void process_large_generic_message(LLMessageSystem* msg, void**);
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -229,7 +229,7 @@ public:
|
|||
LLVOCacheEntry::vocache_entry_set_t mVisibleEntries; //must-be-created visible entries wait for objects creation.
|
||||
LLVOCacheEntry::vocache_entry_priority_list_t mWaitingList; //transient list storing sorted visible entries waiting for object creation.
|
||||
std::set<U32> mNonCacheableCreatedList; //list of local ids of all non-cacheable objects
|
||||
LLVOCacheEntry::vocache_gltf_overrides_map_t mGLTFOverridesJson; // for materials
|
||||
LLVOCacheEntry::vocache_gltf_overrides_map_t mGLTFOverridesLLSD; // for materials
|
||||
|
||||
// time?
|
||||
// LRU info?
|
||||
|
|
@ -846,7 +846,7 @@ void LLViewerRegion::loadObjectCache()
|
|||
{
|
||||
LLVOCache & vocache = LLVOCache::instance();
|
||||
vocache.readFromCache(mHandle, mImpl->mCacheID, mImpl->mCacheMap);
|
||||
vocache.readGenericExtrasFromCache(mHandle, mImpl->mCacheID, mImpl->mGLTFOverridesJson);
|
||||
vocache.readGenericExtrasFromCache(mHandle, mImpl->mCacheID, mImpl->mGLTFOverridesLLSD);
|
||||
|
||||
if (mImpl->mCacheMap.empty())
|
||||
{
|
||||
|
|
@ -876,7 +876,7 @@ void LLViewerRegion::saveObjectCache()
|
|||
LLVOCache & instance = LLVOCache::instance();
|
||||
|
||||
instance.writeToCache(mHandle, mImpl->mCacheID, mImpl->mCacheMap, mCacheDirty, removal_enabled);
|
||||
instance.writeGenericExtrasToCache(mHandle, mImpl->mCacheID, mImpl->mGLTFOverridesJson, mCacheDirty, removal_enabled);
|
||||
instance.writeGenericExtrasToCache(mHandle, mImpl->mCacheID, mImpl->mGLTFOverridesLLSD, mCacheDirty, removal_enabled);
|
||||
mCacheDirty = FALSE;
|
||||
}
|
||||
|
||||
|
|
@ -2877,7 +2877,7 @@ LLViewerRegion::eCacheUpdateResult LLViewerRegion::cacheFullUpdate(LLViewerObjec
|
|||
void LLViewerRegion::cacheFullUpdateGLTFOverride(const LLGLTFOverrideCacheEntry &override_data)
|
||||
{
|
||||
U32 local_id = override_data.mLocalId;
|
||||
mImpl->mGLTFOverridesJson[local_id] = override_data;
|
||||
mImpl->mGLTFOverridesLLSD[local_id] = override_data;
|
||||
}
|
||||
|
||||
LLVOCacheEntry* LLViewerRegion::getCacheEntryForOctree(U32 local_id)
|
||||
|
|
@ -3910,8 +3910,8 @@ std::string LLViewerRegion::getSimHostName()
|
|||
|
||||
void LLViewerRegion::loadCacheMiscExtras(U32 local_id)
|
||||
{
|
||||
auto iter = mImpl->mGLTFOverridesJson.find(local_id);
|
||||
if (iter != mImpl->mGLTFOverridesJson.end())
|
||||
auto iter = mImpl->mGLTFOverridesLLSD.find(local_id);
|
||||
if (iter != mImpl->mGLTFOverridesLLSD.end())
|
||||
{
|
||||
LLGLTFMaterialList::loadCacheOverrides(iter->second);
|
||||
}
|
||||
|
|
@ -3923,8 +3923,8 @@ void LLViewerRegion::applyCacheMiscExtras(LLViewerObject* obj)
|
|||
llassert(obj);
|
||||
|
||||
U32 local_id = obj->getLocalID();
|
||||
auto iter = mImpl->mGLTFOverridesJson.find(local_id);
|
||||
if (iter != mImpl->mGLTFOverridesJson.end())
|
||||
auto iter = mImpl->mGLTFOverridesLLSD.find(local_id);
|
||||
if (iter != mImpl->mGLTFOverridesLLSD.end())
|
||||
{
|
||||
llassert(iter->second.mGLTFMaterial.size() == iter->second.mSides.size());
|
||||
|
||||
|
|
|
|||
|
|
@ -86,40 +86,24 @@ bool LLGLTFOverrideCacheEntry::fromLLSD(const LLSD& data)
|
|||
|
||||
// message should be interpreted thusly:
|
||||
/// sides is a list of face indices
|
||||
// gltf_json is a list of corresponding json
|
||||
// gltf_llsd is a list of corresponding GLTF override LLSD
|
||||
// any side not represented in "sides" has no override
|
||||
if (data.has("sides") && data.has("gltf_json"))
|
||||
if (data.has("sides") && data.has("gltf_llsd"))
|
||||
{
|
||||
LLSD const& sides = data.get("sides");
|
||||
LLSD const& gltf_json = data.get("gltf_json");
|
||||
LLSD const& gltf_llsd = data.get("gltf_llsd");
|
||||
|
||||
if (sides.isArray() && gltf_json.isArray() &&
|
||||
if (sides.isArray() && gltf_llsd.isArray() &&
|
||||
sides.size() != 0 &&
|
||||
sides.size() == gltf_json.size())
|
||||
sides.size() == gltf_llsd.size())
|
||||
{
|
||||
for (int i = 0; i < sides.size(); ++i)
|
||||
{
|
||||
S32 side_idx = sides[i].asInteger();
|
||||
std::string gltf_json_str = gltf_json[i].asString();
|
||||
mSides[side_idx] = gltf_json_str;
|
||||
mSides[side_idx] = gltf_llsd[i];
|
||||
LLGLTFMaterial* override_mat = new LLGLTFMaterial();
|
||||
std::string error, warn;
|
||||
if (override_mat->fromJSON(gltf_json_str, warn, error))
|
||||
{
|
||||
mGLTFMaterial[side_idx] = override_mat;
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << "Invalid GLTF string: \n" << gltf_json_str << LL_ENDL;
|
||||
if (!error.empty())
|
||||
{
|
||||
LL_WARNS() << "Error: " << error << LL_ENDL;
|
||||
}
|
||||
if (!warn.empty())
|
||||
{
|
||||
LL_WARNS() << "Warning: " << warn << LL_ENDL;
|
||||
}
|
||||
}
|
||||
override_mat->applyOverrideLLSD(gltf_llsd[i]);
|
||||
mGLTFMaterial[side_idx] = override_mat;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
|
@ -158,7 +142,7 @@ LLSD LLGLTFOverrideCacheEntry::toLLSD() const
|
|||
// check that mSides and mGLTFMaterial have exactly the same keys present
|
||||
llassert(mGLTFMaterial.count(side.first) == 1);
|
||||
data["sides"].append(LLSD::Integer(side.first));
|
||||
data["gltf_json"].append(side.second);
|
||||
data["gltf_llsd"].append(side.second);
|
||||
}
|
||||
|
||||
return data;
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ public:
|
|||
|
||||
LLUUID mObjectId;
|
||||
U32 mLocalId = 0;
|
||||
std::unordered_map<S32, std::string> mSides; //json per side
|
||||
std::unordered_map<S32, LLSD> mSides; //override LLSD per side
|
||||
std::unordered_map<S32, LLPointer<LLGLTFMaterial> > mGLTFMaterial; //GLTF material per side
|
||||
U64 mRegionHandle = 0;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -7893,7 +7893,17 @@ void LLPipeline::bindDeferredShader(LLGLSLShader& shader, LLRenderTarget* light_
|
|||
shader.uniformMatrix4fv(LLShaderMgr::DEFERRED_NORM_MATRIX, 1, FALSE, norm_mat.m);
|
||||
}
|
||||
|
||||
shader.uniform3fv(LLShaderMgr::SUNLIGHT_COLOR, 1, mSunDiffuse.mV);
|
||||
// auto adjust legacy sun color if needed
|
||||
static LLCachedControl<bool> should_auto_adjust(gSavedSettings, "RenderSkyAutoAdjustLegacy", true);
|
||||
static LLCachedControl<F32> auto_adjust_sun_color_scale(gSavedSettings, "RenderSkyAutoAdjustSunColorScale", 1.f);
|
||||
LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
|
||||
LLColor3 sun_diffuse(mSunDiffuse.mV);
|
||||
if (should_auto_adjust && psky->canAutoAdjust())
|
||||
{
|
||||
sun_diffuse *= auto_adjust_sun_color_scale;
|
||||
}
|
||||
|
||||
shader.uniform3fv(LLShaderMgr::SUNLIGHT_COLOR, 1, sun_diffuse.mV);
|
||||
shader.uniform3fv(LLShaderMgr::MOONLIGHT_COLOR, 1, mMoonDiffuse.mV);
|
||||
|
||||
shader.uniform1f(LLShaderMgr::REFLECTION_PROBE_MAX_LOD, mReflectionMapManager.mMaxProbeLOD);
|
||||
|
|
|
|||
|
|
@ -5807,6 +5807,25 @@ version 2.0
|
|||
}
|
||||
}
|
||||
|
||||
// GenericStreamingMessage
|
||||
// Optimized generic message for streaming arbitrary data to viewer
|
||||
// Avoid payloads over 7KB (8KB ceiling)
|
||||
// Method -- magic number indicating method to use to decode payload:
|
||||
// 0x4175 - GLTF material override data
|
||||
// Payload -- data to be decoded
|
||||
{
|
||||
GenericStreamingMessage High 31 Trusted Unencoded
|
||||
{
|
||||
MethodData Single
|
||||
{ Method U16 }
|
||||
}
|
||||
|
||||
{
|
||||
DataBlock Single
|
||||
{ Data Variable 2 }
|
||||
}
|
||||
}
|
||||
|
||||
// LargeGenericMessage
|
||||
// Similar to the above messages, but can handle larger payloads and serialized
|
||||
// LLSD. Uses HTTP transport
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
e61fad776b4d494be0b901922fc75a3317af97ca
|
||||
9eb8c673c2f6b4e271d50f07823757f98f406f0a
|
||||
Loading…
Reference in New Issue