99 VirtualControlKnot ,
1010 DecorInterpolator ,
1111} from "@iosevka/geometry/spiro-control" ;
12- import { bez3 , fallback , mix } from "@iosevka/util" ;
12+ import { bez3 , clamp , fallback , mix } from "@iosevka/util" ;
1313
1414import { BiKnotCollector } from "../../geometry/src/spiro-expand.mjs" ;
1515
@@ -288,7 +288,7 @@ export function SetupBuilders(bindings) {
288288 super ( ) ;
289289 this . ty = ty ;
290290 this . rx = rx ;
291- this . ry = ry ;
291+ this . ry = fallback ( ry , rx ) ;
292292 this . deltaX = deltaX ;
293293 this . deltaY = deltaY ;
294294 this . raf = fallback ( raf , unimportant ) ;
@@ -302,21 +302,73 @@ export function SetupBuilders(bindings) {
302302 }
303303 }
304304
305- function alsoThru ( rx , ry , raf ) {
306- return new SimpleMixInterpolator ( g4 , rx , ry , 0 , 0 , raf ) ;
305+ class DistanceFromStartInterpolator extends InterpolatorBase {
306+ constructor ( ty , distFromStart , deltaX , deltaY , raf ) {
307+ super ( ) ;
308+ this . ty = ty ;
309+ this . distFromStart = distFromStart ;
310+ this . deltaX = deltaX ;
311+ this . deltaY = deltaY ;
312+ this . raf = fallback ( raf , unimportant ) ;
313+ }
314+ resolveInterpolation ( before , after ) {
315+ const totalDist = Math . hypot ( after . x - before . x , after . y - before . y ) ;
316+ const r = clamp ( 0 , 1 , this . distFromStart / totalDist ) ;
317+ return this . ty (
318+ mix ( before . x , after . x , r ) + this . deltaX ,
319+ mix ( before . y , after . y , r ) + this . deltaY ,
320+ this . raf ,
321+ ) ;
322+ }
307323 }
308- alsoThru . withOffset = function ( rx , ry , deltaX , deltaY , raf ) {
309- return new SimpleMixInterpolator ( g4 , rx , ry , deltaX , deltaY , raf ) ;
310- } ;
311- alsoThru . g2 = function ( rx , ry , raf ) {
312- return new SimpleMixInterpolator ( g2 , rx , ry , 0 , 0 , raf ) ;
313- } ;
314- alsoThru . g4 = function ( rx , ry , raf ) {
315- return new SimpleMixInterpolator ( g4 , rx , ry , 0 , 0 , raf ) ;
316- } ;
317- alsoThru . g2 . withOffset = function ( rx , ry , deltaX , deltaY , raf ) {
318- return new SimpleMixInterpolator ( g2 , rx , ry , deltaX , deltaY , raf ) ;
319- } ;
324+
325+ class DistTillEndInterpolator extends InterpolatorBase {
326+ constructor ( ty , distTillEnd , deltaX , deltaY , raf ) {
327+ super ( ) ;
328+ this . ty = ty ;
329+ this . distTillEnd = distTillEnd ;
330+ this . deltaX = deltaX ;
331+ this . deltaY = deltaY ;
332+ this . raf = fallback ( raf , unimportant ) ;
333+ }
334+ resolveInterpolation ( before , after ) {
335+ const totalDist = Math . hypot ( after . x - before . x , after . y - before . y ) ;
336+ const r = clamp ( 0 , 1 , 1 - this . distTillEnd / totalDist ) ;
337+ return this . ty (
338+ mix ( before . x , after . x , r ) + this . deltaX ,
339+ mix ( before . y , after . y , r ) + this . deltaY ,
340+ this . raf ,
341+ ) ;
342+ }
343+ }
344+
345+ function AlsoThruSeries ( ty ) {
346+ const fn = function ( rx , ry , raf ) {
347+ return new SimpleMixInterpolator ( ty , rx , ry , 0 , 0 , raf ) ;
348+ } ;
349+ fn . withOffset = function ( rx , ry , deltaX , deltaY , raf ) {
350+ return new SimpleMixInterpolator ( ty , rx , ry , deltaX , deltaY , raf ) ;
351+ } ;
352+ fn . distFromStart = function ( dist , raf ) {
353+ return new DistanceFromStartInterpolator ( ty , dist , 0 , 0 , raf ) ;
354+ } ;
355+ fn . distTillEnd = function ( dist , raf ) {
356+ return new DistTillEndInterpolator ( ty , dist , 0 , 0 , raf ) ;
357+ } ;
358+ fn . distFromStart . withOffset = function ( dist , deltaX , deltaY , raf ) {
359+ return new DistanceFromStartInterpolator ( ty , dist , deltaX , deltaY , raf ) ;
360+ } ;
361+ fn . distTillEnd . withOffset = function ( dist , deltaX , deltaY , raf ) {
362+ return new DistTillEndInterpolator ( ty , dist , deltaX , deltaY , raf ) ;
363+ } ;
364+ return fn ;
365+ }
366+
367+ const alsoThru = AlsoThruSeries ( g4 ) ;
368+ alsoThru . g2 = AlsoThruSeries ( g2 ) ;
369+ alsoThru . g4 = AlsoThruSeries ( g2 ) ;
370+ alsoThru . flat = AlsoThruSeries ( flat ) ;
371+ alsoThru . curl = AlsoThruSeries ( curl ) ;
320372
321373 /// Multi-mix interpolator
322374 class MultiMixInterpolator extends InterpolatorBase {
0 commit comments