Merge branch 'master' into DRTVWR-518-ui
# Conflicts: # indra/newview/llfloaterbuycurrency.cpp # indra/newview/llinventorybridge.cpp # indra/newview/llinventorypanel.h # indra/newview/skins/default/xui/en/floater_buy_currency.xmlmaster
commit
4e43097c77
|
|
@ -1,17 +1,18 @@
|
|||
---
|
||||
# clang-format version 10.0.0+
|
||||
Language: Cpp
|
||||
# BasedOnStyle: Microsoft
|
||||
AccessModifierOffset: -2
|
||||
AlignAfterOpenBracket: Align
|
||||
AlignConsecutiveMacros: false
|
||||
AlignConsecutiveAssignments: false
|
||||
AlignConsecutiveDeclarations: false
|
||||
AlignEscapedNewlines: Right
|
||||
AlignConsecutiveMacros: true
|
||||
AlignConsecutiveAssignments: true
|
||||
AlignConsecutiveDeclarations: true
|
||||
AlignEscapedNewlines: Left
|
||||
AlignOperands: true
|
||||
AlignTrailingComments: true
|
||||
AllowAllArgumentsOnNextLine: true
|
||||
AllowAllConstructorInitializersOnNextLine: true
|
||||
AllowAllParametersOfDeclarationOnNextLine: true
|
||||
AllowAllArgumentsOnNextLine: false
|
||||
AllowAllConstructorInitializersOnNextLine: false
|
||||
AllowAllParametersOfDeclarationOnNextLine: false
|
||||
AllowShortBlocksOnASingleLine: Always
|
||||
AllowShortCaseLabelsOnASingleLine: false
|
||||
AllowShortFunctionsOnASingleLine: All
|
||||
|
|
@ -29,21 +30,21 @@ BreakBeforeBraces: Allman
|
|||
BreakBeforeInheritanceComma: false
|
||||
BreakInheritanceList: BeforeColon
|
||||
BreakBeforeTernaryOperators: true
|
||||
BreakConstructorInitializersBeforeComma: false
|
||||
BreakConstructorInitializers: BeforeColon
|
||||
BreakConstructorInitializersBeforeComma: true
|
||||
BreakConstructorInitializers: AfterColon
|
||||
BreakAfterJavaFieldAnnotations: false
|
||||
BreakStringLiterals: true
|
||||
ColumnLimit: 120
|
||||
ColumnLimit: 140
|
||||
CommentPragmas: '^ IWYU pragma:'
|
||||
CompactNamespaces: false
|
||||
ConstructorInitializerAllOnOneLineOrOnePerLine: false
|
||||
ConstructorInitializerAllOnOneLineOrOnePerLine: true
|
||||
ConstructorInitializerIndentWidth: 4
|
||||
ContinuationIndentWidth: 4
|
||||
Cpp11BracedListStyle: true
|
||||
DeriveLineEnding: true
|
||||
DerivePointerAlignment: false
|
||||
DisableFormat: false
|
||||
ExperimentalAutoDetectBinPacking: false
|
||||
ExperimentalAutoDetectBinPacking: true
|
||||
FixNamespaceComments: true
|
||||
ForEachMacros:
|
||||
- foreach
|
||||
|
|
@ -62,18 +63,18 @@ IncludeCategories:
|
|||
SortPriority: 0
|
||||
IncludeIsMainRegex: '(Test)?$'
|
||||
IncludeIsMainSourceRegex: ''
|
||||
IndentCaseLabels: false
|
||||
IndentCaseLabels: true
|
||||
IndentGotoLabels: true
|
||||
IndentPPDirectives: None
|
||||
IndentWidth: 4
|
||||
IndentWrappedFunctionNames: false
|
||||
JavaScriptQuotes: Leave
|
||||
JavaScriptWrapImports: true
|
||||
KeepEmptyLinesAtTheStartOfBlocks: true
|
||||
KeepEmptyLinesAtTheStartOfBlocks: false
|
||||
MacroBlockBegin: ''
|
||||
MacroBlockEnd: ''
|
||||
MaxEmptyLinesToKeep: 1
|
||||
NamespaceIndentation: None
|
||||
NamespaceIndentation: Inner
|
||||
ObjCBinPackProtocolList: Auto
|
||||
ObjCBlockIndentWidth: 2
|
||||
ObjCSpaceAfterProperty: false
|
||||
|
|
@ -94,16 +95,16 @@ SpaceAfterCStyleCast: true
|
|||
SpaceAfterLogicalNot: false
|
||||
SpaceAfterTemplateKeyword: true
|
||||
SpaceBeforeAssignmentOperators: true
|
||||
SpaceBeforeCpp11BracedList: false
|
||||
SpaceBeforeCpp11BracedList: true
|
||||
SpaceBeforeCtorInitializerColon: true
|
||||
SpaceBeforeInheritanceColon: true
|
||||
SpaceBeforeParens: ControlStatements
|
||||
SpaceBeforeRangeBasedForLoopColon: true
|
||||
SpaceInEmptyBlock: false
|
||||
SpaceInEmptyParentheses: false
|
||||
SpacesBeforeTrailingComments: 1
|
||||
SpacesBeforeTrailingComments: 2
|
||||
SpacesInAngles: false
|
||||
SpacesInContainerLiterals: true
|
||||
SpacesInContainerLiterals: false
|
||||
SpacesInCStyleCastParentheses: false
|
||||
SpacesInParentheses: false
|
||||
SpacesInSquareBrackets: false
|
||||
|
|
|
|||
|
|
@ -76,9 +76,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>d670d00aa732b97d105d287b62582762</string>
|
||||
<string>9b8bcc3be6dbe40a04c9c81c313f70dc</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55065/512118/apr_suite-1.4.5.539073-darwin64-539073.tar.bz2</string>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/68333/658209/apr_suite-1.4.5.548882-darwin64-548882.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>darwin64</string>
|
||||
|
|
@ -112,9 +112,9 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>83b4a047db5f7ee462753d91e6277cba</string>
|
||||
<string>6bdf460c18ee004b41a46afc80041a92</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55143/512317/apr_suite-1.4.5.539073-windows-539073.tar.bz2</string>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/68334/658225/apr_suite-1.4.5.548882-windows-548882.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows</string>
|
||||
|
|
@ -124,16 +124,16 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>b3bbf168b39e25c08cc1febddeb33332</string>
|
||||
<string>83104bfa4dabb77cd70d185e38a95b49</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/55139/512304/apr_suite-1.4.5.539073-windows64-539073.tar.bz2</string>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/68332/658215/apr_suite-1.4.5.548882-windows64-548882.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>windows64</string>
|
||||
</map>
|
||||
</map>
|
||||
<key>version</key>
|
||||
<string>1.4.5.539073</string>
|
||||
<string>1.4.5.548882</string>
|
||||
</map>
|
||||
<key>boost</key>
|
||||
<map>
|
||||
|
|
@ -2187,16 +2187,16 @@
|
|||
<key>archive</key>
|
||||
<map>
|
||||
<key>hash</key>
|
||||
<string>8501cbaa7e0f254614694da784a9c61c</string>
|
||||
<string>b677ee43822212f0a27c838dc8bf3623</string>
|
||||
<key>url</key>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/64944/606925/llca-202008010216.546021-common-546021.tar.bz2</string>
|
||||
<string>http://automated-builds-secondlife-com.s3.amazonaws.com/ct2/67622/646614/llca-202009010215.548269-common-548269.tar.bz2</string>
|
||||
</map>
|
||||
<key>name</key>
|
||||
<string>common</string>
|
||||
</map>
|
||||
</map>
|
||||
<key>version</key>
|
||||
<string>202008010216.546021</string>
|
||||
<string>202009010215.548269</string>
|
||||
</map>
|
||||
<key>llphysicsextensions_source</key>
|
||||
<map>
|
||||
|
|
@ -3906,9 +3906,9 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<array>
|
||||
<string>-G</string>
|
||||
<string>${AUTOBUILD_WIN_CMAKE_GEN|NOTWIN}</string>
|
||||
<string>-DUNATTENDED:BOOL=ON</string>
|
||||
<string>-DINSTALL_PROPRIETARY=FALSE</string>
|
||||
<string>-DUSE_KDU=FALSE</string>
|
||||
<string>-DOPENAL:BOOL=ON</string>
|
||||
</array>
|
||||
</map>
|
||||
<key>name</key>
|
||||
|
|
@ -3979,6 +3979,7 @@ Copyright (c) 2012, 2014, 2015, 2016 nghttp2 contributors</string>
|
|||
<string>-DUNATTENDED:BOOL=ON</string>
|
||||
<string>-DINSTALL_PROPRIETARY=FALSE</string>
|
||||
<string>-DUSE_KDU=FALSE</string>
|
||||
<string>-DOPENAL:BOOL=ON</string>
|
||||
</array>
|
||||
</map>
|
||||
<key>name</key>
|
||||
|
|
|
|||
|
|
@ -258,6 +258,8 @@ Beansy Twine
|
|||
Benja Kepler
|
||||
VWR-746
|
||||
Benjamin Bigdipper
|
||||
Beq Janus
|
||||
BUG-227094
|
||||
Beth Walcher
|
||||
Bezilon Kasei
|
||||
Biancaluce Robbiani
|
||||
|
|
@ -829,6 +831,7 @@ Khyota Wulluf
|
|||
Kimar Coba
|
||||
Kithrak Kirkorian
|
||||
Kitty Barnett
|
||||
BUG-228665
|
||||
VWR-19699
|
||||
STORM-288
|
||||
STORM-799
|
||||
|
|
@ -1301,6 +1304,7 @@ Shyotl Kuhr
|
|||
MAINT-2334
|
||||
MAINT-6913
|
||||
STORM-2143
|
||||
SL-11625
|
||||
Siana Gearz
|
||||
STORM-960
|
||||
STORM-1088
|
||||
|
|
@ -1340,6 +1344,7 @@ Sovereign Engineer
|
|||
MAINT-7343
|
||||
SL-11079
|
||||
OPEN-343
|
||||
SL-11625
|
||||
SpacedOut Frye
|
||||
VWR-34
|
||||
VWR-45
|
||||
|
|
@ -1445,6 +1450,8 @@ Thickbrick Sleaford
|
|||
STORM-956
|
||||
STORM-1147
|
||||
STORM-1325
|
||||
Thoys Pan
|
||||
SL-12396
|
||||
Thraxis Epsilon
|
||||
SVC-371
|
||||
VWR-383
|
||||
|
|
|
|||
|
|
@ -63,7 +63,13 @@ if (WINDOWS)
|
|||
# Without PreferredToolArchitecture=x64, as of 2020-06-26 the 32-bit
|
||||
# compiler on our TeamCity build hosts has started running out of virtual
|
||||
# memory for the precompiled header file.
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /p:PreferredToolArchitecture=x64")
|
||||
# CP changed to only append the flag for 32bit builds - on 64bit builds,
|
||||
# locally at least, the build output is spammed with 1000s of 'D9002'
|
||||
# warnings about this switch being ignored.
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP")
|
||||
if( ADDRESS_SIZE EQUAL 32 )
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /p:PreferredToolArchitecture=x64")
|
||||
endif()
|
||||
|
||||
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO
|
||||
"${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Zo"
|
||||
|
|
|
|||
|
|
@ -82,6 +82,10 @@ if(WINDOWS)
|
|||
set(release_files ${release_files} fmod.dll)
|
||||
endif (FMODSTUDIO)
|
||||
|
||||
if (OPENAL)
|
||||
list(APPEND release_files openal32.dll alut.dll)
|
||||
endif (OPENAL)
|
||||
|
||||
#*******************************
|
||||
# Copy MS C runtime dlls, required for packaging.
|
||||
if (MSVC80)
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
12
|
||||
|
|
@ -60,6 +60,10 @@ if (FMODSTUDIO)
|
|||
endif (FMODSTUDIO)
|
||||
|
||||
if (OPENAL)
|
||||
include_directories(
|
||||
${OPENAL_LIBRARIES}
|
||||
)
|
||||
|
||||
list(APPEND llaudio_SOURCE_FILES
|
||||
llaudioengine_openal.cpp
|
||||
lllistener_openal.cpp
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ LLAudioEngine_OpenAL::~LLAudioEngine_OpenAL()
|
|||
bool LLAudioEngine_OpenAL::init(const S32 num_channels, void* userdata, const std::string &app_title)
|
||||
{
|
||||
mWindGen = NULL;
|
||||
LLAudioEngine::init(num_channels, userdata);
|
||||
LLAudioEngine::init(num_channels, userdata, app_title);
|
||||
|
||||
if(!alutInit(NULL, NULL))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -1007,11 +1007,20 @@ CURLcode HttpOpRequest::curlSslCtxCallback(CURL *curl, void *sslctx, void *userd
|
|||
{
|
||||
HttpOpRequest::ptr_t op(HttpOpRequest::fromHandle<HttpOpRequest>(userdata));
|
||||
|
||||
if (op->mCallbackSSLVerify)
|
||||
{
|
||||
SSL_CTX * ctx = (SSL_CTX *)sslctx;
|
||||
// disable any default verification for server certs
|
||||
SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
|
||||
if (op->mCallbackSSLVerify)
|
||||
{
|
||||
SSL_CTX * ctx = (SSL_CTX *)sslctx;
|
||||
if (op->mReqOptions && op->mReqOptions->getSSLVerifyPeer())
|
||||
{
|
||||
// verification for ssl certs
|
||||
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
|
||||
}
|
||||
else
|
||||
{
|
||||
// disable any default verification for server certs
|
||||
// Ex: setting urls (assume non-SL) for parcel media in LLFloaterURLEntry
|
||||
SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
|
||||
}
|
||||
// set the verification callback.
|
||||
SSL_CTX_set_cert_verify_callback(ctx, sslCertVerifyCallback, userdata);
|
||||
// the calls are void
|
||||
|
|
|
|||
|
|
@ -1295,6 +1295,9 @@ void LLSettingsSky::clampColor(LLColor3& color, F32 gamma, F32 scale) const
|
|||
color = linear;
|
||||
}
|
||||
|
||||
// Similar/Shared Algorithms:
|
||||
// indra\llinventory\llsettingssky.cpp -- LLSettingsSky::calculateLightSettings()
|
||||
// indra\newview\app_settings\shaders\class1\windlight\atmosphericsFuncs.glsl -- calcAtmosphericVars()
|
||||
void LLSettingsSky::calculateLightSettings() const
|
||||
{
|
||||
// Initialize temp variables
|
||||
|
|
|
|||
|
|
@ -46,10 +46,10 @@ class LLRotation;
|
|||
// of this writing, July 08, 2010) about getting it implemented before you resort to
|
||||
// LLVector3/LLVector4.
|
||||
/////////////////////////////////
|
||||
class LLVector4a;
|
||||
struct LLVector4a;
|
||||
|
||||
LL_ALIGN_PREFIX(16)
|
||||
class LLVector4a
|
||||
struct LLVector4a
|
||||
{
|
||||
public:
|
||||
|
||||
|
|
@ -92,6 +92,7 @@ public:
|
|||
// CONSTRUCTORS
|
||||
////////////////////////////////////
|
||||
|
||||
//LLVector4a is plain data which should never have a default constructor or destructor(malloc&free won't trigger it)
|
||||
LLVector4a()
|
||||
{ //DO NOT INITIALIZE -- The overhead is completely unnecessary
|
||||
ll_assert_aligned(this,16);
|
||||
|
|
|
|||
|
|
@ -77,12 +77,12 @@ public:
|
|||
///
|
||||
inline size_t countActive() const
|
||||
{
|
||||
return mActiveCoprocs.size();
|
||||
return mActiveCoprocsCount;
|
||||
}
|
||||
|
||||
/// Returns the total number of coprocedures either queued or in active processing.
|
||||
///
|
||||
inline size_t count() const
|
||||
inline S32 count() const
|
||||
{
|
||||
return countPending() + countActive();
|
||||
}
|
||||
|
|
@ -113,12 +113,10 @@ private:
|
|||
// because the consuming coroutine might outlive this LLCoprocedurePool
|
||||
// instance.
|
||||
typedef boost::shared_ptr<CoprocQueue_t> CoprocQueuePtr;
|
||||
typedef std::map<LLUUID, LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t> ActiveCoproc_t;
|
||||
|
||||
std::string mPoolName;
|
||||
size_t mPoolSize, mPending{0};
|
||||
size_t mPoolSize, mActiveCoprocsCount, mPending;
|
||||
CoprocQueuePtr mPendingCoprocs;
|
||||
ActiveCoproc_t mActiveCoprocs;
|
||||
LLTempBoundListener mStatusListener;
|
||||
|
||||
typedef std::map<std::string, LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t> CoroAdapterMap_t;
|
||||
|
|
@ -191,8 +189,13 @@ LLUUID LLCoprocedureManager::enqueueCoprocedure(const std::string &pool, const s
|
|||
|
||||
void LLCoprocedureManager::setPropertyMethods(SettingQuery_t queryfn, SettingUpdate_t updatefn)
|
||||
{
|
||||
// functions to discover and store the pool sizes
|
||||
mPropertyQueryFn = queryfn;
|
||||
mPropertyDefineFn = updatefn;
|
||||
|
||||
// workaround until we get mutex into initializePool
|
||||
initializePool("VAssetStorage");
|
||||
initializePool("Upload");
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
|
@ -276,6 +279,8 @@ void LLCoprocedureManager::close(const std::string &pool)
|
|||
LLCoprocedurePool::LLCoprocedurePool(const std::string &poolName, size_t size):
|
||||
mPoolName(poolName),
|
||||
mPoolSize(size),
|
||||
mActiveCoprocsCount(0),
|
||||
mPending(0),
|
||||
mPendingCoprocs(boost::make_shared<CoprocQueue_t>(DEFAULT_QUEUE_SIZE)),
|
||||
mHTTPPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID),
|
||||
mCoroMapping()
|
||||
|
|
@ -401,8 +406,7 @@ void LLCoprocedurePool::coprocedureInvokerCoro(
|
|||
}
|
||||
// we actually popped an item
|
||||
--mPending;
|
||||
|
||||
ActiveCoproc_t::iterator itActive = mActiveCoprocs.insert(ActiveCoproc_t::value_type(coproc->mId, httpAdapter)).first;
|
||||
mActiveCoprocsCount++;
|
||||
|
||||
LL_DEBUGS("CoProcMgr") << "Dequeued and invoking coprocedure(" << coproc->mName << ") with id=" << coproc->mId.asString() << " in pool \"" << mPoolName << "\" (" << mPending << " left)" << LL_ENDL;
|
||||
|
||||
|
|
@ -410,19 +414,25 @@ void LLCoprocedurePool::coprocedureInvokerCoro(
|
|||
{
|
||||
coproc->mProc(httpAdapter, coproc->mId);
|
||||
}
|
||||
catch (const LLCoros::Stop &e)
|
||||
{
|
||||
LL_INFOS("LLCoros") << "coprocedureInvokerCoro terminating because "
|
||||
<< e.what() << LL_ENDL;
|
||||
throw; // let toplevel handle this as LLContinueError
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
LOG_UNHANDLED_EXCEPTION(STRINGIZE("Coprocedure('" << coproc->mName
|
||||
<< "', id=" << coproc->mId.asString()
|
||||
<< ") in pool '" << mPoolName << "'"));
|
||||
// must NOT omit this or we deplete the pool
|
||||
mActiveCoprocs.erase(itActive);
|
||||
mActiveCoprocsCount--;
|
||||
continue;
|
||||
}
|
||||
|
||||
LL_DEBUGS("CoProcMgr") << "Finished coprocedure(" << coproc->mName << ")" << " in pool \"" << mPoolName << "\"" << LL_ENDL;
|
||||
|
||||
mActiveCoprocs.erase(itActive);
|
||||
mActiveCoprocsCount--;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -85,15 +85,15 @@ const F64 LLExperienceCache::DEFAULT_EXPIRATION = 600.0;
|
|||
const S32 LLExperienceCache::DEFAULT_QUOTA = 128; // this is megabytes
|
||||
const int LLExperienceCache::SEARCH_PAGE_SIZE = 30;
|
||||
|
||||
bool LLExperienceCache::sShutdown = false;
|
||||
|
||||
//=========================================================================
|
||||
LLExperienceCache::LLExperienceCache():
|
||||
mShutdown(false)
|
||||
LLExperienceCache::LLExperienceCache()
|
||||
{
|
||||
}
|
||||
|
||||
LLExperienceCache::~LLExperienceCache()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void LLExperienceCache::initSingleton()
|
||||
|
|
@ -122,7 +122,7 @@ void LLExperienceCache::cleanup()
|
|||
{
|
||||
cache_stream << (*this);
|
||||
}
|
||||
mShutdown = true;
|
||||
sShutdown = true;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
|
|
@ -344,7 +344,7 @@ void LLExperienceCache::requestExperiences()
|
|||
ostr << urlBase << "?page_size=" << PAGE_SIZE1;
|
||||
RequestQueue_t requests;
|
||||
|
||||
while (!mRequestQueue.empty())
|
||||
while (!mRequestQueue.empty() && !sShutdown)
|
||||
{
|
||||
RequestQueue_t::iterator it = mRequestQueue.begin();
|
||||
LLUUID key = (*it);
|
||||
|
|
@ -398,8 +398,6 @@ void LLExperienceCache::idleCoro()
|
|||
LL_INFOS("ExperienceCache") << "Launching Experience cache idle coro." << LL_ENDL;
|
||||
do
|
||||
{
|
||||
llcoro::suspendUntilTimeout(SECS_BETWEEN_REQUESTS);
|
||||
|
||||
if (mEraseExpiredTimer.checkExpirationAndReset(ERASE_EXPIRED_TIMEOUT))
|
||||
{
|
||||
eraseExpired();
|
||||
|
|
@ -410,7 +408,9 @@ void LLExperienceCache::idleCoro()
|
|||
requestExperiences();
|
||||
}
|
||||
|
||||
} while (!mShutdown);
|
||||
llcoro::suspendUntilTimeout(SECS_BETWEEN_REQUESTS);
|
||||
|
||||
} while (!sShutdown);
|
||||
|
||||
// The coroutine system will likely be shut down by the time we get to this point
|
||||
// (or at least no further cycling will occur on it since the user has decided to quit.)
|
||||
|
|
|
|||
|
|
@ -142,7 +142,7 @@ private:
|
|||
LLFrameTimer mEraseExpiredTimer; // Periodically clean out expired entries from the cache
|
||||
CapabilityQuery_t mCapability;
|
||||
std::string mCacheFileName;
|
||||
bool mShutdown;
|
||||
static bool sShutdown; // control for coroutines, they exist out of LLExperienceCache's scope, so they need a static control
|
||||
|
||||
void idleCoro();
|
||||
void eraseExpired();
|
||||
|
|
|
|||
|
|
@ -44,6 +44,8 @@ const U32 TELEPORT_FLAGS_VIA_REGION_ID = 1 << 12;
|
|||
const U32 TELEPORT_FLAGS_IS_FLYING = 1 << 13;
|
||||
const U32 TELEPORT_FLAGS_SHOW_RESET_HOME = 1 << 14;
|
||||
const U32 TELEPORT_FLAGS_FORCE_REDIRECT = 1 << 15; // used to force a redirect to some random location - used when kicking someone from land.
|
||||
const U32 TELEPORT_FLAGS_VIA_GLOBAL_COORDS = 1 << 16;
|
||||
const U32 TELEPORT_FLAGS_WITHIN_REGION = 1 << 17;
|
||||
|
||||
const U32 TELEPORT_FLAGS_MASK_VIA = TELEPORT_FLAGS_VIA_LURE
|
||||
| TELEPORT_FLAGS_VIA_LANDMARK
|
||||
|
|
|
|||
|
|
@ -985,38 +985,56 @@ BOOL LLImageGL::preAddToAtlas(S32 discard_level, const LLImageRaw* raw_image)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
if( !mHasExplicitFormat )
|
||||
{
|
||||
switch (mComponents)
|
||||
{
|
||||
case 1:
|
||||
// Use luminance alpha (for fonts)
|
||||
mFormatInternal = GL_LUMINANCE8;
|
||||
mFormatPrimary = GL_LUMINANCE;
|
||||
mFormatType = GL_UNSIGNED_BYTE;
|
||||
break;
|
||||
case 2:
|
||||
// Use luminance alpha (for fonts)
|
||||
mFormatInternal = GL_LUMINANCE8_ALPHA8;
|
||||
mFormatPrimary = GL_LUMINANCE_ALPHA;
|
||||
mFormatType = GL_UNSIGNED_BYTE;
|
||||
break;
|
||||
case 3:
|
||||
mFormatInternal = GL_RGB8;
|
||||
mFormatPrimary = GL_RGB;
|
||||
mFormatType = GL_UNSIGNED_BYTE;
|
||||
break;
|
||||
case 4:
|
||||
mFormatInternal = GL_RGBA8;
|
||||
mFormatPrimary = GL_RGBA;
|
||||
mFormatType = GL_UNSIGNED_BYTE;
|
||||
break;
|
||||
default:
|
||||
LL_ERRS() << "Bad number of components for texture: " << (U32)getComponents() << LL_ENDL;
|
||||
}
|
||||
}
|
||||
if (!mHasExplicitFormat)
|
||||
{
|
||||
switch (mComponents)
|
||||
{
|
||||
case 1:
|
||||
// Use luminance alpha (for fonts)
|
||||
mFormatInternal = GL_LUMINANCE8;
|
||||
mFormatPrimary = GL_LUMINANCE;
|
||||
mFormatType = GL_UNSIGNED_BYTE;
|
||||
break;
|
||||
case 2:
|
||||
// Use luminance alpha (for fonts)
|
||||
mFormatInternal = GL_LUMINANCE8_ALPHA8;
|
||||
mFormatPrimary = GL_LUMINANCE_ALPHA;
|
||||
mFormatType = GL_UNSIGNED_BYTE;
|
||||
break;
|
||||
case 3:
|
||||
#if USE_SRGB_DECODE
|
||||
if (gGLManager.mHasTexturesRGBDecode)
|
||||
{
|
||||
mFormatInternal = GL_SRGB8;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
mFormatInternal = GL_RGB8;
|
||||
}
|
||||
mFormatPrimary = GL_RGB;
|
||||
mFormatType = GL_UNSIGNED_BYTE;
|
||||
break;
|
||||
case 4:
|
||||
#if USE_SRGB_DECODE
|
||||
if (gGLManager.mHasTexturesRGBDecode)
|
||||
{
|
||||
mFormatInternal = GL_SRGB8_ALPHA8;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
mFormatInternal = GL_RGBA8;
|
||||
}
|
||||
mFormatPrimary = GL_RGBA;
|
||||
mFormatType = GL_UNSIGNED_BYTE;
|
||||
break;
|
||||
default:
|
||||
LL_ERRS() << "Bad number of components for texture: " << (U32) getComponents() << LL_ENDL;
|
||||
}
|
||||
}
|
||||
|
||||
mCurrentDiscardLevel = discard_level;
|
||||
mCurrentDiscardLevel = discard_level;
|
||||
mDiscardLevelInAtlas = discard_level;
|
||||
mTexelsInAtlas = raw_image->getWidth() * raw_image->getHeight() ;
|
||||
mLastBindTime = sLastFrameTime;
|
||||
|
|
|
|||
|
|
@ -849,26 +849,32 @@ void LLTexUnit::debugTextureUnit(void)
|
|||
}
|
||||
}
|
||||
|
||||
void LLTexUnit::setTextureColorSpace(eTextureColorSpace space) {
|
||||
void LLTexUnit::setTextureColorSpace(eTextureColorSpace space)
|
||||
{
|
||||
mTexColorSpace = space;
|
||||
|
||||
#if USE_SRGB_DECODE
|
||||
if (gGLManager.mHasTexturesRGBDecode) {
|
||||
|
||||
if (space == TCS_SRGB) {
|
||||
if (gGLManager.mHasTexturesRGBDecode)
|
||||
{
|
||||
if (space == TCS_SRGB)
|
||||
{
|
||||
glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_SRGB_DECODE_EXT, GL_DECODE_EXT);
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_SRGB_DECODE_EXT, GL_SKIP_DECODE_EXT);
|
||||
}
|
||||
|
||||
if (gDebugGL) {
|
||||
if (gDebugGL)
|
||||
{
|
||||
assert_glerror();
|
||||
}
|
||||
}
|
||||
else
|
||||
#endif
|
||||
glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_SRGB_DECODE_EXT, GL_SKIP_DECODE_EXT);
|
||||
|
||||
{
|
||||
glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_SRGB_DECODE_EXT, GL_SKIP_DECODE_EXT);
|
||||
}
|
||||
}
|
||||
|
||||
LLLightState::LLLightState(S32 index)
|
||||
|
|
@ -1192,46 +1198,46 @@ void LLRender::refreshState(void)
|
|||
|
||||
void LLRender::syncLightState()
|
||||
{
|
||||
LLGLSLShader* shader = LLGLSLShader::sCurBoundShaderPtr;
|
||||
LLGLSLShader *shader = LLGLSLShader::sCurBoundShaderPtr;
|
||||
|
||||
if (!shader)
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (!shader)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (shader->mLightHash != mLightHash)
|
||||
{
|
||||
shader->mLightHash = mLightHash;
|
||||
if (shader->mLightHash != mLightHash)
|
||||
{
|
||||
shader->mLightHash = mLightHash;
|
||||
|
||||
LLVector4 position[8];
|
||||
LLVector3 direction[8];
|
||||
LLVector4 attenuation[8];
|
||||
LLVector3 diffuse[8];
|
||||
LLVector3 diffuse_b[8];
|
||||
bool sun_primary[8];
|
||||
LLVector4 position[LL_NUM_LIGHT_UNITS];
|
||||
LLVector3 direction[LL_NUM_LIGHT_UNITS];
|
||||
LLVector4 attenuation[LL_NUM_LIGHT_UNITS];
|
||||
LLVector3 diffuse[LL_NUM_LIGHT_UNITS];
|
||||
LLVector3 diffuse_b[LL_NUM_LIGHT_UNITS];
|
||||
bool sun_primary[LL_NUM_LIGHT_UNITS];
|
||||
|
||||
for (U32 i = 0; i < 8; i++)
|
||||
{
|
||||
LLLightState* light = mLightState[i];
|
||||
for (U32 i = 0; i < LL_NUM_LIGHT_UNITS; i++)
|
||||
{
|
||||
LLLightState *light = mLightState[i];
|
||||
|
||||
position[i] = light->mPosition;
|
||||
direction[i] = light->mSpotDirection;
|
||||
position[i] = light->mPosition;
|
||||
direction[i] = light->mSpotDirection;
|
||||
attenuation[i].set(light->mLinearAtten, light->mQuadraticAtten, light->mSpecular.mV[2], light->mSpecular.mV[3]);
|
||||
diffuse[i].set(light->mDiffuse.mV);
|
||||
diffuse[i].set(light->mDiffuse.mV);
|
||||
diffuse_b[i].set(light->mDiffuseB.mV);
|
||||
sun_primary[i] = light->mSunIsPrimary;
|
||||
}
|
||||
}
|
||||
|
||||
shader->uniform4fv(LLShaderMgr::LIGHT_POSITION, 8, position[0].mV);
|
||||
shader->uniform3fv(LLShaderMgr::LIGHT_DIRECTION, 8, direction[0].mV);
|
||||
shader->uniform4fv(LLShaderMgr::LIGHT_ATTENUATION, 8, attenuation[0].mV);
|
||||
shader->uniform3fv(LLShaderMgr::LIGHT_DIFFUSE, 8, diffuse[0].mV);
|
||||
shader->uniform4fv(LLShaderMgr::LIGHT_AMBIENT, 1, mAmbientLightColor.mV);
|
||||
shader->uniform4fv(LLShaderMgr::LIGHT_POSITION, LL_NUM_LIGHT_UNITS, position[0].mV);
|
||||
shader->uniform3fv(LLShaderMgr::LIGHT_DIRECTION, LL_NUM_LIGHT_UNITS, direction[0].mV);
|
||||
shader->uniform4fv(LLShaderMgr::LIGHT_ATTENUATION, LL_NUM_LIGHT_UNITS, attenuation[0].mV);
|
||||
shader->uniform3fv(LLShaderMgr::LIGHT_DIFFUSE, LL_NUM_LIGHT_UNITS, diffuse[0].mV);
|
||||
shader->uniform4fv(LLShaderMgr::LIGHT_AMBIENT, 1, mAmbientLightColor.mV);
|
||||
shader->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_primary[0] ? 1 : 0);
|
||||
shader->uniform4fv(LLShaderMgr::AMBIENT, 1, mAmbientLightColor.mV);
|
||||
shader->uniform4fv(LLShaderMgr::SUNLIGHT_COLOR, 1, diffuse[0].mV);
|
||||
shader->uniform4fv(LLShaderMgr::MOONLIGHT_COLOR, 1, diffuse_b[0].mV);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void LLRender::syncMatrices()
|
||||
|
|
@ -1539,11 +1545,17 @@ void LLRender::matrixMode(eMatrixMode mode)
|
|||
{
|
||||
U32 tex_index = gGL.getCurrentTexUnitIndex();
|
||||
// the shaders don't actually reference anything beyond texture_matrix0/1 outside of terrain rendering
|
||||
llassert_always(tex_index <= 3);
|
||||
mode = eMatrixMode(MM_TEXTURE0 + gGL.getCurrentTexUnitIndex());
|
||||
llassert(tex_index <= 3);
|
||||
mode = eMatrixMode(MM_TEXTURE0 + tex_index);
|
||||
if (mode > MM_TEXTURE3)
|
||||
{
|
||||
// getCurrentTexUnitIndex() can go as high as 32 (LL_NUM_TEXTURE_LAYERS)
|
||||
// Large value will result in a crash at mMatrix
|
||||
LL_WARNS_ONCE() << "Attempted to assign matrix mode out of bounds: " << mode << LL_ENDL;
|
||||
mode = MM_TEXTURE0;
|
||||
}
|
||||
}
|
||||
|
||||
llassert(mode < NUM_MATRIX_MODES);
|
||||
mMatrixMode = mode;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -501,23 +501,23 @@ U32 LLRenderTarget::getNumTextures() const
|
|||
return mTex.size();
|
||||
}
|
||||
|
||||
|
||||
void LLRenderTarget::bindTexture(U32 index, S32 channel, LLTexUnit::eTextureFilterOptions filter_options)
|
||||
{
|
||||
gGL.getTexUnit(channel)->bindManual(mUsage, getTexture(index));
|
||||
gGL.getTexUnit(channel)->bindManual(mUsage, getTexture(index));
|
||||
|
||||
bool isSRGB = false;
|
||||
llassert(mInternalFormat.size() > index);
|
||||
switch (mInternalFormat[index])
|
||||
{
|
||||
case GL_SRGB_ALPHA:
|
||||
case GL_SRGB:
|
||||
case GL_SRGB8:
|
||||
case GL_SRGB_ALPHA:
|
||||
case GL_SRGB8_ALPHA8:
|
||||
isSRGB = true;
|
||||
break;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
break;
|
||||
}
|
||||
|
||||
gGL.getTexUnit(channel)->setTextureFilteringOption(filter_options);
|
||||
|
|
|
|||
|
|
@ -1180,7 +1180,7 @@ void LLShaderMgr::initAttribsAndUniforms()
|
|||
|
||||
llassert(mReservedUniforms.size() == LLShaderMgr::MULTI_LIGHT_FAR_Z+1);
|
||||
|
||||
|
||||
//NOTE: MUST match order in eGLSLReservedUniforms
|
||||
mReservedUniforms.push_back("proj_mat");
|
||||
mReservedUniforms.push_back("proj_near");
|
||||
mReservedUniforms.push_back("proj_p");
|
||||
|
|
|
|||
|
|
@ -655,6 +655,37 @@ void LLAccordionCtrl::onScrollPosChangeCallback(S32, LLScrollbar*)
|
|||
{
|
||||
updateLayout(getRect().getWidth(),getRect().getHeight());
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLAccordionCtrl::onUpdateScrollToChild(const LLUICtrl *cntrl)
|
||||
{
|
||||
if (mScrollbar && mScrollbar->getVisible())
|
||||
{
|
||||
// same as scrollToShowRect
|
||||
LLRect rect;
|
||||
cntrl->localRectToOtherView(cntrl->getLocalRect(), &rect, this);
|
||||
|
||||
// Translate to parent coordinatess to check if we are in visible rectangle
|
||||
rect.translate(getRect().mLeft, getRect().mBottom);
|
||||
|
||||
if (!getRect().contains(rect))
|
||||
{
|
||||
// for accordition's scroll, height is in pixels
|
||||
// Back to local coords and calculate position for scroller
|
||||
S32 bottom = mScrollbar->getDocPos() - rect.mBottom + getRect().mBottom;
|
||||
S32 top = mScrollbar->getDocPos() - rect.mTop + getRect().mTop;
|
||||
|
||||
S32 scroll_pos = llclamp(mScrollbar->getDocPos(),
|
||||
bottom, // min vertical scroll
|
||||
top); // max vertical scroll
|
||||
|
||||
mScrollbar->setDocPos(scroll_pos);
|
||||
}
|
||||
}
|
||||
|
||||
LLUICtrl::onUpdateScrollToChild(cntrl);
|
||||
}
|
||||
|
||||
void LLAccordionCtrl::onOpen (const LLSD& key)
|
||||
{
|
||||
for(size_t i=0;i<mAccordionTabs.size();++i)
|
||||
|
|
|
|||
|
|
@ -111,6 +111,7 @@ public:
|
|||
void draw();
|
||||
|
||||
void onScrollPosChangeCallback(S32, LLScrollbar*);
|
||||
virtual void onUpdateScrollToChild(const LLUICtrl * cntrl);
|
||||
|
||||
void onOpen (const LLSD& key);
|
||||
S32 notifyParent(const LLSD& info);
|
||||
|
|
|
|||
|
|
@ -452,6 +452,35 @@ void LLAccordionCtrlTab::onVisibilityChange(BOOL new_visibility)
|
|||
notifyParent(LLSD().with("child_visibility_change", new_visibility));
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLAccordionCtrlTab::onUpdateScrollToChild(const LLUICtrl *cntrl)
|
||||
{
|
||||
if (mScrollbar && mScrollbar->getVisible())
|
||||
{
|
||||
LLRect rect;
|
||||
cntrl->localRectToOtherView(cntrl->getLocalRect(), &rect, this);
|
||||
|
||||
// Translate to parent coordinatess to check if we are in visible rectangle
|
||||
rect.translate(getRect().mLeft, getRect().mBottom);
|
||||
|
||||
if (!getRect().contains(rect))
|
||||
{
|
||||
// for accordition's scroll, height is in pixels
|
||||
// Back to local coords and calculate position for scroller
|
||||
S32 bottom = mScrollbar->getDocPos() - rect.mBottom + getRect().mBottom;
|
||||
S32 top = mScrollbar->getDocPos() - rect.mTop + getRect().mTop;
|
||||
|
||||
S32 scroll_pos = llclamp(mScrollbar->getDocPos(),
|
||||
bottom, // min vertical scroll
|
||||
top); // max vertical scroll
|
||||
|
||||
mScrollbar->setDocPos(scroll_pos);
|
||||
}
|
||||
}
|
||||
|
||||
LLUICtrl::onUpdateScrollToChild(cntrl);
|
||||
}
|
||||
|
||||
BOOL LLAccordionCtrlTab::handleMouseDown(S32 x, S32 y, MASK mask)
|
||||
{
|
||||
if(mCollapsible && mHeaderVisible && mCanOpenClose)
|
||||
|
|
|
|||
|
|
@ -159,6 +159,7 @@ public:
|
|||
* Raises notifyParent event with "child_visibility_change" = new_visibility
|
||||
*/
|
||||
void onVisibilityChange(BOOL new_visibility);
|
||||
virtual void onUpdateScrollToChild(const LLUICtrl * cntrl);
|
||||
|
||||
// Changes expand/collapse state and triggers expand/collapse callbacks
|
||||
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
|
||||
|
|
|
|||
|
|
@ -56,6 +56,14 @@ void LLBadgeOwner::initBadgeParams(const LLBadge::Params& p)
|
|||
}
|
||||
}
|
||||
|
||||
void LLBadgeOwner::reshapeBadge(const LLRect& new_rect)
|
||||
{
|
||||
if (mBadge)
|
||||
{
|
||||
mBadge->setShape(new_rect);
|
||||
}
|
||||
}
|
||||
|
||||
void LLBadgeOwner::setBadgeVisibility(bool visible)
|
||||
{
|
||||
if (mBadge)
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ public:
|
|||
bool hasBadgeHolderParent() const { return mHasBadgeHolderParent; };
|
||||
void setBadgeVisibility(bool visible);
|
||||
void setDrawBadgeAtTop(bool draw_at_top);
|
||||
void reshapeBadge(const LLRect& new_rect);
|
||||
|
||||
private:
|
||||
|
||||
|
|
|
|||
|
|
@ -514,6 +514,14 @@ S32 LLComboBox::getCurrentIndex() const
|
|||
return -1;
|
||||
}
|
||||
|
||||
void LLComboBox::setEnabledByValue(const LLSD& value, BOOL enabled)
|
||||
{
|
||||
LLScrollListItem *found = mList->getItem(value);
|
||||
if (found)
|
||||
{
|
||||
found->setEnabled(enabled);
|
||||
}
|
||||
}
|
||||
|
||||
void LLComboBox::createLineEditor(const LLComboBox::Params& p)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -158,6 +158,8 @@ public:
|
|||
BOOL setCurrentByIndex( S32 index );
|
||||
S32 getCurrentIndex() const;
|
||||
|
||||
void setEnabledByValue(const LLSD& value, BOOL enabled);
|
||||
|
||||
void createLineEditor(const Params&);
|
||||
|
||||
//========================================================================
|
||||
|
|
|
|||
|
|
@ -2151,6 +2151,7 @@ void LLLineEditor::clear()
|
|||
void LLLineEditor::onTabInto()
|
||||
{
|
||||
selectAll();
|
||||
LLUICtrl::onTabInto();
|
||||
}
|
||||
|
||||
//virtual
|
||||
|
|
|
|||
|
|
@ -509,6 +509,7 @@ void LLMultiSliderCtrl::onTabInto()
|
|||
{
|
||||
mEditor->onTabInto();
|
||||
}
|
||||
LLF32UICtrl::onTabInto();
|
||||
}
|
||||
|
||||
void LLMultiSliderCtrl::reportInvalidData()
|
||||
|
|
|
|||
|
|
@ -256,7 +256,7 @@ LLNotificationForm::LLNotificationForm(const LLSD& sd)
|
|||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << "Invalid form data " << sd << LL_ENDL;
|
||||
LL_WARNS("Notifications") << "Invalid form data " << sd << LL_ENDL;
|
||||
mFormData = LLSD::emptyArray();
|
||||
}
|
||||
}
|
||||
|
|
@ -449,11 +449,11 @@ LLNotificationTemplate::LLNotificationTemplate(const LLNotificationTemplate::Par
|
|||
mUniqueContext.push_back(context.value);
|
||||
}
|
||||
|
||||
LL_DEBUGS() << "notification \"" << mName << "\": tag count is " << p.tags.size() << LL_ENDL;
|
||||
LL_DEBUGS("Notifications") << "notification \"" << mName << "\": tag count is " << p.tags.size() << LL_ENDL;
|
||||
|
||||
BOOST_FOREACH(const LLNotificationTemplate::Tag& tag, p.tags)
|
||||
{
|
||||
LL_DEBUGS() << " tag \"" << std::string(tag.value) << "\"" << LL_ENDL;
|
||||
LL_DEBUGS("Notifications") << " tag \"" << std::string(tag.value) << "\"" << LL_ENDL;
|
||||
mTags.push_back(tag.value);
|
||||
}
|
||||
|
||||
|
|
@ -1399,8 +1399,14 @@ void LLNotifications::initSingleton()
|
|||
createDefaultChannels();
|
||||
}
|
||||
|
||||
void LLNotifications::cleanupSingleton()
|
||||
{
|
||||
clear();
|
||||
}
|
||||
|
||||
void LLNotifications::createDefaultChannels()
|
||||
{
|
||||
LL_INFOS("Notifications") << "Generating default notification channels" << LL_ENDL;
|
||||
// now construct the various channels AFTER loading the notifications,
|
||||
// because the history channel is going to rewrite the stored notifications file
|
||||
mDefaultChannels.push_back(new LLNotificationChannel("Enabled", "",
|
||||
|
|
@ -1456,7 +1462,7 @@ void LLNotifications::forceResponse(const LLNotification::Params& params, S32 op
|
|||
|
||||
if (selected_item.isUndefined())
|
||||
{
|
||||
LL_WARNS() << "Invalid option" << option << " for notification " << (std::string)params.name << LL_ENDL;
|
||||
LL_WARNS("Notifications") << "Invalid option" << option << " for notification " << (std::string)params.name << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
response[selected_item["name"].asString()] = true;
|
||||
|
|
@ -1490,12 +1496,12 @@ void replaceSubstitutionStrings(LLXMLNodePtr node, StringMap& replacements)
|
|||
if (found != replacements.end())
|
||||
{
|
||||
replacement = found->second;
|
||||
LL_DEBUGS() << "replaceSubstitutionStrings: value: \"" << value << "\" repl: \"" << replacement << "\"." << LL_ENDL;
|
||||
LL_DEBUGS("Notifications") << "replaceSubstitutionStrings: value: \"" << value << "\" repl: \"" << replacement << "\"." << LL_ENDL;
|
||||
it->second->setValue(replacement);
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << "replaceSubstitutionStrings FAILURE: could not find replacement \"" << value << "\"." << LL_ENDL;
|
||||
LL_WARNS("Notifications") << "replaceSubstitutionStrings FAILURE: could not find replacement \"" << value << "\"." << LL_ENDL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1534,7 +1540,7 @@ void addPathIfExists(const std::string& new_path, std::vector<std::string>& path
|
|||
|
||||
bool LLNotifications::loadTemplates()
|
||||
{
|
||||
LL_INFOS() << "Reading notifications template" << LL_ENDL;
|
||||
LL_INFOS("Notifications") << "Reading notifications template" << LL_ENDL;
|
||||
// Passing findSkinnedFilenames(constraint=LLDir::ALL_SKINS) makes it
|
||||
// output all relevant pathnames instead of just the ones from the most
|
||||
// specific skin.
|
||||
|
|
@ -1605,7 +1611,7 @@ bool LLNotifications::loadTemplates()
|
|||
mTemplates[notification.name] = LLNotificationTemplatePtr(new LLNotificationTemplate(notification));
|
||||
}
|
||||
|
||||
LL_INFOS() << "...done" << LL_ENDL;
|
||||
LL_INFOS("Notifications") << "...done" << LL_ENDL;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
@ -1833,7 +1839,7 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n)
|
|||
for(it = mVisibilityRules.begin(); it != mVisibilityRules.end(); it++)
|
||||
{
|
||||
// An empty type/tag/name string will match any notification, so only do the comparison when the string is non-empty in the rule.
|
||||
LL_DEBUGS()
|
||||
LL_DEBUGS("Notifications")
|
||||
<< "notification \"" << n->getName() << "\" "
|
||||
<< "testing against " << ((*it)->mVisible?"show":"hide") << " rule, "
|
||||
<< "name = \"" << (*it)->mName << "\" "
|
||||
|
|
@ -1878,7 +1884,7 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n)
|
|||
if((*it)->mResponse.empty())
|
||||
{
|
||||
// Response property is empty. Cancel this notification.
|
||||
LL_DEBUGS() << "cancelling notification " << n->getName() << LL_ENDL;
|
||||
LL_DEBUGS("Notifications") << "cancelling notification " << n->getName() << LL_ENDL;
|
||||
|
||||
cancel(n);
|
||||
}
|
||||
|
|
@ -1889,7 +1895,7 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n)
|
|||
// TODO: verify that the response template has an item with the correct name
|
||||
response[(*it)->mResponse] = true;
|
||||
|
||||
LL_DEBUGS() << "responding to notification " << n->getName() << " with response = " << response << LL_ENDL;
|
||||
LL_DEBUGS("Notifications") << "responding to notification " << n->getName() << " with response = " << response << LL_ENDL;
|
||||
|
||||
n->respond(response);
|
||||
}
|
||||
|
|
@ -1901,7 +1907,7 @@ bool LLNotifications::isVisibleByRules(LLNotificationPtr n)
|
|||
break;
|
||||
}
|
||||
|
||||
LL_DEBUGS() << "allowing notification " << n->getName() << LL_ENDL;
|
||||
LL_DEBUGS("Notifications") << "allowing notification " << n->getName() << LL_ENDL;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
@ -1962,7 +1968,7 @@ void LLPostponedNotification::onAvatarNameCache(const LLUUID& agent_id,
|
|||
// from PE merge - we should figure out if this is the right thing to do
|
||||
if (name.empty())
|
||||
{
|
||||
LL_WARNS() << "Empty name received for Id: " << agent_id << LL_ENDL;
|
||||
LL_WARNS("Notifications") << "Empty name received for Id: " << agent_id << LL_ENDL;
|
||||
name = SYSTEM_FROM;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -958,6 +958,7 @@ public:
|
|||
|
||||
private:
|
||||
/*virtual*/ void initSingleton();
|
||||
/*virtual*/ void cleanupSingleton();
|
||||
|
||||
void loadPersistentNotifications();
|
||||
|
||||
|
|
@ -1070,6 +1071,7 @@ public:
|
|||
LLPersistentNotificationChannel()
|
||||
: LLNotificationChannel("Persistent", "Visible", ¬ificationFilter)
|
||||
{}
|
||||
virtual ~LLPersistentNotificationChannel() {}
|
||||
|
||||
typedef std::vector<LLNotificationPtr> history_list_t;
|
||||
history_list_t::iterator beginHistory() { sortHistory(); return mHistory.begin(); }
|
||||
|
|
|
|||
|
|
@ -479,6 +479,7 @@ void LLSliderCtrl::onTabInto()
|
|||
{
|
||||
mEditor->onTabInto();
|
||||
}
|
||||
LLF32UICtrl::onTabInto();
|
||||
}
|
||||
|
||||
void LLSliderCtrl::reportInvalidData()
|
||||
|
|
|
|||
|
|
@ -442,7 +442,8 @@ void LLSpinCtrl::setAllowEdit(BOOL allow_edit)
|
|||
|
||||
void LLSpinCtrl::onTabInto()
|
||||
{
|
||||
mEditor->onTabInto();
|
||||
mEditor->onTabInto();
|
||||
LLF32UICtrl::onTabInto();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1017,7 +1017,38 @@ BOOL LLTextBase::handleMouseDown(S32 x, S32 y, MASK mask)
|
|||
// handle triple click
|
||||
if (!mTripleClickTimer.hasExpired())
|
||||
{
|
||||
selectAll();
|
||||
S32 real_line = getLineNumFromDocIndex(mCursorPos, false);
|
||||
S32 line_start = -1;
|
||||
S32 line_end = -1;
|
||||
for (line_list_t::const_iterator it = mLineInfoList.begin(), end_it = mLineInfoList.end();
|
||||
it != end_it;
|
||||
++it)
|
||||
{
|
||||
if (it->mLineNum < real_line)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (it->mLineNum > real_line)
|
||||
{
|
||||
break;
|
||||
}
|
||||
if (line_start == -1)
|
||||
{
|
||||
line_start = it->mDocIndexStart;
|
||||
}
|
||||
line_end = it->mDocIndexEnd;
|
||||
line_end = llclamp(line_end, 0, getLength());
|
||||
}
|
||||
|
||||
if (line_start == -1)
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
mSelectionEnd = line_start;
|
||||
mSelectionStart = line_end;
|
||||
setCursorPos(line_start);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -721,8 +721,9 @@ void LLUICtrl::resetDirty()
|
|||
}
|
||||
|
||||
// virtual
|
||||
void LLUICtrl::onTabInto()
|
||||
void LLUICtrl::onTabInto()
|
||||
{
|
||||
onUpdateScrollToChild(this);
|
||||
}
|
||||
|
||||
// virtual
|
||||
|
|
|
|||
|
|
@ -645,6 +645,16 @@ void LLView::onVisibilityChange ( BOOL new_visibility )
|
|||
}
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLView::onUpdateScrollToChild(const LLUICtrl * cntrl)
|
||||
{
|
||||
LLView* parent_view = getParent();
|
||||
if (parent_view)
|
||||
{
|
||||
parent_view->onUpdateScrollToChild(cntrl);
|
||||
}
|
||||
}
|
||||
|
||||
// virtual
|
||||
void LLView::translate(S32 x, S32 y)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -301,6 +301,7 @@ public:
|
|||
virtual BOOL setLabelArg( const std::string& key, const LLStringExplicit& text );
|
||||
|
||||
virtual void onVisibilityChange ( BOOL new_visibility );
|
||||
virtual void onUpdateScrollToChild(const LLUICtrl * cntrl);
|
||||
|
||||
void pushVisible(BOOL visible) { mLastVisible = mVisible; setVisible(visible); }
|
||||
void popVisible() { setVisible(mLastVisible); }
|
||||
|
|
|
|||
|
|
@ -359,10 +359,10 @@ attributedStringInfo getSegments(NSAttributedString *str)
|
|||
callRightMouseDown(mMousePos, [theEvent modifierFlags]);
|
||||
mSimulatedRightClick = true;
|
||||
} else {
|
||||
if ([theEvent clickCount] >= 2)
|
||||
if ([theEvent clickCount] == 2)
|
||||
{
|
||||
callDoubleClick(mMousePos, [theEvent modifierFlags]);
|
||||
} else if ([theEvent clickCount] == 1) {
|
||||
} else if ([theEvent clickCount] >= 1) {
|
||||
callLeftMouseDown(mMousePos, [theEvent modifierFlags]);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1620,6 +1620,10 @@ if (WINDOWS)
|
|||
# causes those systems to run in a Windows 8 compatibility mode, which works.
|
||||
LIST(APPEND viewer_SOURCE_FILES windows.manifest)
|
||||
endif (ADDRESS_SIZE EQUAL 64)
|
||||
|
||||
if (OPENAL)
|
||||
LIST(APPEND viewer_LIBRARIES ${OPENAL_LIBRARIES})
|
||||
endif (OPENAL)
|
||||
endif (WINDOWS)
|
||||
|
||||
# Add the xui files. This is handy for searching for xui elements
|
||||
|
|
@ -1721,6 +1725,12 @@ if (FMODSTUDIO)
|
|||
endif (FMODSTUDIO)
|
||||
|
||||
set_source_files_properties(llstartup.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}")
|
||||
|
||||
if (HAVOK OR HAVOK_TPV)
|
||||
set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_HAVOK")
|
||||
endif (HAVOK OR HAVOK_TPV)
|
||||
|
||||
# progress view disables/enables icons based on available packages
|
||||
set_source_files_properties(llprogressview.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}")
|
||||
|
||||
list(APPEND viewer_SOURCE_FILES ${viewer_HEADER_FILES})
|
||||
|
|
@ -1843,6 +1853,13 @@ if (WINDOWS)
|
|||
)
|
||||
endif (FMODSTUDIO)
|
||||
|
||||
if (OPENAL)
|
||||
list(APPEND COPY_INPUT_DEPENDENCIES
|
||||
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/OpenAL32.dll
|
||||
${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/alut.dll
|
||||
)
|
||||
endif (OPENAL)
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ${CMAKE_CFG_INTDIR}/copy_touched.bat
|
||||
COMMAND ${PYTHON_EXECUTABLE}
|
||||
|
|
@ -1853,6 +1870,7 @@ if (WINDOWS)
|
|||
--artwork=${ARTWORK_DIR}
|
||||
"--bugsplat=${BUGSPLAT_DB}"
|
||||
"--fmodstudio=${FMODSTUDIO}"
|
||||
"--openal=${OPENAL}"
|
||||
--build=${CMAKE_CURRENT_BINARY_DIR}
|
||||
--buildtype=${CMAKE_BUILD_TYPE}
|
||||
"--channel=${VIEWER_CHANNEL}"
|
||||
|
|
@ -1915,6 +1933,7 @@ if (WINDOWS)
|
|||
--artwork=${ARTWORK_DIR}
|
||||
"--bugsplat=${BUGSPLAT_DB}"
|
||||
"--fmodstudio=${FMODSTUDIO}"
|
||||
"--openal=${OPENAL}"
|
||||
--build=${CMAKE_CURRENT_BINARY_DIR}
|
||||
--buildtype=${CMAKE_BUILD_TYPE}
|
||||
"--channel=${VIEWER_CHANNEL}"
|
||||
|
|
@ -2062,6 +2081,7 @@ if (LINUX)
|
|||
--artwork=${ARTWORK_DIR}
|
||||
"--bugsplat=${BUGSPLAT_DB}"
|
||||
"--fmodstudio=${FMODSTUDIO}"
|
||||
"--openal=${OPENAL}"
|
||||
--build=${CMAKE_CURRENT_BINARY_DIR}
|
||||
--buildtype=${CMAKE_BUILD_TYPE}
|
||||
"--channel=${VIEWER_CHANNEL}"
|
||||
|
|
@ -2089,6 +2109,7 @@ if (LINUX)
|
|||
--artwork=${ARTWORK_DIR}
|
||||
"--bugsplat=${BUGSPLAT_DB}"
|
||||
"--fmodstudio=${FMODSTUDIO}"
|
||||
"--openal=${OPENAL}"
|
||||
--build=${CMAKE_CURRENT_BINARY_DIR}
|
||||
--buildtype=${CMAKE_BUILD_TYPE}
|
||||
"--channel=${VIEWER_CHANNEL}"
|
||||
|
|
@ -2166,6 +2187,7 @@ if (DARWIN)
|
|||
--artwork=${ARTWORK_DIR}
|
||||
"--bugsplat=${BUGSPLAT_DB}"
|
||||
"--fmodstudio=${FMODSTUDIO}"
|
||||
"--openal=${OPENAL}"
|
||||
--build=${CMAKE_CURRENT_BINARY_DIR}
|
||||
--buildtype=${CMAKE_BUILD_TYPE}
|
||||
--bundleid=${MACOSX_BUNDLE_GUI_IDENTIFIER}
|
||||
|
|
@ -2201,6 +2223,7 @@ if (DARWIN)
|
|||
--artwork=${ARTWORK_DIR}
|
||||
"--bugsplat=${BUGSPLAT_DB}"
|
||||
"--fmodstudio=${FMODSTUDIO}"
|
||||
"--openal=${OPENAL}"
|
||||
--build=${CMAKE_CURRENT_BINARY_DIR}
|
||||
--buildtype=${CMAKE_BUILD_TYPE}
|
||||
"--channel=${VIEWER_CHANNEL}"
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
6.4.8
|
||||
6.4.10
|
||||
|
|
|
|||
|
|
@ -812,17 +812,6 @@
|
|||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>FramePerSecondLimit</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Controls upper limit of frames per second</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>U32</string>
|
||||
<key>Value</key>
|
||||
<integer>120</integer>
|
||||
</map>
|
||||
<key>BackgroundYieldTime</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
@ -14420,7 +14409,7 @@
|
|||
<key>VoiceCallsFriendsOnly</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Only accept voice calls from residents on your friends list</string>
|
||||
<string>(Deprecated) Only accept voice calls from residents on your friends list</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
|
|
|
|||
|
|
@ -220,6 +220,17 @@
|
|||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>VoiceCallsFriendsOnly</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Only accept voice calls and receive IMs from residents on your friends list</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>Boolean</string>
|
||||
<key>Value</key>
|
||||
<integer>0</integer>
|
||||
</map>
|
||||
<key>VoiceEffectDefault</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
|
|
@ -1,24 +1,24 @@
|
|||
/**
|
||||
/**
|
||||
* @file WLCloudsV.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2005, 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$
|
||||
*/
|
||||
|
|
@ -33,26 +33,26 @@ ATTRIBUTE vec2 texcoord0;
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Output parameters
|
||||
VARYING vec4 vary_CloudColorSun;
|
||||
VARYING vec4 vary_CloudColorAmbient;
|
||||
VARYING vec4 vary_CloudColorSun;
|
||||
VARYING vec4 vary_CloudColorAmbient;
|
||||
VARYING float vary_CloudDensity;
|
||||
|
||||
VARYING vec2 vary_texcoord0;
|
||||
VARYING vec2 vary_texcoord1;
|
||||
VARYING vec2 vary_texcoord2;
|
||||
VARYING vec2 vary_texcoord3;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
VARYING vec2 vary_texcoord1;
|
||||
VARYING vec2 vary_texcoord2;
|
||||
VARYING vec2 vary_texcoord3;
|
||||
VARYING float altitude_blend_factor;
|
||||
|
||||
// Inputs
|
||||
uniform vec3 camPosLocal;
|
||||
|
||||
uniform vec4 lightnorm;
|
||||
uniform vec4 sunlight_color;
|
||||
uniform vec4 moonlight_color;
|
||||
uniform int sun_up_factor;
|
||||
uniform vec4 ambient_color;
|
||||
uniform vec4 blue_horizon;
|
||||
uniform vec4 blue_density;
|
||||
uniform vec4 lightnorm;
|
||||
uniform vec4 sunlight_color;
|
||||
uniform vec4 moonlight_color;
|
||||
uniform int sun_up_factor;
|
||||
uniform vec4 ambient_color;
|
||||
uniform vec4 blue_horizon;
|
||||
uniform vec4 blue_density;
|
||||
uniform float haze_horizon;
|
||||
uniform float haze_density;
|
||||
|
||||
|
|
@ -60,7 +60,7 @@ uniform float cloud_shadow;
|
|||
uniform float density_multiplier;
|
||||
uniform float max_y;
|
||||
|
||||
uniform vec4 glow;
|
||||
uniform vec4 glow;
|
||||
uniform float sun_moon_glow_factor;
|
||||
|
||||
uniform vec4 cloud_color;
|
||||
|
|
@ -70,133 +70,123 @@ uniform float cloud_scale;
|
|||
// NOTE: Keep these in sync!
|
||||
// indra\newview\app_settings\shaders\class1\deferred\skyV.glsl
|
||||
// indra\newview\app_settings\shaders\class1\deferred\cloudsV.glsl
|
||||
// indra\newview\app-settings\shaders\class2\windlight\cloudsV.glsl
|
||||
// indra\newview\lllegacyatmospherics.cpp
|
||||
// indra\newview\llsettingsvo.cpp
|
||||
void main()
|
||||
{
|
||||
// World / view / projection
|
||||
gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
|
||||
|
||||
// World / view / projection
|
||||
gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
|
||||
// Texture coords
|
||||
// SL-13084 EEP added support for custom cloud textures -- flip them horizontally to match the preview of Clouds > Cloud Scroll
|
||||
vary_texcoord0 = vec2(-texcoord0.x, texcoord0.y); // See: LLSettingsVOSky::applySpecial
|
||||
|
||||
// Texture coords
|
||||
vary_texcoord0 = texcoord0;
|
||||
vary_texcoord0.xy -= 0.5;
|
||||
vary_texcoord0.xy /= cloud_scale;
|
||||
vary_texcoord0.xy += 0.5;
|
||||
vary_texcoord0.xy -= 0.5;
|
||||
vary_texcoord0.xy /= cloud_scale;
|
||||
vary_texcoord0.xy += 0.5;
|
||||
|
||||
vary_texcoord1 = vary_texcoord0;
|
||||
vary_texcoord1.x += lightnorm.x * 0.0125;
|
||||
vary_texcoord1.y += lightnorm.z * 0.0125;
|
||||
vary_texcoord1 = vary_texcoord0;
|
||||
vary_texcoord1.x += lightnorm.x * 0.0125;
|
||||
vary_texcoord1.y += lightnorm.z * 0.0125;
|
||||
|
||||
vary_texcoord2 = vary_texcoord0 * 16.;
|
||||
vary_texcoord3 = vary_texcoord1 * 16.;
|
||||
vary_texcoord2 = vary_texcoord0 * 16.;
|
||||
vary_texcoord3 = vary_texcoord1 * 16.;
|
||||
|
||||
// Get relative position
|
||||
vec3 P = position.xyz - camPosLocal.xyz + vec3(0,50,0);
|
||||
// Get relative position
|
||||
vec3 rel_pos = position.xyz - camPosLocal.xyz + vec3(0, 50, 0);
|
||||
|
||||
altitude_blend_factor = clamp((P.y + 512.0) / max_y, 0.0, 1.0);
|
||||
altitude_blend_factor = clamp((rel_pos.y + 512.0) / max_y, 0.0, 1.0);
|
||||
|
||||
// Set altitude
|
||||
if (P.y > 0.)
|
||||
{
|
||||
P *= (max_y / P.y);
|
||||
}
|
||||
else
|
||||
{
|
||||
altitude_blend_factor = 0; // SL-11589 Fix clouds drooping below horizon
|
||||
P *= (-32000. / P.y);
|
||||
}
|
||||
// Set altitude
|
||||
if (rel_pos.y > 0)
|
||||
{
|
||||
rel_pos *= (max_y / rel_pos.y);
|
||||
}
|
||||
if (rel_pos.y < 0)
|
||||
{
|
||||
altitude_blend_factor = 0; // SL-11589 Fix clouds drooping below horizon
|
||||
rel_pos *= (-32000. / rel_pos.y);
|
||||
}
|
||||
|
||||
// Can normalize then
|
||||
vec3 Pn = normalize(P);
|
||||
float Plen = length(P);
|
||||
// Can normalize then
|
||||
vec3 rel_pos_norm = normalize(rel_pos);
|
||||
float rel_pos_len = length(rel_pos);
|
||||
|
||||
// Initialize temp variables
|
||||
vec4 temp1 = vec4(0.);
|
||||
vec4 temp2 = vec4(0.);
|
||||
vec4 blue_weight;
|
||||
vec4 haze_weight;
|
||||
//vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color;
|
||||
vec4 sunlight = sunlight_color;
|
||||
vec4 light_atten;
|
||||
// Initialize temp variables
|
||||
vec4 sunlight = sunlight_color;
|
||||
vec4 light_atten;
|
||||
|
||||
float dens_mul = density_multiplier;
|
||||
// Sunlight attenuation effect (hue and brightness) due to atmosphere
|
||||
// this is used later for sunlight modulation at various altitudes
|
||||
light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);
|
||||
|
||||
// Sunlight attenuation effect (hue and brightness) due to atmosphere
|
||||
// this is used later for sunlight modulation at various altitudes
|
||||
light_atten = (blue_density + vec4(haze_density * 0.25)) * (dens_mul * max_y);
|
||||
// Calculate relative weights
|
||||
vec4 combined_haze = abs(blue_density) + vec4(abs(haze_density));
|
||||
vec4 blue_weight = blue_density / combined_haze;
|
||||
vec4 haze_weight = haze_density / combined_haze;
|
||||
|
||||
// Calculate relative weights
|
||||
temp1 = abs(blue_density) + vec4(abs(haze_density));
|
||||
blue_weight = blue_density / temp1;
|
||||
haze_weight = haze_density / temp1;
|
||||
// Compute sunlight from rel_pos & lightnorm (for long rays like sky)
|
||||
float off_axis = 1.0 / max(1e-6, max(0., rel_pos_norm.y) + lightnorm.y);
|
||||
sunlight *= exp(-light_atten * off_axis);
|
||||
|
||||
// Compute sunlight from P & lightnorm (for long rays like sky)
|
||||
temp2.y = max(0., max(0., Pn.y) * 1.0 + lightnorm.y );
|
||||
temp2.y = 1. / temp2.y;
|
||||
sunlight *= exp( - light_atten * temp2.y);
|
||||
// Distance
|
||||
float density_dist = rel_pos_len * density_multiplier;
|
||||
|
||||
// Distance
|
||||
temp2.z = Plen * dens_mul;
|
||||
// Transparency (-> combined_haze)
|
||||
// ATI Bugfix -- can't store combined_haze*density_dist in a variable because the ati
|
||||
// compiler gets confused.
|
||||
combined_haze = exp(-combined_haze * density_dist);
|
||||
|
||||
// Transparency (-> temp1)
|
||||
// ATI Bugfix -- can't store temp1*temp2.z in a variable because the ati
|
||||
// compiler gets confused.
|
||||
temp1 = exp(-temp1 * temp2.z);
|
||||
// Compute haze glow
|
||||
float haze_glow = 1.0 - dot(rel_pos_norm, lightnorm.xyz);
|
||||
// haze_glow is 0 at the sun and increases away from sun
|
||||
haze_glow = max(haze_glow, .001);
|
||||
// Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
|
||||
haze_glow *= glow.x;
|
||||
// Higher glow.x gives dimmer glow (because next step is 1 / "angle")
|
||||
haze_glow = pow(haze_glow, glow.z);
|
||||
// glow.z should be negative, so we're doing a sort of (1 / "angle") function
|
||||
|
||||
haze_glow *= sun_moon_glow_factor;
|
||||
|
||||
// Compute haze glow
|
||||
temp2.x = dot(Pn, lightnorm.xyz);
|
||||
temp2.x = 1. - temp2.x;
|
||||
// temp2.x is 0 at the sun and increases away from sun
|
||||
temp2.x = max(temp2.x, .001);
|
||||
// Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
|
||||
temp2.x *= glow.x;
|
||||
// Higher glow.x gives dimmer glow (because next step is 1 / "angle")
|
||||
temp2.x = pow(temp2.x, glow.z);
|
||||
// glow.z should be negative, so we're doing a sort of (1 / "angle") function
|
||||
// Add "minimum anti-solar illumination"
|
||||
// For sun, add to glow. For moon, remove glow entirely. SL-13768
|
||||
haze_glow = (sun_moon_glow_factor < 1.0) ? 0.0 : (haze_glow + 0.25);
|
||||
|
||||
temp2.x *= sun_moon_glow_factor;
|
||||
// Increase ambient when there are more clouds
|
||||
vec4 tmpAmbient = ambient_color;
|
||||
tmpAmbient += (1. - tmpAmbient) * cloud_shadow * 0.5;
|
||||
|
||||
// Add "minimum anti-solar illumination"
|
||||
temp2.x += .25;
|
||||
// Dim sunlight by cloud shadow percentage
|
||||
sunlight *= (1. - cloud_shadow);
|
||||
|
||||
// Increase ambient when there are more clouds
|
||||
vec4 tmpAmbient = ambient_color;
|
||||
tmpAmbient += (1. - tmpAmbient) * cloud_shadow * 0.5;
|
||||
// Haze color below cloud
|
||||
vec4 additiveColorBelowCloud =
|
||||
(blue_horizon * blue_weight * (sunlight + tmpAmbient) + (haze_horizon * haze_weight) * (sunlight * haze_glow + tmpAmbient));
|
||||
|
||||
// Dim sunlight by cloud shadow percentage
|
||||
sunlight *= (1. - cloud_shadow);
|
||||
// CLOUDS
|
||||
off_axis = 1.0 / max(1e-6, lightnorm.y * 2.);
|
||||
sunlight *= exp(-light_atten * off_axis);
|
||||
|
||||
// Haze color below cloud
|
||||
vec4 additiveColorBelowCloud = ( blue_horizon * blue_weight * (sunlight + tmpAmbient)
|
||||
+ (haze_horizon * haze_weight) * (sunlight * temp2.x + tmpAmbient)
|
||||
);
|
||||
// Cloud color out
|
||||
vary_CloudColorSun = (sunlight * haze_glow) * cloud_color;
|
||||
vary_CloudColorAmbient = tmpAmbient * cloud_color;
|
||||
|
||||
// CLOUDS
|
||||
temp2.y = max(0., lightnorm.y * 2.);
|
||||
temp2.y = 1. / temp2.y;
|
||||
sunlight *= exp( - light_atten * temp2.y);
|
||||
// Attenuate cloud color by atmosphere
|
||||
combined_haze = sqrt(combined_haze); // less atmos opacity (more transparency) below clouds
|
||||
vary_CloudColorSun *= combined_haze;
|
||||
vary_CloudColorAmbient *= combined_haze;
|
||||
vec4 oHazeColorBelowCloud = additiveColorBelowCloud * (1. - combined_haze);
|
||||
|
||||
// Cloud color out
|
||||
vary_CloudColorSun = (sunlight * temp2.x) * cloud_color;
|
||||
vary_CloudColorAmbient = tmpAmbient * cloud_color;
|
||||
|
||||
// Attenuate cloud color by atmosphere
|
||||
temp1 = sqrt(temp1); //less atmos opacity (more transparency) below clouds
|
||||
vary_CloudColorSun *= temp1;
|
||||
vary_CloudColorAmbient *= temp1;
|
||||
vec4 oHazeColorBelowCloud = additiveColorBelowCloud * (1. - temp1);
|
||||
// Make a nice cloud density based on the cloud_shadow value that was passed in.
|
||||
vary_CloudDensity = 2. * (cloud_shadow - 0.25);
|
||||
|
||||
// Make a nice cloud density based on the cloud_shadow value that was passed in.
|
||||
vary_CloudDensity = 2. * (cloud_shadow - 0.25);
|
||||
// Combine these to minimize register use
|
||||
vary_CloudColorAmbient += oHazeColorBelowCloud;
|
||||
|
||||
// needs this to compile on mac
|
||||
// vary_AtmosAttenuation = vec3(0.0,0.0,0.0);
|
||||
|
||||
// Combine these to minimize register use
|
||||
vary_CloudColorAmbient += oHazeColorBelowCloud;
|
||||
|
||||
// needs this to compile on mac
|
||||
//vary_AtmosAttenuation = vec3(0.0,0.0,0.0);
|
||||
|
||||
// END CLOUDS
|
||||
// END CLOUDS
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -42,6 +42,9 @@ VARYING vec4 vary_position;
|
|||
|
||||
uniform samplerCube environmentMap;
|
||||
|
||||
// render_hud_attachments() -> HUD objects set LLShaderMgr::NO_ATMO; used in LLDrawPoolAlpha::beginRenderPass()
|
||||
uniform int no_atmo;
|
||||
|
||||
vec3 fullbrightShinyAtmosTransport(vec3 light);
|
||||
vec3 fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten);
|
||||
vec3 fullbrightScaleSoftClip(vec3 light);
|
||||
|
|
@ -51,7 +54,9 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou
|
|||
vec3 linear_to_srgb(vec3 c);
|
||||
vec3 srgb_to_linear(vec3 c);
|
||||
|
||||
|
||||
// See:
|
||||
// class1\deferred\fullbrightShinyF.glsl
|
||||
// class1\lighting\lightFullbrightShinyF.glsl
|
||||
void main()
|
||||
{
|
||||
#ifdef HAS_DIFFUSE_LOOKUP
|
||||
|
|
@ -59,25 +64,39 @@ void main()
|
|||
#else
|
||||
vec4 color = texture2D(diffuseMap, vary_texcoord0.xy);
|
||||
#endif
|
||||
|
||||
|
||||
color.rgb *= vertex_color.rgb;
|
||||
vec3 pos = vary_position.xyz/vary_position.w;
|
||||
|
||||
vec3 sunlit;
|
||||
vec3 amblit;
|
||||
vec3 additive;
|
||||
vec3 atten;
|
||||
// SL-9632 HUDs are affected by Atmosphere
|
||||
if (no_atmo == 0)
|
||||
{
|
||||
vec3 sunlit;
|
||||
vec3 amblit;
|
||||
vec3 additive;
|
||||
vec3 atten;
|
||||
vec3 pos = vary_position.xyz/vary_position.w;
|
||||
|
||||
calcAtmosphericVars(pos.xyz, vec3(0), 1.0, sunlit, amblit, additive, atten, false);
|
||||
|
||||
vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
|
||||
float env_intensity = vertex_color.a;
|
||||
color.rgb = mix(color.rgb, envColor.rgb, env_intensity);
|
||||
calcAtmosphericVars(pos.xyz, vec3(0), 1.0, sunlit, amblit, additive, atten, false);
|
||||
|
||||
vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
|
||||
float env_intensity = vertex_color.a;
|
||||
|
||||
//color.rgb = srgb_to_linear(color.rgb);
|
||||
|
||||
color.rgb = fullbrightAtmosTransportFrag(color.rgb, additive, atten);
|
||||
color.rgb = fullbrightScaleSoftClip(color.rgb);
|
||||
color.rgb = mix(color.rgb, envColor.rgb, env_intensity);
|
||||
|
||||
color.rgb = fullbrightAtmosTransportFrag(color.rgb, additive, atten);
|
||||
color.rgb = fullbrightScaleSoftClip(color.rgb);
|
||||
}
|
||||
|
||||
/*
|
||||
// NOTE: HUD objects will be full bright. Uncomment if you want "some" environment lighting effecting these HUD objects.
|
||||
else
|
||||
{
|
||||
vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
|
||||
float env_intensity = vertex_color.a;
|
||||
color.rgb = mix(color.rgb, envColor.rgb, env_intensity);
|
||||
}
|
||||
*/
|
||||
|
||||
color.a = 1.0;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,439 +1,443 @@
|
|||
/**
|
||||
* @file materialF.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2007, 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$
|
||||
*/
|
||||
|
||||
/*[EXTRA_CODE_HERE]*/
|
||||
|
||||
//class1/deferred/materialF.glsl
|
||||
|
||||
// This shader is used for both writing opaque/masked content to the gbuffer and writing blended content to the framebuffer during the alpha pass.
|
||||
|
||||
#define DIFFUSE_ALPHA_MODE_NONE 0
|
||||
#define DIFFUSE_ALPHA_MODE_BLEND 1
|
||||
#define DIFFUSE_ALPHA_MODE_MASK 2
|
||||
#define DIFFUSE_ALPHA_MODE_EMISSIVE 3
|
||||
|
||||
uniform float emissive_brightness; // fullbright flag, 1.0 == fullbright, 0.0 otherwise
|
||||
uniform int sun_up_factor;
|
||||
|
||||
#ifdef WATER_FOG
|
||||
vec4 applyWaterFogView(vec3 pos, vec4 color);
|
||||
#endif
|
||||
|
||||
vec3 atmosFragLighting(vec3 l, vec3 additive, vec3 atten);
|
||||
vec3 scaleSoftClipFrag(vec3 l);
|
||||
|
||||
vec3 fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten);
|
||||
vec3 fullbrightScaleSoftClip(vec3 light);
|
||||
|
||||
void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao);
|
||||
|
||||
vec3 srgb_to_linear(vec3 cs);
|
||||
vec3 linear_to_srgb(vec3 cs);
|
||||
|
||||
#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
#else
|
||||
#define frag_color gl_FragColor
|
||||
#endif
|
||||
|
||||
#ifdef HAS_SUN_SHADOW
|
||||
float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen);
|
||||
#endif
|
||||
|
||||
uniform samplerCube environmentMap;
|
||||
uniform sampler2D lightFunc;
|
||||
|
||||
// Inputs
|
||||
uniform vec4 morphFactor;
|
||||
uniform vec3 camPosLocal;
|
||||
uniform mat3 env_mat;
|
||||
|
||||
uniform vec3 sun_dir;
|
||||
uniform vec3 moon_dir;
|
||||
VARYING vec2 vary_fragcoord;
|
||||
|
||||
VARYING vec3 vary_position;
|
||||
|
||||
uniform mat4 proj_mat;
|
||||
uniform mat4 inv_proj;
|
||||
uniform vec2 screen_res;
|
||||
|
||||
uniform vec4 light_position[8];
|
||||
uniform vec3 light_direction[8];
|
||||
uniform vec4 light_attenuation[8];
|
||||
uniform vec3 light_diffuse[8];
|
||||
|
||||
float getAmbientClamp();
|
||||
|
||||
vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 npos, vec3 diffuse, vec4 spec, vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight, inout float glare, float ambiance)
|
||||
{
|
||||
vec3 col = vec3(0);
|
||||
|
||||
//get light vector
|
||||
vec3 lv = lp.xyz - v;
|
||||
|
||||
//get distance
|
||||
float dist = length(lv);
|
||||
float da = 1.0;
|
||||
|
||||
dist /= la;
|
||||
|
||||
if (dist > 0.0 && la > 0.0)
|
||||
{
|
||||
//normalize light vector
|
||||
lv = normalize(lv);
|
||||
|
||||
//distance attenuation
|
||||
float dist_atten = clamp(1.0 - (dist - 1.0*(1.0 - fa)) / fa, 0.0, 1.0);
|
||||
dist_atten *= dist_atten;
|
||||
dist_atten *= 2.0f;
|
||||
|
||||
if (dist_atten <= 0.0)
|
||||
{
|
||||
return col;
|
||||
}
|
||||
|
||||
// spotlight coefficient.
|
||||
float spot = max(dot(-ln, lv), is_pointlight);
|
||||
da *= spot*spot; // GL_SPOT_EXPONENT=2
|
||||
|
||||
//angular attenuation
|
||||
da *= dot(n, lv);
|
||||
|
||||
float lit = 0.0f;
|
||||
|
||||
float amb_da = ambiance;
|
||||
if (da >= 0)
|
||||
{
|
||||
lit = max(da * dist_atten, 0.0);
|
||||
col = lit * light_col * diffuse;
|
||||
amb_da += (da*0.5 + 0.5) * ambiance;
|
||||
}
|
||||
amb_da += (da*da*0.5 + 0.5) * ambiance;
|
||||
amb_da *= dist_atten;
|
||||
amb_da = min(amb_da, 1.0f - lit);
|
||||
|
||||
// SL-10969 need to see why these are blown out
|
||||
//col.rgb += amb_da * light_col * diffuse;
|
||||
|
||||
if (spec.a > 0.0)
|
||||
{
|
||||
//vec3 ref = dot(pos+lv, norm);
|
||||
vec3 h = normalize(lv + npos);
|
||||
float nh = dot(n, h);
|
||||
float nv = dot(n, npos);
|
||||
float vh = dot(npos, h);
|
||||
float sa = nh;
|
||||
float fres = pow(1 - dot(h, npos), 5)*0.4 + 0.5;
|
||||
|
||||
float gtdenom = 2 * nh;
|
||||
float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh));
|
||||
|
||||
if (nh > 0.0)
|
||||
{
|
||||
float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt / (nh*da);
|
||||
vec3 speccol = lit*scol*light_col.rgb*spec.rgb;
|
||||
speccol = clamp(speccol, vec3(0), vec3(1));
|
||||
col += speccol;
|
||||
|
||||
float cur_glare = max(speccol.r, speccol.g);
|
||||
cur_glare = max(cur_glare, speccol.b);
|
||||
glare = max(glare, speccol.r);
|
||||
glare += max(cur_glare, 0.0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return max(col, vec3(0.0, 0.0, 0.0));
|
||||
}
|
||||
|
||||
#else
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_data[3];
|
||||
#else
|
||||
#define frag_data gl_FragData
|
||||
#endif
|
||||
#endif
|
||||
|
||||
uniform sampler2D diffuseMap; //always in sRGB space
|
||||
|
||||
#ifdef HAS_NORMAL_MAP
|
||||
uniform sampler2D bumpMap;
|
||||
#endif
|
||||
|
||||
#ifdef HAS_SPECULAR_MAP
|
||||
uniform sampler2D specularMap;
|
||||
|
||||
VARYING vec2 vary_texcoord2;
|
||||
#endif
|
||||
|
||||
uniform float env_intensity;
|
||||
uniform vec4 specular_color; // specular color RGB and specular exponent (glossiness) in alpha
|
||||
|
||||
#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_MASK)
|
||||
uniform float minimum_alpha;
|
||||
#endif
|
||||
|
||||
#ifdef HAS_NORMAL_MAP
|
||||
VARYING vec3 vary_mat0;
|
||||
VARYING vec3 vary_mat1;
|
||||
VARYING vec3 vary_mat2;
|
||||
VARYING vec2 vary_texcoord1;
|
||||
#else
|
||||
VARYING vec3 vary_normal;
|
||||
#endif
|
||||
|
||||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
vec2 encode_normal(vec3 n);
|
||||
|
||||
void main()
|
||||
{
|
||||
vec2 pos_screen = vary_texcoord0.xy;
|
||||
|
||||
vec4 diffcol = texture2D(diffuseMap, vary_texcoord0.xy);
|
||||
diffcol.rgb *= vertex_color.rgb;
|
||||
|
||||
#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_MASK)
|
||||
|
||||
// Comparing floats cast from 8-bit values, produces acne right at the 8-bit transition points
|
||||
float bias = 0.001953125; // 1/512, or half an 8-bit quantization
|
||||
if (diffcol.a < minimum_alpha-bias)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
|
||||
vec3 gamma_diff = diffcol.rgb;
|
||||
diffcol.rgb = srgb_to_linear(diffcol.rgb);
|
||||
#endif
|
||||
|
||||
#ifdef HAS_SPECULAR_MAP
|
||||
vec4 spec = texture2D(specularMap, vary_texcoord2.xy);
|
||||
spec.rgb *= specular_color.rgb;
|
||||
#else
|
||||
vec4 spec = vec4(specular_color.rgb, 1.0);
|
||||
#endif
|
||||
|
||||
#ifdef HAS_NORMAL_MAP
|
||||
vec4 norm = texture2D(bumpMap, vary_texcoord1.xy);
|
||||
|
||||
norm.xyz = norm.xyz * 2 - 1;
|
||||
|
||||
vec3 tnorm = vec3(dot(norm.xyz,vary_mat0),
|
||||
dot(norm.xyz,vary_mat1),
|
||||
dot(norm.xyz,vary_mat2));
|
||||
#else
|
||||
vec4 norm = vec4(0,0,0,1.0);
|
||||
vec3 tnorm = vary_normal;
|
||||
#endif
|
||||
|
||||
norm.xyz = normalize(tnorm.xyz);
|
||||
|
||||
vec2 abnormal = encode_normal(norm.xyz);
|
||||
|
||||
vec4 final_color = diffcol;
|
||||
|
||||
#if (DIFFUSE_ALPHA_MODE != DIFFUSE_ALPHA_MODE_EMISSIVE)
|
||||
final_color.a = emissive_brightness;
|
||||
#else
|
||||
final_color.a = max(final_color.a, emissive_brightness);
|
||||
#endif
|
||||
|
||||
vec4 final_specular = spec;
|
||||
|
||||
#ifdef HAS_SPECULAR_MAP
|
||||
vec4 final_normal = vec4(encode_normal(normalize(tnorm)), env_intensity * spec.a, 0.0);
|
||||
final_specular.a = specular_color.a * norm.a;
|
||||
#else
|
||||
vec4 final_normal = vec4(encode_normal(normalize(tnorm)), env_intensity, 0.0);
|
||||
final_specular.a = specular_color.a;
|
||||
#endif
|
||||
|
||||
#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
|
||||
|
||||
//forward rendering, output just lit sRGBA
|
||||
vec3 pos = vary_position;
|
||||
|
||||
float shadow = 1.0f;
|
||||
|
||||
#ifdef HAS_SUN_SHADOW
|
||||
shadow = sampleDirectionalShadow(pos.xyz, norm.xyz, pos_screen);
|
||||
#endif
|
||||
|
||||
spec = final_specular;
|
||||
vec4 diffuse = final_color;
|
||||
float envIntensity = final_normal.z;
|
||||
|
||||
vec3 color = vec3(0,0,0);
|
||||
|
||||
vec3 light_dir = (sun_up_factor == 1) ? sun_dir : moon_dir;
|
||||
|
||||
float bloom = 0.0;
|
||||
vec3 sunlit;
|
||||
vec3 amblit;
|
||||
vec3 additive;
|
||||
vec3 atten;
|
||||
|
||||
calcAtmosphericVars(pos.xyz, light_dir, 1.0, sunlit, amblit, additive, atten, false);
|
||||
|
||||
// This call breaks the Mac GLSL compiler/linker for unknown reasons (17Mar2020)
|
||||
// The call is either a no-op or a pure (pow) gamma adjustment, depending on GPU level
|
||||
// TODO: determine if we want to re-apply the gamma adjustment, and if so understand & fix Mac breakage
|
||||
//color = fullbrightScaleSoftClip(color);
|
||||
|
||||
vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
|
||||
|
||||
//we're in sRGB space, so gamma correct this dot product so
|
||||
// lighting from the sun stays sharp
|
||||
float da = clamp(dot(normalize(norm.xyz), light_dir.xyz), 0.0, 1.0);
|
||||
da = pow(da, 1.0 / 1.3);
|
||||
|
||||
color = amblit;
|
||||
|
||||
//darken ambient for normals perpendicular to light vector so surfaces in shadow
|
||||
// and facing away from light still have some definition to them.
|
||||
// do NOT gamma correct this dot product so ambient lighting stays soft
|
||||
float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0);
|
||||
ambient *= 0.5;
|
||||
ambient *= ambient;
|
||||
ambient = (1.0 - ambient);
|
||||
|
||||
vec3 sun_contrib = min(da, shadow) * sunlit;
|
||||
|
||||
color *= ambient;
|
||||
|
||||
color += sun_contrib;
|
||||
|
||||
color *= gamma_diff.rgb;
|
||||
|
||||
float glare = 0.0;
|
||||
|
||||
if (spec.a > 0.0) // specular reflection
|
||||
{
|
||||
#if 1 //EEP
|
||||
|
||||
vec3 npos = -normalize(pos.xyz);
|
||||
|
||||
//vec3 ref = dot(pos+lv, norm);
|
||||
vec3 h = normalize(light_dir.xyz + npos);
|
||||
float nh = dot(norm.xyz, h);
|
||||
float nv = dot(norm.xyz, npos);
|
||||
float vh = dot(npos, h);
|
||||
float sa = nh;
|
||||
float fres = pow(1 - dot(h, npos), 5)*0.4 + 0.5;
|
||||
|
||||
float gtdenom = 2 * nh;
|
||||
float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh));
|
||||
|
||||
if (nh > 0.0)
|
||||
{
|
||||
float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt / (nh*da);
|
||||
vec3 sp = sun_contrib*scol / 6.0f;
|
||||
sp = clamp(sp, vec3(0), vec3(1));
|
||||
bloom = dot(sp, sp) / 4.0;
|
||||
color += sp * spec.rgb;
|
||||
}
|
||||
#else // PRODUCTION
|
||||
float sa = dot(refnormpersp, sun_dir.xyz);
|
||||
vec3 dumbshiny = sunlit*shadow*(texture2D(lightFunc, vec2(sa, spec.a)).r);
|
||||
|
||||
// add the two types of shiny together
|
||||
vec3 spec_contrib = dumbshiny * spec.rgb;
|
||||
bloom = dot(spec_contrib, spec_contrib) / 6;
|
||||
|
||||
glare = max(spec_contrib.r, spec_contrib.g);
|
||||
glare = max(glare, spec_contrib.b);
|
||||
|
||||
color += spec_contrib;
|
||||
#endif
|
||||
}
|
||||
|
||||
color = mix(color.rgb, diffcol.rgb, diffuse.a);
|
||||
|
||||
if (envIntensity > 0.0)
|
||||
{
|
||||
//add environmentmap
|
||||
vec3 env_vec = env_mat * refnormpersp;
|
||||
|
||||
vec3 reflected_color = textureCube(environmentMap, env_vec).rgb;
|
||||
|
||||
color = mix(color, reflected_color, envIntensity);
|
||||
|
||||
float cur_glare = max(reflected_color.r, reflected_color.g);
|
||||
cur_glare = max(cur_glare, reflected_color.b);
|
||||
cur_glare *= envIntensity*4.0;
|
||||
glare += cur_glare;
|
||||
}
|
||||
|
||||
color = atmosFragLighting(color, additive, atten);
|
||||
color = scaleSoftClipFrag(color);
|
||||
|
||||
//convert to linear before adding local lights
|
||||
color = srgb_to_linear(color);
|
||||
|
||||
vec3 npos = normalize(-pos.xyz);
|
||||
|
||||
vec3 light = vec3(0, 0, 0);
|
||||
|
||||
#define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, npos, diffuse.rgb, final_specular, pos.xyz, norm.xyz, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, glare, light_attenuation[i].w );
|
||||
|
||||
LIGHT_LOOP(1)
|
||||
LIGHT_LOOP(2)
|
||||
LIGHT_LOOP(3)
|
||||
LIGHT_LOOP(4)
|
||||
LIGHT_LOOP(5)
|
||||
LIGHT_LOOP(6)
|
||||
LIGHT_LOOP(7)
|
||||
|
||||
color += light;
|
||||
|
||||
glare = min(glare, 1.0);
|
||||
float al = max(diffcol.a, glare)*vertex_color.a;
|
||||
|
||||
//convert to srgb as this color is being written post gamma correction
|
||||
color = linear_to_srgb(color);
|
||||
|
||||
#ifdef WATER_FOG
|
||||
vec4 temp = applyWaterFogView(pos, vec4(color, al));
|
||||
color = temp.rgb;
|
||||
al = temp.a;
|
||||
#endif
|
||||
|
||||
frag_color = vec4(color, al);
|
||||
|
||||
#else // mode is not DIFFUSE_ALPHA_MODE_BLEND, encode to gbuffer
|
||||
|
||||
// deferred path
|
||||
frag_data[0] = final_color; //gbuffer is sRGB
|
||||
frag_data[1] = final_specular; // XYZ = Specular color. W = Specular exponent.
|
||||
frag_data[2] = final_normal; // XY = Normal. Z = Env. intensity.
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* @file materialF.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2007, 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$
|
||||
*/
|
||||
|
||||
/*[EXTRA_CODE_HERE]*/
|
||||
|
||||
//class1/deferred/materialF.glsl
|
||||
|
||||
// This shader is used for both writing opaque/masked content to the gbuffer and writing blended content to the framebuffer during the alpha pass.
|
||||
|
||||
#define DIFFUSE_ALPHA_MODE_NONE 0
|
||||
#define DIFFUSE_ALPHA_MODE_BLEND 1
|
||||
#define DIFFUSE_ALPHA_MODE_MASK 2
|
||||
#define DIFFUSE_ALPHA_MODE_EMISSIVE 3
|
||||
|
||||
uniform float emissive_brightness; // fullbright flag, 1.0 == fullbright, 0.0 otherwise
|
||||
uniform int sun_up_factor;
|
||||
|
||||
#ifdef WATER_FOG
|
||||
vec4 applyWaterFogView(vec3 pos, vec4 color);
|
||||
#endif
|
||||
|
||||
vec3 atmosFragLighting(vec3 l, vec3 additive, vec3 atten);
|
||||
vec3 scaleSoftClipFrag(vec3 l);
|
||||
|
||||
vec3 fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten);
|
||||
vec3 fullbrightScaleSoftClip(vec3 light);
|
||||
|
||||
void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao);
|
||||
|
||||
vec3 srgb_to_linear(vec3 cs);
|
||||
vec3 linear_to_srgb(vec3 cs);
|
||||
|
||||
#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
|
||||
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_color;
|
||||
#else
|
||||
#define frag_color gl_FragColor
|
||||
#endif
|
||||
|
||||
#ifdef HAS_SUN_SHADOW
|
||||
float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen);
|
||||
#endif
|
||||
|
||||
uniform samplerCube environmentMap;
|
||||
uniform sampler2D lightFunc;
|
||||
|
||||
// Inputs
|
||||
uniform vec4 morphFactor;
|
||||
uniform vec3 camPosLocal;
|
||||
uniform mat3 env_mat;
|
||||
|
||||
uniform vec3 sun_dir;
|
||||
uniform vec3 moon_dir;
|
||||
VARYING vec2 vary_fragcoord;
|
||||
|
||||
VARYING vec3 vary_position;
|
||||
|
||||
uniform mat4 proj_mat;
|
||||
uniform mat4 inv_proj;
|
||||
uniform vec2 screen_res;
|
||||
|
||||
uniform vec4 light_position[8];
|
||||
uniform vec3 light_direction[8];
|
||||
uniform vec4 light_attenuation[8];
|
||||
uniform vec3 light_diffuse[8];
|
||||
|
||||
float getAmbientClamp();
|
||||
|
||||
vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 npos, vec3 diffuse, vec4 spec, vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight, inout float glare, float ambiance)
|
||||
{
|
||||
vec3 col = vec3(0);
|
||||
|
||||
//get light vector
|
||||
vec3 lv = lp.xyz - v;
|
||||
|
||||
//get distance
|
||||
float dist = length(lv);
|
||||
float da = 1.0;
|
||||
|
||||
dist /= la;
|
||||
|
||||
if (dist > 0.0 && la > 0.0)
|
||||
{
|
||||
//normalize light vector
|
||||
lv = normalize(lv);
|
||||
|
||||
//distance attenuation
|
||||
float dist_atten = clamp(1.0 - (dist - 1.0*(1.0 - fa)) / fa, 0.0, 1.0);
|
||||
dist_atten *= dist_atten;
|
||||
dist_atten *= 2.0f;
|
||||
|
||||
if (dist_atten <= 0.0)
|
||||
{
|
||||
return col;
|
||||
}
|
||||
|
||||
// spotlight coefficient.
|
||||
float spot = max(dot(-ln, lv), is_pointlight);
|
||||
da *= spot*spot; // GL_SPOT_EXPONENT=2
|
||||
|
||||
//angular attenuation
|
||||
da *= dot(n, lv);
|
||||
|
||||
float lit = 0.0f;
|
||||
|
||||
float amb_da = ambiance;
|
||||
if (da >= 0)
|
||||
{
|
||||
lit = max(da * dist_atten, 0.0);
|
||||
col = lit * light_col * diffuse;
|
||||
amb_da += (da*0.5 + 0.5) * ambiance;
|
||||
}
|
||||
amb_da += (da*da*0.5 + 0.5) * ambiance;
|
||||
amb_da *= dist_atten;
|
||||
amb_da = min(amb_da, 1.0f - lit);
|
||||
|
||||
// SL-10969 need to see why these are blown out
|
||||
//col.rgb += amb_da * light_col * diffuse;
|
||||
|
||||
if (spec.a > 0.0)
|
||||
{
|
||||
//vec3 ref = dot(pos+lv, norm);
|
||||
vec3 h = normalize(lv + npos);
|
||||
float nh = dot(n, h);
|
||||
float nv = dot(n, npos);
|
||||
float vh = dot(npos, h);
|
||||
float sa = nh;
|
||||
float fres = pow(1 - dot(h, npos), 5)*0.4 + 0.5;
|
||||
|
||||
float gtdenom = 2 * nh;
|
||||
float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh));
|
||||
|
||||
if (nh > 0.0)
|
||||
{
|
||||
float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt / (nh*da);
|
||||
vec3 speccol = lit*scol*light_col.rgb*spec.rgb;
|
||||
speccol = clamp(speccol, vec3(0), vec3(1));
|
||||
col += speccol;
|
||||
|
||||
float cur_glare = max(speccol.r, speccol.g);
|
||||
cur_glare = max(cur_glare, speccol.b);
|
||||
glare = max(glare, speccol.r);
|
||||
glare += max(cur_glare, 0.0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return max(col, vec3(0.0, 0.0, 0.0));
|
||||
}
|
||||
|
||||
#else
|
||||
#ifdef DEFINE_GL_FRAGCOLOR
|
||||
out vec4 frag_data[3];
|
||||
#else
|
||||
#define frag_data gl_FragData
|
||||
#endif
|
||||
#endif
|
||||
|
||||
uniform sampler2D diffuseMap; //always in sRGB space
|
||||
|
||||
#ifdef HAS_NORMAL_MAP
|
||||
uniform sampler2D bumpMap;
|
||||
#endif
|
||||
|
||||
#ifdef HAS_SPECULAR_MAP
|
||||
uniform sampler2D specularMap;
|
||||
|
||||
VARYING vec2 vary_texcoord2;
|
||||
#endif
|
||||
|
||||
uniform float env_intensity;
|
||||
uniform vec4 specular_color; // specular color RGB and specular exponent (glossiness) in alpha
|
||||
|
||||
#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_MASK)
|
||||
uniform float minimum_alpha;
|
||||
#endif
|
||||
|
||||
#ifdef HAS_NORMAL_MAP
|
||||
VARYING vec3 vary_mat0;
|
||||
VARYING vec3 vary_mat1;
|
||||
VARYING vec3 vary_mat2;
|
||||
VARYING vec2 vary_texcoord1;
|
||||
#else
|
||||
VARYING vec3 vary_normal;
|
||||
#endif
|
||||
|
||||
VARYING vec4 vertex_color;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
vec2 encode_normal(vec3 n);
|
||||
|
||||
void main()
|
||||
{
|
||||
vec2 pos_screen = vary_texcoord0.xy;
|
||||
|
||||
vec4 diffcol = texture2D(diffuseMap, vary_texcoord0.xy);
|
||||
diffcol.rgb *= vertex_color.rgb;
|
||||
|
||||
#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_MASK)
|
||||
|
||||
// Comparing floats cast from 8-bit values, produces acne right at the 8-bit transition points
|
||||
float bias = 0.001953125; // 1/512, or half an 8-bit quantization
|
||||
if (diffcol.a < minimum_alpha-bias)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
|
||||
vec3 gamma_diff = diffcol.rgb;
|
||||
diffcol.rgb = srgb_to_linear(diffcol.rgb);
|
||||
#endif
|
||||
|
||||
#ifdef HAS_SPECULAR_MAP
|
||||
vec4 spec = texture2D(specularMap, vary_texcoord2.xy);
|
||||
spec.rgb *= specular_color.rgb;
|
||||
#else
|
||||
vec4 spec = vec4(specular_color.rgb, 1.0);
|
||||
#endif
|
||||
|
||||
#ifdef HAS_NORMAL_MAP
|
||||
vec4 norm = texture2D(bumpMap, vary_texcoord1.xy);
|
||||
|
||||
norm.xyz = norm.xyz * 2 - 1;
|
||||
|
||||
vec3 tnorm = vec3(dot(norm.xyz,vary_mat0),
|
||||
dot(norm.xyz,vary_mat1),
|
||||
dot(norm.xyz,vary_mat2));
|
||||
#else
|
||||
vec4 norm = vec4(0,0,0,1.0);
|
||||
vec3 tnorm = vary_normal;
|
||||
#endif
|
||||
|
||||
norm.xyz = normalize(tnorm.xyz);
|
||||
|
||||
vec2 abnormal = encode_normal(norm.xyz);
|
||||
|
||||
vec4 final_color = diffcol;
|
||||
|
||||
#if (DIFFUSE_ALPHA_MODE != DIFFUSE_ALPHA_MODE_EMISSIVE)
|
||||
final_color.a = emissive_brightness;
|
||||
#else
|
||||
final_color.a = max(final_color.a, emissive_brightness);
|
||||
#endif
|
||||
|
||||
vec4 final_specular = spec;
|
||||
|
||||
#ifdef HAS_SPECULAR_MAP
|
||||
vec4 final_normal = vec4(encode_normal(normalize(tnorm)), env_intensity * spec.a, 0.0);
|
||||
final_specular.a = specular_color.a * norm.a;
|
||||
#else
|
||||
vec4 final_normal = vec4(encode_normal(normalize(tnorm)), env_intensity, 0.0);
|
||||
final_specular.a = specular_color.a;
|
||||
#endif
|
||||
|
||||
#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
|
||||
|
||||
//forward rendering, output just lit sRGBA
|
||||
vec3 pos = vary_position;
|
||||
|
||||
float shadow = 1.0f;
|
||||
|
||||
#ifdef HAS_SUN_SHADOW
|
||||
shadow = sampleDirectionalShadow(pos.xyz, norm.xyz, pos_screen);
|
||||
#endif
|
||||
|
||||
spec = final_specular;
|
||||
vec4 diffuse = final_color;
|
||||
float envIntensity = final_normal.z;
|
||||
|
||||
vec3 color = vec3(0,0,0);
|
||||
|
||||
vec3 light_dir = (sun_up_factor == 1) ? sun_dir : moon_dir;
|
||||
|
||||
float bloom = 0.0;
|
||||
vec3 sunlit;
|
||||
vec3 amblit;
|
||||
vec3 additive;
|
||||
vec3 atten;
|
||||
|
||||
calcAtmosphericVars(pos.xyz, light_dir, 1.0, sunlit, amblit, additive, atten, false);
|
||||
|
||||
// This call breaks the Mac GLSL compiler/linker for unknown reasons (17Mar2020)
|
||||
// The call is either a no-op or a pure (pow) gamma adjustment, depending on GPU level
|
||||
// TODO: determine if we want to re-apply the gamma adjustment, and if so understand & fix Mac breakage
|
||||
//color = fullbrightScaleSoftClip(color);
|
||||
|
||||
vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
|
||||
|
||||
//we're in sRGB space, so gamma correct this dot product so
|
||||
// lighting from the sun stays sharp
|
||||
float da = clamp(dot(normalize(norm.xyz), light_dir.xyz), 0.0, 1.0);
|
||||
da = pow(da, 1.0 / 1.3);
|
||||
|
||||
color = amblit;
|
||||
|
||||
//darken ambient for normals perpendicular to light vector so surfaces in shadow
|
||||
// and facing away from light still have some definition to them.
|
||||
// do NOT gamma correct this dot product so ambient lighting stays soft
|
||||
float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0);
|
||||
ambient *= 0.5;
|
||||
ambient *= ambient;
|
||||
ambient = (1.0 - ambient);
|
||||
|
||||
vec3 sun_contrib = min(da, shadow) * sunlit;
|
||||
|
||||
color *= ambient;
|
||||
|
||||
color += sun_contrib;
|
||||
|
||||
color *= gamma_diff.rgb;
|
||||
|
||||
float glare = 0.0;
|
||||
|
||||
if (spec.a > 0.0) // specular reflection
|
||||
{
|
||||
/* // Reverting this specular calculation to previous 'dumbshiny' version - DJH 6/17/2020
|
||||
// Preserving the refactored version as a comment for potential reconsideration,
|
||||
// overriding the general rule to avoid pollutiong the source with commented code.
|
||||
//
|
||||
// If you're reading this in 2021+, feel free to obliterate.
|
||||
|
||||
vec3 npos = -normalize(pos.xyz);
|
||||
|
||||
//vec3 ref = dot(pos+lv, norm);
|
||||
vec3 h = normalize(light_dir.xyz + npos);
|
||||
float nh = dot(norm.xyz, h);
|
||||
float nv = dot(norm.xyz, npos);
|
||||
float vh = dot(npos, h);
|
||||
float sa = nh;
|
||||
float fres = pow(1 - dot(h, npos), 5)*0.4 + 0.5;
|
||||
|
||||
float gtdenom = 2 * nh;
|
||||
float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh));
|
||||
|
||||
if (nh > 0.0)
|
||||
{
|
||||
float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt / (nh*da);
|
||||
vec3 sp = sun_contrib*scol / 6.0f;
|
||||
sp = clamp(sp, vec3(0), vec3(1));
|
||||
bloom = dot(sp, sp) / 4.0;
|
||||
color += sp * spec.rgb;
|
||||
}
|
||||
*/
|
||||
|
||||
float sa = dot(refnormpersp, sun_dir.xyz);
|
||||
vec3 dumbshiny = sunlit * shadow * (texture2D(lightFunc, vec2(sa, spec.a)).r);
|
||||
|
||||
// add the two types of shiny together
|
||||
vec3 spec_contrib = dumbshiny * spec.rgb;
|
||||
bloom = dot(spec_contrib, spec_contrib) / 6;
|
||||
|
||||
glare = max(spec_contrib.r, spec_contrib.g);
|
||||
glare = max(glare, spec_contrib.b);
|
||||
|
||||
color += spec_contrib;
|
||||
}
|
||||
|
||||
color = mix(color.rgb, diffcol.rgb, diffuse.a);
|
||||
|
||||
if (envIntensity > 0.0)
|
||||
{
|
||||
//add environmentmap
|
||||
vec3 env_vec = env_mat * refnormpersp;
|
||||
|
||||
vec3 reflected_color = textureCube(environmentMap, env_vec).rgb;
|
||||
|
||||
color = mix(color, reflected_color, envIntensity);
|
||||
|
||||
float cur_glare = max(reflected_color.r, reflected_color.g);
|
||||
cur_glare = max(cur_glare, reflected_color.b);
|
||||
cur_glare *= envIntensity*4.0;
|
||||
glare += cur_glare;
|
||||
}
|
||||
|
||||
color = atmosFragLighting(color, additive, atten);
|
||||
color = scaleSoftClipFrag(color);
|
||||
|
||||
//convert to linear before adding local lights
|
||||
color = srgb_to_linear(color);
|
||||
|
||||
vec3 npos = normalize(-pos.xyz);
|
||||
|
||||
vec3 light = vec3(0, 0, 0);
|
||||
|
||||
#define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, npos, diffuse.rgb, final_specular, pos.xyz, norm.xyz, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, glare, light_attenuation[i].w );
|
||||
|
||||
LIGHT_LOOP(1)
|
||||
LIGHT_LOOP(2)
|
||||
LIGHT_LOOP(3)
|
||||
LIGHT_LOOP(4)
|
||||
LIGHT_LOOP(5)
|
||||
LIGHT_LOOP(6)
|
||||
LIGHT_LOOP(7)
|
||||
|
||||
color += light;
|
||||
|
||||
glare = min(glare, 1.0);
|
||||
float al = max(diffcol.a, glare)*vertex_color.a;
|
||||
|
||||
//convert to srgb as this color is being written post gamma correction
|
||||
color = linear_to_srgb(color);
|
||||
|
||||
#ifdef WATER_FOG
|
||||
vec4 temp = applyWaterFogView(pos, vec4(color, al));
|
||||
color = temp.rgb;
|
||||
al = temp.a;
|
||||
#endif
|
||||
|
||||
frag_color = vec4(color, al);
|
||||
|
||||
#else // mode is not DIFFUSE_ALPHA_MODE_BLEND, encode to gbuffer
|
||||
|
||||
// deferred path
|
||||
frag_data[0] = final_color; //gbuffer is sRGB
|
||||
frag_data[1] = final_specular; // XYZ = Specular color. W = Specular exponent.
|
||||
frag_data[2] = final_normal; // XY = Normal. Z = Env. intensity.
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
/**
|
||||
* @file moonF.glsl
|
||||
* @file class1\deferred\moonF.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2005, Linden Research, Inc.
|
||||
* Copyright (C) 2005, 2020 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
|
||||
|
|
@ -36,34 +36,33 @@ out vec4 frag_data[3];
|
|||
uniform vec4 color;
|
||||
uniform vec4 sunlight_color;
|
||||
uniform vec4 moonlight_color;
|
||||
uniform vec3 lumWeights;
|
||||
uniform vec3 moon_dir;
|
||||
uniform float moon_brightness;
|
||||
uniform float minLuminance;
|
||||
uniform sampler2D diffuseMap;
|
||||
uniform sampler2D altDiffuseMap;
|
||||
uniform float blend_factor; // interp factor between moon A/B
|
||||
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
vec3 srgb_to_linear(vec3 c);
|
||||
|
||||
/// Soft clips the light with a gamma correction
|
||||
vec3 scaleSoftClip(vec3 light);
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 moonA = texture2D(diffuseMap, vary_texcoord0.xy);
|
||||
vec4 moonB = texture2D(altDiffuseMap, vary_texcoord0.xy);
|
||||
vec4 c = mix(moonA, moonB, blend_factor);
|
||||
// Restore Pre-EEP alpha fade moon near horizon
|
||||
float fade = 1.0;
|
||||
if( moon_dir.z > 0 )
|
||||
fade = clamp( moon_dir.z*moon_dir.z*4.0, 0.0, 1.0 );
|
||||
|
||||
c.rgb = srgb_to_linear(c.rgb);
|
||||
vec4 c = texture2D(diffuseMap, vary_texcoord0.xy);
|
||||
// c.rgb = srgb_to_linear(c.rgb);
|
||||
c.rgb *= moonlight_color.rgb;
|
||||
c.rgb *= moon_brightness;
|
||||
|
||||
// mix factor which blends when sunlight is brighter
|
||||
// and shows true moon color at night
|
||||
vec3 luma_weights = vec3(0.3, 0.5, 0.3);
|
||||
c.rgb *= fade;
|
||||
c.a *= fade;
|
||||
|
||||
vec4 light_color = max(sunlight_color, moonlight_color);
|
||||
float mix = 1.0 - dot(normalize(light_color.rgb), luma_weights);
|
||||
|
||||
vec3 exp = vec3(1.0 - mix * moon_brightness) * 2.0 - 1.0;
|
||||
c.rgb = pow(c.rgb, exp);
|
||||
|
||||
//c.rgb *= moonlight_color.rgb;
|
||||
c.rgb = scaleSoftClip(c.rgb);
|
||||
|
||||
frag_data[0] = vec4(c.rgb, c.a);
|
||||
frag_data[1] = vec4(0.0);
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
/**
|
||||
* @file moonV.glsl
|
||||
* @file class1\deferred\moonV.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2007, Linden Research, Inc.
|
||||
* Copyright (C) 2007, 2020 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
|
||||
|
|
@ -32,18 +32,13 @@ ATTRIBUTE vec2 texcoord0;
|
|||
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
void calcAtmospherics(vec3 eye_pos);
|
||||
|
||||
void main()
|
||||
{
|
||||
//transform vertex
|
||||
vec3 offset = vec3(0, 0, 50);
|
||||
vec4 vert = vec4(position.xyz - offset, 1.0);
|
||||
vec4 vert = vec4(position.xyz, 1.0);
|
||||
vec4 pos = (modelview_matrix * vert);
|
||||
|
||||
gl_Position = modelview_projection_matrix*vert;
|
||||
|
||||
calcAtmospherics(pos.xyz);
|
||||
|
||||
vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,24 +1,24 @@
|
|||
/**
|
||||
* @file multiPointLightF.glsl
|
||||
/**
|
||||
* @file class1/deferred/multiPointLightF.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2007, 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$
|
||||
*/
|
||||
|
|
@ -36,119 +36,112 @@ out vec4 frag_color;
|
|||
uniform sampler2DRect depthMap;
|
||||
uniform sampler2DRect diffuseRect;
|
||||
uniform sampler2DRect specularRect;
|
||||
uniform samplerCube environmentMap;
|
||||
uniform sampler2D noiseMap;
|
||||
uniform sampler2D lightFunc;
|
||||
uniform samplerCube environmentMap;
|
||||
uniform sampler2D noiseMap;
|
||||
uniform sampler2D lightFunc;
|
||||
|
||||
|
||||
uniform vec3 env_mat[3];
|
||||
uniform vec3 env_mat[3];
|
||||
uniform float sun_wash;
|
||||
uniform int light_count;
|
||||
uniform vec4 light[LIGHT_COUNT];
|
||||
uniform vec4 light_col[LIGHT_COUNT];
|
||||
|
||||
uniform int light_count;
|
||||
|
||||
uniform vec4 light[LIGHT_COUNT];
|
||||
uniform vec4 light_col[LIGHT_COUNT];
|
||||
uniform vec2 screen_res;
|
||||
uniform float far_z;
|
||||
uniform mat4 inv_proj;
|
||||
|
||||
VARYING vec4 vary_fragcoord;
|
||||
uniform vec2 screen_res;
|
||||
|
||||
uniform float far_z;
|
||||
|
||||
uniform mat4 inv_proj;
|
||||
|
||||
vec4 getPosition(vec2 pos_screen);
|
||||
vec3 getNorm(vec2 pos_screen);
|
||||
vec3 srgb_to_linear(vec3 c);
|
||||
|
||||
void main()
|
||||
void main()
|
||||
{
|
||||
vec3 out_col = vec3(0,0,0);
|
||||
|
||||
#if defined(LOCAL_LIGHT_KILL)
|
||||
discard;
|
||||
#else
|
||||
vec2 frag = (vary_fragcoord.xy*0.5+0.5)*screen_res;
|
||||
vec3 pos = getPosition(frag.xy).xyz;
|
||||
if (pos.z < far_z)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
vec3 norm = getNorm(frag.xy);
|
||||
|
||||
vec4 spec = texture2DRect(specularRect, frag.xy);
|
||||
vec3 diff = texture2DRect(diffuseRect, frag.xy).rgb;
|
||||
diff.rgb = srgb_to_linear(diff.rgb);
|
||||
|
||||
float noise = texture2D(noiseMap, frag.xy/128.0).b;
|
||||
vec3 npos = normalize(-pos);
|
||||
|
||||
// As of OSX 10.6.7 ATI Apple's crash when using a variable size loop
|
||||
for (int i = 0; i < LIGHT_COUNT; ++i)
|
||||
{
|
||||
vec3 lv = light[i].xyz-pos;
|
||||
float dist = length(lv);
|
||||
dist /= light[i].w;
|
||||
if (dist <= 1.0)
|
||||
{
|
||||
float da = dot(norm, lv);
|
||||
if (da > 0.0)
|
||||
{
|
||||
lv = normalize(lv);
|
||||
da = dot(norm, lv);
|
||||
|
||||
float fa = light_col[i].a+1.0;
|
||||
float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0);
|
||||
dist_atten *= dist_atten;
|
||||
|
||||
// Tweak falloff slightly to match pre-EEP attenuation
|
||||
// NOTE: this magic number also shows up in a great many other places, search for dist_atten *= to audit
|
||||
dist_atten *= 2.0;
|
||||
|
||||
dist_atten *= noise;
|
||||
|
||||
float lit = da * dist_atten;
|
||||
|
||||
vec3 col = light_col[i].rgb*lit*diff;
|
||||
|
||||
//vec3 col = vec3(dist2, light_col[i].a, lit);
|
||||
|
||||
if (spec.a > 0.0)
|
||||
{
|
||||
lit = min(da*6.0, 1.0) * dist_atten;
|
||||
//vec3 ref = dot(pos+lv, norm);
|
||||
vec3 h = normalize(lv+npos);
|
||||
float nh = dot(norm, h);
|
||||
float nv = dot(norm, npos);
|
||||
float vh = dot(npos, h);
|
||||
float sa = nh;
|
||||
float fres = pow(1 - dot(h, npos), 5)*0.4+0.5;
|
||||
|
||||
float gtdenom = 2 * nh;
|
||||
float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh));
|
||||
|
||||
if (nh > 0.0)
|
||||
{
|
||||
float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da);
|
||||
col += lit*scol*light_col[i].rgb*spec.rgb;
|
||||
//col += spec.rgb;
|
||||
}
|
||||
}
|
||||
|
||||
out_col += col;
|
||||
}
|
||||
}
|
||||
}
|
||||
discard; // Bail immediately
|
||||
#endif
|
||||
|
||||
frag_color.rgb = out_col;
|
||||
frag_color.a = 0.0;
|
||||
|
||||
vec3 out_col = vec3(0, 0, 0);
|
||||
vec2 frag = (vary_fragcoord.xy * 0.5 + 0.5) * screen_res;
|
||||
vec3 pos = getPosition(frag.xy).xyz;
|
||||
if (pos.z < far_z)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
vec3 norm = getNorm(frag.xy);
|
||||
|
||||
vec4 spec = texture2DRect(specularRect, frag.xy);
|
||||
spec.rgb = srgb_to_linear(spec.rgb);
|
||||
vec3 diff = texture2DRect(diffuseRect, frag.xy).rgb;
|
||||
diff.rgb = srgb_to_linear(diff.rgb);
|
||||
|
||||
float noise = texture2D(noiseMap, frag.xy / 128.0).b;
|
||||
vec3 npos = normalize(-pos);
|
||||
|
||||
// As of OSX 10.6.7 ATI Apple's crash when using a variable size loop
|
||||
for (int i = 0; i < LIGHT_COUNT; ++i)
|
||||
{
|
||||
vec3 lv = light[i].xyz - pos;
|
||||
float dist = length(lv);
|
||||
dist /= light[i].w;
|
||||
if (dist <= 1.0)
|
||||
{
|
||||
float da = dot(norm, lv);
|
||||
if (da > 0.0)
|
||||
{
|
||||
lv = normalize(lv);
|
||||
da = dot(norm, lv);
|
||||
|
||||
float fa = light_col[i].a + 1.0;
|
||||
float dist_atten = clamp(1.0 - (dist - 1.0 * (1.0 - fa)) / fa, 0.0, 1.0);
|
||||
dist_atten *= dist_atten;
|
||||
|
||||
// Tweak falloff slightly to match pre-EEP attenuation
|
||||
// NOTE: this magic number also shows up in a great many other places, search for dist_atten *= to audit
|
||||
dist_atten *= 2.0;
|
||||
|
||||
dist_atten *= noise;
|
||||
|
||||
float lit = da * dist_atten;
|
||||
|
||||
vec3 col = light_col[i].rgb * lit * diff;
|
||||
|
||||
if (spec.a > 0.0)
|
||||
{
|
||||
lit = min(da * 6.0, 1.0) * dist_atten;
|
||||
vec3 h = normalize(lv + npos);
|
||||
float nh = dot(norm, h);
|
||||
float nv = dot(norm, npos);
|
||||
float vh = dot(npos, h);
|
||||
float sa = nh;
|
||||
float fres = pow(1 - dot(h, npos), 5) * 0.4 + 0.5;
|
||||
|
||||
float gtdenom = 2 * nh;
|
||||
float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh));
|
||||
|
||||
if (nh > 0.0)
|
||||
{
|
||||
float scol = fres * texture2D(lightFunc, vec2(nh, spec.a)).r * gt / (nh * da);
|
||||
col += lit * scol * light_col[i].rgb * spec.rgb;
|
||||
}
|
||||
}
|
||||
|
||||
out_col += col;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
frag_color.rgb = out_col;
|
||||
frag_color.a = 0.0;
|
||||
|
||||
#ifdef IS_AMD_CARD
|
||||
// If it's AMD make sure the GLSL compiler sees the arrays referenced once by static index. Otherwise it seems to optimise the storage awawy which leads to unfun crashes and artifacts.
|
||||
vec4 dummy1 = light[0];
|
||||
vec4 dummy2 = light_col[0];
|
||||
vec4 dummy3 = light[LIGHT_COUNT-1];
|
||||
vec4 dummy4 = light_col[LIGHT_COUNT-1];
|
||||
// If it's AMD make sure the GLSL compiler sees the arrays referenced once by static index. Otherwise it seems to optimise the storage
|
||||
// awawy which leads to unfun crashes and artifacts.
|
||||
vec4 dummy1 = light[0];
|
||||
vec4 dummy2 = light_col[0];
|
||||
vec4 dummy3 = light[LIGHT_COUNT - 1];
|
||||
vec4 dummy4 = light_col[LIGHT_COUNT - 1];
|
||||
#endif
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,24 +1,24 @@
|
|||
/**
|
||||
/**
|
||||
* @file WLSkyV.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2005, 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$
|
||||
*/
|
||||
|
|
@ -37,13 +37,13 @@ VARYING vec4 vary_HazeColor;
|
|||
// Inputs
|
||||
uniform vec3 camPosLocal;
|
||||
|
||||
uniform vec4 lightnorm;
|
||||
uniform vec4 sunlight_color;
|
||||
uniform vec4 moonlight_color;
|
||||
uniform int sun_up_factor;
|
||||
uniform vec4 ambient_color;
|
||||
uniform vec4 blue_horizon;
|
||||
uniform vec4 blue_density;
|
||||
uniform vec4 lightnorm;
|
||||
uniform vec4 sunlight_color;
|
||||
uniform vec4 moonlight_color;
|
||||
uniform int sun_up_factor;
|
||||
uniform vec4 ambient_color;
|
||||
uniform vec4 blue_horizon;
|
||||
uniform vec4 blue_density;
|
||||
uniform float haze_horizon;
|
||||
uniform float haze_density;
|
||||
|
||||
|
|
@ -52,7 +52,7 @@ uniform float density_multiplier;
|
|||
uniform float distance_multiplier;
|
||||
uniform float max_y;
|
||||
|
||||
uniform vec4 glow;
|
||||
uniform vec4 glow;
|
||||
uniform float sun_moon_glow_factor;
|
||||
|
||||
uniform vec4 cloud_color;
|
||||
|
|
@ -63,103 +63,91 @@ uniform vec4 cloud_color;
|
|||
// indra\newview\lllegacyatmospherics.cpp
|
||||
void main()
|
||||
{
|
||||
|
||||
// World / view / projection
|
||||
// World / view / projection
|
||||
vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
|
||||
|
||||
gl_Position = pos;
|
||||
|
||||
// Get relative position
|
||||
vec3 P = position.xyz - camPosLocal.xyz + vec3(0,50,0);
|
||||
gl_Position = pos;
|
||||
|
||||
// Set altitude
|
||||
if (P.y > 0.)
|
||||
{
|
||||
P *= (max_y / P.y);
|
||||
}
|
||||
else
|
||||
{
|
||||
P *= (-32000. / P.y);
|
||||
}
|
||||
// Get relative position
|
||||
vec3 rel_pos = position.xyz - camPosLocal.xyz + vec3(0, 50, 0);
|
||||
|
||||
// Can normalize then
|
||||
vec3 Pn = normalize(P);
|
||||
// Adj position vector to clamp altitude
|
||||
if (rel_pos.y > 0)
|
||||
{
|
||||
rel_pos *= (max_y / rel_pos.y);
|
||||
}
|
||||
if (rel_pos.y < 0)
|
||||
{
|
||||
rel_pos *= (-32000. / rel_pos.y);
|
||||
}
|
||||
|
||||
float Plen = length(P);
|
||||
// Can normalize then
|
||||
vec3 rel_pos_norm = normalize(rel_pos);
|
||||
|
||||
// Initialize temp variables
|
||||
vec4 temp1 = vec4(0.);
|
||||
vec4 temp2 = vec4(0.);
|
||||
vec4 blue_weight;
|
||||
vec4 haze_weight;
|
||||
vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color;
|
||||
vec4 light_atten;
|
||||
float rel_pos_len = length(rel_pos);
|
||||
|
||||
float dens_mul = density_multiplier;
|
||||
// Initialize temp variables
|
||||
vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color;
|
||||
vec4 light_atten;
|
||||
|
||||
// Sunlight attenuation effect (hue and brightness) due to atmosphere
|
||||
// this is used later for sunlight modulation at various altitudes
|
||||
light_atten = (blue_density + vec4(haze_density * 0.25)) * (dens_mul * max_y);
|
||||
// Sunlight attenuation effect (hue and brightness) due to atmosphere
|
||||
// this is used later for sunlight modulation at various altitudes
|
||||
light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);
|
||||
|
||||
// Calculate relative weights
|
||||
temp1 = abs(blue_density) + vec4(abs(haze_density));
|
||||
blue_weight = blue_density / temp1;
|
||||
haze_weight = haze_density / temp1;
|
||||
// Calculate relative weights
|
||||
vec4 combined_haze = abs(blue_density) + vec4(abs(haze_density));
|
||||
vec4 blue_weight = blue_density / combined_haze;
|
||||
vec4 haze_weight = haze_density / combined_haze;
|
||||
|
||||
// Compute sunlight from P & lightnorm (for long rays like sky)
|
||||
temp2.y = max(0., max(0., Pn.y) * 1.0 + lightnorm.y );
|
||||
temp2.y = 1. / temp2.y;
|
||||
sunlight *= exp( - light_atten * temp2.y);
|
||||
// Compute sunlight from rel_pos & lightnorm (for long rays like sky)
|
||||
float off_axis = 1.0 / max(1e-6, max(0., rel_pos_norm.y) + lightnorm.y);
|
||||
sunlight *= exp(-light_atten * off_axis);
|
||||
|
||||
// Distance
|
||||
temp2.z = Plen * dens_mul;
|
||||
// Distance
|
||||
float density_dist = rel_pos_len * density_multiplier;
|
||||
|
||||
// Transparency (-> temp1)
|
||||
// ATI Bugfix -- can't store temp1*temp2.z in a variable because the ati
|
||||
// Transparency (-> combined_haze)
|
||||
// ATI Bugfix -- can't store combined_haze*density_dist in a variable because the ati
|
||||
// compiler gets confused.
|
||||
temp1 = exp(-temp1 * temp2.z);
|
||||
combined_haze = exp(-combined_haze * density_dist);
|
||||
|
||||
// Compute haze glow
|
||||
temp2.x = dot(Pn, lightnorm.xyz);
|
||||
temp2.x = 1. - temp2.x;
|
||||
// temp2.x is 0 at the sun and increases away from sun
|
||||
temp2.x = max(temp2.x, .001);
|
||||
// Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
|
||||
temp2.x *= glow.x;
|
||||
// Higher glow.x gives dimmer glow (because next step is 1 / "angle")
|
||||
temp2.x = pow(temp2.x, glow.z);
|
||||
// glow.z should be negative, so we're doing a sort of (1 / "angle") function
|
||||
// Compute haze glow
|
||||
float haze_glow = 1.0 - dot(rel_pos_norm, lightnorm.xyz);
|
||||
// haze_glow is 0 at the sun and increases away from sun
|
||||
haze_glow = max(haze_glow, .001);
|
||||
// Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
|
||||
haze_glow *= glow.x;
|
||||
// Higher glow.x gives dimmer glow (because next step is 1 / "angle")
|
||||
haze_glow = pow(haze_glow, glow.z);
|
||||
// glow.z should be negative, so we're doing a sort of (1 / "angle") function
|
||||
|
||||
// Add "minimum anti-solar illumination"
|
||||
temp2.x += .25;
|
||||
|
||||
vec4 color = ( blue_horizon * blue_weight * (sunlight + ambient_color)
|
||||
+ (haze_horizon * haze_weight) * (sunlight * temp2.x + ambient_color)
|
||||
);
|
||||
// Add "minimum anti-solar illumination"
|
||||
// For sun, add to glow. For moon, remove glow entirely. SL-13768
|
||||
haze_glow = (sun_moon_glow_factor < 1.0) ? 0.0 : (haze_glow + 0.25);
|
||||
|
||||
vec4 color =
|
||||
(blue_horizon * blue_weight * (sunlight + ambient_color) + (haze_horizon * haze_weight) * (sunlight * haze_glow + ambient_color));
|
||||
|
||||
// Final atmosphere additive
|
||||
color *= (1. - temp1);
|
||||
color *= (1. - combined_haze);
|
||||
|
||||
// Increase ambient when there are more clouds
|
||||
vec4 tmpAmbient = ambient_color;
|
||||
tmpAmbient += max(vec4(0), (1. - ambient_color)) * cloud_shadow * 0.5;
|
||||
// Increase ambient when there are more clouds
|
||||
vec4 tmpAmbient = ambient_color;
|
||||
tmpAmbient += max(vec4(0), (1. - ambient_color)) * cloud_shadow * 0.5;
|
||||
|
||||
// Dim sunlight by cloud shadow percentage
|
||||
sunlight *= max(0.0, (1. - cloud_shadow));
|
||||
// Dim sunlight by cloud shadow percentage
|
||||
sunlight *= max(0.0, (1. - cloud_shadow));
|
||||
|
||||
// Haze color below cloud
|
||||
vec4 additiveColorBelowCloud = ( blue_horizon * blue_weight * (sunlight + tmpAmbient)
|
||||
+ (haze_horizon * haze_weight) * (sunlight * temp2.x + tmpAmbient)
|
||||
);
|
||||
// Haze color below cloud
|
||||
vec4 additiveColorBelowCloud =
|
||||
(blue_horizon * blue_weight * (sunlight + tmpAmbient) + (haze_horizon * haze_weight) * (sunlight * haze_glow + tmpAmbient));
|
||||
|
||||
// Attenuate cloud color by atmosphere
|
||||
temp1 = sqrt(temp1); //less atmos opacity (more transparency) below clouds
|
||||
// Attenuate cloud color by atmosphere
|
||||
combined_haze = sqrt(combined_haze); // less atmos opacity (more transparency) below clouds
|
||||
|
||||
// At horizon, blend high altitude sky color towards the darker color below the clouds
|
||||
color += (additiveColorBelowCloud - color) * (1. - sqrt(temp1));
|
||||
// At horizon, blend high altitude sky color towards the darker color below the clouds
|
||||
color += (additiveColorBelowCloud - color) * (1. - sqrt(combined_haze));
|
||||
|
||||
// Haze color above cloud
|
||||
vary_HazeColor = color;
|
||||
vary_HazeColor = color;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -124,41 +124,15 @@ void main()
|
|||
|
||||
if (spec.a > 0.0) // specular reflection
|
||||
{
|
||||
float sa = dot(refnormpersp, light_dir.xyz);
|
||||
vec3 dumbshiny = sunlit * (texture2D(lightFunc, vec2(sa, spec.a)).r);
|
||||
|
||||
#if 1 //EEP
|
||||
vec3 npos = -normalize(pos.xyz);
|
||||
|
||||
//vec3 ref = dot(pos+lv, norm);
|
||||
vec3 h = normalize(light_dir.xyz+npos);
|
||||
float nh = dot(norm.xyz, h);
|
||||
float nv = dot(norm.xyz, npos);
|
||||
float vh = dot(npos, h);
|
||||
float sa = nh;
|
||||
float fres = pow(1 - dot(h, npos), 5)*0.4+0.5;
|
||||
|
||||
float gtdenom = 2 * nh;
|
||||
float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh));
|
||||
|
||||
if (nh > 0.0)
|
||||
{
|
||||
float scontrib = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da);
|
||||
vec3 sp = sun_contrib*scontrib / 6.0;
|
||||
sp = clamp(sp, vec3(0), vec3(1));
|
||||
bloom += dot(sp, sp) / 4.0;
|
||||
color += sp * spec.rgb;
|
||||
}
|
||||
#else //PRODUCTION
|
||||
float sa = dot(refnormpersp, light_dir.xyz);
|
||||
vec3 dumbshiny = sunlit*(texture2D(lightFunc, vec2(sa, spec.a)).r);
|
||||
|
||||
// add the two types of shiny together
|
||||
vec3 spec_contrib = dumbshiny * spec.rgb;
|
||||
bloom = dot(spec_contrib, spec_contrib) / 6;
|
||||
bloom = dot(spec_contrib, spec_contrib) / 6;
|
||||
color.rgb += spec_contrib;
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
|
||||
color.rgb = mix(color.rgb, diffuse.rgb, diffuse.a);
|
||||
|
||||
if (envIntensity > 0.0)
|
||||
|
|
|
|||
|
|
@ -23,6 +23,9 @@
|
|||
* $/LicenseInfo$
|
||||
*/
|
||||
|
||||
// Lambert Azimuthal Equal-Area projection
|
||||
// See: https://aras-p.info/texts/CompactNormalStorage.html
|
||||
// Also see: A_bit_more_deferred_-_CryEngine3.ppt
|
||||
vec2 encode_normal(vec3 n)
|
||||
{
|
||||
float f = sqrt(8 * n.z + 8);
|
||||
|
|
|
|||
|
|
@ -31,6 +31,9 @@ out vec4 frag_color;
|
|||
|
||||
uniform float minimum_alpha;
|
||||
|
||||
// render_hud_attachments() -> HUD objects set LLShaderMgr::NO_ATMO;
|
||||
uniform int no_atmo;
|
||||
|
||||
vec3 atmosLighting(vec3 light);
|
||||
vec3 scaleSoftClip(vec3 light);
|
||||
|
||||
|
|
@ -41,16 +44,19 @@ void default_lighting()
|
|||
{
|
||||
vec4 color = diffuseLookup(vary_texcoord0.xy);
|
||||
|
||||
color *= vertex_color;
|
||||
|
||||
if (color.a < minimum_alpha)
|
||||
{
|
||||
discard;
|
||||
}
|
||||
|
||||
color *= vertex_color;
|
||||
|
||||
color.rgb = atmosLighting(color.rgb);
|
||||
|
||||
color.rgb = scaleSoftClip(color.rgb);
|
||||
// SL-9632 HUDs are affected by Atmosphere
|
||||
if (no_atmo == 0)
|
||||
{
|
||||
color.rgb = atmosLighting(color.rgb);
|
||||
color.rgb = scaleSoftClip(color.rgb);
|
||||
}
|
||||
|
||||
frag_color = color;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -30,7 +30,10 @@ out vec4 frag_color;
|
|||
#endif
|
||||
|
||||
uniform float minimum_alpha;
|
||||
uniform float texture_gamma;
|
||||
uniform float texture_gamma; // either 1.0 or 2.2; see: "::TEXTURE_GAMMA"
|
||||
|
||||
// render_hud_attachments() -> HUD objects set LLShaderMgr::NO_ATMO; used in LLDrawPoolAlpha::beginRenderPass()
|
||||
uniform int no_atmo;
|
||||
|
||||
vec3 fullbrightAtmosTransport(vec3 light);
|
||||
vec3 fullbrightScaleSoftClip(vec3 light);
|
||||
|
|
@ -50,9 +53,17 @@ void fullbright_lighting()
|
|||
color.rgb *= vertex_color.rgb;
|
||||
|
||||
color.rgb = pow(color.rgb, vec3(texture_gamma));
|
||||
color.rgb = fullbrightAtmosTransport(color.rgb);
|
||||
|
||||
color.rgb = fullbrightScaleSoftClip(color.rgb);
|
||||
|
||||
// SL-9632 HUDs are affected by Atmosphere
|
||||
if (no_atmo == 0)
|
||||
{
|
||||
color.rgb = fullbrightAtmosTransport(color.rgb);
|
||||
color.rgb = fullbrightScaleSoftClip(color.rgb);
|
||||
}
|
||||
|
||||
//*TODO: Are we missing an inverse pow() here?
|
||||
// class1\lighting\lightFullbrightF.glsl has:
|
||||
// color.rgb = pow(color.rgb, vec3(1.0/texture_gamma));
|
||||
|
||||
frag_color = color;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -34,6 +34,9 @@ VARYING vec2 vary_texcoord0;
|
|||
|
||||
uniform float texture_gamma;
|
||||
|
||||
// render_hud_attachments() -> HUD objects set LLShaderMgr::NO_ATMO;
|
||||
uniform int no_atmo;
|
||||
|
||||
vec3 fullbrightAtmosTransport(vec3 light);
|
||||
vec3 fullbrightScaleSoftClip(vec3 light);
|
||||
|
||||
|
|
@ -43,9 +46,12 @@ void fullbright_lighting()
|
|||
|
||||
color.rgb = pow(color.rgb, vec3(texture_gamma));
|
||||
|
||||
color.rgb = fullbrightAtmosTransport(color.rgb);
|
||||
|
||||
color.rgb = fullbrightScaleSoftClip(color.rgb);
|
||||
// SL-9632 HUDs are affected by Atmosphere
|
||||
if (no_atmo == 0)
|
||||
{
|
||||
color.rgb = fullbrightAtmosTransport(color.rgb);
|
||||
color.rgb = fullbrightScaleSoftClip(color.rgb);
|
||||
}
|
||||
|
||||
color.rgb = pow(color.rgb, vec3(1.0/texture_gamma));
|
||||
|
||||
|
|
|
|||
|
|
@ -35,20 +35,37 @@ VARYING vec3 vary_texcoord1;
|
|||
|
||||
uniform samplerCube environmentMap;
|
||||
|
||||
// render_hud_attachments() -> HUD objects set LLShaderMgr::NO_ATMO; used in LLDrawPoolAlpha::beginRenderPass()
|
||||
uniform int no_atmo;
|
||||
|
||||
vec3 fullbrightShinyAtmosTransport(vec3 light);
|
||||
vec3 fullbrightScaleSoftClip(vec3 light);
|
||||
|
||||
// See:
|
||||
// class1\deferred\fullbrightShinyF.glsl
|
||||
// class1\lighting\lightFullbrightShinyF.glsl
|
||||
void fullbright_shiny_lighting()
|
||||
{
|
||||
vec4 color = diffuseLookup(vary_texcoord0.xy);
|
||||
color.rgb *= vertex_color.rgb;
|
||||
|
||||
vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
|
||||
color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a*0.75); // MAGIC NUMBER SL-12574; ALM: Off, Quality > Low
|
||||
|
||||
color.rgb = fullbrightShinyAtmosTransport(color.rgb);
|
||||
// SL-9632 HUDs are affected by Atmosphere
|
||||
if (no_atmo == 0)
|
||||
{
|
||||
vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
|
||||
color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a*0.75); // MAGIC NUMBER SL-12574; ALM: Off, Quality > Low
|
||||
|
||||
color.rgb = fullbrightScaleSoftClip(color.rgb);
|
||||
color.rgb = fullbrightShinyAtmosTransport(color.rgb);
|
||||
color.rgb = fullbrightScaleSoftClip(color.rgb);
|
||||
}
|
||||
/*
|
||||
// NOTE: HUD objects will be full bright. Uncomment if you want "some" environment lighting effecting these HUD objects.
|
||||
else
|
||||
{
|
||||
vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;
|
||||
color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a*0.75); // MAGIC NUMBER SL-12574; ALM: Off, Quality > Low
|
||||
}
|
||||
*/
|
||||
|
||||
color.a = 1.0;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
/**
|
||||
/**
|
||||
* @file simpleV.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
|
|
@ -28,6 +28,9 @@ uniform mat4 texture_matrix0;
|
|||
uniform mat4 modelview_matrix;
|
||||
uniform mat4 modelview_projection_matrix;
|
||||
|
||||
// render_hud_attachments() -> HUD objects set LLShaderMgr::NO_ATMO; used in LLDrawPoolAlpha::beginRenderPass()
|
||||
uniform int no_atmo;
|
||||
|
||||
ATTRIBUTE vec3 position;
|
||||
void passTextureIndex();
|
||||
ATTRIBUTE vec2 texcoord0;
|
||||
|
|
@ -46,19 +49,23 @@ void main()
|
|||
{
|
||||
//transform vertex
|
||||
vec4 vert = vec4(position.xyz,1.0);
|
||||
passTextureIndex();
|
||||
vec4 pos = (modelview_matrix * vert);
|
||||
gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);
|
||||
|
||||
passTextureIndex();
|
||||
vary_texcoord0 = (texture_matrix0 * vec4(texcoord0, 0, 1)).xy;
|
||||
|
||||
|
||||
|
||||
vec3 norm = normalize(normal_matrix * normal);
|
||||
|
||||
calcAtmospherics(pos.xyz);
|
||||
// SL-9632 HUDs are affected by Atmosphere
|
||||
if (no_atmo == 1)
|
||||
{
|
||||
vertex_color = diffuse_color;
|
||||
}
|
||||
else
|
||||
{
|
||||
vec4 pos = (modelview_matrix * vert);
|
||||
vec3 norm = normalize(normal_matrix * normal);
|
||||
|
||||
vec4 color = calcLighting(pos.xyz, norm, diffuse_color);
|
||||
vertex_color = color;
|
||||
calcAtmospherics(pos.xyz);
|
||||
|
||||
|
||||
vertex_color = calcLighting(pos.xyz, norm, diffuse_color);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,154 +1,134 @@
|
|||
/**
|
||||
/**
|
||||
* @file class1\windlight\atmosphericsFuncs.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2019, 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$
|
||||
*/
|
||||
uniform vec4 lightnorm;
|
||||
uniform vec4 sunlight_color;
|
||||
uniform vec4 moonlight_color;
|
||||
uniform int sun_up_factor;
|
||||
uniform vec4 ambient_color;
|
||||
uniform vec4 blue_horizon;
|
||||
uniform vec4 blue_density;
|
||||
uniform vec4 lightnorm;
|
||||
uniform vec4 sunlight_color;
|
||||
uniform vec4 moonlight_color;
|
||||
uniform int sun_up_factor;
|
||||
uniform vec4 ambient_color;
|
||||
uniform vec4 blue_horizon;
|
||||
uniform vec4 blue_density;
|
||||
uniform float haze_horizon;
|
||||
uniform float haze_density;
|
||||
uniform float cloud_shadow;
|
||||
uniform float density_multiplier;
|
||||
uniform float distance_multiplier;
|
||||
uniform float max_y;
|
||||
uniform vec4 glow;
|
||||
uniform vec4 glow;
|
||||
uniform float scene_light_strength;
|
||||
uniform mat3 ssao_effect_mat;
|
||||
uniform int no_atmo;
|
||||
uniform mat3 ssao_effect_mat;
|
||||
uniform int no_atmo;
|
||||
uniform float sun_moon_glow_factor;
|
||||
|
||||
float getAmbientClamp()
|
||||
float getAmbientClamp() { return 1.0f; }
|
||||
|
||||
void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive,
|
||||
out vec3 atten, bool use_ao)
|
||||
{
|
||||
return 1.0f;
|
||||
}
|
||||
vec3 rel_pos = inPositionEye;
|
||||
|
||||
|
||||
void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao) {
|
||||
|
||||
vec3 P = inPositionEye;
|
||||
|
||||
//(TERRAIN) limit altitude
|
||||
if (P.y > max_y) P *= (max_y / P.y);
|
||||
if (P.y < -max_y) P *= (-max_y / P.y);
|
||||
if (abs(rel_pos.y) > max_y) rel_pos *= (max_y / rel_pos.y);
|
||||
|
||||
vec3 tmpLightnorm = lightnorm.xyz;
|
||||
vec3 rel_pos_norm = normalize(rel_pos);
|
||||
float rel_pos_len = length(rel_pos);
|
||||
vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color;
|
||||
|
||||
vec3 Pn = normalize(P);
|
||||
float Plen = length(P);
|
||||
// sunlight attenuation effect (hue and brightness) due to atmosphere
|
||||
// this is used later for sunlight modulation at various altitudes
|
||||
vec4 light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);
|
||||
// I had thought blue_density and haze_density should have equal weighting,
|
||||
// but attenuation due to haze_density tends to seem too strong
|
||||
|
||||
vec4 temp1 = vec4(0);
|
||||
vec3 temp2 = vec3(0);
|
||||
vec4 blue_weight;
|
||||
vec4 haze_weight;
|
||||
vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color;
|
||||
vec4 light_atten;
|
||||
vec4 combined_haze = blue_density + vec4(haze_density);
|
||||
vec4 blue_weight = blue_density / combined_haze;
|
||||
vec4 haze_weight = vec4(haze_density) / combined_haze;
|
||||
|
||||
float dens_mul = density_multiplier;
|
||||
float dist_mul = distance_multiplier;
|
||||
|
||||
//sunlight attenuation effect (hue and brightness) due to atmosphere
|
||||
//this is used later for sunlight modulation at various altitudes
|
||||
light_atten = (blue_density + vec4(haze_density * 0.25)) * (dens_mul * max_y);
|
||||
//I had thought blue_density and haze_density should have equal weighting,
|
||||
//but attenuation due to haze_density tends to seem too strong
|
||||
|
||||
temp1 = blue_density + vec4(haze_density);
|
||||
blue_weight = blue_density / temp1;
|
||||
haze_weight = vec4(haze_density) / temp1;
|
||||
|
||||
//(TERRAIN) compute sunlight from lightnorm only (for short rays like terrain)
|
||||
temp2.y = max(0.0, tmpLightnorm.y);
|
||||
if (abs(temp2.y) > 0.000001f)
|
||||
{
|
||||
temp2.y = 1. / abs(temp2.y);
|
||||
}
|
||||
temp2.y = max(0.0000001f, temp2.y);
|
||||
sunlight *= exp(-light_atten * temp2.y);
|
||||
//(TERRAIN) compute sunlight from lightnorm y component. Factor is roughly cosecant(sun elevation) (for short rays like terrain)
|
||||
float above_horizon_factor = 1.0 / max(1e-6, lightnorm.y);
|
||||
sunlight *= exp(-light_atten * above_horizon_factor); // for sun [horizon..overhead] this maps to an exp curve [0..1]
|
||||
|
||||
// main atmospheric scattering line integral
|
||||
temp2.z = Plen * dens_mul;
|
||||
float density_dist = rel_pos_len * density_multiplier;
|
||||
|
||||
// Transparency (-> temp1)
|
||||
// ATI Bugfix -- can't store temp1*temp2.z*dist_mul in a variable because the ati
|
||||
// Transparency (-> combined_haze)
|
||||
// ATI Bugfix -- can't store combined_haze*density_dist*distance_multiplier in a variable because the ati
|
||||
// compiler gets confused.
|
||||
temp1 = exp(-temp1 * temp2.z * dist_mul);
|
||||
combined_haze = exp(-combined_haze * density_dist * distance_multiplier);
|
||||
|
||||
//final atmosphere attenuation factor
|
||||
atten = temp1.rgb;
|
||||
|
||||
//compute haze glow
|
||||
//(can use temp2.x as temp because we haven't used it yet)
|
||||
temp2.x = dot(Pn, tmpLightnorm.xyz);
|
||||
// final atmosphere attenuation factor
|
||||
atten = combined_haze.rgb;
|
||||
|
||||
// compute haze glow
|
||||
float haze_glow = dot(rel_pos_norm, lightnorm.xyz);
|
||||
|
||||
// dampen sun additive contrib when not facing it...
|
||||
if (length(light_dir) > 0.01)
|
||||
{
|
||||
temp2.x *= max(0.0f, dot(light_dir, Pn));
|
||||
}
|
||||
temp2.x = 1. - temp2.x;
|
||||
//temp2.x is 0 at the sun and increases away from sun
|
||||
temp2.x = max(temp2.x, .001); //was glow.y
|
||||
//set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
|
||||
temp2.x *= glow.x;
|
||||
//higher glow.x gives dimmer glow (because next step is 1 / "angle")
|
||||
temp2.x = pow(temp2.x, glow.z);
|
||||
//glow.z should be negative, so we're doing a sort of (1 / "angle") function
|
||||
// SL-13539: This "if" clause causes an "additive" white artifact at roughly 77 degreees.
|
||||
// if (length(light_dir) > 0.01)
|
||||
haze_glow *= max(0.0f, dot(light_dir, rel_pos_norm));
|
||||
|
||||
//add "minimum anti-solar illumination"
|
||||
temp2.x += .25;
|
||||
haze_glow = 1. - haze_glow;
|
||||
// haze_glow is 0 at the sun and increases away from sun
|
||||
haze_glow = max(haze_glow, .001); // set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
|
||||
haze_glow *= glow.x;
|
||||
// higher glow.x gives dimmer glow (because next step is 1 / "angle")
|
||||
haze_glow = pow(haze_glow, glow.z);
|
||||
// glow.z should be negative, so we're doing a sort of (1 / "angle") function
|
||||
|
||||
temp2.x *= sun_moon_glow_factor;
|
||||
|
||||
vec4 amb_color = ambient_color;
|
||||
|
||||
//increase ambient when there are more clouds
|
||||
// add "minimum anti-solar illumination"
|
||||
haze_glow += .25;
|
||||
|
||||
haze_glow *= sun_moon_glow_factor;
|
||||
|
||||
vec4 amb_color = ambient_color;
|
||||
|
||||
// increase ambient when there are more clouds
|
||||
vec4 tmpAmbient = amb_color + (vec4(1.) - amb_color) * cloud_shadow * 0.5;
|
||||
|
||||
|
||||
/* decrease value and saturation (that in HSV, not HSL) for occluded areas
|
||||
* // for HSV color/geometry used here, see http://gimp-savvy.com/BOOK/index.html?node52.html
|
||||
* // The following line of code performs the equivalent of:
|
||||
* float ambAlpha = tmpAmbient.a;
|
||||
* float ambValue = dot(vec3(tmpAmbient), vec3(0.577)); // projection onto <1/rt(3), 1/rt(3), 1/rt(3)>, the neutral white-black axis
|
||||
* vec3 ambHueSat = vec3(tmpAmbient) - vec3(ambValue);
|
||||
* tmpAmbient = vec4(RenderSSAOEffect.valueFactor * vec3(ambValue) + RenderSSAOEffect.saturationFactor *(1.0 - ambFactor) * ambHueSat, ambAlpha);
|
||||
* tmpAmbient = vec4(RenderSSAOEffect.valueFactor * vec3(ambValue) + RenderSSAOEffect.saturationFactor *(1.0 - ambFactor) * ambHueSat,
|
||||
* ambAlpha);
|
||||
*/
|
||||
if (use_ao)
|
||||
{
|
||||
tmpAmbient = vec4(mix(ssao_effect_mat * tmpAmbient.rgb, tmpAmbient.rgb, ambFactor), tmpAmbient.a);
|
||||
}
|
||||
|
||||
//haze color
|
||||
additive =
|
||||
vec3(blue_horizon * blue_weight * (sunlight*(1.-cloud_shadow) + tmpAmbient)
|
||||
+ (haze_horizon * haze_weight) * (sunlight*(1.-cloud_shadow) * temp2.x
|
||||
+ tmpAmbient));
|
||||
// Similar/Shared Algorithms:
|
||||
// indra\llinventory\llsettingssky.cpp -- LLSettingsSky::calculateLightSettings()
|
||||
// indra\newview\app_settings\shaders\class1\windlight\atmosphericsFuncs.glsl -- calcAtmosphericVars()
|
||||
// haze color
|
||||
vec3 cs = sunlight.rgb * (1. - cloud_shadow);
|
||||
additive = (blue_horizon.rgb * blue_weight.rgb) * (cs + tmpAmbient.rgb) + (haze_horizon * haze_weight.rgb) * (cs * haze_glow + tmpAmbient.rgb);
|
||||
|
||||
//brightness of surface both sunlight and ambient
|
||||
// brightness of surface both sunlight and ambient
|
||||
sunlit = sunlight.rgb * 0.5;
|
||||
amblit = tmpAmbient.rgb * .25;
|
||||
additive *= vec3(1.0 - temp1);
|
||||
additive *= vec3(1.0 - combined_haze);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2005, Linden Research, Inc.
|
||||
* Copyright (C) 2005, 2020 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
|
||||
|
|
@ -36,28 +36,30 @@ out vec4 frag_color;
|
|||
uniform vec4 color;
|
||||
uniform vec4 sunlight_color;
|
||||
uniform vec4 moonlight_color;
|
||||
uniform vec3 lumWeights;
|
||||
uniform vec3 moon_dir;
|
||||
uniform float moon_brightness;
|
||||
uniform float minLuminance;
|
||||
uniform sampler2D diffuseMap;
|
||||
uniform sampler2D altDiffuseMap;
|
||||
uniform float blend_factor; // interp factor between moon A/B
|
||||
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
vec3 scaleSoftClip(vec3 light);
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 moonA = texture2D(diffuseMap, vary_texcoord0.xy);
|
||||
vec4 moonB = texture2D(altDiffuseMap, vary_texcoord0.xy);
|
||||
vec4 c = mix(moonA, moonB, blend_factor);
|
||||
// Restore Pre-EEP alpha fade moon near horizon
|
||||
float fade = 1.0;
|
||||
if( moon_dir.z > 0 )
|
||||
fade = clamp( moon_dir.z*moon_dir.z*4.0, 0.0, 1.0 );
|
||||
|
||||
// mix factor which blends when sunlight is brighter
|
||||
// and shows true moon color at night
|
||||
vec3 luma_weights = vec3(0.3, 0.5, 0.3);
|
||||
float mix = 1.0f - dot(normalize(sunlight_color.rgb), luma_weights);
|
||||
vec4 c = texture2D(diffuseMap, vary_texcoord0.xy);
|
||||
// c.rgb = pow(c.rgb, vec3(0.7f)); // can't use "srgb_to_linear(color.rgb)" as that is a deferred only function
|
||||
c.rgb *= moonlight_color.rgb;
|
||||
c.rgb *= moon_brightness;
|
||||
|
||||
vec3 exp = vec3(1.0 - mix * moon_brightness) * 2.0 - 1.0;
|
||||
c.rgb = pow(c.rgb, exp);
|
||||
//c.rgb *= moonlight_color.rgb;
|
||||
c.rgb *= fade;
|
||||
c.a *= fade;
|
||||
|
||||
c.rgb = scaleSoftClip(c.rgb);
|
||||
|
||||
frag_color = vec4(c.rgb, c.a);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@
|
|||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2007, Linden Research, Inc.
|
||||
* Copyright (C) 2007, 2020 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
|
||||
|
|
@ -30,20 +30,15 @@ uniform mat4 modelview_projection_matrix;
|
|||
ATTRIBUTE vec3 position;
|
||||
ATTRIBUTE vec2 texcoord0;
|
||||
|
||||
void calcAtmospherics(vec3 inPositionEye);
|
||||
|
||||
VARYING vec2 vary_texcoord0;
|
||||
|
||||
void main()
|
||||
{
|
||||
//transform vertex
|
||||
vec3 offset = vec3(0, 0, 50);
|
||||
vec4 vert = vec4(position.xyz - offset, 1.0);
|
||||
vec4 vert = vec4(position.xyz, 1.0);
|
||||
vec4 pos = (modelview_matrix * vert);
|
||||
|
||||
gl_Position = modelview_projection_matrix*vert;
|
||||
|
||||
vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy;
|
||||
|
||||
calcAtmospherics(pos.xyz);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,24 +1,24 @@
|
|||
/**
|
||||
/**
|
||||
* @file class2/deferred/skyF.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2005, 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$
|
||||
*/
|
||||
|
|
@ -32,13 +32,13 @@ uniform mat4 modelview_projection_matrix;
|
|||
// Inputs
|
||||
uniform vec3 camPosLocal;
|
||||
|
||||
uniform vec4 lightnorm;
|
||||
uniform vec4 sunlight_color;
|
||||
uniform vec4 moonlight_color;
|
||||
uniform int sun_up_factor;
|
||||
uniform vec4 ambient_color;
|
||||
uniform vec4 blue_horizon;
|
||||
uniform vec4 blue_density;
|
||||
uniform vec4 lightnorm;
|
||||
uniform vec4 sunlight_color;
|
||||
uniform vec4 moonlight_color;
|
||||
uniform int sun_up_factor;
|
||||
uniform vec4 ambient_color;
|
||||
uniform vec4 blue_horizon;
|
||||
uniform vec4 blue_density;
|
||||
uniform float haze_horizon;
|
||||
uniform float haze_density;
|
||||
|
||||
|
|
@ -47,7 +47,7 @@ uniform float density_multiplier;
|
|||
uniform float distance_multiplier;
|
||||
uniform float max_y;
|
||||
|
||||
uniform vec4 glow;
|
||||
uniform vec4 glow;
|
||||
uniform float sun_moon_glow_factor;
|
||||
|
||||
uniform vec4 cloud_color;
|
||||
|
|
@ -73,16 +73,16 @@ uniform float ice_level;
|
|||
|
||||
vec3 rainbow(float d)
|
||||
{
|
||||
d = clamp(d, -1.0, 0.0);
|
||||
float rad = (droplet_radius - 5.0f) / 1024.0f;
|
||||
return pow(texture2D(rainbow_map, vec2(rad, d)).rgb, vec3(1.8)) * moisture_level;
|
||||
d = clamp(d, -1.0, 0.0);
|
||||
float rad = (droplet_radius - 5.0f) / 1024.0f;
|
||||
return pow(texture2D(rainbow_map, vec2(rad, d)).rgb, vec3(1.8)) * moisture_level;
|
||||
}
|
||||
|
||||
vec3 halo22(float d)
|
||||
{
|
||||
d = clamp(d, 0.1, 1.0);
|
||||
float v = sqrt(clamp(1 - (d * d), 0, 1));
|
||||
return texture2D(halo_map, vec2(0, v)).rgb * ice_level;
|
||||
d = clamp(d, 0.1, 1.0);
|
||||
float v = sqrt(clamp(1 - (d * d), 0, 1));
|
||||
return texture2D(halo_map, vec2(0, v)).rgb * ice_level;
|
||||
}
|
||||
|
||||
/// Soft clips the light with a gamma correction
|
||||
|
|
@ -90,115 +90,96 @@ vec3 scaleSoftClip(vec3 light);
|
|||
|
||||
void main()
|
||||
{
|
||||
|
||||
// World / view / projection
|
||||
// Get relative position
|
||||
vec3 P = pos.xyz - camPosLocal.xyz + vec3(0,50,0);
|
||||
// Get relative position (offset why?)
|
||||
vec3 rel_pos = pos.xyz - camPosLocal.xyz + vec3(0, 50, 0);
|
||||
|
||||
// Set altitude
|
||||
if (P.y > 0.)
|
||||
// Adj position vector to clamp altitude
|
||||
if (rel_pos.y > 0.)
|
||||
{
|
||||
P *= (max_y / P.y);
|
||||
rel_pos *= (max_y / rel_pos.y);
|
||||
}
|
||||
else
|
||||
if (rel_pos.y < 0.)
|
||||
{
|
||||
P *= (-32000. / P.y);
|
||||
rel_pos *= (-32000. / rel_pos.y);
|
||||
}
|
||||
|
||||
// Can normalize then
|
||||
vec3 Pn = normalize(P);
|
||||
float Plen = length(P);
|
||||
// Normalized
|
||||
vec3 rel_pos_norm = normalize(rel_pos);
|
||||
float rel_pos_len = length(rel_pos);
|
||||
|
||||
// Initialize temp variables
|
||||
vec4 temp1 = vec4(0.);
|
||||
vec4 temp2 = vec4(0.);
|
||||
vec4 blue_weight;
|
||||
vec4 haze_weight;
|
||||
vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color;
|
||||
vec4 light_atten;
|
||||
|
||||
float dens_mul = density_multiplier;
|
||||
|
||||
// Sunlight attenuation effect (hue and brightness) due to atmosphere
|
||||
// this is used later for sunlight modulation at various altitudes
|
||||
light_atten = (blue_density + vec4(haze_density * 0.25)) * (dens_mul * max_y);
|
||||
vec4 light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);
|
||||
|
||||
// Calculate relative weights
|
||||
temp1 = abs(blue_density) + vec4(abs(haze_density));
|
||||
blue_weight = blue_density / temp1;
|
||||
haze_weight = haze_density / temp1;
|
||||
vec4 combined_haze = abs(blue_density) + vec4(abs(haze_density));
|
||||
vec4 blue_weight = blue_density / combined_haze;
|
||||
vec4 haze_weight = haze_density / combined_haze;
|
||||
|
||||
// Compute sunlight from P & lightnorm (for long rays like sky)
|
||||
temp2.y = max(0., max(0., Pn.y) * 1.0 + lightnorm.y );
|
||||
temp2.y = 1. / temp2.y;
|
||||
sunlight *= exp( - light_atten * temp2.y);
|
||||
// Compute sunlight from rel_pos & lightnorm (for long rays like sky)
|
||||
float off_axis = 1.0 / max(1e-6, max(0, rel_pos_norm.y) + lightnorm.y);
|
||||
sunlight *= exp(-light_atten * off_axis);
|
||||
|
||||
// Distance
|
||||
temp2.z = Plen * dens_mul;
|
||||
float density_dist = rel_pos_len * density_multiplier;
|
||||
|
||||
// Transparency (-> temp1)
|
||||
// ATI Bugfix -- can't store temp1*temp2.z in a variable because the ati
|
||||
// Transparency (-> combined_haze)
|
||||
// ATI Bugfix -- can't store combined_haze*density_dist in a variable because the ati
|
||||
// compiler gets confused.
|
||||
temp1 = exp(-temp1 * temp2.z);
|
||||
combined_haze = exp(-combined_haze * density_dist);
|
||||
|
||||
// Compute haze glow
|
||||
temp2.x = dot(Pn, lightnorm.xyz);
|
||||
temp2.x = 1. - temp2.x;
|
||||
// temp2.x is 0 at the sun and increases away from sun
|
||||
temp2.x = max(temp2.x, .001);
|
||||
// Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
|
||||
temp2.x *= glow.x;
|
||||
// Higher glow.x gives dimmer glow (because next step is 1 / "angle")
|
||||
temp2.x = pow(temp2.x, glow.z);
|
||||
// glow.z should be negative, so we're doing a sort of (1 / "angle") function
|
||||
float haze_glow = dot(rel_pos_norm, lightnorm.xyz);
|
||||
haze_glow = 1. - haze_glow;
|
||||
// haze_glow is 0 at the sun and increases away from sun
|
||||
haze_glow = max(haze_glow, .001);
|
||||
// Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
|
||||
haze_glow *= glow.x;
|
||||
// Higher glow.x gives dimmer glow (because next step is 1 / "angle")
|
||||
haze_glow = pow(haze_glow, glow.z);
|
||||
// glow.z should be negative, so we're doing a sort of (1 / "angle") function
|
||||
|
||||
// Add "minimum anti-solar illumination"
|
||||
temp2.x += .25;
|
||||
|
||||
temp2.x *= sun_moon_glow_factor;
|
||||
// For sun, add to glow. For moon, remove glow entirely. SL-13768
|
||||
haze_glow = (sun_moon_glow_factor < 1.0) ? 0.0 : (sun_moon_glow_factor * (haze_glow + 0.25));
|
||||
|
||||
// Haze color above cloud
|
||||
vec4 color = ( blue_horizon * blue_weight * (sunlight + ambient_color)
|
||||
+ (haze_horizon * haze_weight) * (sunlight * temp2.x + ambient_color)
|
||||
);
|
||||
vec4 color = blue_horizon * blue_weight * (sunlight + ambient_color)
|
||||
+ haze_horizon * haze_weight * (sunlight * haze_glow + ambient_color);
|
||||
|
||||
// Final atmosphere additive
|
||||
color *= (1. - temp1);
|
||||
color *= (1. - combined_haze);
|
||||
|
||||
// Increase ambient when there are more clouds
|
||||
vec4 tmpAmbient = ambient_color;
|
||||
tmpAmbient += max(vec4(0), (1. - ambient_color)) * cloud_shadow * 0.5;
|
||||
// TODO 9/20: DJH what does this do? max(0,(1-ambient)) will change the color
|
||||
vec4 ambient = ambient_color + max(vec4(0), (1. - ambient_color)) * cloud_shadow * 0.5;
|
||||
|
||||
// Dim sunlight by cloud shadow percentage
|
||||
sunlight *= max(0.0, (1. - cloud_shadow));
|
||||
|
||||
// Haze color below cloud
|
||||
vec4 additiveColorBelowCloud = (blue_horizon * blue_weight * (sunlight + tmpAmbient)
|
||||
+ (haze_horizon * haze_weight) * (sunlight * temp2.x + tmpAmbient)
|
||||
);
|
||||
vec4 add_below_cloud = blue_horizon * blue_weight * (sunlight + ambient)
|
||||
+ haze_horizon * haze_weight * (sunlight * haze_glow + ambient);
|
||||
|
||||
|
||||
|
||||
// Attenuate cloud color by atmosphere
|
||||
temp1 = sqrt(temp1); //less atmos opacity (more transparency) below clouds
|
||||
combined_haze = sqrt(combined_haze); // less atmos opacity (more transparency) below clouds
|
||||
|
||||
// At horizon, blend high altitude sky color towards the darker color below the clouds
|
||||
color += (additiveColorBelowCloud - color) * (1. - sqrt(temp1));
|
||||
|
||||
float optic_d = dot(Pn, lightnorm.xyz);
|
||||
|
||||
vec3 halo_22 = halo22(optic_d);
|
||||
color += (add_below_cloud - color) * (1. - sqrt(combined_haze));
|
||||
|
||||
float optic_d = dot(rel_pos_norm, lightnorm.xyz);
|
||||
vec3 halo_22 = halo22(optic_d);
|
||||
color.rgb += rainbow(optic_d);
|
||||
|
||||
color.rgb += halo_22;
|
||||
|
||||
color.rgb *= 2.;
|
||||
color.rgb = scaleSoftClip(color.rgb);
|
||||
|
||||
/// Gamma correct for WL (soft clip effect).
|
||||
// Gamma correct for WL (soft clip effect).
|
||||
frag_data[0] = vec4(color.rgb, 1.0);
|
||||
frag_data[1] = vec4(0.0,0.0,0.0,0.0);
|
||||
frag_data[2] = vec4(0.0,0.0,0.0,1.0); //1.0 in norm.w masks off fog
|
||||
frag_data[1] = vec4(0.0, 0.0, 0.0, 0.0);
|
||||
frag_data[2] = vec4(0.0, 0.0, 0.0, 1.0); // 1.0 in norm.w masks off fog
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,24 +1,24 @@
|
|||
/**
|
||||
/**
|
||||
* @file class2/deferred/softenLightF.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2007&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2007, 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$
|
||||
*/
|
||||
|
|
@ -39,7 +39,7 @@ uniform sampler2DRect specularRect;
|
|||
uniform sampler2DRect normalMap;
|
||||
uniform sampler2DRect lightMap;
|
||||
uniform sampler2DRect depthMap;
|
||||
uniform samplerCube environmentMap;
|
||||
uniform samplerCube environmentMap;
|
||||
uniform sampler2D lightFunc;
|
||||
|
||||
uniform float blur_size;
|
||||
|
|
@ -50,7 +50,7 @@ uniform mat3 env_mat;
|
|||
|
||||
uniform vec3 sun_dir;
|
||||
uniform vec3 moon_dir;
|
||||
uniform int sun_up_factor;
|
||||
uniform int sun_up_factor;
|
||||
VARYING vec2 vary_fragcoord;
|
||||
|
||||
uniform mat4 inv_proj;
|
||||
|
|
@ -61,10 +61,10 @@ vec4 getPositionWithDepth(vec2 pos_screen, float depth);
|
|||
|
||||
void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao);
|
||||
float getAmbientClamp();
|
||||
vec3 atmosFragLighting(vec3 l, vec3 additive, vec3 atten);
|
||||
vec3 scaleSoftClipFrag(vec3 l);
|
||||
vec3 fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten);
|
||||
vec3 fullbrightScaleSoftClip(vec3 light);
|
||||
vec3 atmosFragLighting(vec3 l, vec3 additive, vec3 atten);
|
||||
vec3 scaleSoftClipFrag(vec3 l);
|
||||
vec3 fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten);
|
||||
vec3 fullbrightScaleSoftClip(vec3 light);
|
||||
|
||||
vec3 linear_to_srgb(vec3 c);
|
||||
vec3 srgb_to_linear(vec3 c);
|
||||
|
|
@ -73,128 +73,85 @@ vec3 srgb_to_linear(vec3 c);
|
|||
vec4 applyWaterFogView(vec3 pos, vec4 color);
|
||||
#endif
|
||||
|
||||
void main()
|
||||
void main()
|
||||
{
|
||||
vec2 tc = vary_fragcoord.xy;
|
||||
float depth = texture2DRect(depthMap, tc.xy).r;
|
||||
vec4 pos = getPositionWithDepth(tc, depth);
|
||||
vec4 norm = texture2DRect(normalMap, tc);
|
||||
vec2 tc = vary_fragcoord.xy;
|
||||
float depth = texture2DRect(depthMap, tc.xy).r;
|
||||
vec4 pos = getPositionWithDepth(tc, depth);
|
||||
vec4 norm = texture2DRect(normalMap, tc);
|
||||
float envIntensity = norm.z;
|
||||
norm.xyz = getNorm(tc);
|
||||
|
||||
vec3 light_dir = (sun_up_factor == 1) ? sun_dir : moon_dir;
|
||||
float da = clamp(dot(norm.xyz, light_dir.xyz), 0.0, 1.0);
|
||||
float light_gamma = 1.0/1.3;
|
||||
da = pow(da, light_gamma);
|
||||
|
||||
norm.xyz = getNorm(tc);
|
||||
|
||||
vec3 light_dir = (sun_up_factor == 1) ? sun_dir : moon_dir;
|
||||
float da = clamp(dot(norm.xyz, light_dir.xyz), 0.0, 1.0);
|
||||
float light_gamma = 1.0 / 1.3;
|
||||
da = pow(da, light_gamma);
|
||||
|
||||
vec4 diffuse = texture2DRect(diffuseRect, tc);
|
||||
|
||||
vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy);
|
||||
vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy);
|
||||
|
||||
vec2 scol_ambocc = texture2DRect(lightMap, vary_fragcoord.xy).rg;
|
||||
scol_ambocc = pow(scol_ambocc, vec2(light_gamma));
|
||||
scol_ambocc = pow(scol_ambocc, vec2(light_gamma));
|
||||
float scol = max(scol_ambocc.r, diffuse.a);
|
||||
float ambocc = scol_ambocc.g;
|
||||
|
||||
float scol = max(scol_ambocc.r, diffuse.a);
|
||||
|
||||
float ambocc = scol_ambocc.g;
|
||||
|
||||
vec3 color = vec3(0);
|
||||
vec3 color = vec3(0);
|
||||
float bloom = 0.0;
|
||||
|
||||
vec3 sunlit;
|
||||
vec3 amblit;
|
||||
vec3 additive;
|
||||
vec3 atten;
|
||||
calcAtmosphericVars(pos.xyz, light_dir, ambocc, sunlit, amblit, additive, atten, true);
|
||||
|
||||
color.rgb = amblit;
|
||||
|
||||
float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0);
|
||||
ambient *= 0.5;
|
||||
ambient *= ambient;
|
||||
ambient = (1.0 - ambient);
|
||||
color.rgb *= ambient;
|
||||
|
||||
vec3 sun_contrib = min(da, scol) * sunlit;
|
||||
color.rgb += sun_contrib;
|
||||
color.rgb *= diffuse.rgb;
|
||||
|
||||
vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
|
||||
|
||||
if (spec.a > 0.0) // specular reflection
|
||||
{
|
||||
vec3 sunlit;
|
||||
vec3 amblit;
|
||||
vec3 additive;
|
||||
vec3 atten;
|
||||
|
||||
calcAtmosphericVars(pos.xyz, light_dir, ambocc, sunlit, amblit, additive, atten, true);
|
||||
|
||||
color.rgb = amblit;
|
||||
|
||||
float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0);
|
||||
ambient *= 0.5;
|
||||
ambient *= ambient;
|
||||
ambient = (1.0 - ambient);
|
||||
|
||||
color.rgb *= ambient;
|
||||
|
||||
vec3 sun_contrib = min(da, scol) * sunlit;
|
||||
|
||||
color.rgb += sun_contrib;
|
||||
|
||||
color.rgb *= diffuse.rgb;
|
||||
|
||||
vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
|
||||
|
||||
if (spec.a > 0.0) // specular reflection
|
||||
{
|
||||
|
||||
#if 1 //EEP
|
||||
vec3 npos = -normalize(pos.xyz);
|
||||
|
||||
//vec3 ref = dot(pos+lv, norm);
|
||||
vec3 h = normalize(light_dir.xyz+npos);
|
||||
float nh = dot(norm.xyz, h);
|
||||
float nv = dot(norm.xyz, npos);
|
||||
float vh = dot(npos, h);
|
||||
float sa = nh;
|
||||
float fres = pow(1 - dot(h, npos), 5)*0.4+0.5;
|
||||
|
||||
float gtdenom = 2 * nh;
|
||||
float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh));
|
||||
|
||||
if (nh > 0.0)
|
||||
{
|
||||
float scontrib = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da);
|
||||
vec3 sp = sun_contrib*scontrib / 6.0;
|
||||
sp = clamp(sp, vec3(0), vec3(1));
|
||||
bloom += dot(sp, sp) / 4.0;
|
||||
color += sp * spec.rgb;
|
||||
}
|
||||
#else //PRODUCTION
|
||||
float sa = dot(refnormpersp, light_dir.xyz);
|
||||
vec3 dumbshiny = sunlit*(texture2D(lightFunc, vec2(sa, spec.a)).r);
|
||||
|
||||
// add the two types of shiny together
|
||||
vec3 spec_contrib = dumbshiny * spec.rgb;
|
||||
bloom = dot(spec_contrib, spec_contrib) / 6;
|
||||
color.rgb += spec_contrib;
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
color.rgb = mix(color.rgb, diffuse.rgb, diffuse.a);
|
||||
|
||||
if (envIntensity > 0.0)
|
||||
{ //add environmentmap
|
||||
vec3 env_vec = env_mat * refnormpersp;
|
||||
vec3 reflected_color = textureCube(environmentMap, env_vec).rgb;
|
||||
color = mix(color.rgb, reflected_color, envIntensity);
|
||||
}
|
||||
|
||||
if (norm.w < 0.5)
|
||||
{
|
||||
color = mix(atmosFragLighting(color, additive, atten), fullbrightAtmosTransportFrag(color, additive, atten), diffuse.a);
|
||||
color = mix(scaleSoftClipFrag(color), fullbrightScaleSoftClip(color), diffuse.a);
|
||||
}
|
||||
|
||||
#ifdef WATER_FOG
|
||||
vec4 fogged = applyWaterFogView(pos.xyz,vec4(color, bloom));
|
||||
color = fogged.rgb;
|
||||
bloom = fogged.a;
|
||||
#endif
|
||||
float sa = dot(refnormpersp, light_dir.xyz);
|
||||
vec3 dumbshiny = sunlit * scol * (texture2D(lightFunc, vec2(sa, spec.a)).r);
|
||||
|
||||
// add the two types of shiny together
|
||||
vec3 spec_contrib = dumbshiny * spec.rgb;
|
||||
bloom = dot(spec_contrib, spec_contrib) / 6;
|
||||
color.rgb += spec_contrib;
|
||||
}
|
||||
|
||||
// linear debuggables
|
||||
//color.rgb = vec3(final_da);
|
||||
//color.rgb = vec3(ambient);
|
||||
//color.rgb = vec3(scol);
|
||||
//color.rgb = diffuse_srgb.rgb;
|
||||
color.rgb = mix(color.rgb, diffuse.rgb, diffuse.a);
|
||||
|
||||
if (envIntensity > 0.0)
|
||||
{ // add environmentmap
|
||||
vec3 env_vec = env_mat * refnormpersp;
|
||||
vec3 reflected_color = textureCube(environmentMap, env_vec).rgb;
|
||||
color = mix(color.rgb, reflected_color, envIntensity);
|
||||
}
|
||||
|
||||
if (norm.w < 0.5)
|
||||
{
|
||||
color = mix(atmosFragLighting(color, additive, atten), fullbrightAtmosTransportFrag(color, additive, atten), diffuse.a);
|
||||
color = mix(scaleSoftClipFrag(color), fullbrightScaleSoftClip(color), diffuse.a);
|
||||
}
|
||||
|
||||
#ifdef WATER_FOG
|
||||
vec4 fogged = applyWaterFogView(pos.xyz, vec4(color, bloom));
|
||||
color = fogged.rgb;
|
||||
bloom = fogged.a;
|
||||
#endif
|
||||
|
||||
// convert to linear as fullscreen lights need to sum in linear colorspace
|
||||
// and will be gamma (re)corrected downstream...
|
||||
|
||||
frag_color.rgb = srgb_to_linear(color.rgb);
|
||||
frag_color.a = bloom;
|
||||
frag_color.a = bloom;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,24 +1,24 @@
|
|||
/**
|
||||
/**
|
||||
* @file class2\wl\cloudsV.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2005, 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$
|
||||
*/
|
||||
|
|
@ -33,25 +33,26 @@ ATTRIBUTE vec2 texcoord0;
|
|||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// Output parameters
|
||||
VARYING vec4 vary_CloudColorSun;
|
||||
VARYING vec4 vary_CloudColorAmbient;
|
||||
VARYING vec4 vary_CloudColorSun;
|
||||
VARYING vec4 vary_CloudColorAmbient;
|
||||
VARYING float vary_CloudDensity;
|
||||
VARYING vec2 vary_texcoord0;
|
||||
VARYING vec2 vary_texcoord1;
|
||||
VARYING vec2 vary_texcoord2;
|
||||
VARYING vec2 vary_texcoord3;
|
||||
|
||||
VARYING vec2 vary_texcoord0;
|
||||
VARYING vec2 vary_texcoord1;
|
||||
VARYING vec2 vary_texcoord2;
|
||||
VARYING vec2 vary_texcoord3;
|
||||
VARYING float altitude_blend_factor;
|
||||
|
||||
// Inputs
|
||||
uniform vec3 camPosLocal;
|
||||
|
||||
uniform vec4 lightnorm;
|
||||
uniform vec4 sunlight_color;
|
||||
uniform vec4 moonlight_color;
|
||||
uniform int sun_up_factor;
|
||||
uniform vec4 ambient_color;
|
||||
uniform vec4 blue_horizon;
|
||||
uniform vec4 blue_density;
|
||||
uniform vec4 lightnorm;
|
||||
uniform vec4 sunlight_color;
|
||||
uniform vec4 moonlight_color;
|
||||
uniform int sun_up_factor;
|
||||
uniform vec4 ambient_color;
|
||||
uniform vec4 blue_horizon;
|
||||
uniform vec4 blue_density;
|
||||
uniform float haze_horizon;
|
||||
uniform float haze_density;
|
||||
|
||||
|
|
@ -59,141 +60,133 @@ uniform float cloud_shadow;
|
|||
uniform float density_multiplier;
|
||||
uniform float max_y;
|
||||
|
||||
uniform vec4 glow;
|
||||
uniform vec4 glow;
|
||||
uniform float sun_moon_glow_factor;
|
||||
|
||||
uniform vec4 cloud_color;
|
||||
|
||||
uniform float cloud_scale;
|
||||
|
||||
// NOTE: Keep these in sync!
|
||||
// indra\newview\app_settings\shaders\class1\deferred\skyV.glsl
|
||||
// indra\newview\app_settings\shaders\class1\deferred\cloudsV.glsl
|
||||
// indra\newview\app-settings\shaders\class2\windlight\cloudsV.glsl
|
||||
// indra\newview\lllegacyatmospherics.cpp
|
||||
// indra\newview\llsettingsvo.cpp
|
||||
void main()
|
||||
{
|
||||
// World / view / projection
|
||||
gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
|
||||
|
||||
// World / view / projection
|
||||
gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);
|
||||
// Texture coords
|
||||
// SL-13084 EEP added support for custom cloud textures -- flip them horizontally to match the preview of Clouds > Cloud Scroll
|
||||
vary_texcoord0 = vec2(-texcoord0.x, texcoord0.y); // See: LLSettingsVOSky::applySpecial
|
||||
|
||||
vary_texcoord0 = texcoord0;
|
||||
vary_texcoord0.xy -= 0.5;
|
||||
vary_texcoord0.xy /= cloud_scale;
|
||||
vary_texcoord0.xy += 0.5;
|
||||
|
||||
// Get relative position
|
||||
vec3 P = position.xyz - camPosLocal.xyz + vec3(0,50,0);
|
||||
vary_texcoord1 = vary_texcoord0;
|
||||
vary_texcoord1.x += lightnorm.x * 0.0125;
|
||||
vary_texcoord1.y += lightnorm.z * 0.0125;
|
||||
|
||||
vary_texcoord2 = vary_texcoord0 * 16.;
|
||||
vary_texcoord3 = vary_texcoord1 * 16.;
|
||||
|
||||
// Get relative position
|
||||
vec3 rel_pos = position.xyz - camPosLocal.xyz + vec3(0, 50, 0);
|
||||
|
||||
// fade clouds beyond a certain point so the bottom of the sky dome doesn't look silly at high altitude
|
||||
altitude_blend_factor = clamp((P.y + 512.0) / max_y, 0.0, 1.0);
|
||||
altitude_blend_factor = clamp((rel_pos.y + 512.0) / max_y, 0.0, 1.0);
|
||||
|
||||
// Set altitude
|
||||
if (P.y > 0.)
|
||||
{
|
||||
P *= (max_y / P.y);
|
||||
}
|
||||
else
|
||||
{
|
||||
P *= (-32000. / P.y);
|
||||
}
|
||||
// Adj position vector to clamp altitude
|
||||
if (rel_pos.y > 0.)
|
||||
{
|
||||
rel_pos *= (max_y / rel_pos.y);
|
||||
}
|
||||
if (rel_pos.y < 0.)
|
||||
{
|
||||
rel_pos *= (-32000. / rel_pos.y);
|
||||
}
|
||||
|
||||
// Can normalize then
|
||||
vec3 Pn = normalize(P);
|
||||
float Plen = length(P);
|
||||
// Can normalize then
|
||||
vec3 rel_pos_norm = normalize(rel_pos);
|
||||
float rel_pos_len = length(rel_pos);
|
||||
|
||||
// Initialize temp variables
|
||||
vec4 temp1 = vec4(0.);
|
||||
vec4 temp2 = vec4(0.);
|
||||
vec4 blue_weight;
|
||||
vec4 haze_weight;
|
||||
//vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color;
|
||||
vec4 sunlight = sunlight_color;
|
||||
vec4 light_atten;
|
||||
// Initialize temp variables
|
||||
vec4 sunlight = sunlight_color;
|
||||
vec4 light_atten;
|
||||
|
||||
float dens_mul = density_multiplier;
|
||||
// Sunlight attenuation effect (hue and brightness) due to atmosphere
|
||||
// this is used later for sunlight modulation at various altitudes
|
||||
light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);
|
||||
|
||||
// Sunlight attenuation effect (hue and brightness) due to atmosphere
|
||||
// this is used later for sunlight modulation at various altitudes
|
||||
light_atten = (blue_density + vec4(haze_density * 0.25)) * (dens_mul * max_y);
|
||||
// Calculate relative weights
|
||||
vec4 combined_haze = abs(blue_density) + vec4(abs(haze_density));
|
||||
vec4 blue_weight = blue_density / combined_haze;
|
||||
vec4 haze_weight = haze_density / combined_haze;
|
||||
|
||||
// Calculate relative weights
|
||||
temp1 = abs(blue_density) + vec4(abs(haze_density));
|
||||
blue_weight = blue_density / temp1;
|
||||
haze_weight = haze_density / temp1;
|
||||
// Compute sunlight from rel_pos & lightnorm (for long rays like sky)
|
||||
float off_axis = 1.0 / max(1e-6, max(0., rel_pos_norm.y) + lightnorm.y);
|
||||
sunlight *= exp(-light_atten * off_axis);
|
||||
|
||||
// Compute sunlight from P & lightnorm (for long rays like sky)
|
||||
temp2.y = max(0., max(0., Pn.y) * 1.0 + lightnorm.y );
|
||||
temp2.y = 1. / temp2.y;
|
||||
sunlight *= exp( - light_atten * temp2.y);
|
||||
// Distance
|
||||
float density_dist = rel_pos_len * density_multiplier;
|
||||
|
||||
// Distance
|
||||
temp2.z = Plen * dens_mul;
|
||||
// Transparency (-> combined_haze)
|
||||
// ATI Bugfix -- can't store combined_haze*density_dist in a variable because the ati
|
||||
// compiler gets confused.
|
||||
combined_haze = exp(-combined_haze * density_dist);
|
||||
|
||||
// Transparency (-> temp1)
|
||||
// ATI Bugfix -- can't store temp1*temp2.z in a variable because the ati
|
||||
// compiler gets confused.
|
||||
temp1 = exp(-temp1 * temp2.z);
|
||||
// Compute haze glow
|
||||
float haze_glow = 1.0 - dot(rel_pos_norm, lightnorm.xyz);
|
||||
// haze_glow is 0 at the sun and increases away from sun
|
||||
haze_glow = max(haze_glow, .001);
|
||||
// Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
|
||||
haze_glow *= glow.x;
|
||||
// Higher glow.x gives dimmer glow (because next step is 1 / "angle")
|
||||
haze_glow = pow(haze_glow, glow.z);
|
||||
// glow.z should be negative, so we're doing a sort of (1 / "angle") function
|
||||
|
||||
haze_glow *= sun_moon_glow_factor;
|
||||
|
||||
// Compute haze glow
|
||||
temp2.x = dot(Pn, lightnorm.xyz);
|
||||
temp2.x = 1. - temp2.x;
|
||||
// temp2.x is 0 at the sun and increases away from sun
|
||||
temp2.x = max(temp2.x, .001);
|
||||
// Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
|
||||
temp2.x *= glow.x;
|
||||
// Higher glow.x gives dimmer glow (because next step is 1 / "angle")
|
||||
temp2.x = pow(temp2.x, glow.z);
|
||||
// glow.z should be negative, so we're doing a sort of (1 / "angle") function
|
||||
// Add "minimum anti-solar illumination"
|
||||
// For sun, add to glow. For moon, remove glow entirely. SL-13768
|
||||
haze_glow = (sun_moon_glow_factor < 1.0) ? 0.0 : (haze_glow + 0.25);
|
||||
|
||||
temp2.x *= sun_moon_glow_factor;
|
||||
// Increase ambient when there are more clouds
|
||||
vec4 tmpAmbient = ambient_color;
|
||||
tmpAmbient += (1. - tmpAmbient) * cloud_shadow * 0.5;
|
||||
|
||||
// Add "minimum anti-solar illumination"
|
||||
temp2.x += .25;
|
||||
// Dim sunlight by cloud shadow percentage
|
||||
sunlight *= (1. - cloud_shadow);
|
||||
|
||||
// Increase ambient when there are more clouds
|
||||
vec4 tmpAmbient = ambient_color;
|
||||
tmpAmbient += (1. - tmpAmbient) * cloud_shadow * 0.5;
|
||||
// Haze color below cloud
|
||||
vec4 additiveColorBelowCloud =
|
||||
(blue_horizon * blue_weight * (sunlight + tmpAmbient) + (haze_horizon * haze_weight) * (sunlight * haze_glow + tmpAmbient));
|
||||
|
||||
// Dim sunlight by cloud shadow percentage
|
||||
sunlight *= (1. - cloud_shadow);
|
||||
// CLOUDS
|
||||
off_axis = 1.0 / max(1e-6, lightnorm.y * 2.);
|
||||
sunlight *= exp(-light_atten * off_axis);
|
||||
|
||||
// Haze color below cloud
|
||||
vec4 additiveColorBelowCloud = ( blue_horizon * blue_weight * (sunlight + tmpAmbient)
|
||||
+ (haze_horizon * haze_weight) * (sunlight * temp2.x + tmpAmbient)
|
||||
);
|
||||
// Cloud color out
|
||||
vary_CloudColorSun = (sunlight * haze_glow) * cloud_color;
|
||||
vary_CloudColorAmbient = tmpAmbient * cloud_color;
|
||||
|
||||
// CLOUDS
|
||||
temp2.y = max(0., lightnorm.y * 2.);
|
||||
temp2.y = 1. / temp2.y;
|
||||
sunlight *= exp( - light_atten * temp2.y);
|
||||
// Attenuate cloud color by atmosphere
|
||||
combined_haze = sqrt(combined_haze); // less atmos opacity (more transparency) below clouds
|
||||
vary_CloudColorSun *= combined_haze;
|
||||
vary_CloudColorAmbient *= combined_haze;
|
||||
vec4 oHazeColorBelowCloud = additiveColorBelowCloud * (1. - combined_haze);
|
||||
|
||||
// Cloud color out
|
||||
vary_CloudColorSun = (sunlight * temp2.x) * cloud_color;
|
||||
vary_CloudColorAmbient = tmpAmbient * cloud_color;
|
||||
|
||||
// Attenuate cloud color by atmosphere
|
||||
temp1 = sqrt(temp1); //less atmos opacity (more transparency) below clouds
|
||||
vary_CloudColorSun *= temp1;
|
||||
vary_CloudColorAmbient *= temp1;
|
||||
vec4 oHazeColorBelowCloud = additiveColorBelowCloud * (1. - temp1);
|
||||
// Make a nice cloud density based on the cloud_shadow value that was passed in.
|
||||
vary_CloudDensity = 2. * (cloud_shadow - 0.25);
|
||||
|
||||
// Make a nice cloud density based on the cloud_shadow value that was passed in.
|
||||
vary_CloudDensity = 2. * (cloud_shadow - 0.25);
|
||||
// Combine these to minimize register use
|
||||
vary_CloudColorAmbient += oHazeColorBelowCloud;
|
||||
|
||||
// needs this to compile on mac
|
||||
// vary_AtmosAttenuation = vec3(0.0,0.0,0.0);
|
||||
|
||||
// Texture coords
|
||||
vary_texcoord0 = texcoord0;
|
||||
vary_texcoord0.xy -= 0.5;
|
||||
vary_texcoord0.xy /= cloud_scale;
|
||||
vary_texcoord0.xy += 0.5;
|
||||
|
||||
vary_texcoord1 = vary_texcoord0;
|
||||
vary_texcoord1.x += lightnorm.x * 0.0125;
|
||||
vary_texcoord1.y += lightnorm.z * 0.0125;
|
||||
|
||||
vary_texcoord2 = vary_texcoord0 * 16.;
|
||||
vary_texcoord3 = vary_texcoord1 * 16.;
|
||||
|
||||
// Combine these to minimize register use
|
||||
vary_CloudColorAmbient += oHazeColorBelowCloud;
|
||||
|
||||
// needs this to compile on mac
|
||||
//vary_AtmosAttenuation = vec3(0.0,0.0,0.0);
|
||||
|
||||
// END CLOUDS
|
||||
// END CLOUDS
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,28 +1,28 @@
|
|||
/**
|
||||
/**
|
||||
* @file class2\wl\skyV.glsl
|
||||
*
|
||||
* $LicenseInfo:firstyear=2005&license=viewerlgpl$
|
||||
* Second Life Viewer Source Code
|
||||
* Copyright (C) 2005, 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$
|
||||
*/
|
||||
|
||||
|
||||
uniform mat4 modelview_projection_matrix;
|
||||
|
||||
ATTRIBUTE vec3 position;
|
||||
|
|
@ -37,13 +37,13 @@ VARYING vec4 vary_HazeColor;
|
|||
// Inputs
|
||||
uniform vec3 camPosLocal;
|
||||
|
||||
uniform vec4 lightnorm;
|
||||
uniform vec4 sunlight_color;
|
||||
uniform vec4 moonlight_color;
|
||||
uniform int sun_up_factor;
|
||||
uniform vec4 ambient_color;
|
||||
uniform vec4 blue_horizon;
|
||||
uniform vec4 blue_density;
|
||||
uniform vec4 lightnorm;
|
||||
uniform vec4 sunlight_color;
|
||||
uniform vec4 moonlight_color;
|
||||
uniform int sun_up_factor;
|
||||
uniform vec4 ambient_color;
|
||||
uniform vec4 blue_horizon;
|
||||
uniform vec4 blue_density;
|
||||
uniform float haze_horizon;
|
||||
uniform float haze_density;
|
||||
|
||||
|
|
@ -52,110 +52,98 @@ uniform float density_multiplier;
|
|||
uniform float distance_multiplier;
|
||||
uniform float max_y;
|
||||
|
||||
uniform vec4 glow;
|
||||
uniform vec4 glow;
|
||||
uniform float sun_moon_glow_factor;
|
||||
|
||||
uniform vec4 cloud_color;
|
||||
|
||||
void main()
|
||||
{
|
||||
|
||||
// World / view / projection
|
||||
// World / view / projection
|
||||
vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0);
|
||||
|
||||
gl_Position = pos;
|
||||
|
||||
// Get relative position
|
||||
vec3 P = position.xyz - camPosLocal.xyz + vec3(0,50,0);
|
||||
gl_Position = pos;
|
||||
|
||||
// Set altitude
|
||||
if (P.y > 0.)
|
||||
{
|
||||
P *= (max_y / P.y);
|
||||
}
|
||||
else
|
||||
{
|
||||
P *= (-32000. / P.y);
|
||||
}
|
||||
// Get relative position
|
||||
vec3 rel_pos = position.xyz - camPosLocal.xyz + vec3(0, 50, 0);
|
||||
|
||||
// Can normalize then
|
||||
vec3 Pn = normalize(P);
|
||||
// Adj position vector to clamp altitude
|
||||
if (rel_pos.y > 0.)
|
||||
{
|
||||
rel_pos *= (max_y / rel_pos.y);
|
||||
}
|
||||
if (rel_pos.y < 0.)
|
||||
{
|
||||
rel_pos *= (-32000. / rel_pos.y);
|
||||
}
|
||||
|
||||
float Plen = length(P);
|
||||
// Can normalize then
|
||||
vec3 rel_pos_norm = normalize(rel_pos);
|
||||
|
||||
// Initialize temp variables
|
||||
vec4 temp1 = vec4(0.);
|
||||
vec4 temp2 = vec4(0.);
|
||||
vec4 blue_weight;
|
||||
vec4 haze_weight;
|
||||
vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color;
|
||||
vec4 light_atten;
|
||||
float rel_pos_len = length(rel_pos);
|
||||
|
||||
float dens_mul = density_multiplier;
|
||||
// Initialize temp variables
|
||||
vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color;
|
||||
vec4 light_atten;
|
||||
|
||||
// Sunlight attenuation effect (hue and brightness) due to atmosphere
|
||||
// this is used later for sunlight modulation at various altitudes
|
||||
light_atten = (blue_density + vec4(haze_density * 0.25)) * (dens_mul * max_y);
|
||||
// Sunlight attenuation effect (hue and brightness) due to atmosphere
|
||||
// this is used later for sunlight modulation at various altitudes
|
||||
light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y);
|
||||
|
||||
// Calculate relative weights
|
||||
temp1 = abs(blue_density) + vec4(abs(haze_density));
|
||||
blue_weight = blue_density / temp1;
|
||||
haze_weight = haze_density / temp1;
|
||||
// Calculate relative weights
|
||||
vec4 combined_haze = abs(blue_density) + vec4(abs(haze_density));
|
||||
vec4 blue_weight = blue_density / combined_haze;
|
||||
vec4 haze_weight = haze_density / combined_haze;
|
||||
|
||||
// Compute sunlight from P & lightnorm (for long rays like sky)
|
||||
temp2.y = max(0., max(0., Pn.y) * 1.0 + lightnorm.y );
|
||||
temp2.y = 1. / temp2.y;
|
||||
sunlight *= exp( - light_atten * temp2.y);
|
||||
// Compute sunlight from rel_pos & lightnorm (for long rays like sky)
|
||||
float off_axis = 1.0 / max(1e-6, max(0., rel_pos_norm.y) + lightnorm.y);
|
||||
sunlight *= exp(-light_atten * off_axis);
|
||||
|
||||
// Distance
|
||||
temp2.z = Plen * dens_mul;
|
||||
// Distance
|
||||
float density_dist = rel_pos_len * density_multiplier;
|
||||
|
||||
// Transparency (-> temp1)
|
||||
// ATI Bugfix -- can't store temp1*temp2.z in a variable because the ati
|
||||
// Transparency (-> combined_haze)
|
||||
// ATI Bugfix -- can't store combined_haze*density_dist in a variable because the ati
|
||||
// compiler gets confused.
|
||||
temp1 = exp(-temp1 * temp2.z);
|
||||
combined_haze = exp(-combined_haze * density_dist);
|
||||
|
||||
// Compute haze glow
|
||||
temp2.x = dot(Pn, lightnorm.xyz);
|
||||
temp2.x = 1. - temp2.x;
|
||||
// temp2.x is 0 at the sun and increases away from sun
|
||||
temp2.x = max(temp2.x, .001);
|
||||
// Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
|
||||
temp2.x *= glow.x;
|
||||
// Higher glow.x gives dimmer glow (because next step is 1 / "angle")
|
||||
temp2.x = pow(temp2.x, glow.z);
|
||||
// glow.z should be negative, so we're doing a sort of (1 / "angle") function
|
||||
// Compute haze glow
|
||||
float haze_glow = 1.0 - dot(rel_pos_norm, lightnorm.xyz);
|
||||
// haze_glow is 0 at the sun and increases away from sun
|
||||
haze_glow = max(haze_glow, .001);
|
||||
// Set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot)
|
||||
haze_glow *= glow.x;
|
||||
// Higher glow.x gives dimmer glow (because next step is 1 / "angle")
|
||||
haze_glow = pow(haze_glow, glow.z);
|
||||
// glow.z should be negative, so we're doing a sort of (1 / "angle") function
|
||||
|
||||
// Add "minimum anti-solar illumination"
|
||||
temp2.x += .25;
|
||||
|
||||
vec4 color = ( blue_horizon * blue_weight * (sunlight + ambient_color)
|
||||
+ (haze_horizon * haze_weight) * (sunlight * temp2.x + ambient_color)
|
||||
);
|
||||
// Add "minimum anti-solar illumination"
|
||||
// For sun, add to glow. For moon, remove glow entirely. SL-13768
|
||||
haze_glow = (sun_moon_glow_factor < 1.0) ? 0.0 : (haze_glow + 0.25);
|
||||
|
||||
vec4 color =
|
||||
(blue_horizon * blue_weight * (sunlight + ambient_color) + (haze_horizon * haze_weight) * (sunlight * haze_glow + ambient_color));
|
||||
|
||||
// Final atmosphere additive
|
||||
color *= (1. - temp1);
|
||||
color *= (1. - combined_haze);
|
||||
|
||||
// Increase ambient when there are more clouds
|
||||
vec4 tmpAmbient = ambient_color;
|
||||
tmpAmbient += max(vec4(0), (1. - ambient_color)) * cloud_shadow * 0.5;
|
||||
// Increase ambient when there are more clouds
|
||||
vec4 tmpAmbient = ambient_color;
|
||||
tmpAmbient += max(vec4(0), (1. - ambient_color)) * cloud_shadow * 0.5;
|
||||
|
||||
// Dim sunlight by cloud shadow percentage
|
||||
sunlight *= max(0.0, (1. - cloud_shadow));
|
||||
// Dim sunlight by cloud shadow percentage
|
||||
sunlight *= max(0.0, (1. - cloud_shadow));
|
||||
|
||||
// Haze color below cloud
|
||||
vec4 additiveColorBelowCloud = ( blue_horizon * blue_weight * (sunlight + tmpAmbient)
|
||||
+ (haze_horizon * haze_weight) * (sunlight * temp2.x + tmpAmbient)
|
||||
);
|
||||
// Haze color below cloud
|
||||
vec4 additiveColorBelowCloud =
|
||||
(blue_horizon * blue_weight * (sunlight + tmpAmbient) + (haze_horizon * haze_weight) * (sunlight * haze_glow + tmpAmbient));
|
||||
|
||||
// Attenuate cloud color by atmosphere
|
||||
temp1 = sqrt(temp1); //less atmos opacity (more transparency) below clouds
|
||||
// Attenuate cloud color by atmosphere
|
||||
combined_haze = sqrt(combined_haze); // less atmos opacity (more transparency) below clouds
|
||||
|
||||
// At horizon, blend high altitude sky color towards the darker color below the clouds
|
||||
color += (additiveColorBelowCloud - color) * (1. - sqrt(temp1));
|
||||
// At horizon, blend high altitude sky color towards the darker color below the clouds
|
||||
color += (additiveColorBelowCloud - color) * (1. - sqrt(combined_haze));
|
||||
|
||||
// Haze color above cloud
|
||||
vary_HazeColor = color;
|
||||
vary_HazeColor = color;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -867,9 +867,7 @@ void LLAgent::setRegion(LLViewerRegion *regionp)
|
|||
if (mRegionp != regionp)
|
||||
{
|
||||
|
||||
std::string ip = regionp->getHost().getString();
|
||||
LL_INFOS("AgentLocation") << "Moving agent into region: " << regionp->getName()
|
||||
<< " located at " << ip << LL_ENDL;
|
||||
LL_INFOS("AgentLocation") << "Moving agent into region: " << regionp->getName() << LL_ENDL;
|
||||
if (mRegionp)
|
||||
{
|
||||
// We've changed regions, we're now going to change our agent coordinate frame.
|
||||
|
|
|
|||
|
|
@ -354,6 +354,18 @@ void LLAgentCamera::resetView(BOOL reset_camera, BOOL change_camera)
|
|||
resetPanDiff();
|
||||
resetOrbitDiff();
|
||||
mHUDTargetZoom = 1.f;
|
||||
|
||||
if (LLSelectMgr::getInstance()->mAllowSelectAvatar)
|
||||
{
|
||||
// resetting camera also resets position overrides in debug mode 'AllowSelectAvatar'
|
||||
LLObjectSelectionHandle selected_handle = LLSelectMgr::getInstance()->getSelection();
|
||||
if (selected_handle->getObjectCount() == 1
|
||||
&& selected_handle->getFirstObject() != NULL
|
||||
&& selected_handle->getFirstObject()->isAvatar())
|
||||
{
|
||||
LLSelectMgr::getInstance()->resetObjectOverrides(selected_handle);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Allow camera to be moved somewhere other than behind avatar.
|
||||
|
|
|
|||
|
|
@ -522,20 +522,20 @@ void LLAppCoreHttp::refreshSettings(bool initial)
|
|||
LLCore::HttpStatus LLAppCoreHttp::sslVerify(const std::string &url,
|
||||
const LLCore::HttpHandler::ptr_t &handler, void *appdata)
|
||||
{
|
||||
X509_STORE_CTX *ctx = static_cast<X509_STORE_CTX *>(appdata);
|
||||
LLCore::HttpStatus result;
|
||||
LLPointer<LLCertificateStore> store = gSecAPIHandler->getCertificateStore("");
|
||||
LLPointer<LLCertificateChain> chain = gSecAPIHandler->getCertificateChain(ctx);
|
||||
LLSD validation_params = LLSD::emptyMap();
|
||||
LLURI uri(url);
|
||||
LLCore::HttpStatus result;
|
||||
try
|
||||
{
|
||||
X509_STORE_CTX *ctx = static_cast<X509_STORE_CTX *>(appdata);
|
||||
LLPointer<LLCertificateStore> store = gSecAPIHandler->getCertificateStore("");
|
||||
LLPointer<LLCertificateChain> chain = gSecAPIHandler->getCertificateChain(ctx);
|
||||
LLSD validation_params = LLSD::emptyMap();
|
||||
LLURI uri(url);
|
||||
|
||||
validation_params[CERT_HOSTNAME] = uri.hostName();
|
||||
validation_params[CERT_HOSTNAME] = uri.hostName();
|
||||
|
||||
// *TODO: In the case of an exception while validating the cert, we need a way
|
||||
// to pass the offending(?) cert back out. *Rider*
|
||||
// *TODO: In the case of an exception while validating the cert, we need a way
|
||||
// to pass the offending(?) cert back out. *Rider*
|
||||
|
||||
try
|
||||
{
|
||||
// don't validate hostname. Let libcurl do it instead. That way, it'll handle redirects
|
||||
store->validate(VALIDATION_POLICY_SSL & (~VALIDATION_POLICY_HOSTNAME), chain, validation_params);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -294,6 +294,7 @@ struct AttachmentInfo
|
|||
std::vector<AttachmentInfo> info{
|
||||
AttachmentInfo(metadata.logFilePathname, "text/plain"),
|
||||
AttachmentInfo(metadata.userSettingsPathname, "text/xml"),
|
||||
AttachmentInfo(metadata.accountSettingsPathname, "text/xml"),
|
||||
AttachmentInfo(metadata.staticDebugPathname, "text/xml")
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -3582,6 +3582,10 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
|
|||
}
|
||||
|
||||
llcoro::suspend();
|
||||
if (LLApp::isQuitting())
|
||||
{
|
||||
return;
|
||||
}
|
||||
S32 retryCount(0);
|
||||
bool bRetry;
|
||||
do
|
||||
|
|
@ -3645,6 +3649,11 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
|
|||
|
||||
LLSD result = httpAdapter->postAndSuspend(httpRequest, url, postData);
|
||||
|
||||
if (LLApp::isQuitting())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS];
|
||||
LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults);
|
||||
|
||||
|
|
@ -3680,6 +3689,10 @@ void LLAppearanceMgr::serverAppearanceUpdateCoro(LLCoreHttpUtil::HttpCoroutineAd
|
|||
LL_WARNS("Avatar") << "Bake retry #" << retryCount << " in " << timeout << " seconds." << LL_ENDL;
|
||||
|
||||
llcoro::suspendUntilTimeout(timeout);
|
||||
if (LLApp::isQuitting())
|
||||
{
|
||||
return;
|
||||
}
|
||||
bRetry = true;
|
||||
continue;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -73,6 +73,7 @@
|
|||
#include "llviewermedia.h"
|
||||
#include "llviewerparcelaskplay.h"
|
||||
#include "llviewerparcelmedia.h"
|
||||
#include "llviewershadermgr.h"
|
||||
#include "llviewermediafocus.h"
|
||||
#include "llviewermessage.h"
|
||||
#include "llviewerobjectlist.h"
|
||||
|
|
@ -688,8 +689,7 @@ LLAppViewer::LLAppViewer()
|
|||
mPeriodicSlowFrame(LLCachedControl<bool>(gSavedSettings,"Periodic Slow Frame", FALSE)),
|
||||
mFastTimerLogThread(NULL),
|
||||
mSettingsLocationList(NULL),
|
||||
mIsFirstRun(false),
|
||||
mMinMicroSecPerFrame(0.f)
|
||||
mIsFirstRun(false)
|
||||
{
|
||||
if(NULL != sInstance)
|
||||
{
|
||||
|
|
@ -1258,10 +1258,6 @@ bool LLAppViewer::init()
|
|||
|
||||
joystick = LLViewerJoystick::getInstance();
|
||||
joystick->setNeedsReset(true);
|
||||
/*----------------------------------------------------------------------*/
|
||||
|
||||
gSavedSettings.getControl("FramePerSecondLimit")->getSignal()->connect(boost::bind(&LLAppViewer::onChangeFrameLimit, this, _2));
|
||||
onChangeFrameLimit(gSavedSettings.getLLSD("FramePerSecondLimit"));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
@ -1481,21 +1477,6 @@ bool LLAppViewer::doFrame()
|
|||
|
||||
display();
|
||||
|
||||
static U64 last_call = 0;
|
||||
if (!gTeleportDisplay || gGLManager.mIsIntel) // SL-10625...throttle early, throttle often with Intel
|
||||
{
|
||||
// Frame/draw throttling
|
||||
U64 elapsed_time = LLTimer::getTotalTime() - last_call;
|
||||
if (elapsed_time < mMinMicroSecPerFrame)
|
||||
{
|
||||
LL_RECORD_BLOCK_TIME(FTM_SLEEP);
|
||||
// llclamp for when time function gets funky
|
||||
U64 sleep_time = llclamp(mMinMicroSecPerFrame - elapsed_time, (U64)1, (U64)1e6);
|
||||
micro_sleep(sleep_time, 0);
|
||||
}
|
||||
}
|
||||
last_call = LLTimer::getTotalTime();
|
||||
|
||||
pingMainloopTimeout("Main:Snapshot");
|
||||
LLFloaterSnapshot::update(); // take snapshots
|
||||
LLFloaterOutfitSnapshot::update();
|
||||
|
|
@ -3122,8 +3103,9 @@ LLSD LLAppViewer::getViewerInfo() const
|
|||
info["POSITION"] = ll_sd_from_vector3d(pos);
|
||||
info["POSITION_LOCAL"] = ll_sd_from_vector3(gAgent.getPosAgentFromGlobal(pos));
|
||||
info["REGION"] = gAgent.getRegion()->getName();
|
||||
info["HOSTNAME"] = gAgent.getRegion()->getHost().getHostName();
|
||||
info["HOSTIP"] = gAgent.getRegion()->getHost().getString();
|
||||
|
||||
boost::regex regex("\\.(secondlife|lindenlab)\\..*");
|
||||
info["HOSTNAME"] = boost::regex_replace(gAgent.getRegion()->getHost().getHostName(), regex, "");
|
||||
info["SERVER_VERSION"] = gLastVersionChannel;
|
||||
LLSLURL slurl;
|
||||
LLAgentUI::buildSLURL(slurl);
|
||||
|
|
@ -3991,6 +3973,7 @@ static LLNotificationFunctorRegistration finish_quit_reg("ConfirmQuit", finish_q
|
|||
|
||||
void LLAppViewer::userQuit()
|
||||
{
|
||||
LL_INFOS() << "User requested quit" << LL_ENDL;
|
||||
if (gDisconnected
|
||||
|| !gViewerWindow
|
||||
|| !gViewerWindow->getProgressView()
|
||||
|
|
@ -4851,13 +4834,14 @@ void LLAppViewer::idle()
|
|||
{
|
||||
return;
|
||||
}
|
||||
|
||||
gViewerWindow->updateUI();
|
||||
|
||||
if (gTeleportDisplay)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
gViewerWindow->updateUI();
|
||||
|
||||
///////////////////////////////////////
|
||||
// Agent and camera movement
|
||||
//
|
||||
|
|
@ -5433,19 +5417,6 @@ void LLAppViewer::disconnectViewer()
|
|||
LLUrlEntryParcel::setDisconnected(gDisconnected);
|
||||
}
|
||||
|
||||
bool LLAppViewer::onChangeFrameLimit(LLSD const & evt)
|
||||
{
|
||||
if (evt.asInteger() > 0)
|
||||
{
|
||||
mMinMicroSecPerFrame = (U64)(1000000.0f / F32(evt.asInteger()));
|
||||
}
|
||||
else
|
||||
{
|
||||
mMinMicroSecPerFrame = 0;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void LLAppViewer::forceErrorLLError()
|
||||
{
|
||||
LL_ERRS() << "This is a deliberate llerror" << LL_ENDL;
|
||||
|
|
|
|||
|
|
@ -255,8 +255,6 @@ private:
|
|||
void sendLogoutRequest();
|
||||
void disconnectViewer();
|
||||
|
||||
bool onChangeFrameLimit(LLSD const & evt);
|
||||
|
||||
// *FIX: the app viewer class should be some sort of singleton, no?
|
||||
// Perhaps its child class is the singleton and this should be an abstract base.
|
||||
static LLAppViewer* sInstance;
|
||||
|
|
@ -313,10 +311,7 @@ private:
|
|||
// llcorehttp library init/shutdown helper
|
||||
LLAppCoreHttp mAppCoreHttp;
|
||||
|
||||
bool mIsFirstRun;
|
||||
U64 mMinMicroSecPerFrame; // frame throttling
|
||||
|
||||
|
||||
bool mIsFirstRun;
|
||||
};
|
||||
|
||||
// consts from viewer.h
|
||||
|
|
|
|||
|
|
@ -52,10 +52,12 @@ LLAppViewerListener::LLAppViewerListener(const LLAppViewerGetter& getter):
|
|||
|
||||
void LLAppViewerListener::requestQuit(const LLSD& event)
|
||||
{
|
||||
LL_INFOS() << "Listener requested quit" << LL_ENDL;
|
||||
mAppViewerGetter()->requestQuit();
|
||||
}
|
||||
|
||||
void LLAppViewerListener::forceQuit(const LLSD& event)
|
||||
{
|
||||
LL_INFOS() << "Listener requested force quit" << LL_ENDL;
|
||||
mAppViewerGetter()->forceQuit();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ struct CrashMetadata
|
|||
{
|
||||
std::string logFilePathname;
|
||||
std::string userSettingsPathname;
|
||||
std::string accountSettingsPathname;
|
||||
std::string staticDebugPathname;
|
||||
std::string OSInfo;
|
||||
std::string agentFullname;
|
||||
|
|
|
|||
|
|
@ -199,10 +199,11 @@ CrashMetadataSingleton::CrashMetadataSingleton()
|
|||
else
|
||||
{
|
||||
LL_INFOS() << "Metadata from '" << staticDebugPathname << "':" << LL_ENDL;
|
||||
logFilePathname = get_metadata(info, "SLLog");
|
||||
userSettingsPathname = get_metadata(info, "SettingsFilename");
|
||||
OSInfo = get_metadata(info, "OSInfo");
|
||||
agentFullname = get_metadata(info, "LoginName");
|
||||
logFilePathname = get_metadata(info, "SLLog");
|
||||
userSettingsPathname = get_metadata(info, "SettingsFilename");
|
||||
accountSettingsPathname = get_metadata(info, "PerAccountSettingsFilename");
|
||||
OSInfo = get_metadata(info, "OSInfo");
|
||||
agentFullname = get_metadata(info, "LoginName");
|
||||
// Translate underscores back to spaces
|
||||
LLStringUtil::replaceChar(agentFullname, '_', ' ');
|
||||
regionName = get_metadata(info, "CurrentRegion");
|
||||
|
|
|
|||
|
|
@ -139,6 +139,9 @@ namespace
|
|||
{
|
||||
// user name, when we have it
|
||||
sBugSplatSender->setDefaultUserName(WCSTR(gAgentAvatarp->getFullname()));
|
||||
|
||||
sBugSplatSender->sendAdditionalFile(
|
||||
WCSTR(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "settings_per_account.xml")));
|
||||
}
|
||||
|
||||
// LL_ERRS message, when there is one
|
||||
|
|
|
|||
|
|
@ -1092,6 +1092,10 @@ void LLScriptChiclet::onMenuItemClicked(const LLSD& user_data)
|
|||
{
|
||||
LLScriptFloaterManager::instance().removeNotification(getSessionId());
|
||||
}
|
||||
else if ("close all" == action)
|
||||
{
|
||||
LLIMWellWindow::getInstance()->closeAll();
|
||||
}
|
||||
}
|
||||
|
||||
void LLScriptChiclet::createPopupMenu()
|
||||
|
|
|
|||
|
|
@ -347,6 +347,13 @@ void LLFloaterCompileQueue::processExperienceIdResults(LLSD result, LLUUID paren
|
|||
bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> hfloater,
|
||||
const LLPointer<LLViewerObject> &object, LLInventoryObject* inventory, LLEventPump &pump)
|
||||
{
|
||||
if (LLApp::isQuitting())
|
||||
{
|
||||
// Reply from coroutine came on shutdown
|
||||
// We are quiting, don't start any more coroutines!
|
||||
return true;
|
||||
}
|
||||
|
||||
LLSD result;
|
||||
LLCheckedHandle<LLFloaterCompileQueue> floater(hfloater);
|
||||
// Dereferencing floater may fail. If they do they throw LLExeceptionStaleHandle.
|
||||
|
|
@ -381,6 +388,8 @@ bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> hfloat
|
|||
result = llcoro::suspendUntilEventOnWithTimeout(pump, fetch_timeout,
|
||||
LLSDMap("timeout", LLSD::Boolean(true)));
|
||||
|
||||
floater.check();
|
||||
|
||||
if (result.has("timeout"))
|
||||
{ // A timeout filed in the result will always be true if present.
|
||||
LLStringUtil::format_map_t args;
|
||||
|
|
@ -404,6 +413,12 @@ bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> hfloat
|
|||
|
||||
}
|
||||
|
||||
if (!gAssetStorage)
|
||||
{
|
||||
// viewer likely is shutting down
|
||||
return true;
|
||||
}
|
||||
|
||||
{
|
||||
HandleScriptUserData userData(pump.getName());
|
||||
|
||||
|
|
@ -468,6 +483,8 @@ bool LLFloaterCompileQueue::processScript(LLHandle<LLFloaterCompileQueue> hfloat
|
|||
|
||||
result = llcoro::suspendUntilEventOnWithTimeout(pump, fetch_timeout, LLSDMap("timeout", LLSD::Boolean(true)));
|
||||
|
||||
floater.check();
|
||||
|
||||
if (result.has("timeout"))
|
||||
{ // A timeout filed in the result will always be true if present.
|
||||
LLStringUtil::format_map_t args;
|
||||
|
|
@ -797,6 +814,7 @@ void LLFloaterScriptQueue::objectScriptProcessingQueueCoro(std::string action, L
|
|||
// but offers no guarantee of doing so.
|
||||
llcoro::suspend();
|
||||
}
|
||||
floater.check();
|
||||
}
|
||||
|
||||
floater->addStringMessage("Done");
|
||||
|
|
|
|||
|
|
@ -482,6 +482,10 @@ bool LLConversationLog::saveToFile(const std::string& filename)
|
|||
conv_it->getSessionID().toString(conversation_id);
|
||||
conv_it->getParticipantID().toString(participant_id);
|
||||
|
||||
bool is_adhoc = (conv_it->getConversationType() == LLIMModel::LLIMSession::ADHOC_SESSION);
|
||||
std::string conv_name = is_adhoc ? conv_it->getConversationName() : LLURI::escape(conv_it->getConversationName());
|
||||
std::string file_name = is_adhoc ? conv_it->getHistoryFileName() : LLURI::escape(conv_it->getHistoryFileName());
|
||||
|
||||
// examples of two file entries
|
||||
// [1343221177] 0 1 0 John Doe| 7e4ec5be-783f-49f5-71dz-16c58c64c145 4ec62a74-c246-0d25-2af6-846beac2aa55 john.doe|
|
||||
// [1343222639] 2 0 0 Ad-hoc Conference| c3g67c89-c479-4c97-b21d-32869bcfe8rc 68f1c33e-4135-3e3e-a897-8c9b23115c09 Ad-hoc Conference hash597394a0-9982-766d-27b8-c75560213b9a|
|
||||
|
|
@ -490,10 +494,10 @@ bool LLConversationLog::saveToFile(const std::string& filename)
|
|||
(S32)conv_it->getConversationType(),
|
||||
(S32)0,
|
||||
(S32)conv_it->hasOfflineMessages(),
|
||||
LLURI::escape(conv_it->getConversationName()).c_str(),
|
||||
conv_name.c_str(),
|
||||
participant_id.c_str(),
|
||||
conversation_id.c_str(),
|
||||
LLURI::escape(conv_it->getHistoryFileName()).c_str());
|
||||
file_name.c_str());
|
||||
}
|
||||
fclose(fp);
|
||||
return true;
|
||||
|
|
@ -541,14 +545,18 @@ bool LLConversationLog::loadFromFile(const std::string& filename)
|
|||
conv_id_buffer,
|
||||
history_file_name);
|
||||
|
||||
bool is_adhoc = ((SessionType)stype == LLIMModel::LLIMSession::ADHOC_SESSION);
|
||||
std::string conv_name = is_adhoc ? conv_name_buffer : LLURI::unescape(conv_name_buffer);
|
||||
std::string file_name = is_adhoc ? history_file_name : LLURI::unescape(history_file_name);
|
||||
|
||||
ConversationParams params;
|
||||
params.time(LLUnits::Seconds::fromValue(time))
|
||||
.conversation_type((SessionType)stype)
|
||||
.has_offline_ims(has_offline_ims)
|
||||
.conversation_name(LLURI::unescape(conv_name_buffer))
|
||||
.conversation_name(conv_name)
|
||||
.participant_id(LLUUID(part_id_buffer))
|
||||
.session_id(LLUUID(conv_id_buffer))
|
||||
.history_filename(LLURI::unescape(history_file_name));
|
||||
.history_filename(file_name);
|
||||
|
||||
LLConversation conversation(params);
|
||||
|
||||
|
|
|
|||
|
|
@ -1178,11 +1178,33 @@ LLSpatialPartition* LLDrawable::getSpatialPartition()
|
|||
}
|
||||
else if (isRoot())
|
||||
{
|
||||
if (mSpatialBridge && (mSpatialBridge->asPartition()->mPartitionType == LLViewerRegion::PARTITION_HUD) != mVObjp->isHUDAttachment())
|
||||
if (mSpatialBridge)
|
||||
{
|
||||
// remove obsolete bridge
|
||||
mSpatialBridge->markDead();
|
||||
setSpatialBridge(NULL);
|
||||
U32 partition_type = mSpatialBridge->asPartition()->mPartitionType;
|
||||
bool is_hud = mVObjp->isHUDAttachment();
|
||||
bool is_animesh = mVObjp->isAnimatedObject() && mVObjp->getControlAvatar() != NULL;
|
||||
bool is_attachment = mVObjp->isAttachment() && !is_hud && !is_animesh;
|
||||
if ((partition_type == LLViewerRegion::PARTITION_HUD) != is_hud)
|
||||
{
|
||||
// Was/became HUD
|
||||
// remove obsolete bridge
|
||||
mSpatialBridge->markDead();
|
||||
setSpatialBridge(NULL);
|
||||
}
|
||||
else if ((partition_type == LLViewerRegion::PARTITION_CONTROL_AV) != is_animesh)
|
||||
{
|
||||
// Was/became part of animesh
|
||||
// remove obsolete bridge
|
||||
mSpatialBridge->markDead();
|
||||
setSpatialBridge(NULL);
|
||||
}
|
||||
else if ((partition_type == LLViewerRegion::PARTITION_AVATAR) != is_attachment)
|
||||
{
|
||||
// Was/became part of avatar
|
||||
// remove obsolete bridge
|
||||
mSpatialBridge->markDead();
|
||||
setSpatialBridge(NULL);
|
||||
}
|
||||
}
|
||||
//must be an active volume
|
||||
if (!mSpatialBridge)
|
||||
|
|
@ -1191,6 +1213,15 @@ LLSpatialPartition* LLDrawable::getSpatialPartition()
|
|||
{
|
||||
setSpatialBridge(new LLHUDBridge(this, getRegion()));
|
||||
}
|
||||
else if (mVObjp->isAnimatedObject() && mVObjp->getControlAvatar())
|
||||
{
|
||||
setSpatialBridge(new LLControlAVBridge(this, getRegion()));
|
||||
}
|
||||
// check HUD first, because HUD is also attachment
|
||||
else if (mVObjp->isAttachment())
|
||||
{
|
||||
setSpatialBridge(new LLAvatarBridge(this, getRegion()));
|
||||
}
|
||||
else
|
||||
{
|
||||
setSpatialBridge(new LLVolumeBridge(this, getRegion()));
|
||||
|
|
@ -1698,12 +1729,26 @@ void LLDrawable::updateFaceSize(S32 idx)
|
|||
LLBridgePartition::LLBridgePartition(LLViewerRegion* regionp)
|
||||
: LLSpatialPartition(0, FALSE, 0, regionp)
|
||||
{
|
||||
mDrawableType = LLPipeline::RENDER_TYPE_AVATAR;
|
||||
mDrawableType = LLPipeline::RENDER_TYPE_VOLUME;
|
||||
mPartitionType = LLViewerRegion::PARTITION_BRIDGE;
|
||||
mLODPeriod = 16;
|
||||
mSlopRatio = 0.25f;
|
||||
}
|
||||
|
||||
LLAvatarPartition::LLAvatarPartition(LLViewerRegion* regionp)
|
||||
: LLBridgePartition(regionp)
|
||||
{
|
||||
mDrawableType = LLPipeline::RENDER_TYPE_AVATAR;
|
||||
mPartitionType = LLViewerRegion::PARTITION_AVATAR;
|
||||
}
|
||||
|
||||
LLControlAVPartition::LLControlAVPartition(LLViewerRegion* regionp)
|
||||
: LLBridgePartition(regionp)
|
||||
{
|
||||
mDrawableType = LLPipeline::RENDER_TYPE_CONTROL_AV;
|
||||
mPartitionType = LLViewerRegion::PARTITION_CONTROL_AV;
|
||||
}
|
||||
|
||||
LLHUDBridge::LLHUDBridge(LLDrawable* drawablep, LLViewerRegion* regionp)
|
||||
: LLVolumeBridge(drawablep, regionp)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -86,7 +86,8 @@ LLDrawPool *LLDrawPool::createPool(const U32 type, LLViewerTexture *tex0)
|
|||
poolp = new LLDrawPoolAlpha();
|
||||
break;
|
||||
case POOL_AVATAR:
|
||||
poolp = new LLDrawPoolAvatar();
|
||||
case POOL_CONTROL_AV:
|
||||
poolp = new LLDrawPoolAvatar(type);
|
||||
break;
|
||||
case POOL_TREE:
|
||||
poolp = new LLDrawPoolTree(tex0);
|
||||
|
|
@ -383,16 +384,6 @@ LLRenderPass::~LLRenderPass()
|
|||
|
||||
}
|
||||
|
||||
LLDrawPool* LLRenderPass::instancePool()
|
||||
{
|
||||
#if LL_RELEASE_FOR_DOWNLOAD
|
||||
LL_WARNS() << "Attempting to instance a render pass. Invalid operation." << LL_ENDL;
|
||||
#else
|
||||
LL_ERRS() << "Attempting to instance a render pass. Invalid operation." << LL_ENDL;
|
||||
#endif
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void LLRenderPass::renderGroup(LLSpatialGroup* group, U32 type, U32 mask, BOOL texture)
|
||||
{
|
||||
LLSpatialGroup::drawmap_elem_t& draw_info = group->mDrawMap[type];
|
||||
|
|
@ -449,7 +440,7 @@ void LLRenderPass::applyModelMatrix(const LLDrawInfo& params)
|
|||
if (params.mModelMatrix != gGLLastMatrix)
|
||||
{
|
||||
gGLLastMatrix = params.mModelMatrix;
|
||||
gGL.matrixMode(LLRender::MM_MODELVIEW);
|
||||
gGL.matrixMode(LLRender::MM_MODELVIEW);
|
||||
gGL.loadMatrix(gGLModelView);
|
||||
if (params.mModelMatrix)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -60,6 +60,7 @@ public:
|
|||
POOL_GRASS,
|
||||
POOL_INVISIBLE, // see below *
|
||||
POOL_AVATAR,
|
||||
POOL_CONTROL_AV, // Animesh
|
||||
POOL_VOIDWATER,
|
||||
POOL_WATER,
|
||||
POOL_GLOW,
|
||||
|
|
@ -110,7 +111,6 @@ public:
|
|||
virtual S32 getShaderLevel() const { return mShaderLevel; }
|
||||
|
||||
static LLDrawPool* createPool(const U32 type, LLViewerTexture *tex0 = NULL);
|
||||
virtual LLDrawPool *instancePool() = 0; // Create an empty new instance of the pool.
|
||||
virtual LLViewerTexture* getTexture() = 0;
|
||||
virtual BOOL isFacePool() { return FALSE; }
|
||||
virtual void resetDrawOrders() = 0;
|
||||
|
|
@ -138,31 +138,30 @@ public:
|
|||
PASS_POST_BUMP,
|
||||
PASS_MATERIAL,
|
||||
PASS_MATERIAL_ALPHA,
|
||||
PASS_MATERIAL_ALPHA_MASK,
|
||||
PASS_MATERIAL_ALPHA_MASK, // Diffuse texture used as alpha mask
|
||||
PASS_MATERIAL_ALPHA_EMISSIVE,
|
||||
PASS_SPECMAP,
|
||||
PASS_SPECMAP_BLEND,
|
||||
PASS_SPECMAP_MASK,
|
||||
PASS_SPECMAP_MASK, // Diffuse texture used as alpha mask and specular texture(map)
|
||||
PASS_SPECMAP_EMISSIVE,
|
||||
PASS_NORMMAP,
|
||||
PASS_NORMMAP_BLEND,
|
||||
PASS_NORMMAP_MASK,
|
||||
PASS_NORMMAP_MASK, // Diffuse texture used as alpha mask and normal map
|
||||
PASS_NORMMAP_EMISSIVE,
|
||||
PASS_NORMSPEC,
|
||||
PASS_NORMSPEC_BLEND,
|
||||
PASS_NORMSPEC_MASK,
|
||||
PASS_NORMSPEC_MASK, // Diffuse texture used as alpha mask with normal and specular map
|
||||
PASS_NORMSPEC_EMISSIVE,
|
||||
PASS_GLOW,
|
||||
PASS_ALPHA,
|
||||
PASS_ALPHA_MASK,
|
||||
PASS_FULLBRIGHT_ALPHA_MASK,
|
||||
PASS_FULLBRIGHT_ALPHA_MASK, // Diffuse texture used as alpha mask and fullbright
|
||||
PASS_ALPHA_INVISIBLE,
|
||||
NUM_RENDER_TYPES,
|
||||
};
|
||||
|
||||
LLRenderPass(const U32 type);
|
||||
virtual ~LLRenderPass();
|
||||
/*virtual*/ LLDrawPool* instancePool();
|
||||
/*virtual*/ LLViewerTexture* getDebugTexture() { return NULL; }
|
||||
LLViewerTexture* getTexture() { return NULL; }
|
||||
BOOL isDead() { return FALSE; }
|
||||
|
|
|
|||
|
|
@ -314,11 +314,15 @@ void LLDrawPoolAlpha::render(S32 pass)
|
|||
LLVertexBuffer::MAP_TEXCOORD0);
|
||||
|
||||
pushBatches(LLRenderPass::PASS_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
|
||||
pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
|
||||
pushBatches(LLRenderPass::PASS_ALPHA_INVISIBLE, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
|
||||
|
||||
// Material alpha mask
|
||||
gGL.diffuseColor4f(0, 0, 1, 1);
|
||||
pushBatches(LLRenderPass::PASS_MATERIAL_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
|
||||
pushBatches(LLRenderPass::PASS_NORMMAP_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
|
||||
pushBatches(LLRenderPass::PASS_SPECMAP_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
|
||||
pushBatches(LLRenderPass::PASS_NORMSPEC_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
|
||||
pushBatches(LLRenderPass::PASS_FULLBRIGHT_ALPHA_MASK, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
|
||||
|
||||
gGL.diffuseColor4f(0, 1, 0, 1);
|
||||
pushBatches(LLRenderPass::PASS_INVISIBLE, LLVertexBuffer::MAP_VERTEX | LLVertexBuffer::MAP_TEXCOORD0, FALSE);
|
||||
|
|
|
|||
|
|
@ -106,8 +106,8 @@ S32 cube_channel = -1;
|
|||
|
||||
static LLTrace::BlockTimerStatHandle FTM_SHADOW_AVATAR("Avatar Shadow");
|
||||
|
||||
LLDrawPoolAvatar::LLDrawPoolAvatar() :
|
||||
LLFacePool(POOL_AVATAR)
|
||||
LLDrawPoolAvatar::LLDrawPoolAvatar(U32 type) :
|
||||
LLFacePool(type)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -136,15 +136,6 @@ BOOL LLDrawPoolAvatar::isDead()
|
|||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// instancePool()
|
||||
//-----------------------------------------------------------------------------
|
||||
LLDrawPool *LLDrawPoolAvatar::instancePool()
|
||||
{
|
||||
return new LLDrawPoolAvatar();
|
||||
}
|
||||
|
||||
|
||||
S32 LLDrawPoolAvatar::getShaderLevel() const
|
||||
{
|
||||
|
|
@ -1741,11 +1732,16 @@ void LLDrawPoolAvatar::getRiggedGeometry(
|
|||
LLVolume* volume,
|
||||
const LLVolumeFace& vol_face)
|
||||
{
|
||||
face->setGeomIndex(0);
|
||||
face->setIndicesIndex(0);
|
||||
|
||||
//rigged faces do not batch textures
|
||||
face->setTextureIndex(255);
|
||||
face->setGeomIndex(0);
|
||||
face->setIndicesIndex(0);
|
||||
|
||||
if (face->getTextureIndex() != FACE_DO_NOT_BATCH_TEXTURES)
|
||||
{
|
||||
face->setDrawInfo(NULL);
|
||||
}
|
||||
|
||||
//rigged faces do not batch textures
|
||||
face->setTextureIndex(FACE_DO_NOT_BATCH_TEXTURES);
|
||||
|
||||
if (buffer.isNull() || buffer->getTypeMask() != data_mask || !buffer->isWriteable())
|
||||
{
|
||||
|
|
@ -1810,7 +1806,7 @@ void LLDrawPoolAvatar::getRiggedGeometry(
|
|||
}
|
||||
else
|
||||
{
|
||||
face->setPoolType(LLDrawPool::POOL_AVATAR);
|
||||
face->setPoolType(mType); // either POOL_AVATAR or POOL_CONTROL_AV
|
||||
}
|
||||
|
||||
//LL_INFOS() << "Rebuilt face " << face->getTEOffset() << " of " << face->getDrawable() << " at " << gFrameTimeSeconds << LL_ENDL;
|
||||
|
|
@ -2494,7 +2490,7 @@ LLColor3 LLDrawPoolAvatar::getDebugColor() const
|
|||
void LLDrawPoolAvatar::addRiggedFace(LLFace* facep, U32 type)
|
||||
{
|
||||
llassert (facep->isState(LLFace::RIGGED));
|
||||
llassert(getType() == LLDrawPool::POOL_AVATAR);
|
||||
llassert(getType() == LLDrawPool::POOL_AVATAR || getType() == LLDrawPool::POOL_CONTROL_AV);
|
||||
if (facep->getPool() && facep->getPool() != this)
|
||||
{
|
||||
LL_ERRS() << "adding rigged face that's already in another pool" << LL_ENDL;
|
||||
|
|
@ -2516,7 +2512,7 @@ void LLDrawPoolAvatar::addRiggedFace(LLFace* facep, U32 type)
|
|||
void LLDrawPoolAvatar::removeRiggedFace(LLFace* facep)
|
||||
{
|
||||
llassert (facep->isState(LLFace::RIGGED));
|
||||
llassert(getType() == LLDrawPool::POOL_AVATAR);
|
||||
llassert(getType() == LLDrawPool::POOL_AVATAR || getType() == LLDrawPool::POOL_CONTROL_AV);
|
||||
if (facep->getPool() != this)
|
||||
{
|
||||
LL_ERRS() << "Tried to remove a rigged face from the wrong pool" << LL_ENDL;
|
||||
|
|
|
|||
|
|
@ -178,12 +178,10 @@ typedef enum
|
|||
|
||||
virtual S32 getShaderLevel() const;
|
||||
|
||||
LLDrawPoolAvatar();
|
||||
LLDrawPoolAvatar(U32 type);
|
||||
|
||||
static LLMatrix4& getModelView();
|
||||
|
||||
/*virtual*/ LLDrawPool *instancePool();
|
||||
|
||||
/*virtual*/ S32 getNumPasses();
|
||||
/*virtual*/ void beginRenderPass(S32 pass);
|
||||
/*virtual*/ void endRenderPass(S32 pass);
|
||||
|
|
|
|||
|
|
@ -46,11 +46,6 @@ LLDrawPoolGround::LLDrawPoolGround() :
|
|||
{
|
||||
}
|
||||
|
||||
LLDrawPool *LLDrawPoolGround::instancePool()
|
||||
{
|
||||
return new LLDrawPoolGround();
|
||||
}
|
||||
|
||||
void LLDrawPoolGround::prerender()
|
||||
{
|
||||
mShaderLevel = LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_ENVIRONMENT);
|
||||
|
|
|
|||
|
|
@ -43,8 +43,6 @@ public:
|
|||
|
||||
LLDrawPoolGround();
|
||||
|
||||
/*virtual*/ LLDrawPool *instancePool();
|
||||
|
||||
/*virtual*/ void prerender();
|
||||
/*virtual*/ void render(S32 pass = 0);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -48,11 +48,6 @@ LLDrawPoolSky::LLDrawPoolSky()
|
|||
{
|
||||
}
|
||||
|
||||
LLDrawPool *LLDrawPoolSky::instancePool()
|
||||
{
|
||||
return new LLDrawPoolSky();
|
||||
}
|
||||
|
||||
void LLDrawPoolSky::prerender()
|
||||
{
|
||||
mShaderLevel = LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_ENVIRONMENT);
|
||||
|
|
@ -128,23 +123,12 @@ void LLDrawPoolSky::renderSkyFace(U8 index)
|
|||
return;
|
||||
}
|
||||
|
||||
F32 interp_val = gSky.mVOSkyp ? gSky.mVOSkyp->getInterpVal() : 0.0f;
|
||||
|
||||
if (index < 6) // sky tex...interp
|
||||
{
|
||||
llassert(mSkyTex);
|
||||
mSkyTex[index].bindTexture(true); // bind the current tex
|
||||
|
||||
face->renderIndexed();
|
||||
|
||||
if (interp_val > 0.01f) // iff, we've got enough info to lerp (a to and a from)
|
||||
{
|
||||
LLGLEnable blend(GL_BLEND);
|
||||
llassert(mSkyTex);
|
||||
mSkyTex[index].bindTexture(false); // bind the "other" texture
|
||||
gGL.diffuseColor4f(1, 1, 1, interp_val); // lighting is disabled
|
||||
face->renderIndexed();
|
||||
}
|
||||
}
|
||||
else // heavenly body faces, no interp...
|
||||
{
|
||||
|
|
|
|||
|
|
@ -49,8 +49,6 @@ public:
|
|||
|
||||
LLDrawPoolSky();
|
||||
|
||||
/*virtual*/ LLDrawPool *instancePool();
|
||||
|
||||
/*virtual*/ S32 getNumPostDeferredPasses() { return getNumPasses(); }
|
||||
/*virtual*/ void beginPostDeferredPass(S32 pass) { beginRenderPass(pass); }
|
||||
/*virtual*/ void endPostDeferredPass(S32 pass) { endRenderPass(pass); }
|
||||
|
|
|
|||
|
|
@ -87,13 +87,6 @@ LLDrawPoolTerrain::~LLDrawPoolTerrain()
|
|||
llassert( gPipeline.findPool( getType(), getTexture() ) == NULL );
|
||||
}
|
||||
|
||||
|
||||
LLDrawPool *LLDrawPoolTerrain::instancePool()
|
||||
{
|
||||
return new LLDrawPoolTerrain(mTexturep);
|
||||
}
|
||||
|
||||
|
||||
U32 LLDrawPoolTerrain::getVertexDataMask()
|
||||
{
|
||||
if (LLPipeline::sShadowRender)
|
||||
|
|
|
|||
|
|
@ -49,8 +49,6 @@ public:
|
|||
LLDrawPoolTerrain(LLViewerTexture *texturep);
|
||||
virtual ~LLDrawPoolTerrain();
|
||||
|
||||
/*virtual*/ LLDrawPool *instancePool();
|
||||
|
||||
/*virtual*/ S32 getNumDeferredPasses() { return 1; }
|
||||
/*virtual*/ void beginDeferredPass(S32 pass);
|
||||
/*virtual*/ void endDeferredPass(S32 pass);
|
||||
|
|
|
|||
|
|
@ -51,11 +51,6 @@ LLDrawPoolTree::LLDrawPoolTree(LLViewerTexture *texturep) :
|
|||
mTexturep->setAddressMode(LLTexUnit::TAM_WRAP);
|
||||
}
|
||||
|
||||
LLDrawPool *LLDrawPoolTree::instancePool()
|
||||
{
|
||||
return new LLDrawPoolTree(mTexturep);
|
||||
}
|
||||
|
||||
void LLDrawPoolTree::prerender()
|
||||
{
|
||||
mShaderLevel = LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_OBJECT);
|
||||
|
|
|
|||
|
|
@ -45,8 +45,6 @@ public:
|
|||
|
||||
LLDrawPoolTree(LLViewerTexture *texturep);
|
||||
|
||||
/*virtual*/ LLDrawPool *instancePool();
|
||||
|
||||
/*virtual*/ void prerender();
|
||||
|
||||
/*virtual*/ S32 getNumDeferredPasses() { return 1; }
|
||||
|
|
|
|||
|
|
@ -104,13 +104,6 @@ void LLDrawPoolWater::restoreGL()
|
|||
}*/
|
||||
}
|
||||
|
||||
LLDrawPool *LLDrawPoolWater::instancePool()
|
||||
{
|
||||
LL_ERRS() << "Should never be calling instancePool on a water pool!" << LL_ENDL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
void LLDrawPoolWater::prerender()
|
||||
{
|
||||
mShaderLevel = (gGLManager.mHasCubeMap && LLCubeMap::sUseCubeMaps) ? LLViewerShaderMgr::instance()->getShaderLevel(LLViewerShaderMgr::SHADER_WATER) : 0;
|
||||
|
|
|
|||
|
|
@ -61,7 +61,6 @@ public:
|
|||
LLDrawPoolWater();
|
||||
/*virtual*/ ~LLDrawPoolWater();
|
||||
|
||||
/*virtual*/ LLDrawPool *instancePool();
|
||||
static void restoreGL();
|
||||
|
||||
/*virtual*/ S32 getNumPostDeferredPasses() { return 0; } //getNumPasses(); }
|
||||
|
|
|
|||
|
|
@ -216,10 +216,11 @@ void LLDrawPoolWLSky::renderSkyHaze(const LLVector3& camPosLocal, F32 camHeightL
|
|||
|
||||
if (gPipeline.canUseWindLightShaders() && gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_SKY))
|
||||
{
|
||||
LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
|
||||
LLGLSPipelineDepthTestSkyBox sky(true, false);
|
||||
sky_shader->bind();
|
||||
sky_shader->uniform1i(LLShaderMgr::SUN_UP_FACTOR, 1);
|
||||
sky_shader->uniform1f(LLShaderMgr::SUN_MOON_GLOW_FACTOR, 1.0f);
|
||||
sky_shader->uniform1f(LLShaderMgr::SUN_MOON_GLOW_FACTOR, psky->getSunMoonGlowFactor());
|
||||
renderDome(origin, camHeightLocal, sky_shader);
|
||||
sky_shader->unbind();
|
||||
}
|
||||
|
|
@ -531,8 +532,6 @@ void LLDrawPoolWLSky::renderHeavenlyBodies()
|
|||
}
|
||||
}
|
||||
|
||||
blend_factor = LLEnvironment::instance().getCurrentSky()->getBlendFactor();
|
||||
|
||||
face = gSky.mVOSkyp->mFace[LLVOSky::FACE_MOON];
|
||||
|
||||
if (gSky.mVOSkyp->getMoon().getDraw() && face && face->getTexture(LLRender::DIFFUSE_MAP) && face->getGeomCount() && moon_shader)
|
||||
|
|
@ -550,17 +549,17 @@ void LLDrawPoolWLSky::renderHeavenlyBodies()
|
|||
{
|
||||
// Bind current and next sun textures
|
||||
moon_shader->bindTexture(LLShaderMgr::DIFFUSE_MAP, tex_a, LLTexUnit::TT_TEXTURE);
|
||||
blend_factor = 0;
|
||||
//blend_factor = 0;
|
||||
}
|
||||
else if (tex_b && !tex_a)
|
||||
{
|
||||
moon_shader->bindTexture(LLShaderMgr::DIFFUSE_MAP, tex_b, LLTexUnit::TT_TEXTURE);
|
||||
blend_factor = 0;
|
||||
//blend_factor = 0;
|
||||
}
|
||||
else if (tex_b != tex_a)
|
||||
{
|
||||
moon_shader->bindTexture(LLShaderMgr::DIFFUSE_MAP, tex_a, LLTexUnit::TT_TEXTURE);
|
||||
moon_shader->bindTexture(LLShaderMgr::ALTERNATE_DIFFUSE_MAP, tex_b, LLTexUnit::TT_TEXTURE);
|
||||
//moon_shader->bindTexture(LLShaderMgr::ALTERNATE_DIFFUSE_MAP, tex_b, LLTexUnit::TT_TEXTURE);
|
||||
}
|
||||
|
||||
LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
|
||||
|
|
@ -570,7 +569,8 @@ void LLDrawPoolWLSky::renderHeavenlyBodies()
|
|||
moon_shader->uniform1f(LLShaderMgr::MOON_BRIGHTNESS, moon_brightness);
|
||||
moon_shader->uniform4fv(LLShaderMgr::MOONLIGHT_COLOR, 1, gSky.mVOSkyp->getMoon().getColor().mV);
|
||||
moon_shader->uniform4fv(LLShaderMgr::DIFFUSE_COLOR, 1, color.mV);
|
||||
moon_shader->uniform1f(LLShaderMgr::BLEND_FACTOR, blend_factor);
|
||||
//moon_shader->uniform1f(LLShaderMgr::BLEND_FACTOR, blend_factor);
|
||||
moon_shader->uniform3fv(LLShaderMgr::DEFERRED_MOON_DIR, 1, psky->getMoonDirection().mV); // shader: moon_dir
|
||||
|
||||
face->renderIndexed();
|
||||
|
||||
|
|
@ -632,11 +632,6 @@ void LLDrawPoolWLSky::prerender()
|
|||
//LL_INFOS() << "wlsky prerendering pass." << LL_ENDL;
|
||||
}
|
||||
|
||||
LLDrawPoolWLSky *LLDrawPoolWLSky::instancePool()
|
||||
{
|
||||
return new LLDrawPoolWLSky();
|
||||
}
|
||||
|
||||
LLViewerTexture* LLDrawPoolWLSky::getTexture()
|
||||
{
|
||||
return NULL;
|
||||
|
|
|
|||
|
|
@ -62,8 +62,6 @@ public:
|
|||
|
||||
//static LLDrawPool* createPool(const U32 type, LLViewerTexture *tex0 = NULL);
|
||||
|
||||
// Create an empty new instance of the pool.
|
||||
/*virtual*/ LLDrawPoolWLSky *instancePool(); ///< covariant override
|
||||
/*virtual*/ LLViewerTexture* getTexture();
|
||||
/*virtual*/ BOOL isFacePool() { return FALSE; }
|
||||
/*virtual*/ void resetDrawOrders();
|
||||
|
|
|
|||
|
|
@ -153,7 +153,7 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)
|
|||
}
|
||||
|
||||
mTEOffset = -1;
|
||||
mTextureIndex = 255;
|
||||
mTextureIndex = FACE_DO_NOT_BATCH_TEXTURES;
|
||||
|
||||
setDrawable(drawablep);
|
||||
mVObjp = objp;
|
||||
|
|
@ -184,6 +184,7 @@ void LLFace::destroy()
|
|||
if(mTexture[i].notNull())
|
||||
{
|
||||
mTexture[i]->removeFace(i, this) ;
|
||||
mTexture[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -195,7 +196,7 @@ void LLFace::destroy()
|
|||
|
||||
if (mDrawPoolp)
|
||||
{
|
||||
if (this->isState(LLFace::RIGGED) && mDrawPoolp->getType() == LLDrawPool::POOL_AVATAR)
|
||||
if (this->isState(LLFace::RIGGED) && (mDrawPoolp->getType() == LLDrawPool::POOL_CONTROL_AV || mDrawPoolp->getType() == LLDrawPool::POOL_AVATAR))
|
||||
{
|
||||
((LLDrawPoolAvatar*) mDrawPoolp)->removeRiggedFace(this);
|
||||
}
|
||||
|
|
@ -203,7 +204,6 @@ void LLFace::destroy()
|
|||
{
|
||||
mDrawPoolp->removeFace(this);
|
||||
}
|
||||
|
||||
mDrawPoolp = NULL;
|
||||
}
|
||||
|
||||
|
|
@ -212,7 +212,7 @@ void LLFace::destroy()
|
|||
delete mTextureMatrix;
|
||||
mTextureMatrix = NULL;
|
||||
|
||||
if (mDrawablep.notNull())
|
||||
if (mDrawablep)
|
||||
{
|
||||
LLSpatialGroup* group = mDrawablep->getSpatialGroup();
|
||||
if (group)
|
||||
|
|
@ -224,7 +224,7 @@ void LLFace::destroy()
|
|||
}
|
||||
|
||||
setDrawInfo(NULL);
|
||||
|
||||
|
||||
mDrawablep = NULL;
|
||||
mVObjp = NULL;
|
||||
}
|
||||
|
|
@ -456,13 +456,13 @@ void LLFace::setTextureIndex(U8 index)
|
|||
{
|
||||
mTextureIndex = index;
|
||||
|
||||
if (mTextureIndex != 255)
|
||||
if (mTextureIndex != FACE_DO_NOT_BATCH_TEXTURES)
|
||||
{
|
||||
mDrawablep->setState(LLDrawable::REBUILD_POSITION);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mDrawInfo && mDrawInfo->mTextureList.size() <= 1)
|
||||
if (mDrawInfo && !mDrawInfo->mTextureList.empty())
|
||||
{
|
||||
LL_ERRS() << "Face with no texture index references indexed texture draw info." << LL_ENDL;
|
||||
}
|
||||
|
|
@ -535,7 +535,7 @@ void LLFace::updateCenterAgent()
|
|||
|
||||
void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color)
|
||||
{
|
||||
if (mDrawablep->getSpatialGroup() == NULL)
|
||||
if (mDrawablep == NULL || mDrawablep->getSpatialGroup() == NULL)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
@ -543,7 +543,7 @@ void LLFace::renderSelected(LLViewerTexture *imagep, const LLColor4& color)
|
|||
mDrawablep->getSpatialGroup()->rebuildGeom();
|
||||
mDrawablep->getSpatialGroup()->rebuildMesh();
|
||||
|
||||
if(mDrawablep.isNull() || mVertexBuffer.isNull())
|
||||
if(mVertexBuffer.isNull())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
@ -1539,7 +1539,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
|
|||
|
||||
mVertexBuffer->bindForFeedback(0, LLVertexBuffer::TYPE_VERTEX, mGeomIndex, mGeomCount);
|
||||
|
||||
U8 index = mTextureIndex < 255 ? mTextureIndex : 0;
|
||||
U8 index = mTextureIndex < FACE_DO_NOT_BATCH_TEXTURES ? mTextureIndex : 0;
|
||||
|
||||
S32 val = 0;
|
||||
U8* vp = (U8*) &val;
|
||||
|
|
@ -2072,7 +2072,7 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
|
|||
|
||||
LLVector4a texIdx;
|
||||
|
||||
S32 index = mTextureIndex < 255 ? mTextureIndex : 0;
|
||||
S32 index = mTextureIndex < FACE_DO_NOT_BATCH_TEXTURES ? mTextureIndex : 0;
|
||||
|
||||
F32 val = 0.f;
|
||||
S32* vp = (S32*) &val;
|
||||
|
|
@ -2673,7 +2673,7 @@ S32 LLFace::renderElements(const U16 *index_array) const
|
|||
|
||||
S32 LLFace::renderIndexed()
|
||||
{
|
||||
if(mDrawablep.isNull() || mDrawPoolp == NULL)
|
||||
if(mDrawablep == NULL || mDrawPoolp == NULL)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -52,6 +52,7 @@ class LLDrawInfo;
|
|||
|
||||
const F32 MIN_ALPHA_SIZE = 1024.f;
|
||||
const F32 MIN_TEX_ANIM_SIZE = 512.f;
|
||||
const U8 FACE_DO_NOT_BATCH_TEXTURES = 255;
|
||||
|
||||
class LLFace : public LLTrace::MemTrackableNonVirtual<LLFace, 16>
|
||||
{
|
||||
|
|
@ -279,8 +280,13 @@ private:
|
|||
LLXformMatrix* mXform;
|
||||
|
||||
LLPointer<LLViewerTexture> mTexture[LLRender::NUM_TEXTURE_CHANNELS];
|
||||
|
||||
LLPointer<LLDrawable> mDrawablep;
|
||||
|
||||
// mDrawablep is not supposed to be null, don't use LLPointer because
|
||||
// mDrawablep owns LLFace and LLPointer is a good way to either cause a
|
||||
// memory leak or a 'delete each other' situation if something deletes
|
||||
// drawable wrongly.
|
||||
LLDrawable* mDrawablep;
|
||||
// LLViewerObject technically owns drawable, but also it should be strictly managed
|
||||
LLPointer<LLViewerObject> mVObjp;
|
||||
S32 mTEOffset;
|
||||
|
||||
|
|
|
|||
|
|
@ -84,10 +84,7 @@ BOOL LLFloaterConversationPreview::postBuild()
|
|||
file = "chat";
|
||||
}
|
||||
mChatHistoryFileName = file;
|
||||
if (mIsGroup)
|
||||
{
|
||||
mChatHistoryFileName += GROUP_CHAT_SUFFIX;
|
||||
}
|
||||
|
||||
LLStringUtil::format_map_t args;
|
||||
args["[NAME]"] = name;
|
||||
std::string title = getString("Title", args);
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@
|
|||
|
||||
#include "llagent.h"
|
||||
#include "llbutton.h"
|
||||
#include "llcheckboxctrl.h"
|
||||
#include "llcombobox.h"
|
||||
#include "lldrawable.h"
|
||||
#include "lldrawpoolavatar.h"
|
||||
|
|
@ -115,8 +116,14 @@ BOOL LLFloaterImagePreview::postBuild()
|
|||
mSculptedPreview = new LLImagePreviewSculpted(256, 256);
|
||||
mSculptedPreview->setPreviewTarget(mRawImagep, 2.0f);
|
||||
|
||||
if (mRawImagep->getWidth() * mRawImagep->getHeight () <= LL_IMAGE_REZ_LOSSLESS_CUTOFF * LL_IMAGE_REZ_LOSSLESS_CUTOFF)
|
||||
getChildView("lossless_check")->setEnabled(TRUE);
|
||||
if (mRawImagep->getWidth() * mRawImagep->getHeight() <= LL_IMAGE_REZ_LOSSLESS_CUTOFF * LL_IMAGE_REZ_LOSSLESS_CUTOFF)
|
||||
{
|
||||
// We want "lossless_check" to be unchecked when it is disabled, regardless of
|
||||
// LosslessJ2CUpload state, so only assign control when enabling checkbox
|
||||
LLCheckBoxCtrl* check_box = getChild<LLCheckBoxCtrl>("lossless_check");
|
||||
check_box->setEnabled(TRUE);
|
||||
check_box->setControlVariable(gSavedSettings.getControl("LosslessJ2CUpload"));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
|
|||
|
|
@ -57,6 +57,9 @@
|
|||
#include "llviewerobjectlist.h"
|
||||
#include "boost/foreach.hpp"
|
||||
|
||||
|
||||
const S32 EVENTS_PER_IDLE_LOOP = 100;
|
||||
|
||||
//
|
||||
// LLFloaterIMContainer
|
||||
//
|
||||
|
|
@ -66,7 +69,8 @@ LLFloaterIMContainer::LLFloaterIMContainer(const LLSD& seed, const Params& param
|
|||
mConversationsRoot(NULL),
|
||||
mConversationsEventStream("ConversationsEvents"),
|
||||
mInitialized(false),
|
||||
mIsFirstLaunch(true)
|
||||
mIsFirstLaunch(true),
|
||||
mConversationEventQueue()
|
||||
{
|
||||
mEnableCallbackRegistrar.add("IMFloaterContainer.Check", boost::bind(&LLFloaterIMContainer::isActionChecked, this, _2));
|
||||
mCommitCallbackRegistrar.add("IMFloaterContainer.Action", boost::bind(&LLFloaterIMContainer::onCustomAction, this, _2));
|
||||
|
|
@ -424,7 +428,9 @@ void LLFloaterIMContainer::idle(void* user_data)
|
|||
{
|
||||
LLFloaterIMContainer* self = static_cast<LLFloaterIMContainer*>(user_data);
|
||||
|
||||
if (!self->getVisible() || self->isMinimized())
|
||||
self->idleProcessEvents();
|
||||
|
||||
if (!self->getVisible() || self->isMinimized())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
|
@ -455,7 +461,7 @@ void LLFloaterIMContainer::idleUpdate()
|
|||
while (current_participant_model != end_participant_model)
|
||||
{
|
||||
LLConversationItemParticipant* participant_model = dynamic_cast<LLConversationItemParticipant*>(*current_participant_model);
|
||||
participant_model->setModeratorOptionsVisible(is_moderator && participant_model->getUUID() != gAgentID);
|
||||
participant_model->setModeratorOptionsVisible(is_moderator);
|
||||
participant_model->setGroupBanVisible(can_ban && participant_model->getUUID() != gAgentID);
|
||||
|
||||
current_participant_model++;
|
||||
|
|
@ -485,13 +491,28 @@ void LLFloaterIMContainer::idleUpdate()
|
|||
}
|
||||
}
|
||||
|
||||
void LLFloaterIMContainer::idleProcessEvents()
|
||||
{
|
||||
if (!mConversationEventQueue.empty())
|
||||
{
|
||||
S32 events_to_handle = llmin((S32)mConversationEventQueue.size(), EVENTS_PER_IDLE_LOOP);
|
||||
for (S32 i = 0; i < events_to_handle; i++)
|
||||
{
|
||||
handleConversationModelEvent(mConversationEventQueue.back());
|
||||
mConversationEventQueue.pop_back();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool LLFloaterIMContainer::onConversationModelEvent(const LLSD& event)
|
||||
{
|
||||
// For debug only
|
||||
//std::ostringstream llsd_value;
|
||||
//llsd_value << LLSDOStreamer<LLSDNotationFormatter>(event) << std::endl;
|
||||
//LL_INFOS() << "LLFloaterIMContainer::onConversationModelEvent, event = " << llsd_value.str() << LL_ENDL;
|
||||
// end debug
|
||||
mConversationEventQueue.push_front(event);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void LLFloaterIMContainer::handleConversationModelEvent(const LLSD& event)
|
||||
{
|
||||
|
||||
// Note: In conversations, the model is not responsible for creating the view, which is a good thing. This means that
|
||||
// the model could change substantially and the view could echo only a portion of this model (though currently the
|
||||
|
|
@ -508,7 +529,7 @@ bool LLFloaterIMContainer::onConversationModelEvent(const LLSD& event)
|
|||
if (!session_view)
|
||||
{
|
||||
// We skip events that are not associated with a session
|
||||
return false;
|
||||
return;
|
||||
}
|
||||
LLConversationViewParticipant* participant_view = session_view->findParticipant(participant_id);
|
||||
LLFloaterIMSessionTab *conversation_floater = (session_id.isNull() ?
|
||||
|
|
@ -535,9 +556,9 @@ bool LLFloaterIMContainer::onConversationModelEvent(const LLSD& event)
|
|||
{
|
||||
LLConversationItemSession* session_model = dynamic_cast<LLConversationItemSession*>(mConversationsItems[session_id]);
|
||||
LLConversationItemParticipant* participant_model = (session_model ? session_model->findParticipant(participant_id) : NULL);
|
||||
LLIMModel::LLIMSession * im_sessionp = LLIMModel::getInstance()->findIMSession(session_id);
|
||||
if (!participant_view && session_model && participant_model)
|
||||
{
|
||||
LLIMModel::LLIMSession * im_sessionp = LLIMModel::getInstance()->findIMSession(session_id);
|
||||
{
|
||||
if (session_id.isNull() || (im_sessionp && !im_sessionp->isP2PSessionType()))
|
||||
{
|
||||
participant_view = createConversationViewParticipant(participant_model);
|
||||
|
|
@ -548,7 +569,8 @@ bool LLFloaterIMContainer::onConversationModelEvent(const LLSD& event)
|
|||
// Add a participant view to the conversation floater
|
||||
if (conversation_floater && participant_model)
|
||||
{
|
||||
conversation_floater->addConversationViewParticipant(participant_model);
|
||||
bool skip_updating = im_sessionp && im_sessionp->isGroupChat();
|
||||
conversation_floater->addConversationViewParticipant(participant_model, !skip_updating);
|
||||
}
|
||||
}
|
||||
else if (type == "update_participant")
|
||||
|
|
@ -571,12 +593,6 @@ bool LLFloaterIMContainer::onConversationModelEvent(const LLSD& event)
|
|||
|
||||
mConversationViewModel.requestSortAll();
|
||||
mConversationsRoot->arrangeAll();
|
||||
if (conversation_floater)
|
||||
{
|
||||
conversation_floater->refreshConversation();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void LLFloaterIMContainer::draw()
|
||||
|
|
@ -1409,12 +1425,21 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v
|
|||
{
|
||||
return is_single_select;
|
||||
}
|
||||
|
||||
// Beyond that point, if only the user agent is selected, everything is disabled
|
||||
if (is_single_select && (single_id == gAgentID))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool is_moderator_option = ("can_moderate_voice" == item) || ("can_allow_text_chat" == item) || ("can_mute" == item) || ("can_unmute" == item);
|
||||
|
||||
// Beyond that point, if only the user agent is selected, everything is disabled
|
||||
if (is_single_select && (single_id == gAgentID))
|
||||
{
|
||||
if (is_moderator_option)
|
||||
{
|
||||
return enableModerateContextMenuItem(item, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// If the user agent is selected with others, everything is disabled
|
||||
for (uuid_vec_t::const_iterator id = uuids.begin(); id != uuids.end(); ++id)
|
||||
|
|
@ -1480,11 +1505,11 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v
|
|||
{
|
||||
return canBanSelectedMember(single_id);
|
||||
}
|
||||
else if (("can_moderate_voice" == item) || ("can_allow_text_chat" == item) || ("can_mute" == item) || ("can_unmute" == item))
|
||||
{
|
||||
// *TODO : get that out of here...
|
||||
return enableModerateContextMenuItem(item);
|
||||
}
|
||||
else if (is_moderator_option)
|
||||
{
|
||||
// *TODO : get that out of here...
|
||||
return enableModerateContextMenuItem(item);
|
||||
}
|
||||
|
||||
// By default, options that not explicitely disabled are enabled
|
||||
return true;
|
||||
|
|
@ -1854,7 +1879,7 @@ LLConversationViewParticipant* LLFloaterIMContainer::createConversationViewParti
|
|||
return LLUICtrlFactory::create<LLConversationViewParticipant>(params);
|
||||
}
|
||||
|
||||
bool LLFloaterIMContainer::enableModerateContextMenuItem(const std::string& userdata)
|
||||
bool LLFloaterIMContainer::enableModerateContextMenuItem(const std::string& userdata, bool is_self)
|
||||
{
|
||||
// only group moderators can perform actions related to this "enable callback"
|
||||
if (!isGroupModerator())
|
||||
|
|
@ -1874,7 +1899,7 @@ bool LLFloaterIMContainer::enableModerateContextMenuItem(const std::string& user
|
|||
{
|
||||
return voice_channel;
|
||||
}
|
||||
else if ("can_mute" == userdata)
|
||||
else if (("can_mute" == userdata) && !is_self)
|
||||
{
|
||||
return voice_channel && !isMuted(getCurSelectedViewModelItem()->getUUID());
|
||||
}
|
||||
|
|
@ -1884,7 +1909,7 @@ bool LLFloaterIMContainer::enableModerateContextMenuItem(const std::string& user
|
|||
}
|
||||
|
||||
// The last invoke is used to check whether the "can_allow_text_chat" will enabled
|
||||
return LLVoiceClient::getInstance()->isParticipantAvatar(getCurSelectedViewModelItem()->getUUID());
|
||||
return LLVoiceClient::getInstance()->isParticipantAvatar(getCurSelectedViewModelItem()->getUUID()) && !is_self;
|
||||
}
|
||||
|
||||
bool LLFloaterIMContainer::isGroupModerator()
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue