@heyramzi/ui 2.8.0 → 2.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/COMPONENTS.md +1 -1
- package/README.md +1 -1
- package/dist/agents/helpers.js +52 -0
- package/dist/agents/index.js +3 -0
- package/dist/agents/page-state.js +65 -0
- package/dist/agents/types.js +1 -0
- package/dist/agents/vendor/color.js +149 -0
- package/dist/agents/vendor/draw.js +548 -0
- package/dist/agents/vendor/engine.js +632 -0
- package/dist/agents/vendor/mesh.js +727 -0
- package/dist/agents/vendor/plastic.js +3273 -0
- package/dist/agents/vendor/presets.js +171 -0
- package/dist/agents/vendor/shapes.js +24 -0
- package/dist/agents/vendor/ticker.js +56 -0
- package/dist/agents/vendor/types.js +0 -0
- package/dist/agents/vendor/wear.js +1525 -0
- package/dist/ai/ai-button/index.js +2 -0
- package/dist/ai/confirmation/confirmation-context.svelte.js +12 -0
- package/dist/ai/confirmation/index.js +9 -0
- package/dist/ai/generation-progress/index.js +2 -0
- package/dist/ai/index.js +11 -0
- package/dist/ai/loading-state/index.js +3 -0
- package/dist/ai/prompt-input/index.js +6 -0
- package/dist/ai/reasoning/index.js +4 -0
- package/dist/ai/reasoning/reasoning-context.svelte.js +12 -0
- package/dist/ai/response/index.js +3 -0
- package/dist/ai/suggestion/index.js +3 -0
- package/dist/ai/thinking-dots/index.js +3 -0
- package/dist/ai/typing-dots/index.js +2 -0
- package/dist/ai/voice-waveform/index.js +3 -0
- package/dist/animations/text-swap.js +30 -0
- package/dist/brand/index.js +65 -0
- package/dist/canvas/card/resize.js +10 -0
- package/dist/canvas/edges/edge-path.js +284 -0
- package/dist/canvas/editor/context-menu.js +42 -0
- package/dist/canvas/editor/dispatch.svelte.js +157 -0
- package/dist/canvas/editor/editor-context.js +8 -0
- package/dist/canvas/editor/editor-mode.js +0 -0
- package/dist/canvas/editor/frame.js +87 -0
- package/dist/canvas/editor/hand-context.js +8 -0
- package/dist/canvas/editor/history-core.js +221 -0
- package/dist/canvas/editor/keymap.js +193 -0
- package/dist/canvas/editor/layout-actions.js +170 -0
- package/dist/canvas/editor/lock.js +65 -0
- package/dist/canvas/editor/rebase.js +279 -0
- package/dist/canvas/editor/style.js +174 -0
- package/dist/canvas/editor/text-field-context.js +8 -0
- package/dist/canvas/editor/z-order.js +82 -0
- package/dist/canvas/headless/alignment.js +20 -0
- package/dist/canvas/headless/break-apart-find.js +324 -0
- package/dist/canvas/headless/break-apart-pieces.js +74 -0
- package/dist/canvas/headless/break-apart-plan.js +378 -0
- package/dist/canvas/headless/break-apart-style.js +93 -0
- package/dist/canvas/headless/break-apart.js +206 -0
- package/dist/canvas/headless/canvas-cleanup.js +70 -0
- package/dist/canvas/headless/edge-anchors.js +134 -0
- package/dist/canvas/headless/edge-memo.js +28 -0
- package/dist/canvas/headless/edge-serialization.js +31 -0
- package/dist/canvas/headless/figure-geometry.js +331 -0
- package/dist/canvas/headless/fit-viewport.js +82 -0
- package/dist/canvas/headless/grid.js +96 -0
- package/dist/canvas/headless/icon-node.js +45 -0
- package/dist/canvas/headless/index.js +1 -0
- package/dist/canvas/headless/linkify.js +25 -0
- package/dist/canvas/headless/pen-marks.js +115 -0
- package/dist/canvas/headless/sketch.js +250 -0
- package/dist/canvas/headless/snap-guides.js +100 -0
- package/dist/canvas/headless/svg-figure.js +137 -0
- package/dist/canvas/headless/table-layout.js +161 -0
- package/dist/canvas/index.js +25 -0
- package/dist/canvas/lod/lod-mode.svelte.js +22 -0
- package/dist/canvas/lod/render-all.svelte.js +45 -0
- package/dist/canvas/ops/arrange.js +83 -0
- package/dist/canvas/ops/ops.js +318 -0
- package/dist/canvas/pen/colors.js +41 -0
- package/dist/canvas/pen/eraser.js +35 -0
- package/dist/canvas/pen/geometry.js +143 -0
- package/dist/canvas/pen/index.js +9 -0
- package/dist/canvas/pen/ops.js +15 -0
- package/dist/canvas/pen/pen-session.js +171 -0
- package/dist/canvas/pen/plugin.js +129 -0
- package/dist/canvas/pen/shapes.js +80 -0
- package/dist/canvas/pen/stroke-path.js +37 -0
- package/dist/canvas/pen/types.js +30 -0
- package/dist/canvas/pen/ui.js +20 -0
- package/dist/canvas/plugin.js +51 -0
- package/dist/canvas/screen/glyphs.js +24 -0
- package/dist/canvas/screen/labels.js +24 -0
- package/dist/canvas/screen/parts.js +140 -0
- package/dist/canvas/screen/plugin.js +71 -0
- package/dist/canvas/screen/types.js +44 -0
- package/dist/canvas/screen/ui.js +13 -0
- package/dist/canvas/test-utils.js +18 -0
- package/dist/canvas/types.js +0 -0
- package/dist/canvas/ui/forward-wheel.js +27 -0
- package/dist/canvas/ui/icons.js +133 -0
- package/dist/canvas/ui/place-panel.js +57 -0
- package/dist/canvas/ui/shortcut-tip.js +18 -0
- package/dist/canvas/ui/tools.js +411 -0
- package/dist/charts/dashboard/chart.js +1 -0
- package/dist/charts/dashboard/data-table.js +7 -0
- package/dist/charts/dashboard/index.js +13 -0
- package/dist/charts/dashboard/windows.js +5 -0
- package/dist/charts/edge-fade.js +7 -0
- package/dist/charts/hover-band.js +13 -0
- package/dist/charts/index.js +19 -0
- package/dist/charts/motion.js +15 -0
- package/dist/charts/primitives/chart-utils.js +22 -0
- package/dist/charts/primitives/index.js +4 -0
- package/dist/components/copy/clipboard.js +38 -0
- package/dist/components/copy/copied.svelte.js +26 -0
- package/dist/components/copy/index.js +3 -0
- package/dist/components/data-table/data-table.js +55 -0
- package/dist/components/data-table/index.js +7 -0
- package/dist/components/docs/index.js +3 -0
- package/dist/components/docs/scroll-spy.svelte.js +71 -0
- package/dist/components/field-row/index.js +1 -0
- package/dist/components/hold-to-confirm/index.js +1 -0
- package/dist/components/icon/index.js +1 -0
- package/dist/components/language-flag/index.js +1 -0
- package/dist/components/list-page/filter-section.js +4 -0
- package/dist/components/list-page/index.js +25 -0
- package/dist/components/list-page/list-table.js +5 -0
- package/dist/components/list-page/queue-rail.js +3 -0
- package/dist/components/list-page/section-host.js +8 -0
- package/dist/components/list-page/step.js +5 -0
- package/dist/components/list-page/types.js +0 -0
- package/dist/components/locale-switch/index.js +1 -0
- package/dist/components/mark/index.js +1 -0
- package/dist/components/open-in/index.js +1 -0
- package/dist/components/picker/index.js +3 -0
- package/dist/components/picker/trigger.js +33 -0
- package/dist/components/picker/types.js +0 -0
- package/dist/components/section-card/index.js +1 -0
- package/dist/components/section-header/index.js +2 -0
- package/dist/components/segmented/collapse.js +32 -0
- package/dist/components/segmented/index.js +8 -0
- package/dist/components/segmented/segmented.js +50 -0
- package/dist/components/star-rating-input/index.js +2 -0
- package/dist/components/svg/index.js +1 -0
- package/dist/components/table-view/index.js +1 -0
- package/dist/components/table-view/types.js +0 -0
- package/dist/components/tags-input/index.js +2 -0
- package/dist/components/tags-input/tags.js +90 -0
- package/dist/components/theme/index.js +3 -0
- package/dist/components/toolbar/index.js +3 -0
- package/dist/components/toolbar/toolbar-trigger.js +4 -0
- package/dist/editor/anchors.js +17 -0
- package/dist/editor/block-id.js +62 -0
- package/dist/editor/block-ops.js +105 -0
- package/dist/editor/doc-blocks.js +181 -0
- package/dist/editor/extensions.js +200 -0
- package/dist/editor/index.js +4 -0
- package/dist/editor/markdown-test-helpers.js +6 -0
- package/dist/editor/markdown.js +486 -0
- package/dist/editor/serializer.js +268 -0
- package/dist/editor/slash-items.js +104 -0
- package/dist/editor/youtube-url.js +27 -0
- package/dist/effects/animated-beam/index.js +1 -0
- package/dist/effects/animated-beam/path-calculator.svelte.js +42 -0
- package/dist/effects/animated-beam/types.js +0 -0
- package/dist/effects/border-beam/css.js +420 -0
- package/dist/effects/border-beam/presets.js +1792 -0
- package/dist/effects/border-beam/register-properties.js +39 -0
- package/dist/effects/border-beam/types.js +0 -0
- package/dist/effects/image-comparison/compare.js +4 -0
- package/dist/effects/image-reveal/index.js +1 -0
- package/dist/effects/image-reveal/types.js +0 -0
- package/dist/effects/magnetic/magnetic.js +54 -0
- package/dist/effects/reveal/index.js +4 -0
- package/dist/effects/reveal/observe.js +43 -0
- package/dist/effects/reveal/types.js +0 -0
- package/dist/effects/shader-gradient/color.js +34 -0
- package/dist/effects/shader-gradient/index.js +1 -0
- package/dist/effects/shader-gradient/renderer.js +320 -0
- package/dist/effects/shader-gradient/shaders.js +280 -0
- package/dist/effects/shader-gradient/types.js +0 -0
- package/dist/icons/apple-symbol-exports.js +126 -0
- package/dist/icons/sf-symbols.js +465 -0
- package/dist/icons/trades.js +34 -0
- package/dist/inbox/index.js +4 -0
- package/dist/inbox/logic.js +156 -0
- package/dist/inbox/types.js +46 -0
- package/dist/index.js +18 -0
- package/dist/lib/arrive.js +13 -0
- package/dist/lib/icon-types.js +0 -0
- package/dist/lib/initials.js +17 -0
- package/dist/lib/layout.js +1 -0
- package/dist/lib/panel.js +3 -0
- package/dist/lib/result.js +26 -0
- package/dist/lib/sliding-pill.js +45 -0
- package/dist/lib/theme-transition.js +53 -0
- package/dist/lib/tone.js +32 -0
- package/dist/lib/utils.js +5 -0
- package/dist/onboarding/define-tours.js +28 -0
- package/dist/onboarding/index.js +4 -0
- package/dist/onboarding/onboarding.svelte.js +15 -0
- package/dist/onboarding/pick.js +16 -0
- package/dist/onboarding/stores.js +50 -0
- package/dist/onboarding/types.js +1 -0
- package/dist/onboarding/wait.js +25 -0
- package/dist/panel/index.js +1 -0
- package/dist/panel/side-panel-types.js +0 -0
- package/dist/record/demo-data.js +512 -0
- package/dist/record/fields.js +148 -0
- package/dist/record/format.js +97 -0
- package/dist/record/gutter.js +1 -0
- package/dist/record/index.js +15 -0
- package/dist/record/kinds.js +110 -0
- package/dist/record/logic.js +255 -0
- package/dist/record/types.js +52 -0
- package/dist/shadcn/accordion/index.js +5 -0
- package/dist/shadcn/alert/index.js +5 -0
- package/dist/shadcn/alert-dialog/index.js +12 -0
- package/dist/shadcn/attachment/index.js +10 -0
- package/dist/shadcn/avatar/index.js +7 -0
- package/dist/shadcn/badge/index.js +2 -0
- package/dist/shadcn/breadcrumb/index.js +8 -0
- package/dist/shadcn/bubble/index.js +5 -0
- package/dist/shadcn/button/index.js +2 -0
- package/dist/shadcn/calendar/index.js +19 -0
- package/dist/shadcn/card/index.js +8 -0
- package/dist/shadcn/checkbox/index.js +2 -0
- package/dist/shadcn/code-block/index.js +9 -0
- package/dist/shadcn/collapsible/index.js +4 -0
- package/dist/shadcn/command/index.js +13 -0
- package/dist/shadcn/context-menu/index.js +17 -0
- package/dist/shadcn/dialog/index.js +11 -0
- package/dist/shadcn/dropdown-menu/index.js +19 -0
- package/dist/shadcn/dropdown-menu/menu-item.js +23 -0
- package/dist/shadcn/empty/index.js +7 -0
- package/dist/shadcn/field/index.js +12 -0
- package/dist/shadcn/hooks/highlighter.js +92 -0
- package/dist/shadcn/hooks/is-mobile.svelte.js +7 -0
- package/dist/shadcn/hooks/use-highlighted-code.svelte.js +65 -0
- package/dist/shadcn/hover-card/index.js +5 -0
- package/dist/shadcn/input/index.js +3 -0
- package/dist/shadcn/input-otp/index.js +5 -0
- package/dist/shadcn/kbd/index.js +3 -0
- package/dist/shadcn/label/index.js +2 -0
- package/dist/shadcn/marker/index.js +4 -0
- package/dist/shadcn/message/index.js +7 -0
- package/dist/shadcn/message-scroller/index.js +8 -0
- package/dist/shadcn/popover/index.js +9 -0
- package/dist/shadcn/progress/index.js +2 -0
- package/dist/shadcn/progress/tone.js +11 -0
- package/dist/shadcn/radio-group/index.js +3 -0
- package/dist/shadcn/scroll-area/index.js +3 -0
- package/dist/shadcn/select/index.js +12 -0
- package/dist/shadcn/separator/index.js +2 -0
- package/dist/shadcn/sheet/index.js +11 -0
- package/dist/shadcn/sidebar/constants.js +6 -0
- package/dist/shadcn/sidebar/context.svelte.js +38 -0
- package/dist/shadcn/sidebar/index.js +25 -0
- package/dist/shadcn/skeleton/index.js +2 -0
- package/dist/shadcn/slider/index.js +2 -0
- package/dist/shadcn/sonner/index.js +1 -0
- package/dist/shadcn/spinner/index.js +1 -0
- package/dist/shadcn/switch/index.js +2 -0
- package/dist/shadcn/table/index.js +9 -0
- package/dist/shadcn/tabs/index.js +5 -0
- package/dist/shadcn/textarea/index.js +2 -0
- package/dist/shadcn/toggle/index.js +3 -0
- package/dist/shadcn/toggle-group/index.js +3 -0
- package/dist/shadcn/tooltip/context.js +8 -0
- package/dist/shadcn/tooltip/index.js +6 -0
- package/dist/shadcn/trace/index.js +9 -0
- package/dist/slides/bridges.js +66 -0
- package/dist/slides/deck-controller.svelte.js +221 -0
- package/dist/slides/export/capture.js +81 -0
- package/dist/slides/export/ffmpeg.js +85 -0
- package/dist/slides/export/index.js +4 -0
- package/dist/slides/export/launch.js +8 -0
- package/dist/slides/export/pdf.js +78 -0
- package/dist/slides/export/types.js +0 -0
- package/dist/slides/index.js +7 -0
- package/dist/slides/labels.js +26 -0
- package/dist/slides/layout.js +47 -0
- package/dist/slides/model.js +9 -0
- package/dist/slides/navigation.js +89 -0
- package/dist/slides/types.js +6 -0
- package/dist/status/define-statuses.js +16 -0
- package/dist/status/index.js +4 -0
- package/dist/status/status-types.js +0 -0
- package/dist/test-setup.js +26 -0
- package/dist/thread/index.js +3 -0
- package/dist/thread/logic.js +94 -0
- package/dist/thread/types.js +23 -0
- package/dist/work/board-order.js +109 -0
- package/dist/work/dates.js +19 -0
- package/dist/work/detail/detail-types.js +20 -0
- package/dist/work/docs/edited.js +39 -0
- package/dist/work/docs/index.js +7 -0
- package/dist/work/docs/labels.js +38 -0
- package/dist/work/docs/menu.js +121 -0
- package/dist/work/docs/outline.js +39 -0
- package/dist/work/gantt/logic.js +260 -0
- package/dist/work/inbox/inbox-logic.js +94 -0
- package/dist/work/inbox/inbox-statuses.js +86 -0
- package/dist/work/inbox/inbox-types.js +0 -0
- package/dist/work/inbox/index.js +1 -0
- package/dist/work/index.js +21 -0
- package/dist/work/kanban-drag.js +25 -0
- package/dist/work/kanban-types.js +0 -0
- package/dist/work/presets/sales.js +35 -0
- package/dist/work/reorder.js +10 -0
- package/dist/work/task-types.js +0 -0
- package/dist/work/time/duration.js +60 -0
- package/dist/work/time/time-types.js +25 -0
- package/dist/work/use-kanban-dnd.svelte.js +128 -0
- package/package.json +102 -76
- package/src/agents/vendor/draw.ts +4 -4
- package/src/canvas/headless/canvas-cleanup.test.ts +1 -1
- package/src/canvas/ops/ops.ts +1 -1
- package/src/charts/area-chart.svelte +11 -1
- package/src/charts/bar-chart.svelte +18 -3
- package/src/charts/line-chart.svelte +11 -1
- package/src/components/data-table/data-table.ts +4 -5
- package/src/components/data-table/pagination.svelte +5 -3
- package/src/components/docs/on-this-page.svelte +82 -5
- package/src/components/docs/scroll-spy.svelte.ts +6 -1
- package/src/components/list-page/detail-header.svelte +7 -3
- package/src/components/list-page/empty-state.svelte +3 -1
- package/src/components/list-page/filter-popover.svelte +2 -2
- package/src/components/list-page/rail-row.svelte +5 -2
- package/src/components/mark/mark.svelte +2 -1
- package/src/components/section-card/section-card.svelte +3 -1
- package/src/components/section-header/section-header.svelte +5 -5
- package/src/components/segmented/segment.svelte +1 -1
- package/src/components/table-view/table-view.svelte +6 -1
- package/src/components/tags-input/tags-input.svelte +1 -1
- package/src/components/toolbar/toolbar-trigger.ts +8 -2
- package/src/components/toolbar/toolbar.svelte +1 -1
- package/src/editor/anchors.ts +28 -0
- package/src/editor/doc-blocks.ts +168 -0
- package/src/editor/doc-page.css +389 -0
- package/src/editor/editor.svelte +47 -5
- package/src/editor/extensions.ts +26 -2
- package/src/editor/markdown.ts +27 -2
- package/src/editor/slash-items.ts +18 -0
- package/src/icons/trades.ts +1 -1
- package/src/inbox/README.md +6 -4
- package/src/inbox/inbox.test.ts +1 -1
- package/src/inbox/index.ts +2 -2
- package/src/inbox/logic.ts +29 -5
- package/src/inbox/thread-inbox.svelte +219 -92
- package/src/inbox/types.ts +27 -1
- package/src/lib/initials.test.ts +25 -0
- package/src/lib/initials.ts +29 -0
- package/src/modules.test.ts +4 -64
- package/src/panel/README.md +1 -1
- package/src/record/README.md +1 -1
- package/src/record/demo-data.ts +4 -4
- package/src/record/info-list.svelte +5 -4
- package/src/record/next-up.svelte +1 -1
- package/src/record/project-list.svelte +1 -1
- package/src/record/record-demo.svelte +2 -2
- package/src/record/steps-rail.svelte +3 -3
- package/src/shadcn/badge/badge.svelte +1 -1
- package/src/shadcn/card/card-title.svelte +1 -5
- package/src/shadcn/empty/empty-description.svelte +1 -1
- package/src/shadcn/progress/progress.svelte +8 -1
- package/src/shadcn/table/table-cell.svelte +10 -2
- package/src/status/README.md +1 -1
- package/src/thread/README.md +2 -0
- package/src/thread/index.ts +9 -1
- package/src/thread/logic.ts +33 -3
- package/src/thread/thread-body.svelte +37 -0
- package/src/thread/thread-events.svelte +30 -0
- package/src/thread/thread.svelte +74 -59
- package/src/thread/types.ts +21 -0
- package/src/{tasks → work}/README.md +11 -8
- package/src/{tasks → work}/detail/task-thread.svelte +8 -15
- package/src/work/docs/doc-editor-page.svelte +194 -0
- package/src/work/docs/doc-menu.svelte +333 -0
- package/src/work/docs/docs-demo.svelte +227 -0
- package/src/work/docs/edited-chip.svelte +125 -0
- package/src/work/docs/edited.ts +54 -0
- package/src/work/docs/index.ts +38 -0
- package/src/work/docs/labels.ts +70 -0
- package/src/work/docs/menu.ts +127 -0
- package/src/work/docs/outline.ts +60 -0
- package/src/{tasks → work}/gantt/gantt-group-row.svelte +1 -1
- package/src/{tasks → work}/inbox/inbox-card.svelte +113 -50
- package/src/work/inbox/inbox-logic.ts +98 -0
- package/src/work/inbox/inbox-trace.svelte +58 -0
- package/src/{tasks → work}/inbox/inbox-types.ts +2 -0
- package/src/{tasks → work}/index.ts +0 -10
- package/src/{tasks → work}/kanban-board.svelte +1 -1
- package/src/{tasks → work}/task-list.svelte +1 -1
- package/src/{tasks → work}/time/time-tracker.svelte +2 -5
- package/src/tasks/inbox/inbox-logic.ts +0 -21
- package/src/tasks/inbox/inbox-trace.svelte +0 -51
- /package/src/{tasks → work}/ambient.d.ts +0 -0
- /package/src/{tasks → work}/board-order.ts +0 -0
- /package/src/{tasks → work}/dates.ts +0 -0
- /package/src/{tasks → work}/demo.svelte +0 -0
- /package/src/{tasks → work}/detail/detail-demo.svelte +0 -0
- /package/src/{tasks → work}/detail/detail-types.ts +0 -0
- /package/src/{tasks → work}/detail/task-chip.svelte +0 -0
- /package/src/{tasks → work}/detail/task-detail.svelte +0 -0
- /package/src/{tasks → work}/detail/task-property.svelte +0 -0
- /package/src/{tasks → work}/gantt/gantt-bar.svelte +0 -0
- /package/src/{tasks → work}/gantt/gantt-grid.svelte +0 -0
- /package/src/{tasks → work}/gantt/gantt-header.svelte +0 -0
- /package/src/{tasks → work}/gantt/gantt-task-row.svelte +0 -0
- /package/src/{tasks → work}/gantt/gantt.css +0 -0
- /package/src/{tasks → work}/gantt/gantt.test.ts +0 -0
- /package/src/{tasks → work}/gantt/logic.test.ts +0 -0
- /package/src/{tasks → work}/gantt/logic.ts +0 -0
- /package/src/{tasks → work}/inbox/inbox-draft.svelte +0 -0
- /package/src/{tasks → work}/inbox/inbox-statuses.ts +0 -0
- /package/src/{tasks → work}/inbox/index.ts +0 -0
- /package/src/{tasks → work}/kanban-column.svelte +0 -0
- /package/src/{tasks → work}/kanban-drag.ts +0 -0
- /package/src/{tasks → work}/kanban-types.ts +0 -0
- /package/src/{tasks → work}/presets/sales.ts +0 -0
- /package/src/{tasks → work}/reorder.ts +0 -0
- /package/src/{tasks → work}/task-gantt.svelte +0 -0
- /package/src/{tasks → work}/task-types.ts +0 -0
- /package/src/{tasks → work}/time/duration.ts +0 -0
- /package/src/{tasks → work}/time/time-chip.svelte +0 -0
- /package/src/{tasks → work}/time/time-dot.svelte +0 -0
- /package/src/{tasks → work}/time/time-ring.svelte +0 -0
- /package/src/{tasks → work}/time/time-types.ts +0 -0
- /package/src/{tasks → work}/use-kanban-dnd.svelte.ts +0 -0
|
@@ -0,0 +1,632 @@
|
|
|
1
|
+
export const STATES = [
|
|
2
|
+
"default",
|
|
3
|
+
"working",
|
|
4
|
+
"sleeping"
|
|
5
|
+
];
|
|
6
|
+
const HOP_T = 0.68;
|
|
7
|
+
const HOP_SPIN_H = 26;
|
|
8
|
+
const FLIP_PRE = 0.2;
|
|
9
|
+
const FLIP_POST = 0.66;
|
|
10
|
+
export const JUMP_DEFAULTS = {
|
|
11
|
+
height: HOP_SPIN_H,
|
|
12
|
+
time: HOP_T,
|
|
13
|
+
stretch: 1,
|
|
14
|
+
squash: 1.15,
|
|
15
|
+
squashTime: 0.37,
|
|
16
|
+
squashEase: "pulse",
|
|
17
|
+
groundTime: 0.11,
|
|
18
|
+
groundEase: "pulse",
|
|
19
|
+
riseTime: 0.33,
|
|
20
|
+
riseEase: "pulse",
|
|
21
|
+
clickSquashTime: 0.24,
|
|
22
|
+
spin: 1,
|
|
23
|
+
lean: 6,
|
|
24
|
+
every: 8,
|
|
25
|
+
land: 0
|
|
26
|
+
};
|
|
27
|
+
const flipPre = (j, poked)=>poked ? j.clickSquashTime : FLIP_PRE * j.time;
|
|
28
|
+
const flipDuration = (j, poked)=>flipPre(j, poked) + j.time + SQUASH_PEAK[j.squashEase] * (poked ? j.clickSquashTime : j.squashTime) + Math.max(0, j.groundTime) + j.riseTime + Math.max(0, j.land) + 0.05;
|
|
29
|
+
const SQUASH_PEAK = {
|
|
30
|
+
sharp: 0,
|
|
31
|
+
pulse: 2 / 7,
|
|
32
|
+
soft: 0.5,
|
|
33
|
+
bouncy: 0.144
|
|
34
|
+
};
|
|
35
|
+
const risePulse = (v, ease)=>{
|
|
36
|
+
if (v <= 0) return 1;
|
|
37
|
+
if (v >= 1) return 0;
|
|
38
|
+
switch(ease){
|
|
39
|
+
case "sharp":
|
|
40
|
+
return (1 - v) * (1 - v);
|
|
41
|
+
case "soft":
|
|
42
|
+
return 0.5 + 0.5 * Math.cos(Math.PI * v);
|
|
43
|
+
case "bouncy":
|
|
44
|
+
return Math.exp(-3.2 * v) * Math.cos(5.4 * v) - v * v * v * 0.026;
|
|
45
|
+
default:
|
|
46
|
+
{
|
|
47
|
+
const k = 4.2 * v;
|
|
48
|
+
return (1 + k) * Math.exp(-k) - v * v * v * 0.078;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
const groundShape = (v, ease)=>1 + 0.25 * squashPulse(v, ease);
|
|
53
|
+
const squashPulse = (u, ease)=>{
|
|
54
|
+
if (u <= 0 || u >= 1) return 0;
|
|
55
|
+
let x;
|
|
56
|
+
switch(ease){
|
|
57
|
+
case "sharp":
|
|
58
|
+
x = (1 - u) * (1 - u);
|
|
59
|
+
break;
|
|
60
|
+
case "soft":
|
|
61
|
+
x = Math.sin(Math.PI * u) ** 2;
|
|
62
|
+
break;
|
|
63
|
+
case "bouncy":
|
|
64
|
+
x = Math.exp(-3.15 * u) * Math.sin(8.43 * u) / 0.596;
|
|
65
|
+
break;
|
|
66
|
+
default:
|
|
67
|
+
{
|
|
68
|
+
const k = 7 * u;
|
|
69
|
+
x = k * k * Math.exp(2 - k) / 4;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const tail = u > 0.85 ? 1 - (u - 0.85) / 0.15 : 1;
|
|
73
|
+
return x * tail * tail * (3 - 2 * tail);
|
|
74
|
+
};
|
|
75
|
+
const hopSquash = (a)=>Math.exp(-Math.pow(Math.min(Math.abs(a), Math.abs(a - 1)) / 0.11, 2));
|
|
76
|
+
const DEG = Math.PI / 180;
|
|
77
|
+
const TAU = Math.PI * 2;
|
|
78
|
+
const SWITCH_TO = {
|
|
79
|
+
default: 1.2,
|
|
80
|
+
working: 0.7,
|
|
81
|
+
sleeping: 1.4
|
|
82
|
+
};
|
|
83
|
+
const SWITCH_FROM_SLEEP = 1;
|
|
84
|
+
function rng(seed) {
|
|
85
|
+
let a = seed * 0x9e3779b1 >>> 0 || 1;
|
|
86
|
+
return ()=>{
|
|
87
|
+
a = a + 0x6d2b79f5 >>> 0;
|
|
88
|
+
let t = a;
|
|
89
|
+
t = Math.imul(t ^ t >>> 15, t | 1);
|
|
90
|
+
t ^= t + Math.imul(t ^ t >>> 7, t | 61);
|
|
91
|
+
return ((t ^ t >>> 14) >>> 0) / 4294967296;
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function approach(cur, target, rate, dt) {
|
|
95
|
+
return cur + (target - cur) * (1 - Math.exp(-rate * dt));
|
|
96
|
+
}
|
|
97
|
+
const easeInOut = (p)=>p < 0.5 ? 4 * p * p * p : 1 - Math.pow(-2 * p + 2, 3) / 2;
|
|
98
|
+
const easeSine = (p)=>0.5 - 0.5 * Math.cos(Math.PI * p);
|
|
99
|
+
class Wander {
|
|
100
|
+
rand;
|
|
101
|
+
amp;
|
|
102
|
+
holdMin;
|
|
103
|
+
holdMax;
|
|
104
|
+
rate;
|
|
105
|
+
spring;
|
|
106
|
+
value = 0;
|
|
107
|
+
vel = 0;
|
|
108
|
+
target = 0;
|
|
109
|
+
next = 0;
|
|
110
|
+
constructor(rand, amp, holdMin, holdMax, rate, spring = false){
|
|
111
|
+
this.rand = rand;
|
|
112
|
+
this.amp = amp;
|
|
113
|
+
this.holdMin = holdMin;
|
|
114
|
+
this.holdMax = holdMax;
|
|
115
|
+
this.rate = rate;
|
|
116
|
+
this.spring = spring;
|
|
117
|
+
}
|
|
118
|
+
update(t, dt) {
|
|
119
|
+
if (t >= this.next) {
|
|
120
|
+
this.target = (this.rand() * 2 - 1) * this.amp;
|
|
121
|
+
this.next = t + this.holdMin + this.rand() * (this.holdMax - this.holdMin);
|
|
122
|
+
}
|
|
123
|
+
if (this.spring) {
|
|
124
|
+
const w = this.rate * 1.6, z = 0.9;
|
|
125
|
+
this.vel += (w * w * (this.target - this.value) - 2 * z * w * this.vel) * dt;
|
|
126
|
+
this.value += this.vel * dt;
|
|
127
|
+
} else this.value = approach(this.value, this.target, this.rate, dt);
|
|
128
|
+
}
|
|
129
|
+
aim(v) {
|
|
130
|
+
this.target = v;
|
|
131
|
+
this.next = Infinity;
|
|
132
|
+
}
|
|
133
|
+
set(amp, holdMin, holdMax, rate) {
|
|
134
|
+
this.amp = amp;
|
|
135
|
+
this.holdMin = holdMin;
|
|
136
|
+
this.holdMax = holdMax;
|
|
137
|
+
this.rate = rate;
|
|
138
|
+
this.next = 0;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
class Event {
|
|
142
|
+
duration;
|
|
143
|
+
p = -1;
|
|
144
|
+
constructor(duration){
|
|
145
|
+
this.duration = duration;
|
|
146
|
+
}
|
|
147
|
+
fire() {
|
|
148
|
+
this.p = 0;
|
|
149
|
+
}
|
|
150
|
+
get active() {
|
|
151
|
+
return this.p >= 0;
|
|
152
|
+
}
|
|
153
|
+
update(dt) {
|
|
154
|
+
if (this.p < 0) return;
|
|
155
|
+
this.p += dt / this.duration;
|
|
156
|
+
if (this.p >= 1) this.p = -1;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
const GAZE_YAW = 35 * DEG;
|
|
160
|
+
const GAZE_PITCH = 14 * DEG;
|
|
161
|
+
const GAZE_ROLL = 3.2 * DEG;
|
|
162
|
+
const GAZE_HOLD_MIN = 2.6;
|
|
163
|
+
const GAZE_HOLD_MAX = 4.4;
|
|
164
|
+
const REST = {
|
|
165
|
+
default: {
|
|
166
|
+
pitch: 0,
|
|
167
|
+
roll: 0,
|
|
168
|
+
y: 0,
|
|
169
|
+
lookX: 0,
|
|
170
|
+
lookY: 0
|
|
171
|
+
},
|
|
172
|
+
working: {
|
|
173
|
+
pitch: 5 * DEG,
|
|
174
|
+
roll: 0,
|
|
175
|
+
y: 0,
|
|
176
|
+
lookX: 0,
|
|
177
|
+
lookY: 0
|
|
178
|
+
},
|
|
179
|
+
sleeping: {
|
|
180
|
+
pitch: -16 * DEG,
|
|
181
|
+
roll: 6 * DEG,
|
|
182
|
+
y: 3,
|
|
183
|
+
lookX: 0,
|
|
184
|
+
lookY: 1
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
export class Sim {
|
|
188
|
+
pose = {
|
|
189
|
+
yaw: 0,
|
|
190
|
+
pitch: 0,
|
|
191
|
+
roll: 0,
|
|
192
|
+
x: 0,
|
|
193
|
+
y: 0,
|
|
194
|
+
sx: 1,
|
|
195
|
+
sy: 1,
|
|
196
|
+
eyeOpen: 1,
|
|
197
|
+
blinkL: 0,
|
|
198
|
+
blinkR: 0,
|
|
199
|
+
lookX: 0,
|
|
200
|
+
lookY: 0,
|
|
201
|
+
breath: 0,
|
|
202
|
+
laugh: 0,
|
|
203
|
+
whirl: 0,
|
|
204
|
+
whirlAngle: 0,
|
|
205
|
+
w: [
|
|
206
|
+
1,
|
|
207
|
+
0,
|
|
208
|
+
0
|
|
209
|
+
]
|
|
210
|
+
};
|
|
211
|
+
state = "default";
|
|
212
|
+
rand;
|
|
213
|
+
t = 0;
|
|
214
|
+
wFrom = [
|
|
215
|
+
1,
|
|
216
|
+
0,
|
|
217
|
+
0
|
|
218
|
+
];
|
|
219
|
+
tr = 1;
|
|
220
|
+
trDuration = 1.2;
|
|
221
|
+
yawW;
|
|
222
|
+
pitchW;
|
|
223
|
+
rollW;
|
|
224
|
+
lookXW;
|
|
225
|
+
lookYW;
|
|
226
|
+
blink = new Event(0.17);
|
|
227
|
+
blinkAt;
|
|
228
|
+
blinkAgain = false;
|
|
229
|
+
dart = new Event(0.12);
|
|
230
|
+
dartAt;
|
|
231
|
+
dartX = 0;
|
|
232
|
+
dartY = 0;
|
|
233
|
+
flip = new Event(flipDuration(JUMP_DEFAULTS, false));
|
|
234
|
+
flipPoked = false;
|
|
235
|
+
jump = {
|
|
236
|
+
...JUMP_DEFAULTS
|
|
237
|
+
};
|
|
238
|
+
flipAt;
|
|
239
|
+
flipSide = 1;
|
|
240
|
+
nod = new Event(1.7);
|
|
241
|
+
nodAt;
|
|
242
|
+
hopPhase = 0;
|
|
243
|
+
hopCount = 0;
|
|
244
|
+
hopGain = 0;
|
|
245
|
+
laughEv = new Event(0.8);
|
|
246
|
+
laughAt;
|
|
247
|
+
prevYaw = 0;
|
|
248
|
+
jelly = 0;
|
|
249
|
+
jellyV = 0;
|
|
250
|
+
gazeLead = 0;
|
|
251
|
+
gazeDir = [
|
|
252
|
+
0,
|
|
253
|
+
0
|
|
254
|
+
];
|
|
255
|
+
gazeAt = 0;
|
|
256
|
+
turnK = 1;
|
|
257
|
+
breathPhase = 0;
|
|
258
|
+
ptrX = 0;
|
|
259
|
+
ptrY = 0;
|
|
260
|
+
ptrS = 0;
|
|
261
|
+
ptrTargetX = 0;
|
|
262
|
+
ptrTargetY = 0;
|
|
263
|
+
ptrTargetS = 0;
|
|
264
|
+
baseYaw = 0;
|
|
265
|
+
constructor(seed, state = "default"){
|
|
266
|
+
this.rand = rng(Math.floor(seed * 1e6) + 1);
|
|
267
|
+
const r = this.rand;
|
|
268
|
+
this.yawW = new Wander(r, 36 * DEG, 1.1, 2.6, 3, true);
|
|
269
|
+
this.pitchW = new Wander(r, 10 * DEG, 1.1, 2.6, 2.6, true);
|
|
270
|
+
this.rollW = new Wander(r, 5 * DEG, 1.6, 3.2, 2, true);
|
|
271
|
+
this.lookXW = new Wander(r, 3.6, 0.5, 2, 14);
|
|
272
|
+
this.lookYW = new Wander(r, 2.4, 0.5, 2, 14);
|
|
273
|
+
this.t = r() * 10;
|
|
274
|
+
this.hopPhase = r();
|
|
275
|
+
this.breathPhase = r();
|
|
276
|
+
this.blinkAt = this.t + 1 + r() * 3;
|
|
277
|
+
this.flipAt = this.nextFlip(this.t, 1);
|
|
278
|
+
this.nodAt = this.t + 3 + r() * 4;
|
|
279
|
+
this.dartAt = this.t + 1 + r() * 2;
|
|
280
|
+
this.laughAt = this.t + 0.6 + r() * 1.5;
|
|
281
|
+
this.setState(state, true);
|
|
282
|
+
}
|
|
283
|
+
setState(next, immediate = false) {
|
|
284
|
+
if (next === this.state && !immediate) return;
|
|
285
|
+
const from = this.state;
|
|
286
|
+
this.state = next;
|
|
287
|
+
const w = this.pose.w;
|
|
288
|
+
if (immediate) {
|
|
289
|
+
for(let i = 0; i < 3; i++)w[i] = STATES[i] === next ? 1 : 0;
|
|
290
|
+
this.tr = 1;
|
|
291
|
+
} else {
|
|
292
|
+
this.wFrom = [
|
|
293
|
+
w[0],
|
|
294
|
+
w[1],
|
|
295
|
+
w[2]
|
|
296
|
+
];
|
|
297
|
+
this.tr = 0;
|
|
298
|
+
this.trDuration = from === "sleeping" ? SWITCH_FROM_SLEEP : SWITCH_TO[next];
|
|
299
|
+
}
|
|
300
|
+
switch(next){
|
|
301
|
+
case "default":
|
|
302
|
+
this.yawW.set(GAZE_YAW, 2.6, 5.4, 2);
|
|
303
|
+
this.pitchW.set(GAZE_PITCH, 2.8, 5.8, 1.8);
|
|
304
|
+
this.rollW.set(GAZE_ROLL, 3.4, 6.6, 1.5);
|
|
305
|
+
this.gazeAt = 0;
|
|
306
|
+
this.gazeDir = [
|
|
307
|
+
0,
|
|
308
|
+
0
|
|
309
|
+
];
|
|
310
|
+
this.lookXW.set(3.6, 0.6, 2.2, 13);
|
|
311
|
+
this.lookYW.set(2.4, 0.6, 2.2, 13);
|
|
312
|
+
this.flipAt = this.nextFlip(this.t, 0.6);
|
|
313
|
+
break;
|
|
314
|
+
case "working":
|
|
315
|
+
this.yawW.set(16 * DEG, 0.9, 1.8, 4);
|
|
316
|
+
this.pitchW.set(3 * DEG, 1.2, 2.4, 3);
|
|
317
|
+
this.rollW.set(0, 1, 2, 3);
|
|
318
|
+
this.lookXW.set(2, 0.5, 1.2, 12);
|
|
319
|
+
this.lookYW.set(1, 0.5, 1.2, 12);
|
|
320
|
+
this.hopPhase = 0;
|
|
321
|
+
this.hopCount = 0;
|
|
322
|
+
this.laughAt = this.t + 0.5 + this.rand() * 1.2;
|
|
323
|
+
break;
|
|
324
|
+
case "sleeping":
|
|
325
|
+
this.yawW.set(7 * DEG, 3, 6, 0.7);
|
|
326
|
+
this.pitchW.set(3 * DEG, 3, 6, 0.7);
|
|
327
|
+
this.rollW.set(2 * DEG, 3, 6, 0.6);
|
|
328
|
+
this.lookXW.set(0, 2, 4, 2);
|
|
329
|
+
this.lookYW.set(0, 2, 4, 2);
|
|
330
|
+
this.nodAt = this.t + 2.5 + this.rand() * 4;
|
|
331
|
+
break;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
setPointer(x, y, strength) {
|
|
335
|
+
this.ptrTargetX = Math.max(-1.2, Math.min(1.2, x));
|
|
336
|
+
this.ptrTargetY = Math.max(-1.2, Math.min(1.2, y));
|
|
337
|
+
this.ptrTargetS = Math.max(0, Math.min(1, strength));
|
|
338
|
+
}
|
|
339
|
+
poke() {
|
|
340
|
+
if (this.flip.active && this.flip.p < 0.6) return;
|
|
341
|
+
this.flipPoked = true;
|
|
342
|
+
this.flip.duration = flipDuration(this.jump, true);
|
|
343
|
+
this.flipSide = this.rand() < 0.5 ? -1 : 1;
|
|
344
|
+
this.flip.fire();
|
|
345
|
+
this.flipAt = this.nextFlip(this.t, 1.1);
|
|
346
|
+
}
|
|
347
|
+
setTurn(k) {
|
|
348
|
+
const next = Math.max(0, k);
|
|
349
|
+
if (next === this.turnK) return;
|
|
350
|
+
this.turnK = next;
|
|
351
|
+
if (this.state === "default") this.gazeAt = 0;
|
|
352
|
+
}
|
|
353
|
+
setJump(j) {
|
|
354
|
+
const every = this.jump.every;
|
|
355
|
+
Object.assign(this.jump, j);
|
|
356
|
+
if (j.every !== undefined && j.every !== every) this.flipAt = this.nextFlip(this.t, 1);
|
|
357
|
+
}
|
|
358
|
+
nextGaze() {
|
|
359
|
+
const r = this.rand;
|
|
360
|
+
const [px, py] = this.gazeDir;
|
|
361
|
+
if (px !== 0 || py !== 0) {
|
|
362
|
+
const p = r();
|
|
363
|
+
if (p < 0.66) return [
|
|
364
|
+
-px,
|
|
365
|
+
-py
|
|
366
|
+
];
|
|
367
|
+
if (p < 0.85) return [
|
|
368
|
+
-px,
|
|
369
|
+
py
|
|
370
|
+
];
|
|
371
|
+
return [
|
|
372
|
+
0,
|
|
373
|
+
0
|
|
374
|
+
];
|
|
375
|
+
}
|
|
376
|
+
const corners = [
|
|
377
|
+
[
|
|
378
|
+
1,
|
|
379
|
+
-1
|
|
380
|
+
],
|
|
381
|
+
[
|
|
382
|
+
-1,
|
|
383
|
+
1
|
|
384
|
+
],
|
|
385
|
+
[
|
|
386
|
+
-1,
|
|
387
|
+
-1
|
|
388
|
+
],
|
|
389
|
+
[
|
|
390
|
+
1,
|
|
391
|
+
1
|
|
392
|
+
]
|
|
393
|
+
];
|
|
394
|
+
return corners[Math.floor(r() * corners.length)];
|
|
395
|
+
}
|
|
396
|
+
nextFlip(t, k) {
|
|
397
|
+
const every = this.jump.every;
|
|
398
|
+
return every > 0 ? t + every * k * (0.625 + this.rand() * 0.75) : Infinity;
|
|
399
|
+
}
|
|
400
|
+
update(dt) {
|
|
401
|
+
dt = Math.min(dt, 0.05);
|
|
402
|
+
this.t += dt;
|
|
403
|
+
const t = this.t;
|
|
404
|
+
const p = this.pose;
|
|
405
|
+
const w = p.w;
|
|
406
|
+
if (this.tr < 1) {
|
|
407
|
+
this.tr = Math.min(1, this.tr + dt / this.trDuration);
|
|
408
|
+
const e = easeSine(this.tr);
|
|
409
|
+
for(let i = 0; i < 3; i++){
|
|
410
|
+
const target = STATES[i] === this.state ? 1 : 0;
|
|
411
|
+
w[i] = this.wFrom[i] + (target - this.wFrom[i]) * e;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
const [wd, ww, ws] = w;
|
|
415
|
+
const rest = {
|
|
416
|
+
pitch: 0,
|
|
417
|
+
roll: 0,
|
|
418
|
+
y: 0,
|
|
419
|
+
lookX: 0,
|
|
420
|
+
lookY: 0
|
|
421
|
+
};
|
|
422
|
+
for(let i = 0; i < 3; i++){
|
|
423
|
+
const r = REST[STATES[i]];
|
|
424
|
+
rest.pitch += r.pitch * w[i];
|
|
425
|
+
rest.roll += r.roll * w[i];
|
|
426
|
+
rest.y += r.y * w[i];
|
|
427
|
+
rest.lookX += r.lookX * w[i];
|
|
428
|
+
rest.lookY += r.lookY * w[i];
|
|
429
|
+
}
|
|
430
|
+
if (this.state === "default" && t >= this.gazeAt) {
|
|
431
|
+
const [gx, gy] = this.nextGaze();
|
|
432
|
+
this.gazeDir = [
|
|
433
|
+
gx,
|
|
434
|
+
gy
|
|
435
|
+
];
|
|
436
|
+
const reach = 0.84 + this.rand() * 0.16;
|
|
437
|
+
this.yawW.aim(gx * GAZE_YAW * reach * this.turnK);
|
|
438
|
+
this.pitchW.aim(gy * GAZE_PITCH * reach);
|
|
439
|
+
this.rollW.aim(gx * GAZE_ROLL * reach * this.turnK);
|
|
440
|
+
this.gazeAt = t + GAZE_HOLD_MIN + this.rand() * (GAZE_HOLD_MAX - GAZE_HOLD_MIN);
|
|
441
|
+
}
|
|
442
|
+
this.yawW.update(t, dt);
|
|
443
|
+
this.pitchW.update(t, dt);
|
|
444
|
+
this.rollW.update(t, dt);
|
|
445
|
+
this.lookXW.update(t, dt);
|
|
446
|
+
this.lookYW.update(t, dt);
|
|
447
|
+
this.ptrS = approach(this.ptrS, this.ptrTargetS, 8, dt);
|
|
448
|
+
this.ptrX = approach(this.ptrX, this.ptrTargetX, 14, dt);
|
|
449
|
+
this.ptrY = approach(this.ptrY, this.ptrTargetY, 14, dt);
|
|
450
|
+
const ps = this.ptrS;
|
|
451
|
+
const quiet = 1 - 0.75 * ps;
|
|
452
|
+
this.baseYaw = approach(this.baseYaw, this.yawW.value * quiet + 22 * DEG * this.ptrX * ps, 5, dt);
|
|
453
|
+
const basePitch = rest.pitch + this.pitchW.value * quiet - 12 * DEG * this.ptrY * ps;
|
|
454
|
+
const baseRoll = rest.roll + this.rollW.value * quiet;
|
|
455
|
+
const baseY = rest.y;
|
|
456
|
+
const baseLookX = rest.lookX + this.lookXW.value * quiet + 4.5 * this.ptrX * ps;
|
|
457
|
+
const baseLookY = rest.lookY + this.lookYW.value * quiet + 3 * this.ptrY * ps;
|
|
458
|
+
let spin = 0, hopY = 0, sx = 1, sy = 1, pitchAdd = 0, rollAdd = 0, blinkClose = 0, lookXAdd = 0, lookYAdd = 0, laugh = 0;
|
|
459
|
+
let whirl = 0, whirlAngle = 0;
|
|
460
|
+
const smooth = (a, b, v)=>{
|
|
461
|
+
const x = Math.min(1, Math.max(0, (v - a) / (b - a)));
|
|
462
|
+
return x * x * (3 - 2 * x);
|
|
463
|
+
};
|
|
464
|
+
const envelope = (q)=>smooth(0.1, 0.26, q) * (1 - smooth(0.66, 0.9, q));
|
|
465
|
+
const ringAngle = (q)=>TAU * (1.5 * q + 0.9 * easeInOut(q));
|
|
466
|
+
if (t >= this.blinkAt && !this.blink.active && wd + ww > 0.5) {
|
|
467
|
+
this.blink.fire();
|
|
468
|
+
this.blinkAgain = !this.blinkAgain && this.rand() < 0.22;
|
|
469
|
+
this.blinkAt = t + (this.blinkAgain ? 0.28 : 2.2 + this.rand() * 2.6);
|
|
470
|
+
}
|
|
471
|
+
this.blink.update(dt);
|
|
472
|
+
if (this.blink.active) blinkClose = Math.sin(Math.PI * this.blink.p);
|
|
473
|
+
if (t >= this.dartAt && !this.dart.active && wd + ww > 0.5) {
|
|
474
|
+
this.dart.fire();
|
|
475
|
+
this.dartX = (this.rand() * 2 - 1) * 4;
|
|
476
|
+
this.dartY = (this.rand() * 2 - 1) * 2;
|
|
477
|
+
this.dart.duration = 0.25 + this.rand() * 0.45;
|
|
478
|
+
this.dartAt = t + 1.2 + this.rand() * 2.6;
|
|
479
|
+
}
|
|
480
|
+
this.dart.update(dt);
|
|
481
|
+
if (this.dart.active) {
|
|
482
|
+
const q = this.dart.p;
|
|
483
|
+
const hold = q < 0.15 ? q / 0.15 : q > 0.8 ? (1 - q) / 0.2 : 1;
|
|
484
|
+
lookXAdd += this.dartX * hold * (wd + ww);
|
|
485
|
+
lookYAdd += this.dartY * hold * (wd + ww);
|
|
486
|
+
}
|
|
487
|
+
if (this.state === "default" && t >= this.flipAt && !this.flip.active) {
|
|
488
|
+
this.flipPoked = false;
|
|
489
|
+
this.flip.duration = flipDuration(this.jump, false);
|
|
490
|
+
this.flipSide = this.rand() < 0.5 ? -1 : 1;
|
|
491
|
+
this.flip.fire();
|
|
492
|
+
this.flipAt = this.nextFlip(t, 1);
|
|
493
|
+
}
|
|
494
|
+
this.flip.update(dt);
|
|
495
|
+
if (this.flip.active) {
|
|
496
|
+
const J = this.jump;
|
|
497
|
+
const preS = flipPre(J, this.flipPoked);
|
|
498
|
+
const a = (this.flip.p * this.flip.duration - preS) / J.time;
|
|
499
|
+
const q = Math.min(1, Math.max(0, a));
|
|
500
|
+
const arc = Math.sin(Math.PI * q);
|
|
501
|
+
spin += TAU * J.spin * easeInOut(q);
|
|
502
|
+
hopY -= J.height * arc;
|
|
503
|
+
const tl = (a - 1) * J.time - J.land;
|
|
504
|
+
const squashTime = this.flipPoked ? J.clickSquashTime : J.squashTime;
|
|
505
|
+
const crouch = (u)=>this.flipPoked ? u * u * (3 - 2 * u) : hopSquash(u - 1);
|
|
506
|
+
const hold = Math.max(0, J.groundTime);
|
|
507
|
+
const peakT = SQUASH_PEAK[J.squashEase] * squashTime;
|
|
508
|
+
const rise = tl - peakT - hold;
|
|
509
|
+
const depth = tl <= peakT ? squashPulse(tl / squashTime, J.squashEase) : rise <= 0 ? groundShape((tl - peakT) / hold, J.groundEase) : risePulse(rise / J.riseTime, J.riseEase);
|
|
510
|
+
const land = (a < 0 ? crouch(Math.max(0, 1 + a * J.time / preS)) : tl > 0 ? depth : a < 0.2 ? hopSquash(a) : 0) * J.squash;
|
|
511
|
+
sx += 0.16 * land - 0.06 * arc * J.stretch;
|
|
512
|
+
sy += -0.18 * land + 0.09 * arc * J.stretch;
|
|
513
|
+
rollAdd += this.flipSide * J.lean * DEG * arc;
|
|
514
|
+
if (J.spin > 0) {
|
|
515
|
+
laugh = Math.max(laugh, arc);
|
|
516
|
+
whirl = Math.max(whirl, envelope(q));
|
|
517
|
+
whirlAngle = ringAngle(q);
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
const J = this.jump;
|
|
521
|
+
const exitHold = Math.max(0, J.groundTime);
|
|
522
|
+
const exitFor = exitHold + J.riseTime;
|
|
523
|
+
if (this.state === "working") this.hopGain = ww;
|
|
524
|
+
if (this.hopGain > 0.02 && (this.state === "working" || this.hopPhase > 0)) {
|
|
525
|
+
this.hopPhase += dt / HOP_T;
|
|
526
|
+
if (this.hopPhase >= 1) {
|
|
527
|
+
if (this.state === "working") {
|
|
528
|
+
this.hopPhase -= 1;
|
|
529
|
+
this.hopCount += 1;
|
|
530
|
+
} else if ((this.hopPhase - 1) * HOP_T >= exitFor) {
|
|
531
|
+
this.hopPhase = 0;
|
|
532
|
+
this.hopGain = 0;
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
const g = this.hopGain;
|
|
536
|
+
const q = Math.min(1, this.hopPhase);
|
|
537
|
+
const arc = Math.sin(Math.PI * q);
|
|
538
|
+
const spinning = this.hopCount % 3 === 2;
|
|
539
|
+
const h = spinning ? HOP_SPIN_H : 18;
|
|
540
|
+
hopY -= h * arc * g;
|
|
541
|
+
const exitT = this.state !== "working" && this.hopPhase > 1 ? (this.hopPhase - 1) * HOP_T : -1;
|
|
542
|
+
const land = exitT < 0 ? hopSquash(this.hopPhase) : exitT < exitHold ? groundShape(exitT / exitHold, J.groundEase) : risePulse((exitT - exitHold) / J.riseTime, J.riseEase);
|
|
543
|
+
sx += (0.16 * land - 0.06 * arc) * g;
|
|
544
|
+
sy += (-0.18 * land + 0.09 * arc) * g;
|
|
545
|
+
if (spinning) {
|
|
546
|
+
spin += TAU * easeInOut(q) * g;
|
|
547
|
+
laugh = Math.max(laugh, arc * g);
|
|
548
|
+
if (envelope(q) * g > whirl) {
|
|
549
|
+
whirl = envelope(q) * g;
|
|
550
|
+
whirlAngle = ringAngle(q);
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
rollAdd += (this.hopCount % 2 === 0 ? 1 : -1) * 6 * DEG * arc * g;
|
|
554
|
+
}
|
|
555
|
+
if (this.state === "working" && t >= this.laughAt && !this.laughEv.active) {
|
|
556
|
+
this.laughEv.fire();
|
|
557
|
+
this.laughEv.duration = 0.6 + this.rand() * 0.5;
|
|
558
|
+
this.laughAt = t + 1.6 + this.rand() * 2.2;
|
|
559
|
+
}
|
|
560
|
+
this.laughEv.update(dt);
|
|
561
|
+
if (this.laughEv.active) {
|
|
562
|
+
const q = this.laughEv.p;
|
|
563
|
+
laugh = Math.max(laugh, q < 0.18 ? q / 0.18 : q > 0.78 ? (1 - q) / 0.22 : 1);
|
|
564
|
+
}
|
|
565
|
+
if (this.state === "sleeping" && t >= this.nodAt && !this.nod.active) {
|
|
566
|
+
this.nod.fire();
|
|
567
|
+
this.nodAt = t + 4 + this.rand() * 4;
|
|
568
|
+
}
|
|
569
|
+
this.nod.update(dt);
|
|
570
|
+
if (this.nod.active) {
|
|
571
|
+
const q = this.nod.p;
|
|
572
|
+
const dip = q < 0.72 ? easeInOut(q / 0.72) : 1 - easeInOut((q - 0.72) / 0.28);
|
|
573
|
+
pitchAdd -= 13 * DEG * dip * ws;
|
|
574
|
+
}
|
|
575
|
+
this.breathPhase += dt / (3.6 + 1.2 * ws);
|
|
576
|
+
const breath = Math.sin(this.breathPhase * TAU);
|
|
577
|
+
p.breath = breath;
|
|
578
|
+
sx += breath * (0.008 + 0.014 * ws);
|
|
579
|
+
sy += breath * (0.012 + 0.02 * ws);
|
|
580
|
+
const bob = Math.sin(t * TAU / 3.4) * 2 * (1 - ws);
|
|
581
|
+
p.yaw = this.baseYaw + spin;
|
|
582
|
+
let dyaw = this.baseYaw - this.prevYaw;
|
|
583
|
+
dyaw = ((dyaw + Math.PI) % TAU + TAU) % TAU - Math.PI;
|
|
584
|
+
this.prevYaw = this.baseYaw;
|
|
585
|
+
const rate = dt > 0 ? Math.abs(dyaw) / dt : 0;
|
|
586
|
+
const leadTarget = dt > 0 ? Math.max(-2.2, Math.min(2.2, dyaw / dt * 2.4)) : 0;
|
|
587
|
+
this.gazeLead = approach(this.gazeLead, leadTarget, 9, dt);
|
|
588
|
+
const jellyTarget = Math.min(0.22, 0.055 * rate);
|
|
589
|
+
const omega = 16, zeta = 0.45;
|
|
590
|
+
this.jellyV += (omega * omega * (jellyTarget - this.jelly) - 2 * zeta * omega * this.jellyV) * dt;
|
|
591
|
+
this.jelly += this.jellyV * dt;
|
|
592
|
+
const jelly = Math.max(-0.08, Math.min(0.28, this.jelly)) * 0.6;
|
|
593
|
+
sx *= 1 + jelly;
|
|
594
|
+
sy *= 1 - 0.55 * jelly;
|
|
595
|
+
p.pitch = basePitch + pitchAdd;
|
|
596
|
+
p.roll = baseRoll + rollAdd;
|
|
597
|
+
p.x = 0;
|
|
598
|
+
p.y = baseY + hopY + bob;
|
|
599
|
+
p.sx = sx;
|
|
600
|
+
p.sy = sy;
|
|
601
|
+
p.eyeOpen = 1;
|
|
602
|
+
p.laugh = approach(p.laugh, laugh, 30, dt);
|
|
603
|
+
p.blinkL = blinkClose;
|
|
604
|
+
p.blinkR = blinkClose;
|
|
605
|
+
p.lookX = baseLookX + lookXAdd + this.gazeLead;
|
|
606
|
+
p.lookY = baseLookY + lookYAdd;
|
|
607
|
+
p.whirl = whirl;
|
|
608
|
+
p.whirlAngle = whirlAngle;
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
export function restPose(state) {
|
|
612
|
+
const r = REST[state];
|
|
613
|
+
return {
|
|
614
|
+
yaw: 0,
|
|
615
|
+
pitch: r.pitch,
|
|
616
|
+
roll: r.roll,
|
|
617
|
+
x: 0,
|
|
618
|
+
y: r.y,
|
|
619
|
+
sx: 1,
|
|
620
|
+
sy: 1,
|
|
621
|
+
eyeOpen: 1,
|
|
622
|
+
blinkL: 0,
|
|
623
|
+
blinkR: 0,
|
|
624
|
+
lookX: r.lookX,
|
|
625
|
+
lookY: r.lookY,
|
|
626
|
+
breath: 0,
|
|
627
|
+
laugh: 0,
|
|
628
|
+
whirl: 0,
|
|
629
|
+
whirlAngle: 0,
|
|
630
|
+
w: STATES.map((s)=>s === state ? 1 : 0)
|
|
631
|
+
};
|
|
632
|
+
}
|