Files
FallBots/Assets/Content/Models/Platforms/Shaders/BorderSlicer.cginc
Alexandre Coirier fccf8c94b8 BorderSlicer shader
2026-03-20 12:55:45 +01:00

41 lines
1.7 KiB
HLSL

float _BS_Remap(float v, float inMin, float inMax, float outMin, float outMax)
{
return outMin + (v - inMin) * (outMax - outMin) / (inMax - inMin);
}
// CornerPart : fraction of the mesh extent occupied by corners [0, 0.5]
// Must match edge loop placement. e.g. 0.1 = loops at ±0.4
// CornerScale : multiplier on the natural corner size.
// 1.0 = perfect proportion preservation at any scale
// 2.0 = corners twice as large, center shrinks
float NineSliceAxis(float p, float scale, float cornerPart, float cornerScale, float center)
{
float pc = p - center;
// Target corner size in object space
// = natural world size (cornerPart * 1 at scale=1) * CornerScale / current scale
float b = clamp(cornerPart * cornerScale / max(abs(scale), 0.0001), 0.0, 0.499);
float cp = clamp(cornerPart, 0.0, 0.499);
float result;
if (pc < -0.5 + cp)
result = _BS_Remap(pc, -0.5, -0.5 + cp, -0.5, -0.5 + b);
else if (pc > 0.5 - cp)
result = _BS_Remap(pc, 0.5 - cp, 0.5, 0.5 - b, 0.5);
else
result = _BS_Remap(pc, -0.5 + cp, 0.5 - cp, -0.5 + b, 0.5 - b);
return result + center;
}
void BorderSlicer_float(float3 PositionOS, float3 Scale, float CornerPart, float CornerScale,
float3 Center, float3 Filter, out float3 Output)
{
float3 sliced = float3(
NineSliceAxis(PositionOS.x, Scale.x, CornerPart, CornerScale, Center.x),
NineSliceAxis(PositionOS.y, Scale.y, CornerPart, CornerScale, Center.y),
NineSliceAxis(PositionOS.z, Scale.z, CornerPart, CornerScale, Center.z)
);
Output = lerp(PositionOS, sliced, saturate(Filter));
}