diff options
| author | Runitai Linden <davep@lindenlab.com> | 2020-03-26 16:48:33 -0500 | 
|---|---|---|
| committer | Runitai Linden <davep@lindenlab.com> | 2020-03-26 16:48:33 -0500 | 
| commit | d756e185730f46fd78e88215e0b4b9fd282fd1d7 (patch) | |
| tree | ec1fc367436fd8ad904d0344a77bc753086aaa37 /indra/llmath | |
| parent | 9e0cf3edaab99cc1c427e590c179d6dd604f4567 (diff) | |
SL-12902 Fix for doing the technically correct but compatibility wrong thing WRT light color values.
Diffstat (limited to 'indra/llmath')
| -rw-r--r-- | indra/llmath/llmath.h | 17 | ||||
| -rw-r--r-- | indra/llmath/v3color.h | 9 | ||||
| -rw-r--r-- | indra/llmath/v4color.h | 11 | 
3 files changed, 33 insertions, 4 deletions
| diff --git a/indra/llmath/llmath.h b/indra/llmath/llmath.h index 57f2489a2d..8f01ad6c1c 100644 --- a/indra/llmath/llmath.h +++ b/indra/llmath/llmath.h @@ -537,9 +537,12 @@ inline void ll_remove_outliers(std::vector<VEC_TYPE>& data, F32 k)  	}  } -// This converts from a non-linear sRGB floating point value (0..1) to a linear value. -// Useful for gamma correction and such.  Note: any values passed through this should not be serialized.  You should also ideally cache the output of this. -inline float sRGBtoLinear(const float val) { +// Converts given value from a linear RGB floating point value (0..1) to a gamma corrected (sRGB) value. +// Some shaders require color values in linear space, while others require color values in gamma corrected (sRGB) space. +// Note: in our code, values labeled as sRGB are ALWAYS gamma corrected linear values, NOT linear values with monitor gamma applied +// Note: stored color values should always be gamma corrected linear (i.e. the values returned from an on-screen color swatch) +// Note: DO NOT cache the conversion.  This leads to error prone synchronization and is actually slower in the typical case due to cache misses +inline float linearTosRGB(const float val) {      if (val < 0.0031308f) {          return val * 12.92f;      } @@ -548,7 +551,13 @@ inline float sRGBtoLinear(const float val) {      }  } -inline float linearTosRGB(const float val) { +// Converts given value from a gamma corrected (sRGB) floating point value (0..1) to a linear color value. +// Some shaders require color values in linear space, while others require color values in gamma corrected (sRGB) space. +// Note: In our code, values labeled as sRGB are gamma corrected linear values, NOT linear values with monitor gamma applied +// Note: Stored color values should generally be gamma corrected sRGB.   +//       If you're serializing the return value of this function, you're probably doing it wrong. +// Note: DO NOT cache the conversion.  This leads to error prone synchronization and is actually slower in the typical case due to cache misses. +inline float sRGBtoLinear(const float val) {      if (val < 0.04045f) {          return val / 12.92f;      } diff --git a/indra/llmath/v3color.h b/indra/llmath/v3color.h index ac78197510..43a632408c 100644 --- a/indra/llmath/v3color.h +++ b/indra/llmath/v3color.h @@ -484,4 +484,13 @@ inline const LLColor3 srgbColor3(const LLColor3 &a) {  	return srgbColor;  } +inline const LLColor3 linearColor3(const LLColor3 &a) { +    LLColor3 linearColor; +    linearColor.mV[0] = sRGBtoLinear(a.mV[0]); +    linearColor.mV[1] = sRGBtoLinear(a.mV[1]); +    linearColor.mV[2] = sRGBtoLinear(a.mV[2]); + +    return linearColor; +} +  #endif diff --git a/indra/llmath/v4color.h b/indra/llmath/v4color.h index 6b91b4f191..00fc955384 100644 --- a/indra/llmath/v4color.h +++ b/indra/llmath/v4color.h @@ -656,6 +656,7 @@ void LLColor4::clamp()  	}  } +// Return the given linear space color value in gamma corrected (sRGB) space  inline const LLColor4 srgbColor4(const LLColor4 &a) {      LLColor4 srgbColor; @@ -667,5 +668,15 @@ inline const LLColor4 srgbColor4(const LLColor4 &a) {      return srgbColor;  } +// Return the given gamma corrected (sRGB) color in linear space +inline const LLColor4 linearColor4(const LLColor4 &a) +{ +    LLColor4 linearColor; +    linearColor.mV[0] = sRGBtoLinear(a.mV[0]); +    linearColor.mV[1] = sRGBtoLinear(a.mV[1]); +    linearColor.mV[2] = sRGBtoLinear(a.mV[2]); +    linearColor.mV[3] = a.mV[3]; +} +  #endif | 
