// #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; }