Skip to content

Commit 22a48be

Browse files
committed
rename timing funcs for clarity + remove and adjust elastic funcs
1 parent 54b7581 commit 22a48be

File tree

5 files changed

+57
-48
lines changed

5 files changed

+57
-48
lines changed

index.animated.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@
100100
// Generate a keyframe with overridable default values.
101101
const genFrame = (overrides) => ({
102102
duration: 4000,
103-
timingFunction: "easeInOut",
103+
timingFunction: "ease",
104104
callback: loopAnimation,
105105
blobOptions: {
106106
extraPoints: 3,
@@ -119,7 +119,7 @@
119119

120120
// Quickly animate to a new frame when canvas is clicked.
121121
canvas.onclick = () => {
122-
animation.transition(genFrame({duration: 400, timingFunction: "elasticIn0"}));
122+
animation.transition(genFrame({duration: 400, timingFunction: "elasticEnd0"}));
123123
};
124124
</script>
125125
</body>

internal/animate/state.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ import {RenderCache, InternalKeyframe, renderFramesAt, transitionFrames, Keyfram
33
import {typeCheck, error} from "../errors";
44
import {timingFunctions} from "./timing";
55

6-
// TODO make sure recursive callbacks don't fill up the stack.
7-
86
interface CallbackKeyframe extends Keyframe {
97
callback?: () => void;
108
}

internal/animate/testing/script.ts

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -259,53 +259,65 @@ const loopBetween = (percentage: number, a: Point[], b: Point[]): Point[] => {
259259
}
260260
};
261261

262-
const genAnimation = (speed: number): blobs2Animate.CanvasAnimation => {
262+
const genAnimation = (speed: number, offset: number, timing: blobs2Animate.CanvasKeyframe["timingFunction"]) => {
263263
const animation = blobs2Animate.canvasPath();
264264

265265
const loopAnimation = () => {
266266
animation.transition(
267267
{
268268
duration: speed,
269269
delay: speed,
270-
timingFunction: "easeInOut",
270+
timingFunction: "ease",
271271
blobOptions: {
272272
extraPoints: 3,
273273
randomness: 4,
274274
seed: Math.random(),
275275
size: 200,
276276
},
277+
canvasOptions: {
278+
offsetX: offset,
279+
},
277280
},
278281
{
279282
duration: speed,
280-
timingFunction: "easeInOut",
283+
timingFunction: "ease",
281284
blobOptions: {
282285
extraPoints: 3,
283286
randomness: 4,
284287
seed: Math.random(),
285288
size: 200,
286289
},
290+
canvasOptions: {
291+
offsetX: offset,
292+
},
287293
},
288294
{
289295
duration: speed,
290296
delay: speed,
291-
timingFunction: "easeInOut",
297+
timingFunction: "ease",
292298
blobOptions: {
293299
extraPoints: 3,
294300
randomness: 4,
295301
seed: Math.random(),
296302
size: 200,
297303
},
304+
canvasOptions: {
305+
offsetX: offset,
306+
},
298307
},
299308
{
300309
duration: speed,
301310
callback: loopAnimation,
302-
timingFunction: "easeInOut",
311+
timingFunction: "ease",
303312
blobOptions: {
304313
extraPoints: 39,
305314
randomness: 2,
306315
seed: Math.random(),
307316
size: 200,
308317
},
318+
canvasOptions: {
319+
offsetX: offset,
320+
},
309321
},
310322
);
311323
};
@@ -319,21 +331,26 @@ const genAnimation = (speed: number): blobs2Animate.CanvasAnimation => {
319331
seed: 0,
320332
size: 200,
321333
},
334+
canvasOptions: {
335+
offsetX: offset,
336+
},
322337
});
323338

339+
const oldOnclick = interact.onclick || (() => 0);
324340
interact.onclick = () => {
341+
oldOnclick();
325342
animation.transition({
326-
duration: 400,
343+
duration: speed,
327344
callback: loopAnimation,
328-
timingFunction: "elasticIn0",
345+
timingFunction: timing,
329346
blobOptions: {
330-
extraPoints: 3,
347+
extraPoints: 30,
331348
randomness: 8,
332349
seed: Math.random(),
333350
size: 180,
334351
},
335352
canvasOptions: {
336-
offsetX: 10,
353+
offsetX: 10 + offset,
337354
offsetY: 10,
338355
},
339356
});
@@ -345,7 +362,12 @@ const genAnimation = (speed: number): blobs2Animate.CanvasAnimation => {
345362
(() => {
346363
let percentage = animationStart;
347364

348-
const animation = genAnimation(1000);
365+
const animations = [
366+
genAnimation(1000, 0, "elasticEnd0"),
367+
genAnimation(1000, 200, "elasticEnd1"),
368+
genAnimation(1000, 400, "elasticEnd2"),
369+
genAnimation(1000, 600, "elasticEnd3"),
370+
];
349371

350372
const renderFrame = () => {
351373
clear(ctx);
@@ -362,7 +384,9 @@ const genAnimation = (speed: number): blobs2Animate.CanvasAnimation => {
362384
testPrepPointsD(percentage);
363385
testPrepLetters(percentage);
364386

365-
ctx.fill(animation.renderFrame());
387+
for (const animation of animations) {
388+
ctx.fill(animation.renderFrame());
389+
}
366390

367391
percentage += animationSpeed / 1000;
368392
percentage = mod(percentage, 1);

internal/animate/timing.ts

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,42 +6,32 @@ const linear: TimingFunc = (p) => {
66
return p;
77
};
88

9-
const easeIn: TimingFunc = (p) => {
9+
const easeEnd: TimingFunc = (p) => {
1010
return 1 - (p - 1) ** 2;
1111
};
1212

13-
const easeOut: TimingFunc = (p) => {
14-
return 1 - easeIn(1 - p);
13+
const easeStart: TimingFunc = (p) => {
14+
return 1 - easeEnd(1 - p);
1515
};
1616

17-
const easeInOut: TimingFunc = (p) => {
17+
const ease: TimingFunc = (p) => {
1818
return 0.5 + 0.5 * Math.sin(Math.PI * (p + 1.5));
1919
};
2020

21-
const elasticIn = (s: number): TimingFunc => (p) => {
21+
const elasticEnd = (s: number): TimingFunc => (p) => {
2222
return Math.pow(2, -10 * p) * Math.sin(((p - s / 4) * (2 * Math.PI)) / s) + 1;
2323
};
2424

25-
const elasticOut = (s: number): TimingFunc => (p) => {
26-
return 1 - elasticIn(s)(1 - p);
27-
};
28-
2925
// https://www.desmos.com/calculator/fqisoq1kuw
30-
// TODO lower magnitude/amount of bounce.
31-
// TODO Rename in/out to avoid confusion (out is out from point before).
3226
export const timingFunctions = {
3327
linear,
34-
easeIn,
35-
easeOut,
36-
easeInOut,
37-
elasticIn0: elasticIn(1),
38-
elasticIn1: elasticIn(0.16),
39-
elasticIn2: elasticIn(0.09),
40-
elasticIn3: elasticIn(0.05),
41-
elasticOut0: elasticOut(1),
42-
elasticOut1: elasticOut(0.16),
43-
elasticOut2: elasticOut(0.09),
44-
elasticOut3: elasticOut(0.05),
28+
easeEnd,
29+
easeStart,
30+
ease,
31+
elasticEnd0: elasticEnd(1),
32+
elasticEnd1: elasticEnd(0.64),
33+
elasticEnd2: elasticEnd(0.32),
34+
elasticEnd3: elasticEnd(0.16),
4535
};
4636

4737
// @ts-ignore: Type assertion.

public/animate.ts

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,13 @@ export interface CanvasKeyframe {
1010
duration: number;
1111
timingFunction?:
1212
| "linear"
13-
| "easeIn"
14-
| "easeOut"
15-
| "easeInOut"
16-
| "elasticIn0"
17-
| "elasticIn1"
18-
| "elasticIn2"
19-
| "elasticIn3"
20-
| "elasticOut0"
21-
| "elasticOut1"
22-
| "elasticOut2"
23-
| "elasticOut3";
13+
| "easeEnd"
14+
| "easeStart"
15+
| "ease"
16+
| "elasticEnd0"
17+
| "elasticEnd1"
18+
| "elasticEnd2"
19+
| "elasticEnd3";
2420
callback?: () => void;
2521
blobOptions: {
2622
seed: number | string;
@@ -43,6 +39,7 @@ const canvasBlobGenerator = (keyframe: CanvasKeyframe): Point[] => {
4339
};
4440

4541
// Only need to check properties unique to the canvas animation generator.
42+
// TODO test bad inputs.
4643
const canvasKeyframeChecker = (keyframe: CanvasKeyframe, index: number) => {
4744
typeCheck(`keyframe[${index}].canvasOptions`, keyframe.canvasOptions, ["object", "undefined"]);
4845
if (keyframe.canvasOptions) {

0 commit comments

Comments
 (0)