diff options
49 files changed, 1105 insertions, 1153 deletions
| diff --git a/indra/llcommon/llerror.h b/indra/llcommon/llerror.h index d06c0e2132..b7dec3cb7f 100644 --- a/indra/llcommon/llerror.h +++ b/indra/llcommon/llerror.h @@ -82,9 +82,11 @@ const int LL_ERR_NOERR = 0;  #ifdef SHOW_ASSERT  #define llassert(func)			llassert_always_msg(func, #func) +#define llassert_msg(func, msg)	llassert_always_msg(func, msg)  #define llverify(func)			llassert_always_msg(func, #func)  #else  #define llassert(func) +#define llassert_msg(func, msg)  #define llverify(func)			do {if (func) {}} while(0)  #endif diff --git a/indra/llcommon/lluuid.cpp b/indra/llcommon/lluuid.cpp index fc04dca08d..3619a64ea9 100644 --- a/indra/llcommon/lluuid.cpp +++ b/indra/llcommon/lluuid.cpp @@ -1,31 +1,31 @@ -/**  +/**   * @file lluuid.cpp   *   * $LicenseInfo:firstyear=2000&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2010, Linden Research, Inc. - *  + *   * This library is free software; you can redistribute it and/or   * modify it under the terms of the GNU Lesser General Public   * License as published by the Free Software Foundation;   * version 2.1 of the License only. - *  + *   * This library is distributed in the hope that it will be useful,   * but WITHOUT ANY WARRANTY; without even the implied warranty of   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU   * Lesser General Public License for more details. - *  + *   * You should have received a copy of the GNU Lesser General Public   * License along with this library; if not, write to the Free Software   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  + *   * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA   * $/LicenseInfo$   */  #include "linden_common.h" -// We can't use WIN32_LEAN_AND_MEAN here, needs lots of includes. + // We can't use WIN32_LEAN_AND_MEAN here, needs lots of includes.  #if LL_WINDOWS  #include "llwin32headers.h"  // ugh, this is ugly.  We need to straighten out our linking for this library @@ -40,18 +40,17 @@  #include "lluuid.h"  #include "llerror.h"  #include "llrand.h" +#include "llmd5.h"  #include "llstring.h"  #include "lltimer.h"  #include "llthread.h"  #include "llmutex.h" -#include "llmd5.h" -#include "hbxxh.h"  const LLUUID LLUUID::null;  const LLTransactionID LLTransactionID::tnull;  // static  -LLMutex * LLUUID::mMutex = NULL; +LLMutex* LLUUID::mMutex = NULL; @@ -60,15 +59,15 @@ LLMutex * LLUUID::mMutex = NULL;  NOT DONE YET!!!  static char BASE85_TABLE[] = { -	'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', -	'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', -	'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', -	'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', -	'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', -	'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', -	'y', 'z', '!', '#', '$', '%', '&', '(', ')', '*', -	'+', '-', ';', '[', '=', '>', '?', '@', '^', '_', -	'`', '{', '|', '}', '~', '\0' +    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', +    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', +    'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', +    'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', +    'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', +    'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', +    'y', 'z', '!', '#', '$', '%', '&', '(', ')', '*', +    '+', '-', ';', '[', '=', '>', '?', '@', '^', '_', +    '`', '{', '|', '}', '~', '\0'  }; @@ -94,28 +93,28 @@ return ret;  void LLUUID::toBase85(char* out)  { -	U32* me = (U32*)&(mData[0]); -	for(S32 i = 0; i < 4; ++i) -	{ -		char* o = &out[i*i]; -		for(S32 j = 0; j < 5; ++j) -		{ -			o[4-j] = BASE85_TABLE[ me[i] % 85]; -			word /= 85; -		} -	} +    U32* me = (U32*)&(mData[0]); +    for(S32 i = 0; i < 4; ++i) +    { +        char* o = &out[i*i]; +        for(S32 j = 0; j < 5; ++j) +        { +            o[4-j] = BASE85_TABLE[ me[i] % 85]; +            word /= 85; +        } +    }  }  unsigned int decode( char const * fiveChars ) throw( bad_input_data )  { -	unsigned int ret = 0; -	for( S32 ix = 0; ix < 5; ++ix ) -	{ -		char * s = strchr( encodeTable, fiveChars[ ix ] ); -		ret = ret * 85 + (s-encodeTable); -	} -	return ret; -}  +    unsigned int ret = 0; +    for( S32 ix = 0; ix < 5; ++ix ) +    { +        char * s = strchr( encodeTable, fiveChars[ ix ] ); +        ret = ret * 85 + (s-encodeTable); +    } +    return ret; +}  */  #define LL_USE_JANKY_RANDOM_NUMBER_GENERATOR 0 @@ -130,8 +129,8 @@ static U64 sJankyRandomSeed(LLUUID::getRandomSeed());   */  U32 janky_fast_random_bytes()  { -	sJankyRandomSeed = U64L(1664525) * sJankyRandomSeed + U64L(1013904223);  -	return (U32)sJankyRandomSeed; +    sJankyRandomSeed = U64L(1664525) * sJankyRandomSeed + U64L(1013904223); +    return (U32)sJankyRandomSeed;  }  /** @@ -139,8 +138,8 @@ U32 janky_fast_random_bytes()   */  U32 janky_fast_random_byes_range(U32 val)  { -	sJankyRandomSeed = U64L(1664525) * sJankyRandomSeed + U64L(1013904223);  -	return (U32)(sJankyRandomSeed) % val;  +    sJankyRandomSeed = U64L(1664525) * sJankyRandomSeed + U64L(1013904223); +    return (U32)(sJankyRandomSeed) % val;  }  /** @@ -148,365 +147,362 @@ U32 janky_fast_random_byes_range(U32 val)   */  U32 janky_fast_random_seeded_bytes(U32 seed, U32 val)  { -	seed = U64L(1664525) * (U64)(seed) + U64L(1013904223);  -	return (U32)(seed) % val;  +    seed = U64L(1664525) * (U64)(seed)+U64L(1013904223); +    return (U32)(seed) % val;  }  #endif  // Common to all UUID implementations  void LLUUID::toString(std::string& out) const  { -	out = llformat( -		"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", -		(U8)(mData[0]), -		(U8)(mData[1]), -		(U8)(mData[2]), -		(U8)(mData[3]), -		(U8)(mData[4]), -		(U8)(mData[5]), -		(U8)(mData[6]), -		(U8)(mData[7]), -		(U8)(mData[8]), -		(U8)(mData[9]), -		(U8)(mData[10]), -		(U8)(mData[11]), -		(U8)(mData[12]), -		(U8)(mData[13]), -		(U8)(mData[14]), -		(U8)(mData[15])); +    out = llformat( +        "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", +        (U8)(mData[0]), +        (U8)(mData[1]), +        (U8)(mData[2]), +        (U8)(mData[3]), +        (U8)(mData[4]), +        (U8)(mData[5]), +        (U8)(mData[6]), +        (U8)(mData[7]), +        (U8)(mData[8]), +        (U8)(mData[9]), +        (U8)(mData[10]), +        (U8)(mData[11]), +        (U8)(mData[12]), +        (U8)(mData[13]), +        (U8)(mData[14]), +        (U8)(mData[15]));  }  // *TODO: deprecate -void LLUUID::toString(char *out) const +void LLUUID::toString(char* out) const  { -	std::string buffer; -	toString(buffer); -	strcpy(out,buffer.c_str()); /* Flawfinder: ignore */ +    std::string buffer; +    toString(buffer); +    strcpy(out, buffer.c_str()); /* Flawfinder: ignore */  }  void LLUUID::toCompressedString(std::string& out) const  { -	char bytes[UUID_BYTES+1]; -	memcpy(bytes, mData, UUID_BYTES);		/* Flawfinder: ignore */ -	bytes[UUID_BYTES] = '\0'; -	out.assign(bytes, UUID_BYTES); +    char bytes[UUID_BYTES + 1]; +    memcpy(bytes, mData, UUID_BYTES);		/* Flawfinder: ignore */ +    bytes[UUID_BYTES] = '\0'; +    out.assign(bytes, UUID_BYTES);  }  // *TODO: deprecate -void LLUUID::toCompressedString(char *out) const +void LLUUID::toCompressedString(char* out) const  { -	memcpy(out, mData, UUID_BYTES);		/* Flawfinder: ignore */ -	out[UUID_BYTES] = '\0'; +    memcpy(out, mData, UUID_BYTES);		/* Flawfinder: ignore */ +    out[UUID_BYTES] = '\0';  }  std::string LLUUID::getString() const  { -	return asString(); +    return asString();  }  std::string LLUUID::asString() const  { -	std::string str; -	toString(str); -	return str; +    std::string str; +    toString(str); +    return str;  }  BOOL LLUUID::set(const char* in_string, BOOL emit)  { -	return set(ll_safe_string(in_string),emit); +    return set(ll_safe_string(in_string), emit);  }  BOOL LLUUID::set(const std::string& in_string, BOOL emit)  { -	BOOL broken_format = FALSE; - -	// empty strings should make NULL uuid -	if (in_string.empty()) -	{ -		setNull(); -		return TRUE; -	} - -	if (in_string.length() != (UUID_STR_LENGTH - 1))		/* Flawfinder: ignore */ -	{ -		// I'm a moron.  First implementation didn't have the right UUID format. -		// Shouldn't see any of these any more -		if (in_string.length() == (UUID_STR_LENGTH - 2))	/* Flawfinder: ignore */ -		{ -			if(emit) -			{ -				LL_WARNS() << "Warning! Using broken UUID string format" << LL_ENDL; -			} -			broken_format = TRUE; -		} -		else -		{ -			// Bad UUID string.  Spam as INFO, as most cases we don't care. -			if(emit) -			{ -				//don't spam the logs because a resident can't spell. -				LL_WARNS() << "Bad UUID string: " << in_string << LL_ENDL; -			} -			setNull(); -			return FALSE; -		} -	} - -	U8 cur_pos = 0; -	S32 i; -	for (i = 0; i < UUID_BYTES; i++) -	{ -		if ((i == 4) || (i == 6) || (i == 8) || (i == 10)) -		{ -			cur_pos++; -			if (broken_format && (i==10)) -			{ -				// Missing - in the broken format -				cur_pos--; -			} -		} - -		mData[i] = 0; - -		if ((in_string[cur_pos] >= '0') && (in_string[cur_pos] <= '9')) -		{ -			mData[i] += (U8)(in_string[cur_pos] - '0'); -		} -		else if ((in_string[cur_pos] >= 'a') && (in_string[cur_pos] <='f')) -		{ -			mData[i] += (U8)(10 + in_string[cur_pos] - 'a'); -		} -		else if ((in_string[cur_pos] >= 'A') && (in_string[cur_pos] <='F')) -		{ -			mData[i] += (U8)(10 + in_string[cur_pos] - 'A'); -		} -		else -		{ -			if(emit) -			{							 -				LL_WARNS() << "Invalid UUID string character" << LL_ENDL; -			} -			setNull(); -			return FALSE; -		} - -		mData[i] = mData[i] << 4; -		cur_pos++; - -		if ((in_string[cur_pos] >= '0') && (in_string[cur_pos] <= '9')) -		{ -			mData[i] += (U8)(in_string[cur_pos] - '0'); -		} -		else if ((in_string[cur_pos] >= 'a') && (in_string[cur_pos] <='f')) -		{ -			mData[i] += (U8)(10 + in_string[cur_pos] - 'a'); -		} -		else if ((in_string[cur_pos] >= 'A') && (in_string[cur_pos] <='F')) -		{ -			mData[i] += (U8)(10 + in_string[cur_pos] - 'A'); -		} -		else -		{ -			if(emit) -			{ -				LL_WARNS() << "Invalid UUID string character" << LL_ENDL; -			} -			setNull(); -			return FALSE; -		} -		cur_pos++; -	} - -	return TRUE; +    BOOL broken_format = FALSE; + +    // empty strings should make NULL uuid +    if (in_string.empty()) +    { +        setNull(); +        return TRUE; +    } + +    if (in_string.length() != (UUID_STR_LENGTH - 1))		/* Flawfinder: ignore */ +    { +        // I'm a moron.  First implementation didn't have the right UUID format. +        // Shouldn't see any of these any more +        if (in_string.length() == (UUID_STR_LENGTH - 2))	/* Flawfinder: ignore */ +        { +            if (emit) +            { +                LL_WARNS() << "Warning! Using broken UUID string format" << LL_ENDL; +            } +            broken_format = TRUE; +        } +        else +        { +            // Bad UUID string.  Spam as INFO, as most cases we don't care. +            if (emit) +            { +                //don't spam the logs because a resident can't spell. +                LL_WARNS() << "Bad UUID string: " << in_string << LL_ENDL; +            } +            setNull(); +            return FALSE; +        } +    } + +    U8 cur_pos = 0; +    S32 i; +    for (i = 0; i < UUID_BYTES; i++) +    { +        if ((i == 4) || (i == 6) || (i == 8) || (i == 10)) +        { +            cur_pos++; +            if (broken_format && (i == 10)) +            { +                // Missing - in the broken format +                cur_pos--; +            } +        } + +        mData[i] = 0; + +        if ((in_string[cur_pos] >= '0') && (in_string[cur_pos] <= '9')) +        { +            mData[i] += (U8)(in_string[cur_pos] - '0'); +        } +        else if ((in_string[cur_pos] >= 'a') && (in_string[cur_pos] <= 'f')) +        { +            mData[i] += (U8)(10 + in_string[cur_pos] - 'a'); +        } +        else if ((in_string[cur_pos] >= 'A') && (in_string[cur_pos] <= 'F')) +        { +            mData[i] += (U8)(10 + in_string[cur_pos] - 'A'); +        } +        else +        { +            if (emit) +            { +                LL_WARNS() << "Invalid UUID string character" << LL_ENDL; +            } +            setNull(); +            return FALSE; +        } + +        mData[i] = mData[i] << 4; +        cur_pos++; + +        if ((in_string[cur_pos] >= '0') && (in_string[cur_pos] <= '9')) +        { +            mData[i] += (U8)(in_string[cur_pos] - '0'); +        } +        else if ((in_string[cur_pos] >= 'a') && (in_string[cur_pos] <= 'f')) +        { +            mData[i] += (U8)(10 + in_string[cur_pos] - 'a'); +        } +        else if ((in_string[cur_pos] >= 'A') && (in_string[cur_pos] <= 'F')) +        { +            mData[i] += (U8)(10 + in_string[cur_pos] - 'A'); +        } +        else +        { +            if (emit) +            { +                LL_WARNS() << "Invalid UUID string character" << LL_ENDL; +            } +            setNull(); +            return FALSE; +        } +        cur_pos++; +    } + +    return TRUE;  }  BOOL LLUUID::validate(const std::string& in_string)  { -	BOOL broken_format = FALSE; -	if (in_string.length() != (UUID_STR_LENGTH - 1))		/* Flawfinder: ignore */ -	{ -		// I'm a moron.  First implementation didn't have the right UUID format. -		if (in_string.length() == (UUID_STR_LENGTH - 2))		/* Flawfinder: ignore */ -		{ -			broken_format = TRUE; -		} -		else -		{ -			return FALSE; -		} -	} - -	U8 cur_pos = 0; -	for (U32 i = 0; i < 16; i++) -	{ -		if ((i == 4) || (i == 6) || (i == 8) || (i == 10)) -		{ -			cur_pos++; -			if (broken_format && (i==10)) -			{ -				// Missing - in the broken format -				cur_pos--; -			} -		} - -		if ((in_string[cur_pos] >= '0') && (in_string[cur_pos] <= '9')) -		{ -		} -		else if ((in_string[cur_pos] >= 'a') && (in_string[cur_pos] <='f')) -		{ -		} -		else if ((in_string[cur_pos] >= 'A') && (in_string[cur_pos] <='F')) -		{ -		} -		else -		{ -			return FALSE; -		} - -		cur_pos++; - -		if ((in_string[cur_pos] >= '0') && (in_string[cur_pos] <= '9')) -		{ -		} -		else if ((in_string[cur_pos] >= 'a') && (in_string[cur_pos] <='f')) -		{ -		} -		else if ((in_string[cur_pos] >= 'A') && (in_string[cur_pos] <='F')) -		{ -		} -		else -		{ -			return FALSE; -		} -		cur_pos++; -	} -	return TRUE; +    BOOL broken_format = FALSE; +    if (in_string.length() != (UUID_STR_LENGTH - 1))		/* Flawfinder: ignore */ +    { +        // I'm a moron.  First implementation didn't have the right UUID format. +        if (in_string.length() == (UUID_STR_LENGTH - 2))		/* Flawfinder: ignore */ +        { +            broken_format = TRUE; +        } +        else +        { +            return FALSE; +        } +    } + +    U8 cur_pos = 0; +    for (U32 i = 0; i < 16; i++) +    { +        if ((i == 4) || (i == 6) || (i == 8) || (i == 10)) +        { +            cur_pos++; +            if (broken_format && (i == 10)) +            { +                // Missing - in the broken format +                cur_pos--; +            } +        } + +        if ((in_string[cur_pos] >= '0') && (in_string[cur_pos] <= '9')) +        { +        } +        else if ((in_string[cur_pos] >= 'a') && (in_string[cur_pos] <= 'f')) +        { +        } +        else if ((in_string[cur_pos] >= 'A') && (in_string[cur_pos] <= 'F')) +        { +        } +        else +        { +            return FALSE; +        } + +        cur_pos++; + +        if ((in_string[cur_pos] >= '0') && (in_string[cur_pos] <= '9')) +        { +        } +        else if ((in_string[cur_pos] >= 'a') && (in_string[cur_pos] <= 'f')) +        { +        } +        else if ((in_string[cur_pos] >= 'A') && (in_string[cur_pos] <= 'F')) +        { +        } +        else +        { +            return FALSE; +        } +        cur_pos++; +    } +    return TRUE;  }  const LLUUID& LLUUID::operator^=(const LLUUID& rhs)  { -	U32* me = (U32*)&(mData[0]); -	const U32* other = (U32*)&(rhs.mData[0]); -	for(S32 i = 0; i < 4; ++i) -	{ -		me[i] = me[i] ^ other[i]; -	} -	return *this; +    U32* me = (U32*)&(mData[0]); +    const U32* other = (U32*)&(rhs.mData[0]); +    for (S32 i = 0; i < 4; ++i) +    { +        me[i] = me[i] ^ other[i]; +    } +    return *this;  }  LLUUID LLUUID::operator^(const LLUUID& rhs) const  { -	LLUUID id(*this); -	id ^= rhs; -	return id; +    LLUUID id(*this); +    id ^= rhs; +    return id;  } -// WARNING: this algorithm SHALL NOT be changed. It is also used by the server -// and plays a role in some assets validation (e.g. clothing items). Changing -// it would cause invalid assets.  void LLUUID::combine(const LLUUID& other, LLUUID& result) const  { -	LLMD5 md5_uuid; -	md5_uuid.update((unsigned char*)mData, 16); -	md5_uuid.update((unsigned char*)other.mData, 16); -	md5_uuid.finalize(); -	md5_uuid.raw_digest(result.mData); +    LLMD5 md5_uuid; +    md5_uuid.update((unsigned char*)mData, 16); +    md5_uuid.update((unsigned char*)other.mData, 16); +    md5_uuid.finalize(); +    md5_uuid.raw_digest(result.mData);  } -LLUUID LLUUID::combine(const LLUUID &other) const +LLUUID LLUUID::combine(const LLUUID& other) const  { -	LLUUID combination; -	combine(other, combination); -	return combination; +    LLUUID combination; +    combine(other, combination); +    return combination;  } -std::ostream& operator<<(std::ostream& s, const LLUUID &uuid) +std::ostream& operator<<(std::ostream& s, const LLUUID& uuid)  { -	std::string uuid_str; -	uuid.toString(uuid_str); -	s << uuid_str; -	return s; +    std::string uuid_str; +    uuid.toString(uuid_str); +    s << uuid_str; +    return s;  } -std::istream& operator>>(std::istream &s, LLUUID &uuid) +std::istream& operator>>(std::istream& s, LLUUID& uuid)  { -	U32 i; -	char uuid_str[UUID_STR_LENGTH];		/* Flawfinder: ignore */ -	for (i = 0; i < UUID_STR_LENGTH-1; i++) -	{ -		s >> uuid_str[i]; -	} -	uuid_str[i] = '\0'; -	uuid.set(std::string(uuid_str)); -	return s; +    U32 i; +    char uuid_str[UUID_STR_LENGTH];		/* Flawfinder: ignore */ +    for (i = 0; i < UUID_STR_LENGTH - 1; i++) +    { +        s >> uuid_str[i]; +    } +    uuid_str[i] = '\0'; +    uuid.set(std::string(uuid_str)); +    return s;  } -static void get_random_bytes(void *buf, int nbytes) +static void get_random_bytes(void* buf, int nbytes)  { -	int i; -	char *cp = (char *) buf; - -	// *NOTE: If we are not using the janky generator ll_rand() -	// generates at least 3 good bytes of data since it is 0 to -	// RAND_MAX. This could be made more efficient by copying all the -	// bytes. -	for (i=0; i < nbytes; i++) +    int i; +    char* cp = (char*)buf; + +    // *NOTE: If we are not using the janky generator ll_rand() +    // generates at least 3 good bytes of data since it is 0 to +    // RAND_MAX. This could be made more efficient by copying all the +    // bytes. +    for (i = 0; i < nbytes; i++)  #if LL_USE_JANKY_RANDOM_NUMBER_GENERATOR -		*cp++ = janky_fast_random_bytes() & 0xFF; +        * cp++ = janky_fast_random_bytes() & 0xFF;  #else -		*cp++ = ll_rand() & 0xFF; +        * cp++ = ll_rand() & 0xFF;  #endif -	return;	 +    return;  }  #if	LL_WINDOWS  typedef struct _ASTAT_  { -	ADAPTER_STATUS adapt; -	NAME_BUFFER    NameBuff [30]; +    ADAPTER_STATUS adapt; +    NAME_BUFFER    NameBuff[30];  }ASTAT, * PASTAT;  // static -S32	LLUUID::getNodeID(unsigned char	*node_id) +S32	LLUUID::getNodeID(unsigned char* node_id)  { -	ASTAT Adapter; -	NCB Ncb; -	UCHAR uRetCode; -	LANA_ENUM   lenum; -	int      i; -	int retval = 0; - -	memset( &Ncb, 0, sizeof(Ncb) ); -	Ncb.ncb_command = NCBENUM; -	Ncb.ncb_buffer = (UCHAR *)&lenum; -	Ncb.ncb_length = sizeof(lenum); -	uRetCode = Netbios( &Ncb ); - -	for(i=0; i < lenum.length ;i++) -	{ -		memset( &Ncb, 0, sizeof(Ncb) ); -		Ncb.ncb_command = NCBRESET; -		Ncb.ncb_lana_num = lenum.lana[i]; - -		uRetCode = Netbios( &Ncb ); - -		memset( &Ncb, 0, sizeof (Ncb) ); -		Ncb.ncb_command = NCBASTAT; -		Ncb.ncb_lana_num = lenum.lana[i]; - -		strcpy( (char *)Ncb.ncb_callname,  "*              " );		/* Flawfinder: ignore */ -		Ncb.ncb_buffer = (unsigned char *)&Adapter; -		Ncb.ncb_length = sizeof(Adapter); - -		uRetCode = Netbios( &Ncb ); -		if ( uRetCode == 0 ) -		{ -			memcpy(node_id,Adapter.adapt.adapter_address,6);		/* Flawfinder: ignore */ -			retval = 1; -		} -	} -	return retval; +    ASTAT Adapter; +    NCB Ncb; +    UCHAR uRetCode; +    LANA_ENUM   lenum; +    int      i; +    int retval = 0; + +    memset(&Ncb, 0, sizeof(Ncb)); +    Ncb.ncb_command = NCBENUM; +    Ncb.ncb_buffer = (UCHAR*)&lenum; +    Ncb.ncb_length = sizeof(lenum); +    uRetCode = Netbios(&Ncb); + +    for (i = 0; i < lenum.length; i++) +    { +        memset(&Ncb, 0, sizeof(Ncb)); +        Ncb.ncb_command = NCBRESET; +        Ncb.ncb_lana_num = lenum.lana[i]; + +        uRetCode = Netbios(&Ncb); + +        memset(&Ncb, 0, sizeof(Ncb)); +        Ncb.ncb_command = NCBASTAT; +        Ncb.ncb_lana_num = lenum.lana[i]; + +        strcpy((char*)Ncb.ncb_callname, "*              ");		/* Flawfinder: ignore */ +        Ncb.ncb_buffer = (unsigned char*)&Adapter; +        Ncb.ncb_length = sizeof(Adapter); + +        uRetCode = Netbios(&Ncb); +        if (uRetCode == 0) +        { +            memcpy(node_id, Adapter.adapt.adapter_address, 6);		/* Flawfinder: ignore */ +            retval = 1; +        } +    } +    return retval;  }  #elif LL_DARWIN @@ -525,66 +521,66 @@ S32	LLUUID::getNodeID(unsigned char	*node_id)  #include <net/route.h>  #include <ifaddrs.h> -// static -S32 LLUUID::getNodeID(unsigned char *node_id) + // static +S32 LLUUID::getNodeID(unsigned char* node_id)  { -	int i; -	unsigned char 	*a = NULL; -	struct ifaddrs *ifap, *ifa; -	int rv; -	S32 result = 0; - -	if ((rv=getifaddrs(&ifap))==-1) -	{        -		return -1; -	} -	if (ifap == NULL) -	{ -		return -1; -	} - -	for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) -	{        -//		printf("Interface %s, address family %d, ", ifa->ifa_name, ifa->ifa_addr->sa_family); -		for(i=0; i< ifa->ifa_addr->sa_len; i++) -		{ -//			printf("%02X ", (unsigned char)ifa->ifa_addr->sa_data[i]); -		} -//		printf("\n"); -		 -		if(ifa->ifa_addr->sa_family == AF_LINK) -		{ -			// This is a link-level address -			struct sockaddr_dl *lla = (struct sockaddr_dl *)ifa->ifa_addr; -			 -//			printf("\tLink level address, type %02X\n", lla->sdl_type); - -			if(lla->sdl_type == IFT_ETHER) -			{ -				// Use the first ethernet MAC in the list. -				// For some reason, the macro LLADDR() defined in net/if_dl.h doesn't expand correctly.  This is what it would do. -				a = (unsigned char *)&((lla)->sdl_data); -				a += (lla)->sdl_nlen; -				 -				if (!a[0] && !a[1] && !a[2] && !a[3] && !a[4] && !a[5]) -				{ -					continue; -				} - -				if (node_id)  -				{ -					memcpy(node_id, a, 6); -					result = 1; -				} -				 -				// We found one. -				break; -			} -		} -	} -	freeifaddrs(ifap); - -	return result; +    int i; +    unsigned char* a = NULL; +    struct ifaddrs* ifap, * ifa; +    int rv; +    S32 result = 0; + +    if ((rv = getifaddrs(&ifap)) == -1) +    { +        return -1; +    } +    if (ifap == NULL) +    { +        return -1; +    } + +    for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) +    { +        //		printf("Interface %s, address family %d, ", ifa->ifa_name, ifa->ifa_addr->sa_family); +        for (i = 0; i < ifa->ifa_addr->sa_len; i++) +        { +            //			printf("%02X ", (unsigned char)ifa->ifa_addr->sa_data[i]); +        } +        //		printf("\n"); + +        if (ifa->ifa_addr->sa_family == AF_LINK) +        { +            // This is a link-level address +            struct sockaddr_dl* lla = (struct sockaddr_dl*)ifa->ifa_addr; + +            //			printf("\tLink level address, type %02X\n", lla->sdl_type); + +            if (lla->sdl_type == IFT_ETHER) +            { +                // Use the first ethernet MAC in the list. +                // For some reason, the macro LLADDR() defined in net/if_dl.h doesn't expand correctly.  This is what it would do. +                a = (unsigned char*)&((lla)->sdl_data); +                a += (lla)->sdl_nlen; + +                if (!a[0] && !a[1] && !a[2] && !a[3] && !a[4] && !a[5]) +                { +                    continue; +                } + +                if (node_id) +                { +                    memcpy(node_id, a, 6); +                    result = 1; +                } + +                // We found one. +                break; +            } +        } +    } +    freeifaddrs(ifap); + +    return result;  }  #else @@ -611,22 +607,22 @@ S32 LLUUID::getNodeID(unsigned char *node_id)  #endif  #endif -// static -S32 LLUUID::getNodeID(unsigned char *node_id) + // static +S32 LLUUID::getNodeID(unsigned char* node_id)  { -	int 		sd; -	struct ifreq 	ifr, *ifrp; -	struct ifconf 	ifc; -	char buf[1024]; -	int		n, i; -	unsigned char 	*a; -	 -/* - * BSD 4.4 defines the size of an ifreq to be - * max(sizeof(ifreq), sizeof(ifreq.ifr_name)+ifreq.ifr_addr.sa_len - * However, under earlier systems, sa_len isn't present, so the size is  - * just sizeof(struct ifreq) - */ +    int 		sd; +    struct ifreq 	ifr, * ifrp; +    struct ifconf 	ifc; +    char buf[1024]; +    int		n, i; +    unsigned char* a; + +    /* +     * BSD 4.4 defines the size of an ifreq to be +     * max(sizeof(ifreq), sizeof(ifreq.ifr_name)+ifreq.ifr_addr.sa_len +     * However, under earlier systems, sa_len isn't present, so the size is +     * just sizeof(struct ifreq) +     */  #ifdef HAVE_SA_LEN  #ifndef max  #define max(a,b) ((a) > (b) ? (a) : (b)) @@ -637,345 +633,356 @@ S32 LLUUID::getNodeID(unsigned char *node_id)  #define ifreq_size(i) sizeof(struct ifreq)  #endif /* HAVE_SA_LEN*/ -	sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); -	if (sd < 0) { -		return -1; -	} -	memset(buf, 0, sizeof(buf)); -	ifc.ifc_len = sizeof(buf); -	ifc.ifc_buf = buf; -	if (ioctl (sd, SIOCGIFCONF, (char *)&ifc) < 0) { -		close(sd); -		return -1; -	} -	n = ifc.ifc_len; -	for (i = 0; i < n; i+= ifreq_size(*ifr) ) { -		ifrp = (struct ifreq *)((char *) ifc.ifc_buf+i); -		strncpy(ifr.ifr_name, ifrp->ifr_name, IFNAMSIZ);		/* Flawfinder: ignore */ +    sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); +    if (sd < 0) { +        return -1; +    } +    memset(buf, 0, sizeof(buf)); +    ifc.ifc_len = sizeof(buf); +    ifc.ifc_buf = buf; +    if (ioctl(sd, SIOCGIFCONF, (char*)&ifc) < 0) { +        close(sd); +        return -1; +    } +    n = ifc.ifc_len; +    for (i = 0; i < n; i += ifreq_size(*ifr)) { +        ifrp = (struct ifreq*)((char*)ifc.ifc_buf + i); +        strncpy(ifr.ifr_name, ifrp->ifr_name, IFNAMSIZ);		/* Flawfinder: ignore */  #ifdef SIOCGIFHWADDR -		if (ioctl(sd, SIOCGIFHWADDR, &ifr) < 0) -			continue; -		a = (unsigned char *) &ifr.ifr_hwaddr.sa_data; +        if (ioctl(sd, SIOCGIFHWADDR, &ifr) < 0) +            continue; +        a = (unsigned char*)&ifr.ifr_hwaddr.sa_data;  #else  #ifdef SIOCGENADDR -		if (ioctl(sd, SIOCGENADDR, &ifr) < 0) -			continue; -		a = (unsigned char *) ifr.ifr_enaddr; +        if (ioctl(sd, SIOCGENADDR, &ifr) < 0) +            continue; +        a = (unsigned char*)ifr.ifr_enaddr;  #else -		/* -		 * XXX we don't have a way of getting the hardware -		 * address -		 */ -		close(sd); -		return 0; +        /* +         * XXX we don't have a way of getting the hardware +         * address +         */ +        close(sd); +        return 0;  #endif /* SIOCGENADDR */  #endif /* SIOCGIFHWADDR */ -		if (!a[0] && !a[1] && !a[2] && !a[3] && !a[4] && !a[5]) -			continue; -		if (node_id) { -			memcpy(node_id, a, 6);		/* Flawfinder: ignore */ -			close(sd); -			return 1; -		} -	} -	close(sd); -	return 0; +        if (!a[0] && !a[1] && !a[2] && !a[3] && !a[4] && !a[5]) +            continue; +        if (node_id) { +            memcpy(node_id, a, 6);		/* Flawfinder: ignore */ +            close(sd); +            return 1; +        } +    } +    close(sd); +    return 0;  }  #endif -S32 LLUUID::cmpTime(uuid_time_t *t1, uuid_time_t *t2) +S32 LLUUID::cmpTime(uuid_time_t* t1, uuid_time_t* t2)  { -   // Compare two time values. +    // Compare two time values. -   if (t1->high < t2->high) return -1; -   if (t1->high > t2->high) return 1; -   if (t1->low  < t2->low)  return -1; -   if (t1->low  > t2->low)  return 1; -   return 0; +    if (t1->high < t2->high) return -1; +    if (t1->high > t2->high) return 1; +    if (t1->low < t2->low)  return -1; +    if (t1->low > t2->low)  return 1; +    return 0;  } -void LLUUID::getSystemTime(uuid_time_t *timestamp) +void LLUUID::getSystemTime(uuid_time_t* timestamp)  { -   // Get system time with 100ns precision. Time is since Oct 15, 1582. +    // Get system time with 100ns precision. Time is since Oct 15, 1582.  #if LL_WINDOWS -   ULARGE_INTEGER time; -   GetSystemTimeAsFileTime((FILETIME *)&time); -   // NT keeps time in FILETIME format which is 100ns ticks since -   // Jan 1, 1601. UUIDs use time in 100ns ticks since Oct 15, 1582. -   // The difference is 17 Days in Oct + 30 (Nov) + 31 (Dec) -   // + 18 years and 5 leap days. -   time.QuadPart += -            (unsigned __int64) (1000*1000*10)       // seconds -          * (unsigned __int64) (60 * 60 * 24)       // days -          * (unsigned __int64) (17+30+31+365*18+5); // # of days - -   timestamp->high = time.HighPart; -   timestamp->low  = time.LowPart; +    ULARGE_INTEGER time; +    GetSystemTimeAsFileTime((FILETIME*)&time); +    // NT keeps time in FILETIME format which is 100ns ticks since +    // Jan 1, 1601. UUIDs use time in 100ns ticks since Oct 15, 1582. +    // The difference is 17 Days in Oct + 30 (Nov) + 31 (Dec) +    // + 18 years and 5 leap days. +    time.QuadPart += +        (unsigned __int64)(1000 * 1000 * 10)       // seconds +        * (unsigned __int64)(60 * 60 * 24)       // days +        * (unsigned __int64)(17 + 30 + 31 + 365 * 18 + 5); // # of days + +    timestamp->high = time.HighPart; +    timestamp->low = time.LowPart;  #else -   struct timeval tp; -   gettimeofday(&tp, 0); - -   // Offset between UUID formatted times and Unix formatted times. -   // UUID UTC base time is October 15, 1582. -   // Unix base time is January 1, 1970. -   U64 uuid_time = ((U64)tp.tv_sec * 10000000) + (tp.tv_usec * 10) + -                           U64L(0x01B21DD213814000); -   timestamp->high = (U32) (uuid_time >> 32); -   timestamp->low  = (U32) (uuid_time & 0xFFFFFFFF); +    struct timeval tp; +    gettimeofday(&tp, 0); + +    // Offset between UUID formatted times and Unix formatted times. +    // UUID UTC base time is October 15, 1582. +    // Unix base time is January 1, 1970. +    U64 uuid_time = ((U64)tp.tv_sec * 10000000) + (tp.tv_usec * 10) + +        U64L(0x01B21DD213814000); +    timestamp->high = (U32)(uuid_time >> 32); +    timestamp->low = (U32)(uuid_time & 0xFFFFFFFF);  #endif  } -void LLUUID::getCurrentTime(uuid_time_t *timestamp) +void LLUUID::getCurrentTime(uuid_time_t* timestamp)  { -   // Get current time as 60 bit 100ns ticks since whenever. -   // Compensate for the fact that real clock resolution is less -   // than 100ns. - -   const U32 uuids_per_tick = 1024; - -   static uuid_time_t time_last; -   static U32    uuids_this_tick; -   static BOOL     init = FALSE; - -   if (!init) { -      getSystemTime(&time_last); -      uuids_this_tick = uuids_per_tick; -      init = TRUE; -      mMutex = new LLMutex(); -   } - -   uuid_time_t time_now = {0,0}; - -   while (1) { -      getSystemTime(&time_now); - -      // if clock reading changed since last UUID generated -      if (cmpTime(&time_last, &time_now))  { -         // reset count of uuid's generated with this clock reading -         uuids_this_tick = 0; -         break; -      } -      if (uuids_this_tick < uuids_per_tick) { -         uuids_this_tick++; -         break; -      } -      // going too fast for our clock; spin -   } - -   time_last = time_now; - -   if (uuids_this_tick != 0) { -      if (time_now.low & 0x80000000) { -         time_now.low += uuids_this_tick; -         if (!(time_now.low & 0x80000000)) -            time_now.high++; -      } else -         time_now.low += uuids_this_tick; -   } - -   timestamp->high = time_now.high; -   timestamp->low  = time_now.low; +    // Get current time as 60 bit 100ns ticks since whenever. +    // Compensate for the fact that real clock resolution is less +    // than 100ns. + +    const U32 uuids_per_tick = 1024; + +    static uuid_time_t time_last; +    static U32    uuids_this_tick; +    static BOOL     init = FALSE; + +    if (!init) { +        getSystemTime(&time_last); +        uuids_this_tick = uuids_per_tick; +        init = TRUE; +        mMutex = new LLMutex(); +    } + +    uuid_time_t time_now = { 0,0 }; + +    while (1) { +        getSystemTime(&time_now); + +        // if clock reading changed since last UUID generated +        if (cmpTime(&time_last, &time_now)) { +            // reset count of uuid's generated with this clock reading +            uuids_this_tick = 0; +            break; +        } +        if (uuids_this_tick < uuids_per_tick) { +            uuids_this_tick++; +            break; +        } +        // going too fast for our clock; spin +    } + +    time_last = time_now; + +    if (uuids_this_tick != 0) { +        if (time_now.low & 0x80000000) { +            time_now.low += uuids_this_tick; +            if (!(time_now.low & 0x80000000)) +                time_now.high++; +        } +        else +            time_now.low += uuids_this_tick; +    } + +    timestamp->high = time_now.high; +    timestamp->low = time_now.low;  }  void LLUUID::generate()  { -	// Create a UUID. -	uuid_time_t timestamp; - -	static unsigned char node_id[6];	/* Flawfinder: ignore */ -	static int has_init = 0; -    -	// Create a UUID. -	static uuid_time_t time_last = {0,0}; -	static U16 clock_seq = 0; +    // Create a UUID. +    uuid_time_t timestamp; + +    static unsigned char node_id[6];	/* Flawfinder: ignore */ +    static int has_init = 0; + +    // Create a UUID. +    static uuid_time_t time_last = { 0,0 }; +    static U16 clock_seq = 0;  #if LL_USE_JANKY_RANDOM_NUMBER_GENERATOR -	static U32 seed = 0L; // dummy seed.  reset it below +    static U32 seed = 0L; // dummy seed.  reset it below  #endif -	if (!has_init)  -	{ -		has_init = 1; -		if (getNodeID(node_id) <= 0)  -		{ -			get_random_bytes(node_id, 6); -			/* -			 * Set multicast bit, to prevent conflicts -			 * with IEEE 802 addresses obtained from -			 * network cards -			 */ -			node_id[0] |= 0x80; -		} - -		getCurrentTime(&time_last); +    if (!has_init) +    { +        has_init = 1; +        if (getNodeID(node_id) <= 0) +        { +            get_random_bytes(node_id, 6); +            /* +             * Set multicast bit, to prevent conflicts +             * with IEEE 802 addresses obtained from +             * network cards +             */ +            node_id[0] |= 0x80; +        } + +        getCurrentTime(&time_last);  #if LL_USE_JANKY_RANDOM_NUMBER_GENERATOR -		seed = time_last.low; +        seed = time_last.low;  #endif  #if LL_USE_JANKY_RANDOM_NUMBER_GENERATOR -		clock_seq = (U16)janky_fast_random_seeded_bytes(seed, 65536); +        clock_seq = (U16)janky_fast_random_seeded_bytes(seed, 65536);  #else -		clock_seq = (U16)ll_rand(65536); +        clock_seq = (U16)ll_rand(65536);  #endif -	} - -	// get current time -	getCurrentTime(×tamp); -	U16 our_clock_seq = clock_seq; - -	// if clock hasn't changed or went backward, change clockseq -	if (cmpTime(×tamp, &time_last) != 1)  -	{ -		LLMutexLock	lock(mMutex); -		clock_seq = (clock_seq + 1) & 0x3FFF; -		if (clock_seq == 0)  -			clock_seq++; -		our_clock_seq = clock_seq;	// Ensure we're using a different clock_seq value from previous time -	} +    } + +    // get current time +    getCurrentTime(×tamp); +    U16 our_clock_seq = clock_seq; + +    // if clock hasn't changed or went backward, change clockseq +    if (cmpTime(×tamp, &time_last) != 1) +    { +        LLMutexLock	lock(mMutex); +        clock_seq = (clock_seq + 1) & 0x3FFF; +        if (clock_seq == 0) +            clock_seq++; +        our_clock_seq = clock_seq;	// Ensure we're using a different clock_seq value from previous time +    }      time_last = timestamp; -	memcpy(mData+10, node_id, 6);		/* Flawfinder: ignore */ -	U32 tmp; -	tmp = timestamp.low; -	mData[3] = (unsigned char) tmp; -	tmp >>= 8; -	mData[2] = (unsigned char) tmp; -	tmp >>= 8; -	mData[1] = (unsigned char) tmp; -	tmp >>= 8; -	mData[0] = (unsigned char) tmp; -	 -	tmp = (U16) timestamp.high; -	mData[5] = (unsigned char) tmp; -	tmp >>= 8; -	mData[4] = (unsigned char) tmp; - -	tmp = (timestamp.high >> 16) | 0x1000; -	mData[7] = (unsigned char) tmp; -	tmp >>= 8; -	mData[6] = (unsigned char) tmp; - -	tmp = our_clock_seq; - -	mData[9] = (unsigned char) tmp; -	tmp >>= 8; -	mData[8] = (unsigned char) tmp; - -	HBXXH128::digest(*this, (const void*)mData, 16); +    memcpy(mData + 10, node_id, 6);		/* Flawfinder: ignore */ +    U32 tmp; +    tmp = timestamp.low; +    mData[3] = (unsigned char)tmp; +    tmp >>= 8; +    mData[2] = (unsigned char)tmp; +    tmp >>= 8; +    mData[1] = (unsigned char)tmp; +    tmp >>= 8; +    mData[0] = (unsigned char)tmp; + +    tmp = (U16)timestamp.high; +    mData[5] = (unsigned char)tmp; +    tmp >>= 8; +    mData[4] = (unsigned char)tmp; + +    tmp = (timestamp.high >> 16) | 0x1000; +    mData[7] = (unsigned char)tmp; +    tmp >>= 8; +    mData[6] = (unsigned char)tmp; + +    tmp = our_clock_seq; + +    mData[9] = (unsigned char)tmp; +    tmp >>= 8; +    mData[8] = (unsigned char)tmp; + +    LLMD5 md5_uuid; + +    md5_uuid.update(mData, 16); +    md5_uuid.finalize(); +    md5_uuid.raw_digest(mData);  }  void LLUUID::generate(const std::string& hash_string)  { -	HBXXH128::digest(*this, hash_string); +    LLMD5 md5_uuid((U8*)hash_string.c_str()); +    md5_uuid.raw_digest(mData);  }  U32 LLUUID::getRandomSeed()  { -   static unsigned char seed[16];		/* Flawfinder: ignore */ -    -   getNodeID(&seed[0]); +    static unsigned char seed[16];		/* Flawfinder: ignore */ -   // Incorporate the pid into the seed to prevent -   // processes that start on the same host at the same -   // time from generating the same seed. -   pid_t pid = LLApp::getPid(); +    getNodeID(&seed[0]); -   seed[6]=(unsigned char)(pid >> 8); -   seed[7]=(unsigned char)(pid); -   getSystemTime((uuid_time_t *)(&seed[8])); +    // Incorporate the pid into the seed to prevent +    // processes that start on the same host at the same +    // time from generating the same seed. +    pid_t pid = LLApp::getPid(); -   U64 seed64 = HBXXH64((const void*)seed, 16).digest(); -   return U32(seed64) ^ U32(seed64 >> 32); +    seed[6] = (unsigned char)(pid >> 8); +    seed[7] = (unsigned char)(pid); +    getSystemTime((uuid_time_t*)(&seed[8])); + +    LLMD5 md5_seed; + +    md5_seed.update(seed, 16); +    md5_seed.finalize(); +    md5_seed.raw_digest(seed); + +    return(*(U32*)seed);  }  BOOL LLUUID::parseUUID(const std::string& buf, LLUUID* value)  { -	if( buf.empty() || value == NULL) -	{ -		return FALSE; -	} - -	std::string temp( buf ); -	LLStringUtil::trim(temp); -	if( LLUUID::validate( temp ) ) -	{ -		value->set( temp ); -		return TRUE; -	} -	return FALSE; +    if (buf.empty() || value == NULL) +    { +        return FALSE; +    } + +    std::string temp(buf); +    LLStringUtil::trim(temp); +    if (LLUUID::validate(temp)) +    { +        value->set(temp); +        return TRUE; +    } +    return FALSE;  }  //static  LLUUID LLUUID::generateNewID(std::string hash_string)  { -	LLUUID new_id; -	if (hash_string.empty()) -	{ -		new_id.generate(); -	} -	else -	{ -		new_id.generate(hash_string); -	} -	return new_id; +    LLUUID new_id; +    if (hash_string.empty()) +    { +        new_id.generate(); +    } +    else +    { +        new_id.generate(hash_string); +    } +    return new_id;  }  LLAssetID LLTransactionID::makeAssetID(const LLUUID& session) const  { -	LLAssetID result; -	if (isNull()) -	{ -		result.setNull(); -	} -	else -	{ -		combine(session, result); -	} -	return result; +    LLAssetID result; +    if (isNull()) +    { +        result.setNull(); +    } +    else +    { +        combine(session, result); +    } +    return result;  }  // Construct  LLUUID::LLUUID()  { -	setNull(); +    setNull();  }  // Faster than copying from memory - void LLUUID::setNull() +void LLUUID::setNull()  { -	U32 *word = (U32 *)mData; -	word[0] = 0; -	word[1] = 0; -	word[2] = 0; -	word[3] = 0; +    U32* word = (U32*)mData; +    word[0] = 0; +    word[1] = 0; +    word[2] = 0; +    word[3] = 0;  }  // Compare - bool LLUUID::operator==(const LLUUID& rhs) const +bool LLUUID::operator==(const LLUUID& rhs) const  { -	U32 *tmp = (U32 *)mData; -	U32 *rhstmp = (U32 *)rhs.mData; -	// Note: binary & to avoid branching -	return  -		(tmp[0] == rhstmp[0]) &   -		(tmp[1] == rhstmp[1]) & -		(tmp[2] == rhstmp[2]) & -		(tmp[3] == rhstmp[3]); +    U32* tmp = (U32*)mData; +    U32* rhstmp = (U32*)rhs.mData; +    // Note: binary & to avoid branching +    return +        (tmp[0] == rhstmp[0]) & +        (tmp[1] == rhstmp[1]) & +        (tmp[2] == rhstmp[2]) & +        (tmp[3] == rhstmp[3]);  } - bool LLUUID::operator!=(const LLUUID& rhs) const +bool LLUUID::operator!=(const LLUUID& rhs) const  { -	U32 *tmp = (U32 *)mData; -	U32 *rhstmp = (U32 *)rhs.mData; -	// Note: binary | to avoid branching -	return  -		(tmp[0] != rhstmp[0]) | -		(tmp[1] != rhstmp[1]) | -		(tmp[2] != rhstmp[2]) | -		(tmp[3] != rhstmp[3]); +    U32* tmp = (U32*)mData; +    U32* rhstmp = (U32*)rhs.mData; +    // Note: binary | to avoid branching +    return +        (tmp[0] != rhstmp[0]) | +        (tmp[1] != rhstmp[1]) | +        (tmp[2] != rhstmp[2]) | +        (tmp[3] != rhstmp[3]);  }  /* @@ -983,94 +990,94 @@ LLUUID::LLUUID()  // to integers, among other things.  Use isNull() or notNull().   LLUUID::operator bool() const  { -	U32 *word = (U32 *)mData; -	return (word[0] | word[1] | word[2] | word[3]) > 0; +    U32 *word = (U32 *)mData; +    return (word[0] | word[1] | word[2] | word[3]) > 0;  }  */ - BOOL LLUUID::notNull() const +BOOL LLUUID::notNull() const  { -	U32 *word = (U32 *)mData; -	return (word[0] | word[1] | word[2] | word[3]) > 0; +    U32* word = (U32*)mData; +    return (word[0] | word[1] | word[2] | word[3]) > 0;  }  // Faster than == LLUUID::null because doesn't require  // as much memory access. - BOOL LLUUID::isNull() const +BOOL LLUUID::isNull() const  { -	U32 *word = (U32 *)mData; -	// If all bits are zero, return !0 == TRUE -	return !(word[0] | word[1] | word[2] | word[3]); +    U32* word = (U32*)mData; +    // If all bits are zero, return !0 == TRUE +    return !(word[0] | word[1] | word[2] | word[3]);  } - LLUUID::LLUUID(const char *in_string) +LLUUID::LLUUID(const char* in_string)  { -	if (!in_string || in_string[0] == 0) -	{ -		setNull(); -		return; -	} -  -	set(in_string); +    if (!in_string || in_string[0] == 0) +    { +        setNull(); +        return; +    } + +    set(in_string);  } - LLUUID::LLUUID(const std::string& in_string) +LLUUID::LLUUID(const std::string& in_string)  { -	if (in_string.empty()) -	{ -		setNull(); -		return; -	} +    if (in_string.empty()) +    { +        setNull(); +        return; +    } -	set(in_string); +    set(in_string);  }  // IW: DON'T "optimize" these w/ U32s or you'll scoogie the sort order  // IW: this will make me very sad - bool LLUUID::operator<(const LLUUID &rhs) const +bool LLUUID::operator<(const LLUUID& rhs) const  { -	U32 i; -	for( i = 0; i < (UUID_BYTES - 1); i++ ) -	{ -		if( mData[i] != rhs.mData[i] ) -		{ -			return (mData[i] < rhs.mData[i]); -		} -	} -	return (mData[UUID_BYTES - 1] < rhs.mData[UUID_BYTES - 1]); +    U32 i; +    for (i = 0; i < (UUID_BYTES - 1); i++) +    { +        if (mData[i] != rhs.mData[i]) +        { +            return (mData[i] < rhs.mData[i]); +        } +    } +    return (mData[UUID_BYTES - 1] < rhs.mData[UUID_BYTES - 1]);  } - bool LLUUID::operator>(const LLUUID &rhs) const +bool LLUUID::operator>(const LLUUID& rhs) const  { -	U32 i; -	for( i = 0; i < (UUID_BYTES - 1); i++ ) -	{ -		if( mData[i] != rhs.mData[i] ) -		{ -			return (mData[i] > rhs.mData[i]); -		} -	} -	return (mData[UUID_BYTES - 1] > rhs.mData[UUID_BYTES - 1]); +    U32 i; +    for (i = 0; i < (UUID_BYTES - 1); i++) +    { +        if (mData[i] != rhs.mData[i]) +        { +            return (mData[i] > rhs.mData[i]); +        } +    } +    return (mData[UUID_BYTES - 1] > rhs.mData[UUID_BYTES - 1]);  } - U16 LLUUID::getCRC16() const +U16 LLUUID::getCRC16() const  { -	// A UUID is 16 bytes, or 8 shorts. -	U16 *short_data = (U16*)mData; -	U16 out = 0; -	out += short_data[0]; -	out += short_data[1]; -	out += short_data[2]; -	out += short_data[3]; -	out += short_data[4]; -	out += short_data[5]; -	out += short_data[6]; -	out += short_data[7]; -	return out; +    // A UUID is 16 bytes, or 8 shorts. +    U16* short_data = (U16*)mData; +    U16 out = 0; +    out += short_data[0]; +    out += short_data[1]; +    out += short_data[2]; +    out += short_data[3]; +    out += short_data[4]; +    out += short_data[5]; +    out += short_data[6]; +    out += short_data[7]; +    return out;  } - U32 LLUUID::getCRC32() const +U32 LLUUID::getCRC32() const  { -	U32 *tmp = (U32*)mData; -	return tmp[0] + tmp[1] + tmp[2] + tmp[3]; +    U32* tmp = (U32*)mData; +    return tmp[0] + tmp[1] + tmp[2] + tmp[3];  } diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index 9919af5368..7a694ab10c 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -4863,17 +4863,6 @@ LLVolumeFace& LLVolumeFace::operator=(const LLVolumeFace& src)  			mTangents = NULL;  		} -        if (src.mTangents) -        { -            allocateTangents(src.mNumVertices); -            LLVector4a::memcpyNonAliased16((F32*)mTangents, (F32*)src.mTangents, vert_size); -        } -        else -        { -            ll_aligned_free_16(mTangents); -            mTangents = nullptr; -        } -  		if (src.mWeights)  		{              llassert(!mWeights); // don't orphan an old alloc here accidentally diff --git a/indra/llprimitive/llgltfmaterial.cpp b/indra/llprimitive/llgltfmaterial.cpp index d0ecf611ff..62b693919c 100644 --- a/indra/llprimitive/llgltfmaterial.cpp +++ b/indra/llprimitive/llgltfmaterial.cpp @@ -43,26 +43,16 @@ const char* const GLTF_FILE_EXTENSION_TRANSFORM_ROTATION = "rotation";  // special UUID that indicates a null UUID in override data  static const LLUUID GLTF_OVERRIDE_NULL_UUID = LLUUID("ffffffff-ffff-ffff-ffff-ffffffffffff"); -// https://github.com/KhronosGroup/glTF/tree/main/extensions/3.0/Khronos/KHR_texture_transform -LLMatrix3 LLGLTFMaterial::TextureTransform::asMatrix() -{ -    LLMatrix3 scale; -    scale.mMatrix[0][0] = mScale[0]; -    scale.mMatrix[1][1] = mScale[1]; - -    LLMatrix3 rotation; -    const F32 cos_r = cos(mRotation); -    const F32 sin_r = sin(mRotation); -    rotation.mMatrix[0][0] = cos_r; -    rotation.mMatrix[0][1] = -sin_r; -    rotation.mMatrix[1][0] = sin_r; -    rotation.mMatrix[1][1] = cos_r; - -    LLMatrix3 offset; -    offset.mMatrix[2][0] = mOffset[0]; -    offset.mMatrix[2][1] = mOffset[1]; - -    return offset * rotation * scale; +void LLGLTFMaterial::TextureTransform::getPacked(F32 (&packed)[8]) +{ +    packed[0] = mScale.mV[VX]; +    packed[1] = mScale.mV[VY]; +    packed[2] = mRotation; +    // packed[3] = unused +    packed[4] = mOffset.mV[VX]; +    packed[5] = mOffset.mV[VY]; +    // packed[6] = unused +    // packed[7] = unused  }  bool LLGLTFMaterial::TextureTransform::operator==(const TextureTransform& other) const diff --git a/indra/llprimitive/llgltfmaterial.h b/indra/llprimitive/llgltfmaterial.h index cae7284421..b453b91e67 100644 --- a/indra/llprimitive/llgltfmaterial.h +++ b/indra/llprimitive/llgltfmaterial.h @@ -28,7 +28,6 @@  #include "llrefcount.h"  #include "llmemory.h" -#include "m3math.h"  #include "v4color.h"  #include "v3color.h"  #include "v2math.h" @@ -60,7 +59,7 @@ public:          LLVector2 mScale = { 1.f, 1.f };          F32 mRotation = 0.f; -        LLMatrix3 asMatrix(); +        void getPacked(F32 (&packed)[8]);          bool operator==(const TextureTransform& other) const;      }; @@ -99,7 +98,8 @@ public:      std::array<TextureTransform, GLTF_TEXTURE_INFO_COUNT> mTextureTransform; -    // NOTE : initialize values to defaults according to the GLTF spec +    // NOTE: initialize values to defaults according to the GLTF spec +    // NOTE: these values should be in linear color space      LLColor4 mBaseColor = LLColor4(1, 1, 1, 1);      LLColor3 mEmissiveColor = LLColor3(0, 0, 0); diff --git a/indra/llrender/llcubemaparray.cpp b/indra/llrender/llcubemaparray.cpp index 52118172c0..ac48a633c7 100644 --- a/indra/llrender/llcubemaparray.cpp +++ b/indra/llrender/llcubemaparray.cpp @@ -122,7 +122,7 @@ void LLCubeMapArray::allocate(U32 resolution, U32 components, U32 count, BOOL us      bind(0); -    U32 format = components == 4 ? GL_RGBA12 : GL_RGB10; +    U32 format = components == 4 ? GL_RGBA12 : GL_RGB16F;      U32 mip = 0; diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp index b3b79bd6c4..50d4532fa7 100644 --- a/indra/llrender/llimagegl.cpp +++ b/indra/llrender/llimagegl.cpp @@ -1408,8 +1408,11 @@ void LLImageGL::setManualImage(U32 target, S32 miplevel, S32 intformat, S32 widt          LL_PROFILE_ZONE_NUM(height);          free_cur_tex_image(); -#if 0 -        glTexImage2D(target, miplevel, intformat, width, height, 0, pixformat, pixtype, use_scratch ? scratch : pixels); +#if LL_DARWIN +        { +            LL_PROFILE_ZONE_NAMED("glTexImage2D alloc"); +            glTexImage2D(target, miplevel, intformat, width, height, 0, pixformat, pixtype, use_scratch ? scratch : pixels); +        }  #else          // break up calls to a manageable size for the GL command buffer          { diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index c355115e8c..6fb319fd5b 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -1074,20 +1074,12 @@ void LLShaderMgr::initAttribsAndUniforms()  	mReservedUniforms.push_back("object_plane_s");  	mReservedUniforms.push_back("object_plane_t"); -    mReservedUniforms.push_back("texture_base_color_scale"); // (GLTF) -    mReservedUniforms.push_back("texture_base_color_rotation"); // (GLTF) -    mReservedUniforms.push_back("texture_base_color_offset"); // (GLTF) -    mReservedUniforms.push_back("texture_normal_scale"); // (GLTF) -    mReservedUniforms.push_back("texture_normal_rotation"); // (GLTF) -    mReservedUniforms.push_back("texture_normal_offset"); // (GLTF) -    mReservedUniforms.push_back("texture_metallic_roughness_scale"); // (GLTF) -    mReservedUniforms.push_back("texture_metallic_roughness_rotation"); // (GLTF) -    mReservedUniforms.push_back("texture_metallic_roughness_offset"); // (GLTF) -    mReservedUniforms.push_back("texture_emissive_scale"); // (GLTF) -    mReservedUniforms.push_back("texture_emissive_rotation"); // (GLTF) -    mReservedUniforms.push_back("texture_emissive_offset"); // (GLTF) - -    llassert(mReservedUniforms.size() == LLShaderMgr::TEXTURE_EMISSIVE_OFFSET+1); +    mReservedUniforms.push_back("texture_base_color_transform"); // (GLTF) +    mReservedUniforms.push_back("texture_normal_transform"); // (GLTF) +    mReservedUniforms.push_back("texture_metallic_roughness_transform"); // (GLTF) +    mReservedUniforms.push_back("texture_emissive_transform"); // (GLTF) + +    llassert(mReservedUniforms.size() == LLShaderMgr::TEXTURE_EMISSIVE_TRANSFORM+1);  	mReservedUniforms.push_back("viewport"); diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h index f7439a65af..93ea49d16a 100644 --- a/indra/llrender/llshadermgr.h +++ b/indra/llrender/llshadermgr.h @@ -53,18 +53,10 @@ public:          OBJECT_PLANE_S,                     //  "object_plane_s"          OBJECT_PLANE_T,                     //  "object_plane_t" -        TEXTURE_BASE_COLOR_SCALE,           //  "texture_base_color_scale" (GLTF) -        TEXTURE_BASE_COLOR_ROTATION,        //  "texture_base_color_rotation" (GLTF) -        TEXTURE_BASE_COLOR_OFFSET,          //  "texture_base_color_offset" (GLTF) -        TEXTURE_NORMAL_SCALE,               //  "texture_normal_scale" (GLTF) -        TEXTURE_NORMAL_ROTATION,            //  "texture_normal_rotation" (GLTF) -        TEXTURE_NORMAL_OFFSET,              //  "texture_normal_offset" (GLTF) -        TEXTURE_METALLIC_ROUGHNESS_SCALE,   //  "texture_metallic_roughness_scale" (GLTF) -        TEXTURE_METALLIC_ROUGHNESS_ROTATION,//  "texture_metallic_roughness_rotation" (GLTF) -        TEXTURE_METALLIC_ROUGHNESS_OFFSET,  //  "texture_metallic_roughness_offset" (GLTF) -        TEXTURE_EMISSIVE_SCALE,             //  "texture_emissive_scale" (GLTF) -        TEXTURE_EMISSIVE_ROTATION,          //  "texture_emissive_rotation" (GLTF) -        TEXTURE_EMISSIVE_OFFSET,            //  "texture_emissive_offset" (GLTF) +        TEXTURE_BASE_COLOR_TRANSFORM,         //  "texture_base_color_transform" (GLTF) +        TEXTURE_NORMAL_TRANSFORM,             //  "texture_normal_transform" (GLTF) +        TEXTURE_METALLIC_ROUGHNESS_TRANSFORM, //  "texture_metallic_roughness_transform" (GLTF) +        TEXTURE_EMISSIVE_TRANSFORM,           //  "texture_emissive_transform" (GLTF)          VIEWPORT,                           //  "viewport"          LIGHT_POSITION,                     //  "light_position" diff --git a/indra/llrender/llvertexbuffer.cpp b/indra/llrender/llvertexbuffer.cpp index 11e2b6e5c4..e5e6882ba1 100644 --- a/indra/llrender/llvertexbuffer.cpp +++ b/indra/llrender/llvertexbuffer.cpp @@ -1363,7 +1363,8 @@ void LLVertexBuffer::setBuffer()      U32 data_mask = LLGLSLShader::sCurBoundShaderPtr->mAttributeMask;      // this Vertex Buffer must provide all necessary attributes for currently bound shader -    llassert(((~data_mask & mTypeMask) > 0) || (mTypeMask == data_mask)); +    llassert_msg((data_mask & mTypeMask) == data_mask, +        "Attribute mask mismatch! mTypeMask should be a superset of data_mask.  data_mask: 0x" << std::hex << data_mask << " mTypeMask: 0x" << mTypeMask << std::dec);      if (sGLRenderBuffer != mGLBuffer)      { diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl index cf9ce646d1..fe796a054d 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/cloudsF.glsl @@ -52,9 +52,6 @@ VARYING vec2 vary_texcoord2;  VARYING vec2 vary_texcoord3;  VARYING float altitude_blend_factor; -/// Soft clips the light with a gamma correction -vec3 scaleSoftClip(vec3 light); -  vec4 cloudNoise(vec2 uv)  {     vec4 a = texture2D(cloud_noise_texture, uv); @@ -119,7 +116,6 @@ void main()      color = (cloudColorSun*(1.-alpha2) + cloudColorAmbient);      color.rgb= max(vec3(0), color.rgb);      color.rgb *= 2.0; -    color.rgb = scaleSoftClip(color.rgb);      /// Gamma correct for WL (soft clip effect).      frag_data[0] = vec4(color.rgb, alpha1); diff --git a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl index 6ab966ae01..4bf16b50bf 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl @@ -74,7 +74,6 @@ const float ONE_OVER_PI = 0.3183098861;  vec3 srgb_to_linear(vec3 cs);  vec3 atmosFragLightingLinear(vec3 light, vec3 additive, vec3 atten); -vec3 scaleSoftClipFragLinear(vec3 light);  float calcLegacyDistanceAttenuation(float distance, float falloff)  { @@ -396,7 +395,7 @@ vec3 pbrIbl(vec3 diffuseColor,      specContrib = specular * ao; -	return (diffuse + specular*0.5) * ao;  //reduce by half to place in appropriate color space for atmospherics +	return (diffuse + specular) * ao;  }  vec3 pbrIbl(vec3 diffuseColor, @@ -562,16 +561,13 @@ vec3 pbrBaseLight(vec3 diffuseColor, vec3 specularColor, float metallic, vec3 v,      float NdotV = clamp(abs(dot(norm, v)), 0.001, 1.0);      vec3 ibl_spec; -    color += pbrIbl(diffuseColor, specularColor, radiance, irradiance, ao, NdotV, 0.2, ibl_spec); +    color += pbrIbl(diffuseColor, specularColor, radiance, irradiance, ao, NdotV, perceptualRoughness, ibl_spec);      color += pbrPunctual(diffuseColor, specularColor, perceptualRoughness, metallic, norm, v, normalize(light_dir), specContrib) * sunlit * 2.75 * scol;      specContrib *= sunlit * 2.75 * scol;      specContrib += ibl_spec; -    color += colorEmissive*0.5; - -    color = atmosFragLightingLinear(color, additive, atten); -    color = scaleSoftClipFragLinear(color); +    color += colorEmissive;      return color;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl b/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl index f0522850de..fb97cd95b4 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/emissiveF.glsl @@ -27,14 +27,9 @@  /*[EXTRA_CODE_HERE]*/ -#ifdef DEFINE_GL_FRAGCOLOR  out vec4 frag_color; -#else -#define frag_color gl_FragColor -#endif  vec3 fullbrightAtmosTransport(vec3 light); -vec3 fullbrightScaleSoftClip(vec3 light);  VARYING vec4 vertex_color;  VARYING vec2 vary_texcoord0; @@ -46,8 +41,6 @@ void main()  	vec4 color = diffuseLookup(vary_texcoord0.xy)*vertex_color;  	color.rgb = fullbrightAtmosTransport(color.rgb); -	color.rgb = fullbrightScaleSoftClip(color.rgb); -  	frag_color = color;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl index afe504743d..3a15fd1111 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl @@ -88,8 +88,10 @@ void main()  #endif  #ifndef IS_HUD +    color.rgb = fullbrightAtmosTransport(color.rgb);      color.rgb = srgb_to_linear(color.rgb);  #endif +      frag_color.rgb = color.rgb;      frag_color.a   = color.a;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl index a9e114dddc..e9515a9187 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbralphaV.glsl @@ -44,18 +44,10 @@ uniform mat4 modelview_matrix;  out vec3 vary_position; -uniform vec2 texture_base_color_scale; -uniform float texture_base_color_rotation; -uniform vec2 texture_base_color_offset; -uniform vec2 texture_normal_scale; -uniform float texture_normal_rotation; -uniform vec2 texture_normal_offset; -uniform vec2 texture_metallic_roughness_scale; -uniform float texture_metallic_roughness_rotation; -uniform vec2 texture_metallic_roughness_offset; -uniform vec2 texture_emissive_scale; -uniform float texture_emissive_rotation; -uniform vec2 texture_emissive_offset; +uniform vec4[2] texture_base_color_transform; +uniform vec4[2] texture_normal_transform; +uniform vec4[2] texture_metallic_roughness_transform; +uniform vec4[2] texture_emissive_transform;  out vec3 vary_fragcoord; @@ -78,7 +70,7 @@ out vec3 vary_tangent;  flat out float vary_sign;  out vec3 vary_normal; -vec2 texture_transform(vec2 vertex_texcoord, vec2 khr_gltf_scale, float khr_gltf_rotation, vec2 khr_gltf_offset, mat4 sl_animation_transform); +vec2 texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform, mat4 sl_animation_transform);  void main() @@ -97,10 +89,10 @@ void main()      vary_fragcoord.xyz = vert.xyz + vec3(0,0,near_clip); -	base_color_texcoord = texture_transform(texcoord0, texture_base_color_scale, texture_base_color_rotation, texture_base_color_offset, texture_matrix0); -	normal_texcoord = texture_transform(texcoord0, texture_normal_scale, texture_normal_rotation, texture_normal_offset, texture_matrix0); -	metallic_roughness_texcoord = texture_transform(texcoord0, texture_metallic_roughness_scale, texture_metallic_roughness_rotation, texture_metallic_roughness_offset, texture_matrix0); -	emissive_texcoord = texture_transform(texcoord0, texture_emissive_scale, texture_emissive_rotation, texture_emissive_offset, texture_matrix0); +    base_color_texcoord = texture_transform(texcoord0, texture_base_color_transform, texture_matrix0); +    normal_texcoord = texture_transform(texcoord0, texture_normal_transform, texture_matrix0); +    metallic_roughness_texcoord = texture_transform(texcoord0, texture_metallic_roughness_transform, texture_matrix0); +    emissive_texcoord = texture_transform(texcoord0, texture_emissive_transform, texture_matrix0);  #ifdef HAS_SKIN  	vec3 n = (mat*vec4(normal.xyz+position.xyz,1.0)).xyz-pos.xyz; @@ -133,12 +125,8 @@ uniform mat4 modelview_matrix;  out vec3 vary_position; -uniform vec2 texture_base_color_scale; -uniform float texture_base_color_rotation; -uniform vec2 texture_base_color_offset; -uniform vec2 texture_emissive_scale; -uniform float texture_emissive_rotation; -uniform vec2 texture_emissive_offset; +uniform vec4[2] texture_base_color_transform; +uniform vec4[2] texture_emissive_transform;  in vec3 position;  in vec4 diffuse_color; @@ -149,7 +137,7 @@ out vec2 emissive_texcoord;  out vec4 vertex_color; -vec2 texture_transform(vec2 vertex_texcoord, vec2 khr_gltf_scale, float khr_gltf_rotation, vec2 khr_gltf_offset, mat4 sl_animation_transform); +vec2 texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform, mat4 sl_animation_transform);  void main() @@ -159,8 +147,8 @@ void main()      gl_Position = vert;      vary_position = vert.xyz; -	base_color_texcoord = texture_transform(texcoord0, texture_base_color_scale, texture_base_color_rotation, texture_base_color_offset, texture_matrix0); -	emissive_texcoord = texture_transform(texcoord0, texture_emissive_scale, texture_emissive_rotation, texture_emissive_offset, texture_matrix0); +    base_color_texcoord = texture_transform(texcoord0, texture_base_color_transform, texture_matrix0); +    emissive_texcoord = texture_transform(texcoord0, texture_emissive_transform, texture_matrix0);  	vertex_color = diffuse_color;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbrglowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbrglowV.glsl index b73d08cf0d..82a50a115c 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbrglowV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbrglowV.glsl @@ -34,12 +34,8 @@ uniform mat4 modelview_projection_matrix;  uniform mat4 texture_matrix0; -uniform vec2 texture_base_color_scale; -uniform float texture_base_color_rotation; -uniform vec2 texture_base_color_offset; -uniform vec2 texture_emissive_scale; -uniform float texture_emissive_rotation; -uniform vec2 texture_emissive_offset; +uniform vec4[2] texture_base_color_transform; +uniform vec4[2] texture_emissive_transform;  in vec3 position;  in vec4 emissive; @@ -51,7 +47,7 @@ out vec2 emissive_texcoord;  out vec4 vertex_emissive; -vec2 texture_transform(vec2 vertex_texcoord, vec2 khr_gltf_scale, float khr_gltf_rotation, vec2 khr_gltf_offset, mat4 sl_animation_transform); +vec2 texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform, mat4 sl_animation_transform);  void main()  { @@ -68,8 +64,8 @@ void main()      gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);   #endif -    base_color_texcoord = texture_transform(texcoord0, texture_base_color_scale, texture_base_color_rotation, texture_base_color_offset, texture_matrix0); -    emissive_texcoord = texture_transform(texcoord0, texture_emissive_scale, texture_emissive_rotation, texture_emissive_offset, texture_matrix0); +    base_color_texcoord = texture_transform(texcoord0, texture_base_color_transform, texture_matrix0); +    emissive_texcoord = texture_transform(texcoord0, texture_emissive_transform, texture_matrix0);      vertex_emissive = emissive;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl index 6f50aefdab..e2c23ac8f0 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pbropaqueV.glsl @@ -38,18 +38,10 @@ uniform mat4 modelview_projection_matrix;  #endif  uniform mat4 texture_matrix0; -uniform vec2 texture_base_color_scale; -uniform float texture_base_color_rotation; -uniform vec2 texture_base_color_offset; -uniform vec2 texture_normal_scale; -uniform float texture_normal_rotation; -uniform vec2 texture_normal_offset; -uniform vec2 texture_metallic_roughness_scale; -uniform float texture_metallic_roughness_rotation; -uniform vec2 texture_metallic_roughness_offset; -uniform vec2 texture_emissive_scale; -uniform float texture_emissive_rotation; -uniform vec2 texture_emissive_offset; +uniform vec4[2] texture_base_color_transform; +uniform vec4[2] texture_normal_transform; +uniform vec4[2] texture_metallic_roughness_transform; +uniform vec4[2] texture_emissive_transform;  in vec3 position;  in vec4 diffuse_color; @@ -68,7 +60,7 @@ out vec3 vary_tangent;  flat out float vary_sign;  out vec3 vary_normal; -vec2 texture_transform(vec2 vertex_texcoord, vec2 khr_gltf_scale, float khr_gltf_rotation, vec2 khr_gltf_offset, mat4 sl_animation_transform); +vec2 texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform, mat4 sl_animation_transform);  void main()  { @@ -86,10 +78,10 @@ void main()  	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);   #endif -    base_color_texcoord = texture_transform(texcoord0, texture_base_color_scale, texture_base_color_rotation, texture_base_color_offset, texture_matrix0); -    normal_texcoord = texture_transform(texcoord0, texture_normal_scale, texture_normal_rotation, texture_normal_offset, texture_matrix0); -    metallic_roughness_texcoord = texture_transform(texcoord0, texture_metallic_roughness_scale, texture_metallic_roughness_rotation, texture_metallic_roughness_offset, texture_matrix0); -    emissive_texcoord = texture_transform(texcoord0, texture_emissive_scale, texture_emissive_rotation, texture_emissive_offset, texture_matrix0); +    base_color_texcoord = texture_transform(texcoord0, texture_base_color_transform, texture_matrix0); +    normal_texcoord = texture_transform(texcoord0, texture_normal_transform, texture_matrix0); +    metallic_roughness_texcoord = texture_transform(texcoord0, texture_metallic_roughness_transform, texture_matrix0); +    emissive_texcoord = texture_transform(texcoord0, texture_emissive_transform, texture_matrix0);  #ifdef HAS_SKIN  	vec3 n = (mat*vec4(normal.xyz+position.xyz,1.0)).xyz-pos.xyz; @@ -114,18 +106,10 @@ uniform mat4 modelview_projection_matrix;  uniform mat4 texture_matrix0; -uniform vec2 texture_base_color_scale; -uniform float texture_base_color_rotation; -uniform vec2 texture_base_color_offset; -uniform vec2 texture_normal_scale; -uniform float texture_normal_rotation; -uniform vec2 texture_normal_offset; -uniform vec2 texture_metallic_roughness_scale; -uniform float texture_metallic_roughness_rotation; -uniform vec2 texture_metallic_roughness_offset; -uniform vec2 texture_emissive_scale; -uniform float texture_emissive_rotation; -uniform vec2 texture_emissive_offset; +uniform vec4[2] texture_base_color_transform; +uniform vec4[2] texture_normal_transform; +uniform vec4[2] texture_metallic_roughness_transform; +uniform vec4[2] texture_emissive_transform;  in vec3 position;  in vec4 diffuse_color; @@ -136,15 +120,15 @@ out vec2 emissive_texcoord;  out vec4 vertex_color; -vec2 texture_transform(vec2 vertex_texcoord, vec2 khr_gltf_scale, float khr_gltf_rotation, vec2 khr_gltf_offset, mat4 sl_animation_transform); +vec2 texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform, mat4 sl_animation_transform);  void main()  {      //transform vertex      gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);  -    base_color_texcoord = texture_transform(texcoord0, texture_base_color_scale, texture_base_color_rotation, texture_base_color_offset, texture_matrix0); -    emissive_texcoord = texture_transform(texcoord0, texture_emissive_scale, texture_emissive_rotation, texture_emissive_offset, texture_matrix0); +    base_color_texcoord = texture_transform(texcoord0, texture_base_color_transform, texture_matrix0); +    emissive_texcoord = texture_transform(texcoord0, texture_emissive_transform, texture_matrix0);      vertex_color = diffuse_color;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl index f0e940eb5f..383fcaa9a7 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postDeferredGammaCorrect.glsl @@ -44,9 +44,6 @@ vec3 linear_to_srgb(vec3 cl);  //===============================================================  // tone mapping taken from Khronos sample implementation  //=============================================================== -const float GAMMA = 2.2; -const float INV_GAMMA = 1.0 / GAMMA; -  // sRGB => XYZ => D65_2_D60 => AP1 => RRT_SAT  const mat3 ACESInputMat = mat3 @@ -65,29 +62,6 @@ const mat3 ACESOutputMat = mat3      -0.07367, -0.00605,  1.07602  ); - -// linear to sRGB approximation -// see http://chilliant.blogspot.com/2012/08/srgb-approximations-for-hlsl.html -vec3 linearTosRGB(vec3 color) -{ -    return pow(color, vec3(INV_GAMMA)); -} - - -// sRGB to linear approximation -// see http://chilliant.blogspot.com/2012/08/srgb-approximations-for-hlsl.html -vec3 sRGBToLinear(vec3 srgbIn) -{ -    return vec3(pow(srgbIn.xyz, vec3(GAMMA))); -} - - -vec4 sRGBToLinear(vec4 srgbIn) -{ -    return vec4(sRGBToLinear(srgbIn.xyz), srgbIn.w); -} - -  // ACES tone map (faster approximation)  // see: https://knarkowicz.wordpress.com/2016/01/06/aces-filmic-tone-mapping-curve/  vec3 toneMapACES_Narkowicz(vec3 color) @@ -128,6 +102,7 @@ vec3 toneMapACES_Hill(vec3 color)  }  uniform float exposure; +uniform float gamma;  vec3 toneMap(vec3 color)  { @@ -145,11 +120,12 @@ vec3 toneMap(vec3 color)      // boost exposure as discussed in https://github.com/mrdoob/three.js/pull/19621      // this factor is based on the exposure correction of Krzysztof Narkowicz in his      // implemetation of ACES tone mapping -    color /= 0.6; +    color *= 1.0/0.6; +    //color /= 0.6;      color = toneMapACES_Hill(color);  #endif -    return linearTosRGB(color); +    return linear_to_srgb(color);  }  //=============================================================== @@ -192,16 +168,26 @@ float noise(vec2 x) {  //============================= + +vec3 legacyGamma(vec3 color) +{ +    color = 1. - clamp(color, vec3(0.), vec3(1.)); +    color = 1. - pow(color, vec3(gamma)); // s/b inverted already CPU-side + +    return color; +} +  void main()   {      //this is the one of the rare spots where diffuseRect contains linear color values (not sRGB)      vec4 diff = texture2D(diffuseRect, vary_fragcoord);      diff.rgb = toneMap(diff.rgb); -    vec2 tc = vary_fragcoord.xy*screen_res; - +    diff.rgb = legacyGamma(diff.rgb); +     +    vec2 tc = vary_fragcoord.xy*screen_res*4.0;      vec3 seed = (diff.rgb+vec3(1.0))*vec3(tc.xy, tc.x+tc.y);      vec3 nz = vec3(noise(seed.rg), noise(seed.gb), noise(seed.rb)); -    diff.rgb += nz*0.008; +    diff.rgb += nz*0.003;      //diff.rgb = nz;      frag_color = diff;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl b/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl index 39cc07d2d1..71f7ec52c4 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/textureUtilV.glsl @@ -58,7 +58,7 @@ vec2 khr_texture_transform(vec2 texcoord, vec2 scale, float rotation, vec2 offse  //     animations, available through LSL script functions such as  //     LlSetTextureAnim. It assumes a right-handed UV coordinate system.  // texcoord - The final texcoord to use for image sampling -vec2 texture_transform(vec2 vertex_texcoord, vec2 khr_gltf_scale, float khr_gltf_rotation, vec2 khr_gltf_offset, mat4 sl_animation_transform) +vec2 texture_transform(vec2 vertex_texcoord, vec4[2] khr_gltf_transform, mat4 sl_animation_transform)  {      vec2 texcoord = vertex_texcoord; @@ -67,7 +67,7 @@ vec2 texture_transform(vec2 vertex_texcoord, vec2 khr_gltf_scale, float khr_gltf      // Convert to left-handed coordinate system. The offset of 1 is necessary      // for rotations to be applied correctly.      texcoord.y = 1.0 - texcoord.y; -    texcoord = khr_texture_transform(texcoord, khr_gltf_scale, khr_gltf_rotation, khr_gltf_offset); +    texcoord = khr_texture_transform(texcoord, khr_gltf_transform[0].xy, khr_gltf_transform[0].z, khr_gltf_transform[1].xy);      // Convert back to right-handed coordinate system      texcoord.y = 1.0 - texcoord.y; diff --git a/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl b/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl index 16651dcdbc..745999fc2f 100644 --- a/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/waterFogF.glsl @@ -33,6 +33,7 @@ uniform float waterFogKS;  vec3 getPositionEye();  vec3 srgb_to_linear(vec3 col); +vec3 linear_to_srgb(vec3 col);  vec4 applyWaterFogView(vec3 pos, vec4 color)  { @@ -68,48 +69,16 @@ vec4 applyWaterFogView(vec3 pos, vec4 color)      float D = pow(0.98, l*kd);      color.rgb = color.rgb * D + kc.rgb * L; +    color.a = kc.a + color.a;      return color;  }  vec4 applyWaterFogViewLinearNoClip(vec3 pos, vec4 color, vec3 sunlit)  { -    vec3 view = normalize(pos); -    //normalize view vector -    float es = -(dot(view, waterPlane.xyz)); - -     -    //find intersection point with water plane and eye vector - -    //get eye depth -    float e0 = max(-waterPlane.w, 0.0); - -    vec3 int_v = waterPlane.w > 0.0 ? view * waterPlane.w / es : vec3(0.0, 0.0, 0.0); - -    //get object depth -    float depth = length(pos - int_v); - -    //get "thickness" of water -    float l = max(depth, 0.1); - -    float kd = waterFogDensity*1.3; -    float ks = waterFogKS; -    vec4 kc = waterFogColor; -    kc.rgb = srgb_to_linear(kc.rgb); // TODO -- pass in waterFogColor linear -    kc.rgb *= sunlit; - -    float F = 0.98; - -    float t1 = -kd * pow(F, ks * e0); -    float t2 = kd + ks * es; -    float t3 = pow(F, t2 * l) - 1.0; - -    float L = min(t1 / t2 * t3, 1.0); - -    float D = pow(0.98, l * kd); - -    color.rgb = color.rgb * D + kc.rgb * L; - +    color.rgb = linear_to_srgb(color.rgb); +    color = applyWaterFogView(pos, color); +    color.rgb = srgb_to_linear(color.rgb);      return color;  } diff --git a/indra/newview/app_settings/shaders/class1/interface/gaussianF.glsl b/indra/newview/app_settings/shaders/class1/interface/gaussianF.glsl index 8e341503f5..188fac5460 100644 --- a/indra/newview/app_settings/shaders/class1/interface/gaussianF.glsl +++ b/indra/newview/app_settings/shaders/class1/interface/gaussianF.glsl @@ -41,7 +41,7 @@ void main()  {      vec3 col = vec3(0,0,0); -    float w[] = { 0.0002, 0.0060, 0.0606, 0.2417, 0.3829, 0.2417, 0.0606, 0.0060, 0.0002 }; +    float w[9] = float[9]( 0.0002, 0.0060, 0.0606, 0.2417, 0.3829, 0.2417, 0.0606, 0.0060, 0.0002 );      for (int i = 0; i < 9; ++i)      { diff --git a/indra/newview/app_settings/shaders/class1/interface/reflectionmipF.glsl b/indra/newview/app_settings/shaders/class1/interface/reflectionmipF.glsl index 9f7706fe36..45267e4403 100644 --- a/indra/newview/app_settings/shaders/class1/interface/reflectionmipF.glsl +++ b/indra/newview/app_settings/shaders/class1/interface/reflectionmipF.glsl @@ -26,29 +26,11 @@  out vec4 frag_color;  uniform sampler2D diffuseRect; -uniform sampler2D depthMap; - -uniform float resScale; -uniform float znear; -uniform float zfar;  in vec2 vary_texcoord0; -// get linear depth value given a depth buffer sample d and znear and zfar values -float linearDepth(float d, float znear, float zfar); -  void main()   { -    float depth = texture(depthMap, vary_texcoord0.xy).r; -    float dist = linearDepth(depth, znear, zfar); - -    // convert linear depth to distance -    vec3 v; -    v.xy = vary_texcoord0.xy / 512.0 * 2.0 - 1.0; -    v.z = 1.0; -    v = normalize(v); -    dist /= v.z; -      vec3 col = texture(diffuseRect, vary_texcoord0.xy).rgb; -    frag_color = vec4(col, dist/256.0); +    frag_color = vec4(col, 0.0);  } diff --git a/indra/newview/app_settings/shaders/class1/interface/splattexturerectV.glsl b/indra/newview/app_settings/shaders/class1/interface/splattexturerectV.glsl index edc0a9628b..7af7f20f85 100644 --- a/indra/newview/app_settings/shaders/class1/interface/splattexturerectV.glsl +++ b/indra/newview/app_settings/shaders/class1/interface/splattexturerectV.glsl @@ -26,15 +26,12 @@  uniform mat4 modelview_projection_matrix;  in vec3 position; -in vec4 diffuse_color; -out vec4 vertex_color;  out vec2 vary_texcoord0;  void main()  {  	gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0);  	vary_texcoord0 = position.xy*0.5+0.5; -	vertex_color = diffuse_color;  } diff --git a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl index e2694e060e..ef35bf3fd7 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/alphaF.glsl @@ -250,6 +250,9 @@ void main()      calcAtmosphericVarsLinear(pos.xyz, norm, light_dir, sunlit, amblit, additive, atten); +    vec3 sunlit_linear = srgb_to_linear(sunlit); +    vec3 amblit_linear = amblit; +      vec3 irradiance;      vec3 glossenv;      vec3 legacyenv; @@ -266,7 +269,7 @@ void main()      color.a   = final_alpha; -    vec3 sun_contrib = min(final_da, shadow) * sunlit; +    vec3 sun_contrib = min(final_da, shadow) * sunlit_linear;      color.rgb = max(amblit, irradiance); @@ -274,8 +277,10 @@ void main()      color.rgb *= diffuse_linear.rgb; +    color.rgb = linear_to_srgb(color.rgb);      color.rgb = atmosFragLightingLinear(color.rgb, additive, atten);      color.rgb = scaleSoftClipFragLinear(color.rgb); +    color.rgb = srgb_to_linear(color.rgb);      vec4 light = vec4(0,0,0,0); @@ -294,8 +299,9 @@ void main()      color.rgb += light.rgb;  #endif // !defined(LOCAL_LIGHT_KILL) +  #ifdef WATER_FOG -    color = applyWaterFogViewLinear(pos.xyz, color, sunlit); +    color = applyWaterFogViewLinear(pos.xyz, color, sunlit_linear);  #endif // WATER_FOG  #endif // #else // FOR_IMPOSTOR @@ -303,6 +309,7 @@ void main()  #ifdef IS_HUD      color.rgb = linear_to_srgb(color.rgb);  #endif +      frag_color = color;  } diff --git a/indra/newview/app_settings/shaders/class2/deferred/pbralphaF.glsl b/indra/newview/app_settings/shaders/class2/deferred/pbralphaF.glsl index 2a093827cb..fb76db99a0 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/pbralphaF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/pbralphaF.glsl @@ -82,6 +82,8 @@ vec3 srgb_to_linear(vec3 c);  vec3 linear_to_srgb(vec3 c);  void calcAtmosphericVarsLinear(vec3 inPositionEye, vec3 norm, vec3 light_dir, out vec3 sunlit, out vec3 amblit, out vec3 atten, out vec3 additive); +vec3 atmosFragLightingLinear(vec3 color, vec3 additive, vec3 atten); +vec3 scaleSoftClipFragLinear(vec3 color);  void calcHalfVectors(vec3 lv, vec3 n, vec3 v, out vec3 h, out vec3 l, out float nh, out float nl, out float nv, out float vh, out float lightDist);  float calcLegacyDistanceAttenuation(float distance, float falloff); @@ -196,6 +198,8 @@ void main()      vec3 atten;      calcAtmosphericVarsLinear(pos.xyz, norm, light_dir, sunlit, amblit, additive, atten); +    vec3 sunlit_linear = srgb_to_linear(sunlit); +      vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5;  #ifdef HAS_SUN_SHADOW @@ -229,9 +233,14 @@ void main()      vec3 v = -normalize(pos.xyz);      vec3 spec; -    color = pbrBaseLight(diffuseColor, specularColor, metallic, v, norm.xyz, perceptualRoughness, light_dir, sunlit, scol, radiance, irradiance, colorEmissive, ao, additive, atten, spec); +    color = pbrBaseLight(diffuseColor, specularColor, metallic, v, norm.xyz, perceptualRoughness, light_dir, sunlit_linear, scol, radiance, irradiance, colorEmissive, ao, additive, atten, spec);      glare += max(max(spec.r, spec.g), spec.b); +    color.rgb = linear_to_srgb(color.rgb); +    color.rgb = atmosFragLightingLinear(color.rgb, additive, atten); +    color.rgb = scaleSoftClipFragLinear(color.rgb); +    color.rgb = srgb_to_linear(color.rgb); +      vec3 light = vec3(0);      // Punctual lights diff --git a/indra/newview/app_settings/shaders/class2/deferred/reflectionProbeF.glsl b/indra/newview/app_settings/shaders/class2/deferred/reflectionProbeF.glsl index f1ee4b4681..080f622155 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/reflectionProbeF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/reflectionProbeF.glsl @@ -34,7 +34,7 @@ uniform mat3 env_mat;  vec3 srgb_to_linear(vec3 c);  void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, -        vec2 tc, vec3 pos, vec3 norm, float glossiness, bool errorCorrect) +        vec2 tc, vec3 pos, vec3 norm, float glossiness)  {      ambenv = vec3(reflection_probe_ambiance * 0.25); @@ -43,11 +43,10 @@ void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv,      glossenv = srgb_to_linear(textureCube(environmentMap, env_vec).rgb);  } -void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, -    vec2 tc, vec3 pos, vec3 norm, float glossiness) +void sampleReflectionProbesWater(inout vec3 ambenv, inout vec3 glossenv, +        vec2 tc, vec3 pos, vec3 norm, float glossiness)  { -    sampleReflectionProbes(ambenv, glossenv, -        tc, pos, norm, glossiness, false); +    sampleReflectionProbes(ambenv, glossenv, tc, pos, norm, glossiness);  }  vec4 sampleReflectionProbesDebug(vec3 pos) diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl index 6668a00841..1d02498209 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsF.glsl @@ -33,8 +33,8 @@ vec3 linear_to_srgb(vec3 col);  vec3 atmosFragLighting(vec3 light, vec3 additive, vec3 atten)  {       light *= atten.r; -    light += additive; -    return light * 2.0; +    light += additive * 2.0; +    return light;  }  vec3 atmosFragLightingLinear(vec3 light, vec3 additive, vec3 atten) diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsFuncs.glsl index f9f625ecdb..34ac0c62dc 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsFuncs.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsFuncs.glsl @@ -137,12 +137,15 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou      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 -    sunlit = sunlight.rgb; -    amblit = tmpAmbient.rgb; +     +    // fudge sunlit and amblit to get consistent lighting compared to legacy +    // midday before PBR was a thing +    sunlit = sunlight.rgb * 0.7; +    amblit = tmpAmbient.rgb * 0.25; +      additive *= vec3(1.0 - combined_haze);  } -  vec3 srgb_to_linear(vec3 col);  // provide a touch of lighting in the opposite direction of the sun light  @@ -150,21 +153,24 @@ vec3 srgb_to_linear(vec3 col);  float ambientLighting(vec3 norm, vec3 light_dir)  {      float ambient = min(abs(dot(norm.xyz, light_dir.xyz)), 1.0); -    ambient *= 0.56; +    ambient *= 0.5;      ambient *= ambient;      ambient = (1.0 - ambient);      return ambient;  } -// return colors in linear space +// return lit amblit in linear space, leave sunlit and additive in sRGB space  void calcAtmosphericVarsLinear(vec3 inPositionEye, vec3 norm, vec3 light_dir, out vec3 sunlit, out vec3 amblit, out vec3 additive,                           out vec3 atten)  {      calcAtmosphericVars(inPositionEye, light_dir, 1.0, sunlit, amblit, additive, atten, false); -    sunlit = srgb_to_linear(sunlit); -    additive = srgb_to_linear(additive); -    amblit = ambient_linear; + +    // multiply by 2 to get same colors as when the "scaleSoftClip" implementation was doubling color values +    // (allows for mixing of light sources other than sunlight e.g. reflection probes) +    sunlit *= 2.0; +    amblit *= 2.0;      amblit *= ambientLighting(norm, light_dir); +    amblit = srgb_to_linear(amblit);  } diff --git a/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl b/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl index 9a9b179e6a..027bfb866f 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl @@ -22,43 +22,34 @@   * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA   * $/LicenseInfo$   */ -uniform float gamma; -vec3 getAtmosAttenuation(); -vec3 getAdditiveColor(); + // DEPRECATED -vec3 srgb_to_linear(vec3 col); -vec3 linear_to_srgb(vec3 col); +//soft clip effect has been moved to postDeferredGammaCorrect legacyGamma, this file is effectively dead +// but these functions need to be removed from all existing shaders before removing this file -vec3 scaleSoftClipFragLinear(vec3 light) -{ // identical to non-linear version and that's probably close enough -    //soft clip effect: -    light = 1. - clamp(light, vec3(0.), vec3(1.)); -    light = 1. - pow(light, vec3(gamma)); // s/b inverted already CPU-side +vec3 scaleSoftClipFrag(vec3 light) +{      return light;  } -vec3 scaleSoftClipFrag(vec3 light) -{ -    //soft clip effect: -    light = 1. - clamp(light, vec3(0.), vec3(1.)); -    light = 1. - pow(light, vec3(gamma)); // s/b inverted already CPU-side +vec3 scaleSoftClipFragLinear(vec3 light) +{ // identical to non-linear version and that's probably close enough      return light;  }  vec3 scaleSoftClip(vec3 light)  { -    return scaleSoftClipFrag(light); +    return light;  }  vec3 fullbrightScaleSoftClipFrag(vec3 light, vec3 add, vec3 atten)  { -    //return mix(scaleSoftClipFrag(light.rgb), add, atten); -    return scaleSoftClipFrag(light.rgb); +    return light;  }  vec3 fullbrightScaleSoftClip(vec3 light)  { -    return fullbrightScaleSoftClipFrag(light, getAdditiveColor(), getAtmosAttenuation()); +    return light;  } diff --git a/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl b/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl index c509d865ba..6aa719d200 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl @@ -48,23 +48,27 @@ vec3 atmosTransport(vec3 light)  vec3 fullbrightAtmosTransportFragLinear(vec3 light, vec3 additive, vec3 atten)  {      // same as non-linear version, probably fine -    float brightness = dot(light.rgb * 0.5, vec3(0.3333)) + 0.1;     -    return mix(atmosTransportFrag(light.rgb, additive, atten), light.rgb + additive, brightness * brightness); +    //float brightness = dot(light.rgb * 0.5, vec3(0.3333)) + 0.1;     +    //return mix(atmosTransportFrag(light.rgb, additive, atten), light.rgb + additive, brightness * brightness); +    return atmosTransportFrag(light, additive, atten);  }  vec3 fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten)  { -    float brightness = dot(light.rgb * 0.5, vec3(0.3333)) + 0.1;     -    return mix(atmosTransportFrag(light.rgb, additive, atten), light.rgb + additive, brightness * brightness); +    //float brightness = dot(light.rgb * 0.5, vec3(0.3333)) + 0.1;     +    //return mix(atmosTransportFrag(light.rgb, additive, atten), light.rgb + additive, brightness * brightness); +    return atmosTransportFrag(light, additive, atten);  }  vec3 fullbrightAtmosTransport(vec3 light)  { -    return fullbrightAtmosTransportFrag(light, getAdditiveColor(), getAtmosAttenuation()); +    //return fullbrightAtmosTransportFrag(light, getAdditiveColor(), getAtmosAttenuation()); +    return atmosTransport(light);  }  vec3 fullbrightShinyAtmosTransport(vec3 light)  { -    float brightness = dot(light.rgb, vec3(0.33333)); -    return mix(atmosTransport(light.rgb), (light.rgb + getAdditiveColor().rgb) * (2.0 - brightness), brightness * brightness); +    //float brightness = dot(light.rgb, vec3(0.33333)); +    //return mix(atmosTransport(light.rgb), (light.rgb + getAdditiveColor().rgb) * (2.0 - brightness), brightness * brightness); +    return atmosTransport(light);  } diff --git a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl index 49529860be..add1cb2a37 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl @@ -334,16 +334,19 @@ void main()      vec3 atten;      calcAtmosphericVarsLinear(pos.xyz, norm.xyz, light_dir, sunlit, amblit, additive, atten); +    vec3 sunlit_linear = srgb_to_linear(sunlit); +    vec3 amblit_linear = amblit; +      vec3 ambenv;      vec3 glossenv;      vec3 legacyenv;      sampleReflectionProbesLegacy(ambenv, glossenv, legacyenv, pos.xy*0.5+0.5, pos.xyz, norm.xyz, glossiness, env);      // use sky settings ambient or irradiance map sample, whichever is brighter -    color = max(amblit, ambenv); +    color = max(amblit_linear, ambenv);      float da          = clamp(dot(norm.xyz, light_dir.xyz), 0.0, 1.0); -    vec3 sun_contrib = min(da, shadow) * sunlit; +    vec3 sun_contrib = min(da, shadow) * sunlit_linear;      color.rgb += sun_contrib;      color *= diffcol.rgb; @@ -354,7 +357,7 @@ void main()      if (glossiness > 0.0)  // specular reflection      {          float sa        = dot(normalize(refnormpersp), light_dir.xyz); -        vec3  dumbshiny = sunlit * shadow * (texture2D(lightFunc, vec2(sa, glossiness)).r); +        vec3  dumbshiny = sunlit_linear * shadow * (texture2D(lightFunc, vec2(sa, glossiness)).r);          // add the two types of shiny together          vec3 spec_contrib = dumbshiny * spec.rgb; @@ -379,8 +382,10 @@ void main()          glare += cur_glare;      } -    color.rgb = mix(atmosFragLightingLinear(color.rgb, additive, atten), fullbrightAtmosTransportFragLinear(color, additive, atten), emissive);  +    color.rgb = linear_to_srgb(color.rgb); +    color.rgb = atmosFragLightingLinear(color.rgb, additive, atten);       color.rgb = scaleSoftClipFragLinear(color.rgb); +    color.rgb = srgb_to_linear(color.rgb);      vec3 npos = normalize(-pos.xyz);      vec3 light = vec3(0, 0, 0); diff --git a/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl b/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl index 24539c3c3a..a6a2543915 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl @@ -458,28 +458,24 @@ float sphereWeight(vec3 pos, vec3 dir, vec3 origin, float r, float min_da, int i  // dir - pixel normal  //  w - weight of sample (distance and angular attenuation)  //  dw - weight of sample (distance only) -// vi - return value of intersection point with influence volume -// wi - return value of approximate world space position of sampled pixel -// lod - which mip to bias towards (lower is higher res, sharper reflections) +// lod - which mip to sample (lower is higher res, sharper reflections)  // c - center of probe  // r2 - radius of probe squared  // i - index of probe  -vec3 tapRefMap(vec3 pos, vec3 dir, out float w, out float dw, out vec3 vi, out vec3 wi, float lod, vec3 c, int i) +vec3 tapRefMap(vec3 pos, vec3 dir, out float w, out float dw, float lod, vec3 c, int i)  { -    //lod = max(lod, 1);      // parallax adjustment -      vec3 v;      if (refIndex[i].w < 0) -    { +    {  // box probe          float d = 0;          v = boxIntersect(pos, dir, i, d);          w = max(d, 0.001);      }      else -    { +    { // sphere probe          float r = refSphere[i].w;          float rr = r * r; @@ -491,16 +487,12 @@ vec3 tapRefMap(vec3 pos, vec3 dir, out float w, out float dw, out vec3 vi, out v          w = sphereWeight(pos, dir, refSphere[i].xyz, r, 0.25, i, dw);      } -    vi = v; -      v -= c;      vec3 d = normalize(v);      v = env_mat * v; -    vec4 ret = textureLod(reflectionProbes, vec4(v.xyz, refIndex[i].x), lod); - -    wi = d * ret.a * 256.0+c; +    vec4 ret = textureLod(reflectionProbes, vec4(v.xyz, refIndex[i].x), lod) * refParams[i].y;      return ret.rgb;  } @@ -542,7 +534,7 @@ vec3 tapIrradianceMap(vec3 pos, vec3 dir, out float w, out float dw, vec3 c, int      }  } -vec3 sampleProbes(vec3 pos, vec3 dir, float lod, bool errorCorrect) +vec3 sampleProbes(vec3 pos, vec3 dir, float lod)  {      float wsum[2];      wsum[0] = 0; @@ -568,34 +560,11 @@ vec3 sampleProbes(vec3 pos, vec3 dir, float lod, bool errorCorrect)          float w = 0;          float dw = 0; -        vec3 vi, wi;          vec3 refcol;          { -            if (errorCorrect && refIndex[i].w >= 0) -            { // error correction is on and this probe is a sphere -              //take a sample to get depth value, then error correct -                refcol = tapRefMap(pos, dir, w, dw, vi, wi, abs(lod + 2), refSphere[i].xyz, i); - -                //adjust lookup by distance result -                float d = length(vi - wi); -                vi += dir * d; - -                vi -= refSphere[i].xyz; - -                vi = env_mat * vi; - -                refcol = textureLod(reflectionProbes, vec4(vi, refIndex[i].x), lod).rgb; - -                // weight by vector correctness -                vec3 pi = normalize(wi - pos); -                w *= max(dot(pi, dir), 0.1); -            } -            else -            { -                refcol = tapRefMap(pos, dir, w, dw, vi, wi, lod, refSphere[i].xyz, i); -            } +            refcol = tapRefMap(pos, dir, w, dw, lod, refSphere[i].xyz, i);              col[p] += refcol.rgb*w;              wsum[p] += w; @@ -684,10 +653,10 @@ vec3 sampleProbeAmbient(vec3 pos, vec3 dir)  }  void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, -        vec2 tc, vec3 pos, vec3 norm, float glossiness, bool errorCorrect) +        vec2 tc, vec3 pos, vec3 norm, float glossiness)  {      // TODO - don't hard code lods -    float reflection_lods = max_probe_lod; +    float reflection_lods = max_probe_lod-1;      preProbeSample(pos);      vec3 refnormpersp = reflect(pos.xyz, norm.xyz); @@ -695,13 +664,12 @@ void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv,      ambenv = sampleProbeAmbient(pos, norm);      float lod = (1.0-glossiness)*reflection_lods; -    glossenv = sampleProbes(pos, normalize(refnormpersp), lod, errorCorrect); +    glossenv = sampleProbes(pos, normalize(refnormpersp), lod);  #if defined(SSR)      if (cube_snapshot != 1 && glossiness >= 0.9)      {          vec4 ssr = vec4(0); -        //float w = tapScreenSpaceReflection(errorCorrect ? 1 : 4, tc, pos, norm, ssr, sceneMap);          float w = tapScreenSpaceReflection(1, tc, pos, norm, ssr, sceneMap);          glossenv = mix(glossenv, ssr.rgb, w); @@ -709,6 +677,15 @@ void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv,  #endif  } +void sampleReflectionProbesWater(inout vec3 ambenv, inout vec3 glossenv, +        vec2 tc, vec3 pos, vec3 norm, float glossiness) +{ +    sampleReflectionProbes(ambenv, glossenv, tc, pos, norm, glossiness); + +    // fudge factor to get PBR water at a similar luminance ot legacy water +    glossenv *= 0.25; +} +  void debugTapRefMap(vec3 pos, vec3 dir, float depth, int i, inout vec4 col)  {      vec3 origin = vec3(0,0,0); @@ -749,14 +726,6 @@ vec4 sampleReflectionProbesDebug(vec3 pos)      return col;  } -void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, -    vec2 tc, vec3 pos, vec3 norm, float glossiness) -{ -    sampleReflectionProbes(ambenv, glossenv, -        tc, pos, norm, glossiness, false); -} - -  void sampleReflectionProbesLegacy(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv,          vec2 tc, vec3 pos, vec3 norm, float glossiness, float envIntensity)  { @@ -770,12 +739,12 @@ void sampleReflectionProbesLegacy(inout vec3 ambenv, inout vec3 glossenv, inout      if (glossiness > 0.0)      {          float lod = (1.0-glossiness)*reflection_lods; -        glossenv = sampleProbes(pos, normalize(refnormpersp), lod, false); +        glossenv = sampleProbes(pos, normalize(refnormpersp), lod);      }      if (envIntensity > 0.0)      { -        legacyenv = sampleProbes(pos, normalize(refnormpersp), 0.0, false); +        legacyenv = sampleProbes(pos, normalize(refnormpersp), 0.0);      }  #if defined(SSR) diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl index 8d48e6f596..dfd1d47b3e 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl @@ -85,6 +85,8 @@ float getDepth(vec2 pos_screen);  vec3 linear_to_srgb(vec3 c);  vec3 srgb_to_linear(vec3 c); +uniform vec4 waterPlane; +  #ifdef WATER_FOG  vec4 applyWaterFogViewLinear(vec3 pos, vec4 color);  #endif @@ -153,6 +155,24 @@ void main()      calcAtmosphericVarsLinear(pos.xyz, norm.xyz, light_dir, sunlit, amblit, additive, atten); +    vec3 sunlit_linear = srgb_to_linear(sunlit); +    vec3 amblit_linear = amblit; + +    bool do_atmospherics = false; + +#ifndef WATER_FOG +    // when above water, mask off atmospherics below water +    if (dot(pos.xyz, waterPlane.xyz) + waterPlane.w > 0.0) +    { +        do_atmospherics = true; +    } +#else +    do_atmospherics = true; +#endif + +    vec3  irradiance = vec3(0); +    vec3  radiance  = vec3(0); +      if (GET_GBUFFER_FLAG(GBUFFER_FLAG_HAS_PBR))      {          vec3 orm = texture2D(specularRect, tc).rgb;  @@ -161,23 +181,32 @@ void main()          float ao = orm.r * ambocc;          vec3 colorEmissive = texture2D(emissiveRect, tc).rgb; -          // PBR IBL          float gloss      = 1.0 - perceptualRoughness; -        vec3  irradiance = vec3(0); -        vec3  radiance  = vec3(0); +                  sampleReflectionProbes(irradiance, radiance, tc, pos.xyz, norm.xyz, gloss);          // Take maximium of legacy ambient vs irradiance sample as irradiance          // NOTE: ao is applied in pbrIbl (see pbrBaseLight), do not apply here -        irradiance       = max(amblit,irradiance); +        irradiance       = max(amblit_linear,irradiance);          vec3 diffuseColor;          vec3 specularColor;          calcDiffuseSpecular(baseColor.rgb, metallic, diffuseColor, specularColor);          vec3 v = -normalize(pos.xyz); -        color = pbrBaseLight(diffuseColor, specularColor, metallic, v, norm.xyz, perceptualRoughness, light_dir, sunlit, scol, radiance, irradiance, colorEmissive, ao, additive, atten); +        color = vec3(1,0,1); +        color = pbrBaseLight(diffuseColor, specularColor, metallic, v, norm.xyz, perceptualRoughness, light_dir, sunlit_linear, scol, radiance, irradiance, colorEmissive, ao, additive, atten); + +         +        if (do_atmospherics) +        { +            color = linear_to_srgb(color); +            color = atmosFragLightingLinear(color, additive, atten); +            color = srgb_to_linear(color); +        } +         +              }      else if (!GET_GBUFFER_FLAG(GBUFFER_FLAG_HAS_ATMOS))      { @@ -199,12 +228,12 @@ void main()          sampleReflectionProbesLegacy(irradiance, glossenv, legacyenv, tc, pos.xyz, norm.xyz, spec.a, envIntensity);          // use sky settings ambient or irradiance map sample, whichever is brighter -        irradiance = max(amblit, irradiance); +        irradiance = max(amblit_linear, irradiance);          // apply lambertian IBL only (see pbrIbl)          color.rgb = irradiance * ambocc; -        vec3 sun_contrib = min(da, scol) * sunlit; +        vec3 sun_contrib = min(da, scol) * sunlit_linear;          color.rgb += sun_contrib;          color.rgb *= baseColor.rgb; @@ -230,9 +259,16 @@ void main()              applyLegacyEnv(color, legacyenv, spec, pos.xyz, norm.xyz, envIntensity);          } -        color = mix(atmosFragLightingLinear(color, additive, atten), fullbrightAtmosTransportFragLinear(color, additive, atten), baseColor.a); -        color = scaleSoftClipFragLinear(color); -    } +         +        if (do_atmospherics) +        { +            color = linear_to_srgb(color); +            color = atmosFragLightingLinear(color, additive, atten); +            color = srgb_to_linear(color); +        } +   } + +          #ifdef WATER_FOG          vec4 fogged = applyWaterFogViewLinear(pos.xyz, vec4(color, bloom)); diff --git a/indra/newview/app_settings/shaders/class3/environment/waterF.glsl b/indra/newview/app_settings/shaders/class3/environment/waterF.glsl index 631d2c04d0..7524567f6b 100644 --- a/indra/newview/app_settings/shaders/class3/environment/waterF.glsl +++ b/indra/newview/app_settings/shaders/class3/environment/waterF.glsl @@ -114,6 +114,7 @@ vec3 BlendNormal(vec3 bump1, vec3 bump2)  }  vec3 srgb_to_linear(vec3 col); +vec3 linear_to_srgb(vec3 col);  vec3 vN, vT, vB; @@ -122,11 +123,8 @@ vec3 transform_normal(vec3 vNt)      return normalize(vNt.x * vT + vNt.y * vB + vNt.z * vN);  } -void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, -    vec2 tc, vec3 pos, vec3 norm, float glossiness); - -void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, -     vec2 tc, vec3 pos, vec3 norm, float glossiness, bool errorCorrect); +void sampleReflectionProbesWater(inout vec3 ambenv, inout vec3 glossenv, +        vec2 tc, vec3 pos, vec3 norm, float glossiness);  vec3 getPositionWithNDC(vec3 ndc); @@ -203,6 +201,8 @@ void main()      calcAtmosphericVarsLinear(pos.xyz, wavef, vary_light_dir, sunlit, amblit, additive, atten); +    vec3 sunlit_linear = srgb_to_linear(sunlit); +  #ifdef TRANSPARENT_WATER      vec4 fb = texture2D(screenTex, distort2);      float depth = texture2D(screenDepth, distort2).r; @@ -219,16 +219,19 @@ void main()      fb = applyWaterFogViewLinear(refPos, fb, sunlit);  #else -    vec4 fb = applyWaterFogViewLinear(viewVec*2048.0, vec4(0.5), sunlit); +    vec4 fb = applyWaterFogViewLinear(viewVec*2048.0, vec4(1.0), sunlit_linear);  #endif +    // fudge sample on other side of water to be a tad darker +    fb.rgb *= 0.75; +      float metallic = 0.0; -    float perceptualRoughness = 0.1; +    float perceptualRoughness = 0.05;      float gloss      = 1.0 - perceptualRoughness;      vec3  irradiance = vec3(0);      vec3  radiance  = vec3(0); -    sampleReflectionProbes(irradiance, radiance, distort2, pos.xyz, wave_ibl.xyz, gloss); +    sampleReflectionProbesWater(irradiance, radiance, distort2, pos.xyz, wave_ibl.xyz, gloss);      irradiance       = vec3(0); @@ -250,10 +253,7 @@ void main()      vec3 punctual = pbrPunctual(vec3(0), specularColor, 0.1, metallic, normalize(wavef+up*max(dist, 32.0)/32.0*(1.0-vdu)), v, normalize(light_dir)); -    vec3 color = punctual * sunlit * 2.75 * scol; - -    color = atmosFragLightingLinear(color, additive, atten); -    color = scaleSoftClipFragLinear(color); +    vec3 color = punctual * sunlit_linear * 2.75 * scol;      vec3 ibl = pbrIbl(vec3(0), vec3(1), radiance, vec3(0), ao, NdotV, 0.0); @@ -265,10 +265,24 @@ void main()      f *= 0.9;      f *= f; +    // incoming scale is [0, 1] with 0.5 being default +    // shift to 0.5 to 1.5 +    f *= (fresnelScale - 0.5)+1.0; + +    // incoming offset is [0, 1] with 0.5 being default +    // shift from -1 to 1 +    f += (fresnelOffset - 0.5) * 2.0; +      f = clamp(f, 0, 1); -    //fb.rgb *= 1.; -     +      color = mix(color, fb.rgb, f); + +    color.rgb = linear_to_srgb(color.rgb); +    color = atmosFragLightingLinear(color, additive, atten); +    color = scaleSoftClipFragLinear(color); +    color.rgb = srgb_to_linear(color.rgb); + +      float spec = min(max(max(punctual.r, punctual.g), punctual.b), 0.05);      frag_color = vec4(color, spec); //*sunAngle2); diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt index af72d48db9..b24244c188 100644 --- a/indra/newview/featuretable.txt +++ b/indra/newview/featuretable.txt @@ -1,4 +1,4 @@ -version 49 +version 50  // The version number above should be incremented IF AND ONLY IF some  // change has been made that is sufficiently important to justify  // resetting the graphics preferences of all users to the recommended @@ -117,7 +117,7 @@ RenderGlowResolutionPow		1	8  RenderMaxPartCount			1	2048  RenderLocalLights			1	1  RenderTransparentWater      1   0 -RenderReflectionsEnabled    1   0 +RenderReflectionsEnabled    1   1  RenderReflectionProbeDetail	1	0  RenderTerrainDetail			1	1  RenderTerrainLODFactor		1	1.0 diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt index afe95c86d9..df12f56dd2 100644 --- a/indra/newview/featuretable_mac.txt +++ b/indra/newview/featuretable_mac.txt @@ -1,4 +1,4 @@ -version 44 +version 45  // The version number above should be incremented IF AND ONLY IF some  // change has been made that is sufficiently important to justify  // resetting the graphics preferences of all users to the recommended @@ -71,6 +71,7 @@ RenderGLMultiThreaded       1   0  RenderReflectionsEnabled    1   1  RenderReflectionProbeDetail	1	2  RenderScreenSpaceReflections 1  1 +RenderReflectionProbeCount  1   8  //  // Low Graphics Settings @@ -123,7 +124,7 @@ RenderUseAdvancedAtmospherics 1 0  RenderShadowDetail			1	0  WLSkyDetail					1	48  RenderFSAASamples			1	0 -RenderReflectionsEnabled    1   0 +RenderReflectionsEnabled    1   1  RenderReflectionProbeDetail	1	0  RenderScreenSpaceReflections 1  0 diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp index 59ed62f995..acbc349567 100644 --- a/indra/newview/lldrawpoolwlsky.cpp +++ b/indra/newview/lldrawpoolwlsky.cpp @@ -45,6 +45,8 @@  #include "llvowlsky.h"  #include "llsettingsvo.h" +extern BOOL gCubeSnapshot; +  static LLStaticHashedString sCamPosLocal("camPosLocal");  static LLStaticHashedString sCustomAlpha("custom_alpha"); @@ -434,7 +436,10 @@ void LLDrawPoolWLSky::renderDeferred(S32 pass)      {          renderSkyHazeDeferred(origin, camHeightLocal);          renderHeavenlyBodies(); -        renderStarsDeferred(origin); +        if (!gCubeSnapshot) +        { +            renderStarsDeferred(origin); +        }          renderSkyCloudsDeferred(origin, camHeightLocal, cloud_shader);      }      gGL.setColorMask(true, true); diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp index 3b1bee05af..81a7aa47c8 100644 --- a/indra/newview/llfeaturemanager.cpp +++ b/indra/newview/llfeaturemanager.cpp @@ -425,18 +425,14 @@ bool LLFeatureManager::loadGPUClass()  		}  		if (gbps < 0.f) -		{ //couldn't bench, use GLVersion +		{ //couldn't bench, default to Low  	#if LL_DARWIN  		//GLVersion is misleading on OSX, just default to class 3 if we can't bench  		LL_WARNS("RenderInit") << "Unable to get an accurate benchmark; defaulting to class 3" << LL_ENDL;  		mGPUClass = GPU_CLASS_3;  	#else -			mGPUClass = GPU_CLASS_2; -	#endif -		} -		else if (gbps <= 5.f) -		{  			mGPUClass = GPU_CLASS_0; +	#endif  		}  		else if (gbps <= 8.f)  		{ diff --git a/indra/newview/llfetchedgltfmaterial.cpp b/indra/newview/llfetchedgltfmaterial.cpp index 2f2c58aa3a..80074cc655 100644 --- a/indra/newview/llfetchedgltfmaterial.cpp +++ b/indra/newview/llfetchedgltfmaterial.cpp @@ -110,21 +110,21 @@ void LLFetchedGLTFMaterial::bind(LLViewerTexture* media_tex)          shader->uniform1f(LLShaderMgr::METALLIC_FACTOR, mMetallicFactor);          shader->uniform3fv(LLShaderMgr::EMISSIVE_COLOR, 1, mEmissiveColor.mV); -        shader->uniform2fv(LLShaderMgr::TEXTURE_BASE_COLOR_SCALE, 1, (F32*)mTextureTransform[GLTF_TEXTURE_INFO_BASE_COLOR].mScale.mV); -        shader->uniform1f(LLShaderMgr::TEXTURE_BASE_COLOR_ROTATION, mTextureTransform[GLTF_TEXTURE_INFO_BASE_COLOR].mRotation); -        shader->uniform2fv(LLShaderMgr::TEXTURE_BASE_COLOR_OFFSET, 1, (F32*)mTextureTransform[GLTF_TEXTURE_INFO_BASE_COLOR].mOffset.mV); +        F32 base_color_packed[8]; +        mTextureTransform[GLTF_TEXTURE_INFO_BASE_COLOR].getPacked(base_color_packed); +        shader->uniform4fv(LLShaderMgr::TEXTURE_BASE_COLOR_TRANSFORM, 2, (F32*)base_color_packed); -        shader->uniform2fv(LLShaderMgr::TEXTURE_NORMAL_SCALE, 1, (F32*)mTextureTransform[GLTF_TEXTURE_INFO_NORMAL].mScale.mV); -        shader->uniform1f(LLShaderMgr::TEXTURE_NORMAL_ROTATION, mTextureTransform[GLTF_TEXTURE_INFO_NORMAL].mRotation); -        shader->uniform2fv(LLShaderMgr::TEXTURE_NORMAL_OFFSET, 1, (F32*)mTextureTransform[GLTF_TEXTURE_INFO_NORMAL].mOffset.mV); +        F32 normal_packed[8]; +        mTextureTransform[GLTF_TEXTURE_INFO_NORMAL].getPacked(normal_packed); +        shader->uniform4fv(LLShaderMgr::TEXTURE_NORMAL_TRANSFORM, 2, (F32*)normal_packed); -        shader->uniform2fv(LLShaderMgr::TEXTURE_METALLIC_ROUGHNESS_SCALE, 1, (F32*)mTextureTransform[GLTF_TEXTURE_INFO_METALLIC_ROUGHNESS].mScale.mV); -        shader->uniform1f(LLShaderMgr::TEXTURE_METALLIC_ROUGHNESS_ROTATION, mTextureTransform[GLTF_TEXTURE_INFO_METALLIC_ROUGHNESS].mRotation); -        shader->uniform2fv(LLShaderMgr::TEXTURE_METALLIC_ROUGHNESS_OFFSET, 1, (F32*)mTextureTransform[GLTF_TEXTURE_INFO_METALLIC_ROUGHNESS].mOffset.mV); +        F32 metallic_roughness_packed[8]; +        mTextureTransform[GLTF_TEXTURE_INFO_METALLIC_ROUGHNESS].getPacked(metallic_roughness_packed); +        shader->uniform4fv(LLShaderMgr::TEXTURE_METALLIC_ROUGHNESS_TRANSFORM, 2, (F32*)metallic_roughness_packed); -        shader->uniform2fv(LLShaderMgr::TEXTURE_EMISSIVE_SCALE, 1, (F32*)mTextureTransform[GLTF_TEXTURE_INFO_EMISSIVE].mScale.mV); -        shader->uniform1f(LLShaderMgr::TEXTURE_EMISSIVE_ROTATION, mTextureTransform[GLTF_TEXTURE_INFO_EMISSIVE].mRotation); -        shader->uniform2fv(LLShaderMgr::TEXTURE_EMISSIVE_OFFSET, 1, (F32*)mTextureTransform[GLTF_TEXTURE_INFO_EMISSIVE].mOffset.mV); +        F32 emissive_packed[8]; +        mTextureTransform[GLTF_TEXTURE_INFO_EMISSIVE].getPacked(emissive_packed); +        shader->uniform4fv(LLShaderMgr::TEXTURE_EMISSIVE_TRANSFORM, 2, (F32*)emissive_packed);      }  } diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp index 29e8210d8e..014c8a4d2d 100644 --- a/indra/newview/llfilepicker.cpp +++ b/indra/newview/llfilepicker.cpp @@ -631,6 +631,7 @@ std::unique_ptr<std::vector<std::string>> LLFilePicker::navOpenFilterProc(ELoadF              allowedv->push_back("anim");              break;          case FFLOAD_GLTF: +        case FFLOAD_MATERIAL:              allowedv->push_back("gltf");              allowedv->push_back("glb");              break; diff --git a/indra/newview/llpanelvolume.cpp b/indra/newview/llpanelvolume.cpp index 3c34d6ee65..ed244f773c 100644 --- a/indra/newview/llpanelvolume.cpp +++ b/indra/newview/llpanelvolume.cpp @@ -749,29 +749,49 @@ void LLPanelVolume::sendIsReflectionProbe()      BOOL value = getChild<LLUICtrl>("Reflection Probe")->getValue();      BOOL old_value = volobjp->isReflectionProbe(); -    volobjp->setIsReflectionProbe(value); -    LL_INFOS() << "update reflection probe sent" << LL_ENDL; +    if (value && value != old_value) +    { // defer to notification util as to whether or not we *really* make this object a reflection probe +        LLNotificationsUtil::add("ReflectionProbeApplied", LLSD(), LLSD(), boost::bind(&LLPanelVolume::doSendIsReflectionProbe, this, _1, _2)); +    } +    else +    { +        volobjp->setIsReflectionProbe(value); +    } +} -    if (value && !old_value) -    { // has become a reflection probe, slam to a 10m sphere and pop up a message -        // warning people about the pitfalls of reflection probes -#if 0 -        auto* select_mgr = LLSelectMgr::getInstance(); +void LLPanelVolume::doSendIsReflectionProbe(const LLSD & notification, const LLSD & response) +{ +    S32 option = LLNotificationsUtil::getSelectedOption(notification, response); +    if (option == 0) // YES +    { +        LLViewerObject* objectp = mObject; +        if (!objectp || (objectp->getPCode() != LL_PCODE_VOLUME)) +        { +            return; +        } +        LLVOVolume* volobjp = (LLVOVolume*)objectp; -        mObject->setScale(LLVector3(10.f, 10.f, 10.f)); -        select_mgr->sendMultipleUpdate(UPD_ROTATION | UPD_POSITION | UPD_SCALE); +        volobjp->setIsReflectionProbe(true); -        select_mgr->selectionUpdatePhantom(true); -        select_mgr->selectionSetGLTFMaterial(LLUUID::null); -        select_mgr->selectionSetAlphaOnly(0.f); -         -        LLVolumeParams params; -        params.getPathParams().setCurveType(LL_PCODE_PATH_CIRCLE); -        params.getProfileParams().setCurveType(LL_PCODE_PROFILE_CIRCLE_HALF); -        mObject->updateVolume(params); -#endif +        { // has become a reflection probe, slam to a 10m sphere and pop up a message +            // warning people about the pitfalls of reflection probes + +            auto* select_mgr = LLSelectMgr::getInstance(); -        LLNotificationsUtil::add("ReflectionProbeApplied"); +            select_mgr->selectionUpdatePhantom(true); +            select_mgr->selectionSetGLTFMaterial(LLUUID::null); +            select_mgr->selectionSetAlphaOnly(0.f); + +            LLVolumeParams params; +            params.getPathParams().setCurveType(LL_PCODE_PATH_CIRCLE); +            params.getProfileParams().setCurveType(LL_PCODE_PROFILE_CIRCLE_HALF); +            mObject->updateVolume(params); +        } +    } +    else +    { +        // cancelled, touch up UI state +        getChild<LLUICtrl>("Reflection Probe")->setValue(false);      }  } diff --git a/indra/newview/llpanelvolume.h b/indra/newview/llpanelvolume.h index 62a6d01b21..01b7ebb75c 100644 --- a/indra/newview/llpanelvolume.h +++ b/indra/newview/llpanelvolume.h @@ -57,7 +57,14 @@ public:  	void			refresh();  	void			sendIsLight(); +     +    // when an object is becoming a refleciton probe, present a dialog asking for confirmation +    // otherwise, send the reflection probe update immediately      void            sendIsReflectionProbe(); + +    // callback for handling response of the ok/cancel/ignore dialog for making an object a reflection probe +    void            doSendIsReflectionProbe(const LLSD& notification, const LLSD& response); +  	void			sendIsFlexible();  	static bool		precommitValidate(const LLSD& data); diff --git a/indra/newview/llreflectionmapmanager.cpp b/indra/newview/llreflectionmapmanager.cpp index acb3612416..61d8756490 100644 --- a/indra/newview/llreflectionmapmanager.cpp +++ b/indra/newview/llreflectionmapmanager.cpp @@ -107,7 +107,7 @@ void LLReflectionMapManager::update()          mMipChain.resize(count);          for (int i = 0; i < count; ++i)          { -            mMipChain[i].allocate(res, res, GL_RGBA16); +            mMipChain[i].allocate(res, res, GL_RGB16);              res /= 2;          }      } @@ -475,7 +475,7 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)          //only render sky, water, terrain, and clouds          gPipeline.andRenderTypeMask(LLPipeline::RENDER_TYPE_SKY, LLPipeline::RENDER_TYPE_WL_SKY, -            LLPipeline::RENDER_TYPE_WATER, LLPipeline::RENDER_TYPE_CLOUDS, LLPipeline::RENDER_TYPE_TERRAIN, LLPipeline::END_RENDER_TYPES); +            LLPipeline::RENDER_TYPE_WATER, LLPipeline::RENDER_TYPE_VOIDWATER, LLPipeline::RENDER_TYPE_CLOUDS, LLPipeline::RENDER_TYPE_TERRAIN, LLPipeline::END_RENDER_TYPES);          probe->update(mRenderTarget.getWidth(), face); @@ -519,7 +519,6 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)          static LLStaticHashedString zfar("zfar");          LLRenderTarget* screen_rt = &gPipeline.mAuxillaryRT.screen; -        LLRenderTarget* depth_rt = &gPipeline.mAuxillaryRT.deferredScreen;          // perform a gaussian blur on the super sampled render before downsampling          { @@ -549,7 +548,6 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)          gReflectionMipProgram.bind();          S32 diffuseChannel = gReflectionMipProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, LLTexUnit::TT_TEXTURE); -        S32 depthChannel   = gReflectionMipProgram.enableTexture(LLShaderMgr::DEFERRED_DEPTH, LLTexUnit::TT_TEXTURE);          for (int i = 0; i < mMipChain.size(); ++i)          { @@ -564,12 +562,9 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)                  gGL.getTexUnit(diffuseChannel)->bind(&(mMipChain[i - 1]));              } -            gGL.getTexUnit(depthChannel)->bind(depth_rt, true); - +                          gReflectionMipProgram.uniform1f(resScale, 1.f/(mProbeResolution*2)); -            gReflectionMipProgram.uniform1f(znear, probe->getNearClip()); -            gReflectionMipProgram.uniform1f(zfar, MAX_FAR_CLIP); - +                          gPipeline.mScreenTriangleVB->setBuffer();              gPipeline.mScreenTriangleVB->drawArrays(LLRender::TRIANGLES, 0, 3); @@ -597,7 +592,6 @@ void LLReflectionMapManager::updateProbeFace(LLReflectionMap* probe, U32 face)          gGL.popMatrix();          gGL.getTexUnit(diffuseChannel)->unbind(LLTexUnit::TT_TEXTURE); -        gGL.getTexUnit(depthChannel)->unbind(LLTexUnit::TT_TEXTURE);          gReflectionMipProgram.unbind();      } @@ -820,7 +814,7 @@ void LLReflectionMapManager::updateUniforms()      F32 minimum_ambiance = psky->getTotalReflectionProbeAmbiance(cloud_shadow_scale);      F32 ambscale = gCubeSnapshot && !isRadiancePass() ? 0.f : 1.f; -     +    F32 radscale = gCubeSnapshot && !isRadiancePass() ? 0.5f : 1.f;      for (auto* refmap : mReflectionMaps)      { @@ -858,7 +852,7 @@ void LLReflectionMapManager::updateUniforms()              rpd.refIndex[count][3] = -rpd.refIndex[count][3];          } -        rpd.refParams[count].set(llmax(minimum_ambiance, refmap->getAmbiance())*ambscale, 0.f, 0.f, 0.f); +        rpd.refParams[count].set(llmax(minimum_ambiance, refmap->getAmbiance())*ambscale, radscale, 0.f, 0.f);          S32 ni = nc; // neighbor ("index") - index into refNeighbor to write indices for current reflection probe's neighbors          { @@ -1021,7 +1015,7 @@ void LLReflectionMapManager::initReflectionMaps()          mTexture = new LLCubeMapArray();          // store mReflectionProbeCount+2 cube maps, final two cube maps are used for render target and radiance map generation source) -        mTexture->allocate(mProbeResolution, 4, mReflectionProbeCount + 2); +        mTexture->allocate(mProbeResolution, 3, mReflectionProbeCount + 2);          mIrradianceMaps = new LLCubeMapArray();          mIrradianceMaps->allocate(LL_IRRADIANCE_MAP_RESOLUTION, 4, mReflectionProbeCount, FALSE); @@ -1082,7 +1076,7 @@ void LLReflectionMapManager::doOcclusion()      for (auto& probe : mProbes)      { -        if (probe != nullptr) +        if (probe != nullptr && probe != mDefaultProbe)          {              probe->doOcclusion(eye);          } diff --git a/indra/newview/llsettingsvo.cpp b/indra/newview/llsettingsvo.cpp index 1752b2494f..ac5bde7b9b 100644 --- a/indra/newview/llsettingsvo.cpp +++ b/indra/newview/llsettingsvo.cpp @@ -716,15 +716,15 @@ void LLSettingsVOSky::applySpecial(void *ptarget, bool force)      LLColor3 ambient(getTotalAmbient()); -    shader->uniform3fv(LLShaderMgr::AMBIENT, LLVector3(ambient.mV)); -      if (radiance_pass)      { // during an irradiance map update, disable ambient lighting (direct lighting only) and desaturate sky color (avoid tinting the world blue)          shader->uniform3fv(LLShaderMgr::AMBIENT_LINEAR, LLVector3::zero.mV); +        shader->uniform3fv(LLShaderMgr::AMBIENT, LLVector3::zero.mV);      }      else      {          shader->uniform3fv(LLShaderMgr::AMBIENT_LINEAR, linearColor3v(getAmbientColor() / 3.f)); // note magic number 3.f comes from SLIDER_SCALE_SUN_AMBIENT +        shader->uniform3fv(LLShaderMgr::AMBIENT, LLVector3(ambient.mV));      }      shader->uniform3fv(LLShaderMgr::BLUE_HORIZON_LINEAR, linearColor3v(getBlueHorizon() / 2.f)); // note magic number of 2.f comes from SLIDER_SCALE_BLUE_HORIZON_DENSITY diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index f4f20ee7a6..31c71aac2a 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -235,7 +235,6 @@ LLViewerShaderMgr::LLViewerShaderMgr() :  	mShaderLevel(SHADER_COUNT, 0),  	mMaxAvatarShaderLevel(0)  {    -    /// Make sure WL Sky is the first program      //ONLY shaders that need WL Param management should be added here  	mShaderList.push_back(&gAvatarProgram);  	mShaderList.push_back(&gWaterProgram); @@ -291,6 +290,7 @@ LLViewerShaderMgr::LLViewerShaderMgr() :      mShaderList.push_back(&gDeferredPBRAlphaProgram);      mShaderList.push_back(&gHUDPBRAlphaProgram);      mShaderList.push_back(&gDeferredSkinnedPBRAlphaProgram); +    mShaderList.push_back(&gDeferredPostGammaCorrectProgram); // for gamma  } @@ -2525,6 +2525,10 @@ BOOL LLViewerShaderMgr::loadShadersDeferred()          {              gDeferredPostGammaCorrectProgram.addPermutation("TONEMAP_ACES_HILL_EXPOSURE_BOOST", "1");          } +        else +        { +            gDeferredPostGammaCorrectProgram.addPermutation("TONEMAP_LINEAR", "1"); +        }  		gDeferredPostGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredNoTCV.glsl", GL_VERTEX_SHADER));  		gDeferredPostGammaCorrectProgram.mShaderFiles.push_back(make_pair("deferred/postDeferredGammaCorrect.glsl", GL_FRAGMENT_SHADER));          gDeferredPostGammaCorrectProgram.mShaderLevel = mShaderLevel[SHADER_DEFERRED]; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 5c1467f28f..ad9e3da379 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -5206,7 +5206,12 @@ BOOL LLViewerWindow::simpleSnapshot(LLImageRaw* raw, S32 image_width, S32 image_          LLPipeline::toggleRenderDebugFeature(LLPipeline::RENDER_DEBUG_FEATURE_UI);      } -    LLPipeline::sShowHUDAttachments = FALSE; +    BOOL hide_hud = LLPipeline::sShowHUDAttachments; +	if (hide_hud) +	{ +		LLPipeline::sShowHUDAttachments = FALSE; +	} +      LLRect window_rect = getWorldViewRectRaw();      S32 original_width = LLPipeline::sRenderDeferred ? gPipeline.mRT->deferredScreen.getWidth() : gViewerWindow->getWorldViewWidthRaw(); @@ -5276,7 +5281,10 @@ BOOL LLViewerWindow::simpleSnapshot(LLImageRaw* raw, S32 image_width, S32 image_          }      } -    LLPipeline::sShowHUDAttachments = TRUE; +	if (hide_hud) +	{ +		LLPipeline::sShowHUDAttachments = TRUE; +	}      setCursor(UI_CURSOR_ARROW); @@ -5351,7 +5359,11 @@ BOOL LLViewerWindow::cubeSnapshot(const LLVector3& origin, LLCubeMapArray* cubea          LLPipeline::toggleRenderDebugFeature(LLPipeline::RENDER_DEBUG_FEATURE_UI);      } -    LLPipeline::sShowHUDAttachments = FALSE; +    BOOL hide_hud = LLPipeline::sShowHUDAttachments; +	if (hide_hud) +	{ +		LLPipeline::sShowHUDAttachments = FALSE; +	}      LLRect window_rect = getWorldViewRectRaw();      mWorldViewRectRaw.set(0, res, res, 0); @@ -5417,7 +5429,10 @@ BOOL LLViewerWindow::cubeSnapshot(const LLVector3& origin, LLCubeMapArray* cubea          }      } -    LLPipeline::sShowHUDAttachments = TRUE; +	if (hide_hud) +	{ +		LLPipeline::sShowHUDAttachments = TRUE; +	}      gPipeline.resetDrawOrders();      mWorldViewRectRaw = window_rect; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index b5b5d9ef7f..fffccc72ea 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -8119,6 +8119,8 @@ void LLPipeline::renderDeferredLighting()              soften_shader.uniform1i(LLShaderMgr::SUN_UP_FACTOR, environment.getIsSunUp() ? 1 : 0);              soften_shader.uniform3fv(LLShaderMgr::LIGHTNORM, 1, environment.getClampedLightNorm().mV); +            soften_shader.uniform4fv(LLShaderMgr::WATER_WATERPLANE, 1, LLDrawPoolAlpha::sWaterPlane.mV); +              {                  LLGLDepthTest depth(GL_FALSE);                  LLGLDisable   blend(GL_BLEND); diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index 711be76764..bf67118eac 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -12041,10 +12041,12 @@ Material successfully created.  Asset ID: [ASSET_ID]      name="ReflectionProbeApplied"      persist="true"      type="alertmodal"> -    WARNING: You have made your object a Refelction Probe.  Continuing to manipulate the object while it is a probe will implicitly change the object to mimic its influence volume and will make irreversible changes to the object.  If you don't know what a reflection probe is, uncheck "Reflection Probe" immediately.  To learn more about Reflection Probes and how to use them, see https://wiki.secondlife.com/wiki/PBR_Materials#Understanding_and_Assisting_the_New_Reflections_System. -    <usetemplate ignoretext="Reflection Probe tips" -                 name="okignore" -                 yestext="OK"/> +    WARNING: You have made your object a Reflection Probe.  This will implicitly change the object to mimic its influence volume and will make irreversible changes to the object.  Do you want to continue? +   <usetemplate +       ignoretext="Reflection Probe tips" +       name="okcancelignore" +       notext="Cancel" +       yestext="OK"/>    </notification>  </notifications> diff --git a/indra/newview/skins/default/xui/en/panel_tools_texture.xml b/indra/newview/skins/default/xui/en/panel_tools_texture.xml index 3bcbe0ca3a..67bdd189c1 100644 --- a/indra/newview/skins/default/xui/en/panel_tools_texture.xml +++ b/indra/newview/skins/default/xui/en/panel_tools_texture.xml @@ -140,11 +140,11 @@               top_pad="17"               width="90">                  <combo_box.item -                 label="Materials" +                 label="Blinn-Phong"                   name="Materials"                   value="Materials" />                  <combo_box.item -                 label="PBR" +                 label="PBR Metallic Roughness"                   name="PBR"                   value="PBR" />                  <combo_box.item @@ -256,7 +256,7 @@               allow_no_texture="true"               follows="left|top"               height="80" -             label="PBR       " +             label="Material"               layout="topleft"               left="10"               name="pbr_control" | 
