#ifndef POI_EMISSION #define POI_EMISSION float4 _EmissionColor; #if defined(PROP_EMISSIONMAP) || !defined(OPTIMIZER_ENABLED) POI_TEXTURE_NOSAMPLER(_EmissionMap); #endif #if defined(PROP_EMISSIONMASK) || !defined(OPTIMIZER_ENABLED) POI_TEXTURE_NOSAMPLER(_EmissionMask); #endif #if defined(PROP_EMISSIONSCROLLINGCURVE) || !defined(OPTIMIZER_ENABLED) UNITY_DECLARE_TEX2D_NOSAMPLER(_EmissionScrollingCurve); float4 _EmissionScrollingCurve_ST; #endif float _EmissionBaseColorAsMap; float _EmissionStrength; float _EnableEmission; float _EmissionHueShift; float4 _EmissiveScroll_Direction; float _EmissiveScroll_Width; float _EmissiveScroll_Velocity; float _EmissiveScroll_Interval; float _EmissionBlinkingEnabled; float _EmissiveBlink_Min; float _EmissiveBlink_Max; float _EmissiveBlink_Velocity; float _ScrollingEmission; float _EnableGITDEmission; float _GITDEMinEmissionMultiplier; float _GITDEMaxEmissionMultiplier; float _GITDEMinLight; float _GITDEMaxLight; float _GITDEWorldOrMesh; float _EmissionCenterOutEnabled; float _EmissionCenterOutSpeed; float _EmissionHueShiftEnabled; float _EmissionBlinkingOffset; float _EmissionScrollingOffset; float _EmissionHueShiftSpeed; float _EmissionHueShiftSpeed1; float4 _EmissionColor1; #ifdef EFFECT_HUE_VARIATION #if defined(PROP_EMISSIONMAP1) || !defined(OPTIMIZER_ENABLED) POI_TEXTURE_NOSAMPLER(_EmissionMap1); #endif #if defined(PROP_EMISSIONMASK1) || !defined(OPTIMIZER_ENABLED) POI_TEXTURE_NOSAMPLER(_EmissionMask1); #endif #if defined(PROP_EMISSIONSCROLLINGCURVE1) || !defined(OPTIMIZER_ENABLED) UNITY_DECLARE_TEX2D_NOSAMPLER(_EmissionScrollingCurve1); float4 _EmissionScrollingCurve1_ST; #endif #endif float _EmissionBaseColorAsMap1; float _EmissionStrength1; float _EnableEmission1; float _EmissionHueShift1; float4 _EmissiveScroll_Direction1; float _EmissiveScroll_Width1; float _EmissiveScroll_Velocity1; float _EmissiveScroll_Interval1; float _EmissionBlinkingEnabled1; float _EmissiveBlink_Min1; float _EmissiveBlink_Max1; float _EmissiveBlink_Velocity1; float _ScrollingEmission1; float _EnableGITDEmission1; float _GITDEMinEmissionMultiplier1; float _GITDEMaxEmissionMultiplier1; float _GITDEMinLight1; float _GITDEMaxLight1; float _GITDEWorldOrMesh1; float _EmissionCenterOutEnabled1; float _EmissionCenterOutSpeed1; float _EmissionHueShiftEnabled1; float _EmissionBlinkingOffset1; float _EmissionScrollingOffset1; float _EmissionReplace; float _EmissionScrollingVertexColor; float _EmissionScrollingVertexColor1; float _EmissionScrollingUseCurve; float _EmissionScrollingUseCurve1; #ifdef POI_AUDIOLINK half _EnableEmissionStrengthAudioLink; half _AudioLinkEmissionStrengthBand; half _EnableEmissionCenterOutAudioLink; half _AudioLinkEmissionCenterOutBand; float2 _AudioLinkAddEmission; half _AudioLinkAddEmissionBand; float2 _EmissionCenterOutAddAudioLink; half _AudioLinkEmissionCenterOutAddBand; half _EnableEmission1StrengthAudioLink; half _AudioLinkEmission1StrengthBand; half _EnableEmission1CenterOutAudioLink; half _AudioLinkEmission1CenterOutBand; float2 _AudioLinkAddEmission1; half _AudioLinkAddEmission1Band; float2 _EmissionCenterOutAddAudioLink1; half _AudioLinkEmission1CenterOutAddBand; fixed _EmissionCenterOutAudioLinkWidth; fixed _EmissionCenterOutAddAudioLinkwidth; fixed _Emission1CenterOutAudioLinkWidth; fixed _Emission1CenterOutAddAudioLinkwidth; #endif float calculateGlowInTheDark(in float minLight, in float maxLight, in float minEmissionMultiplier, in float maxEmissionMultiplier, in float enabled, in float worldOrMesh) { float glowInTheDarkMultiplier = 1; UNITY_BRANCH if (enabled) { #ifdef POI_LIGHTING float3 lightValue = worldOrMesh ? calculateluminance(poiLight.finalLighting.rgb): calculateluminance(poiLight.directLighting.rgb); float gitdeAlpha = saturate(inverseLerp(minLight, maxLight, lightValue)); glowInTheDarkMultiplier = lerp(minEmissionMultiplier, maxEmissionMultiplier, gitdeAlpha); #endif } return glowInTheDarkMultiplier; } float calculateScrollingEmission(in float3 direction, in float velocity, in float interval, in float scrollWidth, float offset, float3 position) { float phase = 0; phase = dot(position, direction); phase -= (_Time.y + offset) * velocity; phase /= interval; phase -= floor(phase); phase = saturate(phase); return(pow(phase, scrollWidth) + pow(1 - phase, scrollWidth * 4)) * 0.5; } float calculateBlinkingEmission(in float blinkMin, in float blinkMax, in float blinkVelocity, float offset) { float amplitude = (blinkMax - blinkMin) * 0.5f; float base = blinkMin + amplitude; return sin((_Time.y + offset) * blinkVelocity) * amplitude + base; } float3 calculateEmissionNew(in float3 baseColor, inout float4 finalColor) { // First Emission float3 emission0 = 0; float emissionStrength0 = _EmissionStrength; float3 emissionColor0 = 0; #ifdef POI_AUDIOLINK UNITY_BRANCH if (poiMods.audioLinkTextureExists) { UNITY_BRANCH if (_EnableEmissionStrengthAudioLink) { emissionStrength0 *= poiMods.audioLink[_AudioLinkEmissionStrengthBand]; } UNITY_BRANCH if (_EnableEmissionCenterOutAudioLink) { emissionStrength0 *= getBandAtTime(_AudioLinkEmissionCenterOutBand, saturate(1 - poiLight.nDotV), _EmissionCenterOutAudioLinkWidth); } emissionStrength0 += lerp(_EmissionCenterOutAddAudioLink.x, _EmissionCenterOutAddAudioLink.y, getBandAtTime(_AudioLinkEmissionCenterOutAddBand, saturate(1 - poiLight.nDotV), _EmissionCenterOutAddAudioLinkwidth)); emissionStrength0 += lerp(_AudioLinkAddEmission.x, _AudioLinkAddEmission.y, poiMods.audioLink[_AudioLinkAddEmissionBand]); emissionStrength0 = max(emissionStrength0, 0); } #endif float glowInTheDarkMultiplier0 = calculateGlowInTheDark(_GITDEMinLight, _GITDEMaxLight, _GITDEMinEmissionMultiplier, _GITDEMaxEmissionMultiplier, _EnableGITDEmission, _GITDEWorldOrMesh); #if defined(PROP_EMISSIONMAP) || !defined(OPTIMIZER_ENABLED) UNITY_BRANCH if (!_EmissionCenterOutEnabled) { emissionColor0 = POI2D_SAMPLER_PAN(_EmissionMap, _MainTex, poiMesh.uv[_EmissionMapUV], _EmissionMapPan).rgb * lerp(1, baseColor, _EmissionBaseColorAsMap).rgb * _EmissionColor.rgb; } else { emissionColor0 = UNITY_SAMPLE_TEX2D_SAMPLER(_EmissionMap, _MainTex, ((.5 + poiLight.nDotV * .5) * _EmissionMap_ST.xy) + _Time.x * _EmissionCenterOutSpeed).rgb * lerp(1, baseColor, _EmissionBaseColorAsMap).rgb * _EmissionColor.rgb; } #else emissionColor0 = lerp(1, baseColor, _EmissionBaseColorAsMap).rgb * _EmissionColor.rgb; #endif UNITY_BRANCH if (_ScrollingEmission) { float3 pos = poiMesh.localPos; UNITY_BRANCH if (_EmissionScrollingVertexColor) { pos = poiMesh.vertexColor.rgb; } UNITY_BRANCH if (_EmissionScrollingUseCurve) { #if defined(PROP_EMISSIONSCROLLINGCURVE) || !defined(OPTIMIZER_ENABLED) emissionStrength0 *= UNITY_SAMPLE_TEX2D_SAMPLER(_EmissionScrollingCurve, _MainTex, TRANSFORM_TEX(poiMesh.uv[_EmissionMapUV], _EmissionScrollingCurve) + (dot(pos, _EmissiveScroll_Direction.xyz) * _EmissiveScroll_Interval) + _Time.x * _EmissiveScroll_Velocity).r; #endif } else { emissionStrength0 *= calculateScrollingEmission(_EmissiveScroll_Direction.xyz, _EmissiveScroll_Velocity, _EmissiveScroll_Interval, _EmissiveScroll_Width, _EmissionScrollingOffset, pos); } } UNITY_BRANCH if (_EmissionBlinkingEnabled) { emissionStrength0 *= calculateBlinkingEmission(_EmissiveBlink_Min, _EmissiveBlink_Max, _EmissiveBlink_Velocity, _EmissionBlinkingOffset); } emissionColor0 = hueShift(emissionColor0, frac(_EmissionHueShift + _EmissionHueShiftSpeed * _Time.x) * _EmissionHueShiftEnabled); #if defined(PROP_EMISSIONMASK) || !defined(OPTIMIZER_ENABLED) float emissionMask0 = UNITY_SAMPLE_TEX2D_SAMPLER(_EmissionMask, _MainTex, TRANSFORM_TEX(poiMesh.uv[_EmissionMaskUV], _EmissionMask) + _Time.x * _EmissionMaskPan).r; #else float emissionMask0 = 1; #endif #ifdef POI_BLACKLIGHT if (_BlackLightMaskEmission != 4) { emissionMask0 *= blackLightMask[_BlackLightMaskEmission]; } #endif emissionStrength0 *= glowInTheDarkMultiplier0 * emissionMask0; emission0 = emissionStrength0 * emissionColor0; #ifdef POI_DISSOLVE UNITY_BRANCH if (_DissolveEmissionSide != 2) { emission0 *= lerp(1 - dissolveAlpha, dissolveAlpha, _DissolveEmissionSide); } #endif // Second Emission float3 emission1 = 0; float emissionStrength1 = 0; float3 emissionColor1 = 0; #ifdef EFFECT_HUE_VARIATION emissionStrength1 = _EmissionStrength1; #ifdef POI_AUDIOLINK UNITY_BRANCH if (poiMods.audioLinkTextureExists) { UNITY_BRANCH if (_EnableEmission1StrengthAudioLink) { emissionStrength1 *= poiMods.audioLink[_AudioLinkEmission1StrengthBand]; } UNITY_BRANCH if (_EnableEmission1CenterOutAudioLink) { emissionStrength1 *= getBandAtTime(_AudioLinkEmission1CenterOutBand, saturate(1 - poiLight.nDotV), _Emission1CenterOutAudioLinkWidth); } emissionStrength1 += lerp(_EmissionCenterOutAddAudioLink1.x, _EmissionCenterOutAddAudioLink1.y, getBandAtTime(_AudioLinkEmission1CenterOutAddBand, saturate(1 - poiLight.nDotV), _Emission1CenterOutAddAudioLinkwidth)); emissionStrength1 += lerp(_AudioLinkAddEmission1.x, _AudioLinkAddEmission1.y, poiMods.audioLink[_AudioLinkAddEmission1Band]); emissionStrength1 = max(emissionStrength1, 0); } #endif float glowInTheDarkMultiplier1 = calculateGlowInTheDark(_GITDEMinLight1, _GITDEMaxLight1, _GITDEMinEmissionMultiplier1, _GITDEMaxEmissionMultiplier1, _EnableGITDEmission1, _GITDEWorldOrMesh1); #if defined(PROP_EMISSIONMAP1) || !defined(OPTIMIZER_ENABLED) UNITY_BRANCH if (!_EmissionCenterOutEnabled1) { emissionColor1 = POI2D_SAMPLER_PAN(_EmissionMap1, _MainTex, poiMesh.uv[_EmissionMap1UV], _EmissionMap1Pan) * lerp(1, baseColor, _EmissionBaseColorAsMap1).rgb * _EmissionColor1.rgb; } else { emissionColor1 = UNITY_SAMPLE_TEX2D_SAMPLER(_EmissionMap1, _MainTex, ((.5 + poiLight.nDotV * .5) * _EmissionMap1_ST.xy) + _Time.x * _EmissionCenterOutSpeed1).rgb * lerp(1, baseColor, _EmissionBaseColorAsMap1).rgb * _EmissionColor1.rgb; } #else emissionColor1 = lerp(1, baseColor, _EmissionBaseColorAsMap1).rgb * _EmissionColor1.rgb;; #endif UNITY_BRANCH if (_ScrollingEmission1) { float3 pos1 = poiMesh.localPos; UNITY_BRANCH if (_EmissionScrollingVertexColor1) { pos1 = poiMesh.vertexColor.rgb; } UNITY_BRANCH if (_EmissionScrollingUseCurve1) { #if defined(PROP_EMISSIONSCROLLINGCURVE1) || !defined(OPTIMIZER_ENABLED) emissionStrength1 *= UNITY_SAMPLE_TEX2D_SAMPLER(_EmissionScrollingCurve1, _MainTex, TRANSFORM_TEX(poiMesh.uv[_EmissionMap1UV], _EmissionScrollingCurve1) + (dot(pos1, _EmissiveScroll_Direction1) * _EmissiveScroll_Interval1) + _Time.x * _EmissiveScroll_Velocity1); #endif } else { emissionStrength1 *= calculateScrollingEmission(_EmissiveScroll_Direction1, _EmissiveScroll_Velocity1, _EmissiveScroll_Interval1, _EmissiveScroll_Width1, _EmissionScrollingOffset1, pos1); } } UNITY_BRANCH if (_EmissionBlinkingEnabled1) { emissionStrength1 *= calculateBlinkingEmission(_EmissiveBlink_Min1, _EmissiveBlink_Max1, _EmissiveBlink_Velocity1, _EmissionBlinkingOffset1); } emissionColor1 = hueShift(emissionColor1, frac(_EmissionHueShift1 + _EmissionHueShiftSpeed1 * _Time.x) * _EmissionHueShiftEnabled1); #if defined(PROP_EMISSIONMASK1) || !defined(OPTIMIZER_ENABLED) float emissionMask1 = UNITY_SAMPLE_TEX2D_SAMPLER(_EmissionMask1, _MainTex, TRANSFORM_TEX(poiMesh.uv[_EmissionMask1UV], _EmissionMask1) + _Time.x * _EmissionMask1Pan); #else float emissionMask1 = 1; #endif #ifdef POI_BLACKLIGHT if (_BlackLightMaskEmission2 != 4) { emissionMask1 *= blackLightMask[_BlackLightMaskEmission2]; } #endif emissionStrength1 *= glowInTheDarkMultiplier1 * emissionMask1; emission1 = emissionStrength1 * emissionColor1; #ifdef POI_DISSOLVE if (_DissolveEmission1Side != 2) { emission1 *= lerp(1 - dissolveAlpha, dissolveAlpha, _DissolveEmission1Side); } #endif #endif finalColor.rgb = lerp(finalColor.rgb, saturate(emissionColor0 + emissionColor1), saturate(emissionStrength0 + emissionStrength1) * _EmissionReplace * poiMax(emission0 + emission1)); return emission0 + emission1; } #endif