#ifndef POI_FLIPBOOK #define POI_FLIPBOOK #if defined(PROP_FLIPBOOKTEXARRAY) || !defined(OPTIMIZER_ENABLED) UNITY_DECLARE_TEX2DARRAY(_FlipbookTexArray); float4 _FlipbookTexArray_ST; #endif #if defined(PROP_FLIPBOOKMASK) || !defined(OPTIMIZER_ENABLED) POI_TEXTURE_NOSAMPLER(_FlipbookMask); #endif float4 _FlipbookColor; float _FlipbookFPS; float _FlipbookTotalFrames; float4 _FlipbookScaleOffset; float _FlipbookTiled; float _FlipbookCurrentFrame; float _FlipbookEmissionStrength; float _FlipbookRotation; float _EnableFlipbook; float _FlipbookTexArrayUV; float _FlipbookAlphaControlsFinalAlpha; float _FlipbookRotationSpeed; float _FlipbookIntensityControlsAlpha; float _FlipbookColorReplaces; float2 _FlipbookTexArrayPan; // blending float _FlipbookReplace; float _FlipbookMultiply; float _FlipbookAdd; // anim float _FlipbookMovementType; float4 _FlipbookStartEndOffset; float _FlipbookMovementSpeed; // Crossfade float _FlipbookCrossfadeEnabled; float2 _FlipbookCrossfadeRange; float _FlipbookHueShiftEnabled; float _FlipbookHueShiftSpeed; float _FlipbookHueShift; // Global float4 flipBookPixel; float4 flipBookPixelMultiply; float flipBookMask; // Audio Link half _AudioLinkFlipbookScaleBand; half4 _AudioLinkFlipbookScale; half _AudioLinkFlipbookAlphaBand; half2 _AudioLinkFlipbookAlpha; half _AudioLinkFlipbookEmissionBand; half2 _AudioLinkFlipbookEmission; half _AudioLinkFlipbookFrameBand; half2 _AudioLinkFlipbookFrame; #ifndef POI_SHADOW void applyFlipbook(inout float4 finalColor, inout float3 flipbookEmission) { #if defined(PROP_FLIPBOOKMASK) || !defined(OPTIMIZER_ENABLED) flipBookMask = POI2D_SAMPLER_PAN(_FlipbookMask, _MainTex, poiMesh.uv[float(0)], float4(0,0,0,0)).r; #else flipBookMask = 1; #endif float4 flipbookScaleOffset = float4(1,1,0,0); #ifdef POI_AUDIOLINK flipbookScaleOffset.xy += lerp(_AudioLinkFlipbookScale.xy, _AudioLinkFlipbookScale.zw, poiMods.audioLink[_AudioLinkFlipbookScaleBand]); #endif flipbookScaleOffset.xy = 1 - flipbookScaleOffset.xy; float2 uv = frac(poiMesh.uv[float(0)]); float theta = radians(float(0) + _Time.z * float(0)); float cs = cos(theta); float sn = sin(theta); float2 spriteCenter = flipbookScaleOffset.zw + .5; // 2d rotation uv = float2((uv.x - spriteCenter.x) * cs - (uv.y - spriteCenter.y) * sn + spriteCenter.x, (uv.x - spriteCenter.x) * sn + (uv.y - spriteCenter.y) * cs + spriteCenter.y); float2 newUV = remap(uv, float2(0, 0) + flipbookScaleOffset.xy / 2 + flipbookScaleOffset.zw, float2(1, 1) - flipbookScaleOffset.xy / 2 + flipbookScaleOffset.zw, float2(0, 0), float2(1, 1)); if (float(0) == 0) { if (max(newUV.x, newUV.y) > 1 || min(newUV.x, newUV.y) < 0) { flipBookPixel = 0; return; } } #if defined(PROP_FLIPBOOKTEXARRAY) || !defined(OPTIMIZER_ENABLED) float currentFrame = fmod(float(-1), float(1)); if (float(-1) < 0) { currentFrame = (_Time.y / (1 / float(30))) % float(1); } #ifdef POI_AUDIOLINK currentFrame += lerp(_AudioLinkFlipbookFrame.x, _AudioLinkFlipbookFrame.y, poiMods.audioLink[_AudioLinkFlipbookFrameBand]); #endif flipBookPixel = UNITY_SAMPLE_TEX2DARRAY(_FlipbookTexArray, float3(TRANSFORM_TEX(newUV, _FlipbookTexArray) + _Time.x * float4(0,0,0,0), floor(currentFrame))); if (float(0)) { float4 flipbookNextPixel = UNITY_SAMPLE_TEX2DARRAY(_FlipbookTexArray, float3(TRANSFORM_TEX(newUV, _FlipbookTexArray) + _Time.x * float4(0,0,0,0), floor((currentFrame + 1) % float(1)))); flipBookPixel = lerp(flipBookPixel, flipbookNextPixel, smoothstep(float4(0.75,1,0,1).x, float4(0.75,1,0,1).y, frac(currentFrame))); } #else flipBookPixel = 1; #endif if (float(0)) { flipBookPixel.a = poiMax(flipBookPixel.rgb); } if (float(0)) { flipBookPixel.rgb = float4(1,1,1,1).rgb; } else { flipBookPixel.rgb *= float4(1,1,1,1).rgb; } #ifdef POI_BLACKLIGHT if (_BlackLightMaskFlipbook != 4) { flipBookMask *= blackLightMask[_BlackLightMaskFlipbook]; } #endif if (float(0)) { flipBookPixel.rgb = hueShift(flipBookPixel.rgb, float(0) + _Time.x * float(0)); } half flipbookAlpha = 1; #ifdef POI_AUDIOLINK flipbookAlpha = saturate(lerp(_AudioLinkFlipbookAlpha.x, _AudioLinkFlipbookAlpha.y, poiMods.audioLink[_AudioLinkFlipbookAlphaBand])); #endif finalColor.rgb = lerp(finalColor.rgb, flipBookPixel.rgb, flipBookPixel.a * float4(1,1,1,1).a * float(1) * flipBookMask * flipbookAlpha); finalColor.rgb = finalColor + flipBookPixel.rgb * float(0) * flipBookMask * flipbookAlpha; finalColor.rgb = finalColor * lerp(1, flipBookPixel.rgb, flipBookPixel.a * float4(1,1,1,1).a * flipBookMask * float(0) * flipbookAlpha); if (float(0)) { finalColor.a = lerp(finalColor.a, flipBookPixel.a * float4(1,1,1,1).a, flipBookMask); } float flipbookEmissionStrength = float(0); #ifdef POI_AUDIOLINK flipbookEmissionStrength += max(lerp(_AudioLinkFlipbookEmission.x, _AudioLinkFlipbookEmission.y, poiMods.audioLink[_AudioLinkFlipbookEmissionBand]), 0); #endif flipbookEmission = lerp(0, flipBookPixel.rgb * flipbookEmissionStrength, flipBookPixel.a * float4(1,1,1,1).a * flipBookMask * flipbookAlpha); } #else float applyFlipbookAlphaToShadow(float2 uv) { if (float(0)) { float flipbookShadowAlpha = 0; float4 flipbookScaleOffset = float4(1,1,0,0); flipbookScaleOffset.xy = 1 - flipbookScaleOffset.xy; float theta = radians(float(0)); float cs = cos(theta); float sn = sin(theta); float2 spriteCenter = flipbookScaleOffset.zw + .5; uv = float2((uv.x - spriteCenter.x) * cs - (uv.y - spriteCenter.y) * sn + spriteCenter.x, (uv.x - spriteCenter.x) * sn + (uv.y - spriteCenter.y) * cs + spriteCenter.y); float2 newUV = remap(uv, float2(0, 0) + flipbookScaleOffset.xy / 2 + flipbookScaleOffset.zw, float2(1, 1) - flipbookScaleOffset.xy / 2 + flipbookScaleOffset.zw, float2(0, 0), float2(1, 1)); #if defined(PROP_FLIPBOOKTEXARRAY) || !defined(OPTIMIZER_ENABLED) float currentFrame = fmod(float(-1), float(1)); if (float(-1) < 0) { currentFrame = (_Time.y / (1 / float(30))) % float(1); } half4 flipbookColor = UNITY_SAMPLE_TEX2DARRAY(_FlipbookTexArray, float3(TRANSFORM_TEX(newUV, _FlipbookTexArray) + _Time.x * float4(0,0,0,0), floor(currentFrame))); if (float(0)) { float4 flipbookNextPixel = UNITY_SAMPLE_TEX2DARRAY(_FlipbookTexArray, float3(TRANSFORM_TEX(newUV, _FlipbookTexArray) + _Time.x * float4(0,0,0,0), floor((currentFrame + 1) % float(1)))); flipbookColor = lerp(flipbookColor, flipbookNextPixel, smoothstep(float4(0.75,1,0,1).x, float4(0.75,1,0,1).y, frac(currentFrame))); } #else half4 flipbookColor = 1; #endif if (float(0)) { flipbookColor.a = poiMax(flipbookColor.rgb); } if (float(0) == 0) { if (max(newUV.x, newUV.y) > 1 || min(newUV.x, newUV.y) < 0) { flipbookColor.a = 0; } } return flipbookColor.a * float4(1,1,1,1).a; } return 1; } #endif #endif