rokojori_action_library/Runtime/Shading/Library/Bezier.gdshaderinc

66 lines
1.7 KiB
Plaintext

// #include "res://addons/rokojori_action_library/Runtime/Shading/Library/Bezier.gdshaderinc"
float cubicBezier( float t, float p0, float p1, float p2, float p3 )
{
float bp0 = ( 1.0 - t ) * ( 1.0 - t ) * ( 1.0 - t );
float bp1 = 3.0 * ( 1.0 - t ) * ( 1.0 - t ) * t;
float bp2 = 3.0 * ( 1.0 - t ) * t * t;
float bp3 = t * t * t;
return p0 * bp0 + p1 * bp1 + p2 * bp2 + p3 * bp3;
}
vec2 cubicBezier( float t, vec2 p0, vec2 p1, vec2 p2, vec2 p3 )
{
float bp0 = ( 1.0 - t ) * ( 1.0 - t ) * ( 1.0 - t );
float bp1 = 3.0 * ( 1.0 - t ) * ( 1.0 - t ) * t;
float bp2 = 3.0 * ( 1.0 - t ) * t * t;
float bp3 = t * t * t;
return p0 * bp0 + p1 * bp1 + p2 * bp2 + p3 * bp3;
}
vec3 cubicBezier( float t, vec3 p0, vec3 p1, vec3 p2, vec3 p3 )
{
float bp0 = ( 1.0 - t ) * ( 1.0 - t ) * ( 1.0 - t );
float bp1 = 3.0 * ( 1.0 - t ) * ( 1.0 - t ) * t;
float bp2 = 3.0 * ( 1.0 - t ) * t * t;
float bp3 = t * t * t;
return p0 * bp0 + p1 * bp1 + p2 * bp2 + p3 * bp3;
}
vec3 cubicBezierDerivative( float t, vec3 p0, vec3 p1, vec3 p2, vec3 p3 )
{
vec3 d0 = ( p1 - p0 );
vec3 d1 = ( p2 - p1 );
vec3 d2 = ( p3 - p2 );
float bp0 = 3.0 * ( 1.0 - t ) * ( 1.0 - t );
float bp1 = 6.0 * ( 1.0 - t ) * t;
float bp2 = 3.0 * t * t;
return d0 * bp0 + d1 * bp1 + d2 * bp2;
}
vec3 rationalCubicBezier( float t,
vec3 p0, vec3 p1, vec3 p2, vec3 p3,
float w0, float w1, float w2, float w3
)
{
float bp0 = ( 1.0 - t ) * ( 1.0 - t ) * ( 1.0 - t ) * w0;
float bp1 = 3.0 * ( 1.0 - t ) * ( 1.0 - t ) * t * w1;
float bp2 = 3.0 * ( 1.0 - t ) * t * t * w2;
float bp3 = t * t * t * w3;
vec3 weighted = p0 * bp0 + p1 * bp1 + p2 * bp2 + p3 * bp3;
float projection = bp0 + bp1 + bp2 + bp3;
return weighted / projection;
}