64 lines
1.8 KiB
Plaintext
64 lines
1.8 KiB
Plaintext
![]() |
#include "res://addons/rokojori_action_library/Runtime/Shading/Library/Math.gdshaderinc"
|
||
|
|
||
|
void computeNinePatchBorders( vec2 _TEXTURE_PIXEL_SIZE, vec2 renderSize, vec4 pixelBorders,
|
||
|
out vec4 uvBorders, out vec4 scaledBorders )
|
||
|
{
|
||
|
vec2 texSize = vec2( 1.0 / _TEXTURE_PIXEL_SIZE.x, 1.0 / _TEXTURE_PIXEL_SIZE.y );
|
||
|
|
||
|
vec2 scale = texSize / renderSize;
|
||
|
scale = max( scale, vec2( 1, 1 ) );
|
||
|
|
||
|
float scaling = max( scale.x, scale.y );
|
||
|
|
||
|
uvBorders = vec4
|
||
|
(
|
||
|
pixelBorders[ 0 ] / texSize.x, ( texSize.x - pixelBorders[ 1 ] ) / texSize.x,
|
||
|
|
||
|
pixelBorders[ 2 ] / texSize.y, ( texSize.y - pixelBorders[ 1 ] ) / texSize.y
|
||
|
);
|
||
|
|
||
|
scaledBorders = pixelBorders / scaling;
|
||
|
scaledBorders[ 1 ] = renderSize.x - scaledBorders[ 1 ];
|
||
|
scaledBorders[ 3 ] = renderSize.y - scaledBorders[ 3 ];
|
||
|
}
|
||
|
|
||
|
float ninePatchBorderRemap( float value, float borderStart, float borderEnd,
|
||
|
float uvStart, float uvEnd, float maxSize )
|
||
|
{
|
||
|
float inMin = borderStart;
|
||
|
float inMax = borderEnd;
|
||
|
float outMin = uvStart;
|
||
|
float outMax = uvEnd;
|
||
|
|
||
|
|
||
|
if ( value < borderStart )
|
||
|
{
|
||
|
inMin = 0.0; inMax = borderStart;
|
||
|
outMin = 0.0; outMax = uvStart;
|
||
|
}
|
||
|
else if ( value > borderEnd )
|
||
|
{
|
||
|
inMin = borderEnd; inMax = maxSize;
|
||
|
outMin = uvEnd; outMax = 1.0;
|
||
|
}
|
||
|
|
||
|
return map( value, inMin, inMax, outMin, outMax );
|
||
|
|
||
|
}
|
||
|
|
||
|
vec2 computeNinePatchUV( vec2 _UV, vec2 renderSize, vec4 uvBorders, vec4 scaledBorders )
|
||
|
{
|
||
|
vec2 pixelCoord = _UV * renderSize;
|
||
|
|
||
|
float nU = ninePatchBorderRemap(
|
||
|
pixelCoord.x, scaledBorders[ 0 ], scaledBorders[ 1 ],
|
||
|
uvBorders[ 0 ], uvBorders[ 1 ], renderSize.x
|
||
|
);
|
||
|
|
||
|
float nV = ninePatchBorderRemap(
|
||
|
pixelCoord.y, scaledBorders[ 2 ], scaledBorders[ 3 ],
|
||
|
uvBorders[ 2 ], uvBorders[ 3 ], renderSize.y
|
||
|
);
|
||
|
|
||
|
return vec2( nU, nV );
|
||
|
}
|