// Generated on <$_SCRIBE_DATE$>//// Created by Olivier Prat on 04/12/17.// Copyright 2017 High Fidelity, Inc.//// Distributed under the Apache License, Version 2.0.// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html//<@if not FADE_SLH@><@def FADE_SLH@> <@include render-utils/ShaderConstants.h@> <@func declareFadeFragmentCommon()@> <@include FadeObjectParams.shared.slh@> TEXTURE(RENDER_UTILS_TEXTURE_FADE_MASK, sampler2D, fadeMaskMap); vec2 hash2D(vec3 position) { return position.xy* vec2(0.1677, 0.221765) + position.z*0.561;} float noise3D(vec3 position) { float n = textureLod(fadeMaskMap, hash2D(position), 0.0).r; return pow(n, 1.0/2.2); // Remove sRGB. Need to fix this later directly in the texture} float evalFadeNoiseGradient(FadeObjectParams params, vec3 position) { // Do tri-linear interpolation vec3 noisePosition = position * params.noiseInvSizeAndLevel.xyz + params.noiseOffsetAndInverted.xyz; vec3 noisePositionFloored = floor(noisePosition); vec3 noisePositionFraction = fract(noisePosition); noisePositionFraction = noisePositionFraction*noisePositionFraction*(3.0 - 2.0*noisePositionFraction); float noiseLowXLowYLowZ = noise3D(noisePositionFloored); float noiseLowXHighYLowZ = noise3D(noisePositionFloored+vec3(0,1,0)); float noiseHighXLowYLowZ = noise3D(noisePositionFloored+vec3(1,0,0)); float noiseHighXHighYLowZ = noise3D(noisePositionFloored+vec3(1,1,0)); float noiseLowXLowYHighZ = noise3D(noisePositionFloored+vec3(0,0,1)); float noiseLowXHighYHighZ = noise3D(noisePositionFloored+vec3(0,1,1)); float noiseHighXLowYHighZ = noise3D(noisePositionFloored+vec3(1,0,1)); float noiseHighXHighYHighZ = noise3D(noisePositionFloored+vec3(1,1,1)); vec4 maskLowZ = vec4(noiseLowXLowYLowZ, noiseLowXHighYLowZ, noiseHighXLowYLowZ, noiseHighXHighYLowZ); vec4 maskHighZ = vec4(noiseLowXLowYHighZ, noiseLowXHighYHighZ, noiseHighXLowYHighZ, noiseHighXHighYHighZ); vec4 maskXY = mix(maskLowZ, maskHighZ, noisePositionFraction.z); vec2 maskY = mix(maskXY.xy, maskXY.zw, noisePositionFraction.x); float noise = mix(maskY.x, maskY.y, noisePositionFraction.y); noise -= 0.5; // Center on value 0 return noise * params.noiseInvSizeAndLevel.w;} float evalFadeBaseGradient(FadeObjectParams params, vec3 position) { float gradient = length((position - params.baseOffsetAndThreshold.xyz) * params.baseInvSizeAndLevel.xyz); gradient = gradient-0.5; // Center on value 0.5 gradient *= params.baseInvSizeAndLevel.w; return gradient;} float evalFadeGradient(FadeObjectParams params, vec3 position) { float baseGradient = evalFadeBaseGradient(params, position); float noiseGradient = evalFadeNoiseGradient(params, position); float gradient = noiseGradient+baseGradient+0.5; return gradient;} float evalFadeAlpha(FadeObjectParams params, vec3 position) { float alpha = evalFadeGradient(params, position) - params.baseOffsetAndThreshold.w; alpha *= 1.0 - 2.0 * params.noiseOffsetAndInverted.w; return alpha;} void applyFadeClip(FadeObjectParams params, vec3 position) { if (evalFadeAlpha(params, position) < 0.0) { discard; }} void applyFade(FadeObjectParams params, vec3 position, out vec3 emissive) { float alpha = evalFadeAlpha(params, position); if (alpha < 0.0) { discard; } float edgeMask = alpha * params.edgeWidthInv; float edgeAlpha = 1.0-clamp(edgeMask, 0.0, 1.0); edgeMask = step(edgeMask, 1.0); edgeAlpha *= edgeAlpha; // Square to have a nice ease out vec4 color = mix(params.innerEdgeColor, params.outerEdgeColor, edgeAlpha); emissive = color.rgb * edgeMask * color.a;} <@endfunc@> <@func declareFadeFragmentUniform()@> UNIFORM_BUFFER(RENDER_UTILS_BUFFER_FADE_OBJECT_PARAMS, fadeObjectParametersBuffer) { FadeObjectParams fadeObjectParams;}; <@endfunc@> <@func fetchFadeObjectParams(fadeParams)@> <$fadeParams$> = fadeObjectParams;<@endfunc@> <@func declareFadeFragmentVertexInput()@> FLAT_INPUT(RENDER_UTILS_ATTR_FADE1, vec4, _fadeData1);FLAT_INPUT(RENDER_UTILS_ATTR_FADE2, vec4, _fadeData2);FLAT_INPUT(RENDER_UTILS_ATTR_FADE3, vec4, _fadeData3);FLAT_INPUT(RENDER_UTILS_ATTR_FADE4, vec4, _fadeData4);FLAT_INPUT(RENDER_UTILS_ATTR_FADE5, vec4, _fadeData5);FLAT_INPUT(RENDER_UTILS_ATTR_FADE6, vec4, _fadeData6);FLAT_INPUT(RENDER_UTILS_ATTR_FADE7, float, _fadeData7); <@endfunc@> <@func fetchFadeObjectParamsInstanced(fadeParams)@> <$fadeParams$>.noiseOffsetAndInverted = _fadeData1; <$fadeParams$>.baseOffsetAndThreshold = _fadeData2; <$fadeParams$>.baseInvSizeAndLevel = _fadeData3; <$fadeParams$>.noiseInvSizeAndLevel = _fadeData4; <$fadeParams$>.innerEdgeColor = _fadeData5; <$fadeParams$>.outerEdgeColor = _fadeData6; <$fadeParams$>.edgeWidthInv = _fadeData7;<@endfunc@> <@func declareFadeFragment()@><$declareFadeFragmentCommon()$><$declareFadeFragmentUniform()$><@endfunc@> <@func declareFadeFragmentInstanced()@><$declareFadeFragmentCommon()$><$declareFadeFragmentVertexInput()$><@endfunc@> <@func declareFadeVertexInstanced()@>INPUT(GPU_ATTR_FADEDATA1, vec4, fadeData1);INPUT(GPU_ATTR_FADEDATA2, vec4, fadeData2);INPUT(GPU_ATTR_FADEDATA3, vec4, fadeData3);INPUT(GPU_ATTR_FADEDATA4, vec4, fadeData4);INPUT(GPU_ATTR_FADEDATA5, vec4, fadeData5);INPUT(GPU_ATTR_FADEDATA6, vec4, fadeData6);INPUT(GPU_ATTR_FADEDATA7, float, fadeData7); FLAT_OUTPUT(RENDER_UTILS_ATTR_FADE1, vec4, _fadeData1);FLAT_OUTPUT(RENDER_UTILS_ATTR_FADE2, vec4, _fadeData2);FLAT_OUTPUT(RENDER_UTILS_ATTR_FADE3, vec4, _fadeData3);FLAT_OUTPUT(RENDER_UTILS_ATTR_FADE4, vec4, _fadeData4);FLAT_OUTPUT(RENDER_UTILS_ATTR_FADE5, vec4, _fadeData5);FLAT_OUTPUT(RENDER_UTILS_ATTR_FADE6, vec4, _fadeData6);FLAT_OUTPUT(RENDER_UTILS_ATTR_FADE7, float, _fadeData7);<@endfunc@> <@func passThroughFadeObjectParams()@> _fadeData1 = fadeData1; _fadeData2 = fadeData2; _fadeData3 = fadeData3; _fadeData4 = fadeData4; _fadeData5 = fadeData5; _fadeData6 = fadeData6; _fadeData7 = fadeData7;<@endfunc@> <@endif@>
// Generated on <$_SCRIBE_DATE$>
//
// Created by Olivier Prat on 04/12/17.
// Copyright 2017 High Fidelity, Inc.
//
// Distributed under the Apache License, Version 2.0.
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
//
<@if not FADE_SLH@>
<@def FADE_SLH@>
<@include render-utils/ShaderConstants.h@>
<@func declareFadeFragmentCommon()@>
<@include FadeObjectParams.shared.slh@>
TEXTURE(RENDER_UTILS_TEXTURE_FADE_MASK, sampler2D, fadeMaskMap);
vec2 hash2D(vec3 position) {
return position.xy* vec2(0.1677, 0.221765) + position.z*0.561;
}
float noise3D(vec3 position) {
float n = textureLod(fadeMaskMap, hash2D(position), 0.0).r;
return pow(n, 1.0/2.2); // Remove sRGB. Need to fix this later directly in the texture
}
float evalFadeNoiseGradient(FadeObjectParams params, vec3 position) {
// Do tri-linear interpolation
vec3 noisePosition = position * params.noiseInvSizeAndLevel.xyz + params.noiseOffsetAndInverted.xyz;
vec3 noisePositionFloored = floor(noisePosition);
vec3 noisePositionFraction = fract(noisePosition);
noisePositionFraction = noisePositionFraction*noisePositionFraction*(3.0 - 2.0*noisePositionFraction);
float noiseLowXLowYLowZ = noise3D(noisePositionFloored);
float noiseLowXHighYLowZ = noise3D(noisePositionFloored+vec3(0,1,0));
float noiseHighXLowYLowZ = noise3D(noisePositionFloored+vec3(1,0,0));
float noiseHighXHighYLowZ = noise3D(noisePositionFloored+vec3(1,1,0));
float noiseLowXLowYHighZ = noise3D(noisePositionFloored+vec3(0,0,1));
float noiseLowXHighYHighZ = noise3D(noisePositionFloored+vec3(0,1,1));
float noiseHighXLowYHighZ = noise3D(noisePositionFloored+vec3(1,0,1));
float noiseHighXHighYHighZ = noise3D(noisePositionFloored+vec3(1,1,1));
vec4 maskLowZ = vec4(noiseLowXLowYLowZ, noiseLowXHighYLowZ, noiseHighXLowYLowZ, noiseHighXHighYLowZ);
vec4 maskHighZ = vec4(noiseLowXLowYHighZ, noiseLowXHighYHighZ, noiseHighXLowYHighZ, noiseHighXHighYHighZ);
vec4 maskXY = mix(maskLowZ, maskHighZ, noisePositionFraction.z);
vec2 maskY = mix(maskXY.xy, maskXY.zw, noisePositionFraction.x);
float noise = mix(maskY.x, maskY.y, noisePositionFraction.y);
noise -= 0.5; // Center on value 0
return noise * params.noiseInvSizeAndLevel.w;
}
float evalFadeBaseGradient(FadeObjectParams params, vec3 position) {
float gradient = length((position - params.baseOffsetAndThreshold.xyz) * params.baseInvSizeAndLevel.xyz);
gradient = gradient-0.5; // Center on value 0.5
gradient *= params.baseInvSizeAndLevel.w;
return gradient;
}
float evalFadeGradient(FadeObjectParams params, vec3 position) {
float baseGradient = evalFadeBaseGradient(params, position);
float noiseGradient = evalFadeNoiseGradient(params, position);
float gradient = noiseGradient+baseGradient+0.5;
return gradient;
}
float evalFadeAlpha(FadeObjectParams params, vec3 position) {
float alpha = evalFadeGradient(params, position) - params.baseOffsetAndThreshold.w;
alpha *= 1.0 - 2.0 * params.noiseOffsetAndInverted.w;
return alpha;
}
void applyFadeClip(FadeObjectParams params, vec3 position) {
if (evalFadeAlpha(params, position) < 0.0) {
discard;
}
}
void applyFade(FadeObjectParams params, vec3 position, out vec3 emissive) {
float alpha = evalFadeAlpha(params, position);
if (alpha < 0.0) {
discard;
}
float edgeMask = alpha * params.edgeWidthInv;
float edgeAlpha = 1.0-clamp(edgeMask, 0.0, 1.0);
edgeMask = step(edgeMask, 1.0);
edgeAlpha *= edgeAlpha; // Square to have a nice ease out
vec4 color = mix(params.innerEdgeColor, params.outerEdgeColor, edgeAlpha);
emissive = color.rgb * edgeMask * color.a;
}
<@endfunc@>
<@func declareFadeFragmentUniform()@>
UNIFORM_BUFFER(RENDER_UTILS_BUFFER_FADE_OBJECT_PARAMS, fadeObjectParametersBuffer) {
FadeObjectParams fadeObjectParams;
};
<@endfunc@>
<@func fetchFadeObjectParams(fadeParams)@>
<$fadeParams$> = fadeObjectParams;
<@endfunc@>
<@func declareFadeFragmentVertexInput()@>
FLAT_INPUT(RENDER_UTILS_ATTR_FADE1, vec4, _fadeData1);
FLAT_INPUT(RENDER_UTILS_ATTR_FADE2, vec4, _fadeData2);
FLAT_INPUT(RENDER_UTILS_ATTR_FADE3, vec4, _fadeData3);
FLAT_INPUT(RENDER_UTILS_ATTR_FADE4, vec4, _fadeData4);
FLAT_INPUT(RENDER_UTILS_ATTR_FADE5, vec4, _fadeData5);
FLAT_INPUT(RENDER_UTILS_ATTR_FADE6, vec4, _fadeData6);
FLAT_INPUT(RENDER_UTILS_ATTR_FADE7, float, _fadeData7);
<@endfunc@>
<@func fetchFadeObjectParamsInstanced(fadeParams)@>
<$fadeParams$>.noiseOffsetAndInverted = _fadeData1;
<$fadeParams$>.baseOffsetAndThreshold = _fadeData2;
<$fadeParams$>.baseInvSizeAndLevel = _fadeData3;
<$fadeParams$>.noiseInvSizeAndLevel = _fadeData4;
<$fadeParams$>.innerEdgeColor = _fadeData5;
<$fadeParams$>.outerEdgeColor = _fadeData6;
<$fadeParams$>.edgeWidthInv = _fadeData7;
<@endfunc@>
<@func declareFadeFragment()@>
<$declareFadeFragmentCommon()$>
<$declareFadeFragmentUniform()$>
<@endfunc@>
<@func declareFadeFragmentInstanced()@>
<$declareFadeFragmentCommon()$>
<$declareFadeFragmentVertexInput()$>
<@endfunc@>
<@func declareFadeVertexInstanced()@>
INPUT(GPU_ATTR_FADEDATA1, vec4, fadeData1);
INPUT(GPU_ATTR_FADEDATA2, vec4, fadeData2);
INPUT(GPU_ATTR_FADEDATA3, vec4, fadeData3);
INPUT(GPU_ATTR_FADEDATA4, vec4, fadeData4);
INPUT(GPU_ATTR_FADEDATA5, vec4, fadeData5);
INPUT(GPU_ATTR_FADEDATA6, vec4, fadeData6);
INPUT(GPU_ATTR_FADEDATA7, float, fadeData7);
FLAT_OUTPUT(RENDER_UTILS_ATTR_FADE1, vec4, _fadeData1);
FLAT_OUTPUT(RENDER_UTILS_ATTR_FADE2, vec4, _fadeData2);
FLAT_OUTPUT(RENDER_UTILS_ATTR_FADE3, vec4, _fadeData3);
FLAT_OUTPUT(RENDER_UTILS_ATTR_FADE4, vec4, _fadeData4);
FLAT_OUTPUT(RENDER_UTILS_ATTR_FADE5, vec4, _fadeData5);
FLAT_OUTPUT(RENDER_UTILS_ATTR_FADE6, vec4, _fadeData6);
FLAT_OUTPUT(RENDER_UTILS_ATTR_FADE7, float, _fadeData7);
<@endfunc@>
<@func passThroughFadeObjectParams()@>
_fadeData1 = fadeData1;
_fadeData2 = fadeData2;
_fadeData3 = fadeData3;
_fadeData4 = fadeData4;
_fadeData5 = fadeData5;
_fadeData6 = fadeData6;
_fadeData7 = fadeData7;
<@endfunc@>
<@endif@>