| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 | /** * Copyright(c) Live2D Inc. All rights reserved. * * Use of this source code is governed by the Live2D Open Software license * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html. */#ifndef CUBISM_CG_INCLUDED#define CUBISM_CG_INCLUDED#include "UnityCG.cginc"inline float4 CubismGetMaskChannel(float4 tile){    return tile.xxxx == float4(0, 1, 2, 3);}inline float4 CubismGetClippedMaskChannel(float2 coordinates, float4 tile){    float2 bound = tile.yz * tile.w;    float isInside =        step(bound.x, coordinates.x)        * step(bound.y, coordinates.y)        * step(coordinates.x, bound.x + tile.w)        * step(coordinates.y, bound.y + tile.w);    return CubismGetMaskChannel(tile) * isInside;}inline float2 CubismToMaskCoordinates(float2 vertex, float4 tile, float4 transform){    float2 result = vertex;    float  scale = tile.w * transform.z;    float2 offset = transform.xy;    float2 origin = (tile.yz + float2(0.5, 0.5)) * tile.ww;    result.xy -= offset;    result *= scale;    result.xy += origin;    return result;}inline float4 CubismToMaskClipPos(float2 vertex, float4 tile, float4 transform){    float2 result = CubismToMaskCoordinates(vertex, tile, transform);    result *= 2;    result.xy = float2(result.x, (result.y * _ProjectionParams.x));    result.xy -= float2(1, _ProjectionParams.x);    return float4(result.xy, 1, 1);}inline float CubismSampleMaskTexture(sampler2D tex, float4 channel, float2 coordinates){    float4 texel = tex2D(tex, coordinates.xy) * channel;    return texel.r + texel.g + texel.b + texel.a;}#if defined (CUBISM_MASK_ON) || defined(CUBISM_INVERT_ON)#define CUBISM_MASK_SHADER_VARIABLES    \    sampler2D cubism_MaskTexture;       \    float4 cubism_MaskTile;             \    float4 cubism_MaskTransform;#define CUBISM_TO_MASK_CLIP_POS(IN, OUT) OUT.vertex = CubismToMaskClipPos(IN.vertex, cubism_MaskTile, cubism_MaskTransform);#define CUBISM_MASK_CHANNEL CubismGetMaskChannel(cubism_MaskTile)#define CUBISM_VERTEX_OUTPUT float2 cubism_MaskCoordinates : TEXCOORD3;#define CUBISM_INITIALIZE_VERTEX_OUTPUT(IN, OUT) OUT.cubism_MaskCoordinates = CubismToMaskCoordinates(IN.vertex, cubism_MaskTile, cubism_MaskTransform);#if defined(CUBISM_INVERT_ON)#define CUBISM_APPLY_MASK(IN, COLOR)                                                                                        \    float4 cubism_maskChannel = CubismGetClippedMaskChannel(IN.cubism_MaskCoordinates, cubism_MaskTile);                    \    float  cubism_maskAlpha = CubismSampleMaskTexture(cubism_MaskTexture, cubism_maskChannel, IN.cubism_MaskCoordinates);   \    COLOR *= 1.0 - cubism_maskAlpha;#else#define CUBISM_APPLY_MASK(IN, COLOR)                                                                                        \    float4 cubism_maskChannel = CubismGetClippedMaskChannel(IN.cubism_MaskCoordinates, cubism_MaskTile);                    \    float  cubism_maskAlpha = CubismSampleMaskTexture(cubism_MaskTexture, cubism_maskChannel, IN.cubism_MaskCoordinates);   \    COLOR *= cubism_maskAlpha;#endif#else#define CUBISM_MASK_SHADER_VARIABLES#define CUBISM_TO_MASK_CLIP_POS(IN, OUT)#define CUBISM_MASK_CHANNEL float4(1, 1, 1, 1)#define CUBISM_VERTEX_OUTPUT#define CUBISM_INITIALIZE_VERTEX_OUTPUT(IN, OUT)#define CUBISM_APPLY_MASK(IN, COLOR)#endif#define CUBISM_SHADER_VARIABLES     \    float cubism_ModelOpacity;      \    CUBISM_MASK_SHADER_VARIABLES#define CUBISM_APPLY_ALPHA(IN, COLOR)   \    COLOR.rgb *= COLOR.a;               \    CUBISM_APPLY_MASK(IN, COLOR);       \    COLOR *= cubism_ModelOpacity;#endif
 |