64 lines
1.9 KiB
HLSL
64 lines
1.9 KiB
HLSL
// Shapes © Freya Holmér - https://twitter.com/FreyaHolmer/
|
|
// Website & Documentation - https://acegikmo.com/shapes/
|
|
|
|
#ifndef SHAPES_INCLUDED_MATH // just to make compilers happy
|
|
#include "Shapes Math.cginc"
|
|
#endif
|
|
|
|
#define FILL_TYPE_NONE -1
|
|
#define FILL_TYPE_LINEAR 0
|
|
#define FILL_TYPE_RADIAL 1
|
|
|
|
#define FILL_SPACE_LOCAL 0
|
|
#define FILL_SPACE_WORLD 1
|
|
|
|
#define SHAPES_INTERPOLATOR_FILL(i) float3 fillCoords : TEXCOORD##i;
|
|
|
|
|
|
float3 GetFillCoords( float3 localPos ){
|
|
|
|
int fillType = PROP( _FillType );
|
|
int fillSpace = PROP( _FillSpace );
|
|
float4 start = PROP( _FillStart );
|
|
float3 end = PROP( _FillEnd );
|
|
|
|
if( fillType == FILL_TYPE_NONE )
|
|
return float3(0,0,0);
|
|
|
|
// need coords
|
|
float3 absoluteCoord = fillSpace == FILL_SPACE_LOCAL ? localPos : LocalToWorldPos( localPos );
|
|
float3 relativeCoord = absoluteCoord - start.xyz;
|
|
|
|
// radial has to send full coordinates
|
|
if( fillType == FILL_TYPE_RADIAL )
|
|
return relativeCoord;
|
|
|
|
// linear needs only the interpolator
|
|
// if( fillType == FILL_TYPE_LINEAR )
|
|
half3 gradVec = end - start.xyz;
|
|
half t = dot(gradVec, relativeCoord ) / dot(gradVec, gradVec);
|
|
return float3( t, 0, 0 );
|
|
}
|
|
|
|
half GetFillGradientT( float3 coords, int fillType, float4 start ){
|
|
switch( fillType ){
|
|
case FILL_TYPE_LINEAR: {
|
|
return saturate(coords.x); // interpolation is done in the vertex shader so shrug~
|
|
}
|
|
case FILL_TYPE_RADIAL: {
|
|
half radius = start.w;
|
|
return saturate( length( coords ) / radius ); // start.w = radius
|
|
}
|
|
default: { return 0; }
|
|
}
|
|
}
|
|
|
|
half4 GetFillColor( float3 fillCoords ){
|
|
int fillType = PROP( _FillType );
|
|
half4 color = PROP( _Color );
|
|
if( fillType == FILL_TYPE_NONE )
|
|
return color;
|
|
half t = GetFillGradientT( fillCoords, fillType, PROP(_FillStart) );
|
|
return lerp( color, PROP(_ColorEnd), t );
|
|
}
|