@reicek/neataptic-ts 0.1.21 → 0.1.23
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/.github/agents/boundary-mapper.agent.md +31 -0
- package/.github/agents/docs-scout.agent.md +29 -0
- package/.github/agents/plan-scout.agent.md +31 -0
- package/.github/agents/solid-split.agent.md +143 -0
- package/.github/copilot-instructions.md +119 -0
- package/.github/skills/solid-split-playbook/SKILL.md +220 -0
- package/.github/skills/solid-split-playbook/assets/docs-checklist.md +34 -0
- package/.github/skills/solid-split-playbook/assets/split-plan-template.md +48 -0
- package/.github/skills/solid-split-playbook/assets/split-workflow-checklist.md +51 -0
- package/.github/skills/trace-analyzer-extension/SKILL.md +63 -0
- package/.github/skills/trace-analyzer-extension/assets/extension-checklist.md +24 -0
- package/.github/skills/trace-analyzer-extension/references/analyzer-extension-workflow.md +101 -0
- package/.github/skills/trace-audit-reporting/SKILL.md +96 -0
- package/.github/skills/trace-audit-reporting/assets/performance-report-template.md +123 -0
- package/.github/skills/trace-audit-reporting/references/trace-analysis-workflow.md +132 -0
- package/package.json +7 -3
- package/plans/ES2023 migration +13 -8
- package/plans/Evolution_Training_Interoperability_Contracts.md +1 -1
- package/plans/Flappy_Bird_Folder_Documentation_Pass.md +53 -0
- package/plans/Flappy_Evolution_Worker_Documentation_Pass.md +58 -0
- package/plans/Interactive_Examples_and_Learning_Path.md +10 -2
- package/plans/Memory_Optimization.md +3 -3
- package/plans/README.md +63 -0
- package/plans/Roadmap.md +15 -3
- package/plans/asciiMaze_SOLID_split.done.md +130 -0
- package/plans/flappy_bird_SOLID_split.done.md +67 -0
- package/scripts/analyze-trace.ts +590 -0
- package/scripts/assets/theme.css +221 -34
- package/scripts/copy-examples.mjs +9 -5
- package/scripts/export-onnx.mjs +3 -3
- package/scripts/generate-bench-tables.mjs +10 -10
- package/scripts/generate-bench-tables.ts +10 -10
- package/scripts/generate-docs.ts +1415 -449
- package/scripts/render-docs-html.ts +15 -8
- package/src/README.md +127 -222
- package/src/architecture/README.md +117 -184
- package/src/architecture/architect.ts +6 -0
- package/src/architecture/layer/README.md +38 -38
- package/src/architecture/network/README.md +49 -31
- package/src/architecture/network/activate/README.md +77 -77
- package/src/architecture/network/connect/README.md +15 -13
- package/src/architecture/network/deterministic/README.md +7 -7
- package/src/architecture/network/evolve/README.md +44 -44
- package/src/architecture/network/gating/README.md +20 -20
- package/src/architecture/network/genetic/README.md +51 -51
- package/src/architecture/network/mutate/README.md +97 -97
- package/src/architecture/network/network.types.ts +39 -0
- package/src/architecture/network/onnx/README.md +264 -264
- package/src/architecture/network/prune/README.md +39 -39
- package/src/architecture/network/remove/README.md +26 -26
- package/src/architecture/network/serialize/README.md +56 -56
- package/src/architecture/network/serialize/network.serialize.json.utils.ts +1 -0
- package/src/architecture/network/serialize/network.serialize.utils.ts +6 -1
- package/src/architecture/network/serialize/network.serialize.utils.types.ts +1 -1
- package/src/architecture/network/slab/README.md +61 -61
- package/src/architecture/network/standalone/README.md +24 -24
- package/src/architecture/network/stats/README.md +9 -9
- package/src/architecture/network/topology/README.md +46 -46
- package/src/architecture/network/training/README.md +21 -21
- package/src/architecture/network.ts +114 -10
- package/src/methods/README.md +9 -87
- package/src/multithreading/README.md +8 -77
- package/src/multithreading/workers/README.md +2 -2
- package/src/multithreading/workers/browser/README.md +0 -6
- package/src/multithreading/workers/node/README.md +0 -3
- package/src/neat/README.md +623 -568
- package/src/neat/neat.evolve.population.utils.ts +29 -5
- package/src/neat/neat.helpers.ts +16 -0
- package/src/neat/neat.topology-intent.utils.ts +160 -0
- package/src/utils/README.md +18 -18
- package/test/examples/asciiMaze/README.md +59 -59
- package/test/examples/asciiMaze/asciiMaze.e2e.test.ts +14 -9
- package/test/examples/asciiMaze/browser-entry/README.md +196 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.abort.services.ts +95 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.constants.ts +23 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.curriculum.services.ts +115 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.globals.services.ts +106 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.host.services.ts +157 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.services.ts +14 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.ts +129 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.types.ts +120 -0
- package/test/examples/asciiMaze/browser-entry/browser-entry.utils.ts +98 -0
- package/test/examples/asciiMaze/browser-entry.ts +10 -576
- package/test/examples/asciiMaze/dashboardManager/README.md +276 -0
- package/test/examples/asciiMaze/dashboardManager/archive/README.md +16 -0
- package/test/examples/asciiMaze/dashboardManager/archive/dashboardManager.archive.services.ts +267 -0
- package/test/examples/asciiMaze/dashboardManager/dashboardManager.constants.ts +35 -0
- package/test/examples/asciiMaze/dashboardManager/dashboardManager.services.ts +103 -0
- package/test/examples/asciiMaze/dashboardManager/dashboardManager.ts +181 -0
- package/test/examples/asciiMaze/dashboardManager/dashboardManager.types.ts +267 -0
- package/test/examples/asciiMaze/dashboardManager/dashboardManager.utils.ts +254 -0
- package/test/examples/asciiMaze/dashboardManager/live/README.md +14 -0
- package/test/examples/asciiMaze/dashboardManager/live/dashboardManager.live.services.ts +264 -0
- package/test/examples/asciiMaze/dashboardManager/telemetry/README.md +47 -0
- package/test/examples/asciiMaze/dashboardManager/telemetry/dashboardManager.telemetry.services.ts +513 -0
- package/test/examples/asciiMaze/dashboardManager.ts +13 -2335
- package/test/examples/asciiMaze/evolutionEngine/README.md +1058 -0
- package/test/examples/asciiMaze/evolutionEngine/curriculumPhase.ts +90 -0
- package/test/examples/asciiMaze/evolutionEngine/engineState.constants.ts +36 -0
- package/test/examples/asciiMaze/evolutionEngine/engineState.ts +58 -513
- package/test/examples/asciiMaze/evolutionEngine/engineState.types.ts +212 -0
- package/test/examples/asciiMaze/evolutionEngine/engineState.utils.ts +301 -0
- package/test/examples/asciiMaze/evolutionEngine/evolutionEngine.types.ts +445 -0
- package/test/examples/asciiMaze/evolutionEngine/evolutionLoop.ts +81 -50
- package/test/examples/asciiMaze/evolutionEngine/optionsAndSetup.ts +2 -4
- package/test/examples/asciiMaze/evolutionEngine/populationDynamics.ts +17 -33
- package/test/examples/asciiMaze/evolutionEngine/populationPruning.ts +1 -1
- package/test/examples/asciiMaze/evolutionEngine/rngAndTiming.ts +1 -2
- package/test/examples/asciiMaze/evolutionEngine/sampling.ts +1 -1
- package/test/examples/asciiMaze/evolutionEngine/scratchPools.ts +2 -5
- package/test/examples/asciiMaze/evolutionEngine/setupHelpers.ts +30 -37
- package/test/examples/asciiMaze/evolutionEngine/telemetryMetrics.ts +16 -58
- package/test/examples/asciiMaze/evolutionEngine/trainingWarmStart.ts +2 -2
- package/test/examples/asciiMaze/evolutionEngine.ts +55 -55
- package/test/examples/asciiMaze/fitness.ts +2 -2
- package/test/examples/asciiMaze/fitness.types.ts +65 -0
- package/test/examples/asciiMaze/interfaces.ts +64 -1352
- package/test/examples/asciiMaze/mazeMovement/README.md +356 -0
- package/test/examples/asciiMaze/mazeMovement/finalization/README.md +49 -0
- package/test/examples/asciiMaze/mazeMovement/finalization/mazeMovement.finalization.ts +138 -0
- package/test/examples/asciiMaze/mazeMovement/mazeMovement.constants.ts +101 -0
- package/test/examples/asciiMaze/mazeMovement/mazeMovement.services.ts +230 -0
- package/test/examples/asciiMaze/mazeMovement/mazeMovement.ts +299 -0
- package/test/examples/asciiMaze/mazeMovement/mazeMovement.types.ts +185 -0
- package/test/examples/asciiMaze/mazeMovement/mazeMovement.utils.ts +153 -0
- package/test/examples/asciiMaze/mazeMovement/policy/README.md +91 -0
- package/test/examples/asciiMaze/mazeMovement/policy/mazeMovement.policy.ts +467 -0
- package/test/examples/asciiMaze/mazeMovement/runtime/README.md +95 -0
- package/test/examples/asciiMaze/mazeMovement/runtime/mazeMovement.runtime.ts +354 -0
- package/test/examples/asciiMaze/mazeMovement/shaping/README.md +124 -0
- package/test/examples/asciiMaze/mazeMovement/shaping/mazeMovement.shaping.ts +459 -0
- package/test/examples/asciiMaze/mazeMovement.ts +12 -2978
- package/test/examples/flappy_bird/README.md +193 -88
- package/test/examples/flappy_bird/browser-entry/README.md +1441 -0
- package/test/examples/flappy_bird/browser-entry/browser-entry.host.utils.ts +4 -324
- package/test/examples/flappy_bird/browser-entry/browser-entry.network-view.utils.ts +9 -396
- package/test/examples/flappy_bird/browser-entry/browser-entry.playback.utils.ts +6 -714
- package/test/examples/flappy_bird/browser-entry/browser-entry.render.types.ts +26 -3
- package/test/examples/flappy_bird/browser-entry/browser-entry.runtime.types.ts +16 -1
- package/test/examples/flappy_bird/browser-entry/browser-entry.simulation.types.ts +39 -5
- package/test/examples/flappy_bird/browser-entry/browser-entry.spawn.utils.ts +11 -31
- package/test/examples/flappy_bird/browser-entry/browser-entry.stats.types.ts +32 -4
- package/test/examples/flappy_bird/browser-entry/browser-entry.ts +11 -0
- package/test/examples/flappy_bird/browser-entry/browser-entry.types.ts +8 -0
- package/test/examples/flappy_bird/browser-entry/browser-entry.visualization.types.ts +50 -7
- package/test/examples/flappy_bird/browser-entry/browser-entry.visualization.utils.ts +21 -893
- package/test/examples/flappy_bird/browser-entry/browser-entry.worker.types.ts +91 -10
- package/test/examples/flappy_bird/browser-entry/host/README.md +318 -0
- package/test/examples/flappy_bird/browser-entry/host/host.canvas.service.ts +16 -0
- package/test/examples/flappy_bird/browser-entry/host/host.constants.ts +20 -0
- package/test/examples/flappy_bird/browser-entry/host/host.dom.service.ts +10 -0
- package/test/examples/flappy_bird/browser-entry/host/host.resize.service.ts +1 -295
- package/test/examples/flappy_bird/browser-entry/host/host.stats.service.ts +14 -0
- package/test/examples/flappy_bird/browser-entry/host/host.ts +592 -6
- package/test/examples/flappy_bird/browser-entry/host/host.types.ts +13 -0
- package/test/examples/flappy_bird/browser-entry/host/resize/README.md +309 -0
- package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.constants.ts +47 -0
- package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.services.ts +392 -0
- package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.ts +132 -0
- package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.types.ts +92 -0
- package/test/examples/flappy_bird/browser-entry/host/resize/host.resize.service.utils.ts +272 -0
- package/test/examples/flappy_bird/browser-entry/network-view/README.md +389 -0
- package/test/examples/flappy_bird/browser-entry/network-view/network-view.draw.service.ts +13 -0
- package/test/examples/flappy_bird/browser-entry/network-view/network-view.labels.utils.ts +12 -0
- package/test/examples/flappy_bird/browser-entry/network-view/network-view.layout.utils.ts +14 -0
- package/test/examples/flappy_bird/browser-entry/network-view/network-view.topology.utils.ts +267 -0
- package/test/examples/flappy_bird/browser-entry/network-view/network-view.ts +823 -7
- package/test/examples/flappy_bird/browser-entry/network-view/network-view.types.ts +11 -0
- package/test/examples/flappy_bird/browser-entry/playback/README.md +845 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/README.md +355 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/README.md +1068 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.batch.services.ts +64 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.cache.services.ts +207 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.constants.ts +197 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.batch.utils.ts +114 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.layout.utils.test.ts +96 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.layout.utils.ts +204 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.services.ts +49 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.geometry.utils.ts +313 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.layer.services.ts +81 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.math.utils.test.ts +33 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.math.utils.ts +201 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.selection.utils.ts +171 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.timing.utils.ts +124 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.utils.test.ts +279 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.pulse.utils.ts +132 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.scene.services.ts +26 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.services.ts +65 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.ts +48 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.types.ts +342 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/ground-grid/playback.background.ground-grid.utils.ts +10 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.cache.services.ts +96 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.constants.ts +127 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.draw.services.ts +184 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.scene.services.ts +64 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.services.ts +6 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.ts +53 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.types.ts +105 -0
- package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.utils.ts +100 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/README.md +541 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.bird.utils.ts +180 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.canvas.services.ts +77 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.entity.services.ts +167 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.scene.services.ts +57 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.service.test.ts +176 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.service.ts +113 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.services.ts +35 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.trail.utils.ts +248 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.types.ts +103 -0
- package/test/examples/flappy_bird/browser-entry/playback/frame-render/playback.frame-render.utils.ts +11 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.constants.ts +1 -1
- package/test/examples/flappy_bird/browser-entry/playback/playback.frame-render.service.ts +10 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.iteration.services.ts +192 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.loop.service.ts +12 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.orchestration.types.ts +78 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.render.pipe-outline.service.ts +128 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.render.service.ts +1 -116
- package/test/examples/flappy_bird/browser-entry/playback/playback.session.services.ts +184 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.snapshot.utils.test.ts +121 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.snapshot.utils.ts +8 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.layer.services.ts +36 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.service.ts +11 -128
- package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.services.ts +268 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.types.ts +91 -0
- package/test/examples/flappy_bird/browser-entry/playback/playback.starfield.utils.ts +11 -4
- package/test/examples/flappy_bird/browser-entry/playback/playback.trail.utils.ts +9 -86
- package/test/examples/flappy_bird/browser-entry/playback/playback.ts +75 -7
- package/test/examples/flappy_bird/browser-entry/playback/playback.types.ts +12 -9
- package/test/examples/flappy_bird/browser-entry/playback/playback.worker-channel.utils.ts +11 -123
- package/test/examples/flappy_bird/browser-entry/playback/snapshot/README.md +55 -0
- package/test/examples/flappy_bird/browser-entry/playback/snapshot/playback.snapshot.services.ts +103 -0
- package/test/examples/flappy_bird/browser-entry/playback/snapshot/playback.snapshot.summary.utils.test.ts +45 -0
- package/test/examples/flappy_bird/browser-entry/playback/snapshot/playback.snapshot.summary.utils.ts +28 -0
- package/test/examples/flappy_bird/browser-entry/playback/trail/README.md +95 -0
- package/test/examples/flappy_bird/browser-entry/playback/trail/playback.trail.history.services.test.ts +35 -0
- package/test/examples/flappy_bird/browser-entry/playback/trail/playback.trail.history.services.ts +64 -0
- package/test/examples/flappy_bird/browser-entry/playback/trail/playback.trail.opacity.utils.test.ts +37 -0
- package/test/examples/flappy_bird/browser-entry/playback/trail/playback.trail.opacity.utils.ts +74 -0
- package/test/examples/flappy_bird/browser-entry/playback/worker-channel/README.md +71 -0
- package/test/examples/flappy_bird/browser-entry/playback/worker-channel/playback.worker-channel.request.services.ts +45 -0
- package/test/examples/flappy_bird/browser-entry/playback/worker-channel/playback.worker-channel.summary.services.ts +74 -0
- package/test/examples/flappy_bird/browser-entry/playback/worker-channel/playback.worker-channel.types.ts +53 -0
- package/test/examples/flappy_bird/browser-entry/runtime/README.md +304 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.browser-globals.service.ts +15 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.errors.ts +17 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.evolution-launch.service.ts +56 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.evolution-loop.service.ts +19 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.lifecycle.service.ts +96 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.startup.service.ts +92 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.telemetry.service.ts +24 -0
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.ts +31 -121
- package/test/examples/flappy_bird/browser-entry/runtime/runtime.types.ts +65 -0
- package/test/examples/flappy_bird/browser-entry/visualization/README.md +568 -0
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.colors.utils.ts +26 -0
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.constants.ts +110 -0
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.draw.service.ts +979 -19
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.legend.utils.ts +157 -3
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.topology.utils.ts +13 -27
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.ts +7 -20
- package/test/examples/flappy_bird/browser-entry/visualization/visualization.types.ts +14 -0
- package/test/examples/flappy_bird/browser-entry/worker-channel/README.md +238 -0
- package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.errors.ts +11 -0
- package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.generation.service.ts +12 -0
- package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.playback.service.test.ts +143 -0
- package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.playback.service.ts +140 -14
- package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.request.service.ts +27 -0
- package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.ts +8 -0
- package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.types.ts +23 -0
- package/test/examples/flappy_bird/browser-entry/worker-channel/worker-channel.url.service.ts +5 -0
- package/test/examples/flappy_bird/constants/README.md +1163 -0
- package/test/examples/flappy_bird/constants/constants.birds.ts +16 -38
- package/test/examples/flappy_bird/constants/constants.difficulty.ts +21 -0
- package/test/examples/flappy_bird/constants/constants.network-view.ts +24 -0
- package/test/examples/flappy_bird/constants/constants.network.ts +1 -1
- package/test/examples/flappy_bird/constants/constants.observation.ts +7 -0
- package/test/examples/flappy_bird/constants/constants.palette.ts +9 -2
- package/test/examples/flappy_bird/constants/constants.physics.ts +9 -0
- package/test/examples/flappy_bird/constants/constants.pipe-render.ts +3 -0
- package/test/examples/flappy_bird/constants/constants.pipes.ts +22 -3
- package/test/examples/flappy_bird/constants/constants.runtime.ts +28 -4
- package/test/examples/flappy_bird/constants/constants.starfield.ts +78 -3
- package/test/examples/flappy_bird/constants/constants.ts +6 -0
- package/test/examples/flappy_bird/environment/README.md +182 -0
- package/test/examples/flappy_bird/environment/environment.collision.utils.ts +7 -0
- package/test/examples/flappy_bird/environment/environment.constants.ts +16 -3
- package/test/examples/flappy_bird/environment/environment.observation.utils.ts +12 -19
- package/test/examples/flappy_bird/environment/environment.state.service.ts +10 -0
- package/test/examples/flappy_bird/environment/environment.step.service.ts +15 -66
- package/test/examples/flappy_bird/environment/environment.types.ts +14 -0
- package/test/examples/flappy_bird/evaluation/README.md +155 -0
- package/test/examples/flappy_bird/evaluation/evaluation.constants.ts +23 -4
- package/test/examples/flappy_bird/evaluation/evaluation.fitness.utils.ts +16 -1
- package/test/examples/flappy_bird/evaluation/evaluation.rollout.service.ts +7 -374
- package/test/examples/flappy_bird/evaluation/evaluation.seed.utils.ts +4 -0
- package/test/examples/flappy_bird/evaluation/evaluation.types.ts +18 -2
- package/test/examples/flappy_bird/evaluation/rollout/README.md +355 -0
- package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.constants.ts +38 -0
- package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.service.ts +71 -0
- package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.services.ts +338 -0
- package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.types.ts +69 -0
- package/test/examples/flappy_bird/evaluation/rollout/evaluation.rollout.utils.ts +399 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/README.md +845 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.constants.ts +49 -7
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.errors.ts +34 -3
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.evolution.service.ts +22 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.playback.service.ts +62 -26
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.protocol.service.ts +27 -1
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.runtime.service.ts +23 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.frame.service.ts +378 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.types.ts +22 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.simulation.utils.ts +20 -203
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.snapshot.utils.test.ts +94 -0
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.snapshot.utils.ts +78 -13
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.ts +235 -344
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.types.ts +170 -22
- package/test/examples/flappy_bird/flappy-evolution-worker/flappy-evolution-worker.warm-start.service.ts +314 -0
- package/test/examples/flappy_bird/flappy.simulation.shared.utils.ts +17 -0
- package/test/examples/flappy_bird/flappyEnvironment.ts +21 -0
- package/test/examples/flappy_bird/flappyEvaluation.ts +12 -0
- package/test/examples/flappy_bird/flappyEvolution.worker.ts +7 -0
- package/test/examples/flappy_bird/index.ts +8 -2
- package/test/examples/flappy_bird/rng.ts +10 -0
- package/test/examples/flappy_bird/simulation-shared/README.md +518 -0
- package/test/examples/flappy_bird/simulation-shared/observation/README.md +255 -0
- package/test/examples/flappy_bird/simulation-shared/observation/observation.features.utils.ts +339 -0
- package/test/examples/flappy_bird/simulation-shared/observation/observation.ts +19 -0
- package/test/examples/flappy_bird/simulation-shared/observation/observation.vector.utils.ts +81 -0
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.constants.ts +3 -0
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.control.utils.ts +6 -0
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.difficulty.utils.ts +9 -0
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.errors.ts +10 -1
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.memory.utils.ts +18 -0
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.observation.utils.ts +7 -402
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.spawn.utils.ts +36 -6
- package/test/examples/flappy_bird/{evaluation/evaluation.statistics.utils.ts → simulation-shared/simulation-shared.statistics.utils.ts} +30 -9
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.types.ts +38 -5
- package/test/examples/flappy_bird/trainFlappyBird.ts +13 -0
- package/test/examples/flappy_bird/trainer/README.md +676 -0
- package/test/examples/flappy_bird/trainer/evaluation/README.md +253 -0
- package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.constants.ts +15 -0
- package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.services.ts +86 -0
- package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.ts +187 -0
- package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.types.ts +32 -0
- package/test/examples/flappy_bird/trainer/evaluation/trainer.evaluation.service.utils.ts +182 -0
- package/test/examples/flappy_bird/trainer/trainer.evaluation.service.ts +13 -0
- package/test/examples/flappy_bird/trainer/trainer.fitness.service.ts +23 -1
- package/test/examples/flappy_bird/trainer/trainer.loop.service.ts +17 -1
- package/test/examples/flappy_bird/trainer/trainer.report.service.services.ts +181 -0
- package/test/examples/flappy_bird/trainer/trainer.report.service.ts +136 -0
- package/test/examples/flappy_bird/trainer/trainer.selection.utils.ts +89 -0
- package/test/examples/flappy_bird/trainer/trainer.setup.service.ts +22 -0
- package/test/examples/flappy_bird/trainer/trainer.signals.service.ts +8 -0
- package/test/examples/flappy_bird/trainer/trainer.ts +38 -553
- package/test/examples/flappy_bird/trainer/trainer.types.ts +44 -7
- package/test/neat/neat.topology-intent.test.ts +129 -0
- package/test/network/network.topology-intent.test.ts +44 -0
- package/test/examples/flappy_bird/browser-entry/browser-entry.utils.ts +0 -12
- package/test/examples/flappy_bird/environment/environment.ts +0 -7
- package/test/examples/flappy_bird/evaluation/evaluation.ts +0 -7
- package/test/examples/flappy_bird/simulation-shared/simulation-shared.ts +0 -15
- package/test/examples/flappy_bird/trainer/trainer.statistics.utils.ts +0 -78
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
import type { PlaybackBackgroundSceneContext } from '../playback.background.types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Narrow request required to render the playback ground grid.
|
|
5
|
+
*
|
|
6
|
+
* The ground grid only needs time and world-scroll context. That separation is
|
|
7
|
+
* deliberate: the lower-band renderer should respond to camera motion like a
|
|
8
|
+
* piece of scenic lighting, not reach into gameplay entities or playback HUD
|
|
9
|
+
* state.
|
|
10
|
+
*/
|
|
11
|
+
export type PlaybackBackgroundGroundGridRequest = {
|
|
12
|
+
frameIndex: number;
|
|
13
|
+
scrollBasePx: number;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Lazy builder used when one horizontal geometry cache entry is missing.
|
|
18
|
+
*
|
|
19
|
+
* Horizontal depth bands depend only on stable scene dimensions, so callers can
|
|
20
|
+
* defer their construction until a cache miss proves the work is actually
|
|
21
|
+
* needed.
|
|
22
|
+
*/
|
|
23
|
+
export type PlaybackGroundGridHorizontalGeometryFactory =
|
|
24
|
+
() => PlaybackGroundGridHorizontalGeometry;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Lazy builder used when one vertical geometry cache entry is missing.
|
|
28
|
+
*
|
|
29
|
+
* Vertical rays additionally depend on wrapped scroll state, so the cache keeps
|
|
30
|
+
* a compact builder hook rather than eagerly storing every possible cycle.
|
|
31
|
+
*/
|
|
32
|
+
export type PlaybackGroundGridVerticalGeometryFactory =
|
|
33
|
+
() => PlaybackGroundGridVerticalGeometry;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Lazy builder used when one vertical scene-metrics cache entry is missing.
|
|
37
|
+
*
|
|
38
|
+
* Scene metrics such as projected anchor bounds are pure functions of the
|
|
39
|
+
* viewport, which makes them ideal cache inputs for the performance-sensitive
|
|
40
|
+
* lower-band renderer.
|
|
41
|
+
*/
|
|
42
|
+
export type PlaybackGroundGridVerticalSceneMetricsFactory =
|
|
43
|
+
() => PlaybackGroundGridVerticalSceneMetrics;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Immutable scene context resolved for one lower-band ground-grid pass.
|
|
47
|
+
*
|
|
48
|
+
* This is the adapted subset of the shared background scene that the ground
|
|
49
|
+
* grid cares about: horizon position, lower-band bounds, and the centered
|
|
50
|
+
* vanishing point that gives the grid its forced-perspective look.
|
|
51
|
+
*/
|
|
52
|
+
export type PlaybackBackgroundGroundGridSceneContext = {
|
|
53
|
+
viewportOffsetXPx: number;
|
|
54
|
+
visibleWorldWidthPx: number;
|
|
55
|
+
alignedHorizonYPx: number;
|
|
56
|
+
lowerBandTopYPx: number;
|
|
57
|
+
lowerBandHeightPx: number;
|
|
58
|
+
lowerBandBottomYPx: number;
|
|
59
|
+
vanishingPointXPx: number;
|
|
60
|
+
vanishingPointYPx: number;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Theme-owned style contract for the neon ground grid.
|
|
65
|
+
*
|
|
66
|
+
* The ground grid uses three coordinated colors: the structural line work, a
|
|
67
|
+
* fog wash that softens the lower band, and small pulse markers that briefly
|
|
68
|
+
* travel along eligible tracks.
|
|
69
|
+
*/
|
|
70
|
+
export type PlaybackBackgroundGroundGridStyle = {
|
|
71
|
+
lineColor: string;
|
|
72
|
+
fogColor: string;
|
|
73
|
+
pulseFillColor: string;
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Travel orientation used by lightweight pulse overlays.
|
|
78
|
+
*
|
|
79
|
+
* Horizontal pulses skim along depth bands, while vertical pulses ride the
|
|
80
|
+
* perspective rays toward or away from the horizon.
|
|
81
|
+
*/
|
|
82
|
+
export type PlaybackGroundGridPulseOrientation = 'horizontal' | 'vertical';
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Geometry and style package resolved before drawing the ground grid.
|
|
86
|
+
*
|
|
87
|
+
* Splitting scene resolution from drawing keeps canvas code simple: by the time
|
|
88
|
+
* the renderer runs, every geometric and palette decision has already been made
|
|
89
|
+
* and packed into one immutable object graph.
|
|
90
|
+
*/
|
|
91
|
+
export type PlaybackBackgroundGroundGridResolvedScene = {
|
|
92
|
+
sceneContext: PlaybackBackgroundGroundGridSceneContext;
|
|
93
|
+
style: PlaybackBackgroundGroundGridStyle;
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Declarative line segment model used by the ground-grid renderer.
|
|
98
|
+
*
|
|
99
|
+
* The grid is built as plain data first so batch builders can group segments by
|
|
100
|
+
* shared style before any canvas path or glow work happens.
|
|
101
|
+
*/
|
|
102
|
+
export type PlaybackGroundGridLineSegment = {
|
|
103
|
+
startXPx: number;
|
|
104
|
+
startYPx: number;
|
|
105
|
+
endXPx: number;
|
|
106
|
+
endYPx: number;
|
|
107
|
+
alpha: number;
|
|
108
|
+
blurPx: number;
|
|
109
|
+
thicknessPx: number;
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Ordered batch of line segments that share one render style.
|
|
114
|
+
*
|
|
115
|
+
* Grouping segments by alpha, blur, and thickness reduces canvas state churn
|
|
116
|
+
* and gives the renderer a natural place to cache `Path2D` instances when the
|
|
117
|
+
* environment supports them.
|
|
118
|
+
*/
|
|
119
|
+
export type PlaybackGroundGridSegmentBatch = {
|
|
120
|
+
alpha: number;
|
|
121
|
+
blurPx: number;
|
|
122
|
+
path: Path2D | null;
|
|
123
|
+
thicknessPx: number;
|
|
124
|
+
segments: readonly PlaybackGroundGridLineSegment[];
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Internal helper contract used while generating vertical-ray sub-segments.
|
|
129
|
+
*
|
|
130
|
+
* Each vertical ray is split into depth-aware pieces so stroke thickness and
|
|
131
|
+
* glow can evolve as the ray approaches the viewer instead of staying uniform.
|
|
132
|
+
*/
|
|
133
|
+
export type PlaybackGroundGridVerticalRayInput = PlaybackGroundGridPulsePath & {
|
|
134
|
+
lineDepthRatio: number;
|
|
135
|
+
maximumDistanceToHorizonPx: number;
|
|
136
|
+
sceneContext: PlaybackBackgroundGroundGridSceneContext;
|
|
137
|
+
verticalSegmentCount: number;
|
|
138
|
+
};
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Simplified path used by one visible pulse event.
|
|
142
|
+
*
|
|
143
|
+
* Pulses do not need the full batch geometry; they only need a single lane to
|
|
144
|
+
* travel along, represented here as a start-end segment plus local thickness.
|
|
145
|
+
*/
|
|
146
|
+
export type PlaybackGroundGridPulsePath = {
|
|
147
|
+
orientation: PlaybackGroundGridPulseOrientation;
|
|
148
|
+
startXPx: number;
|
|
149
|
+
startYPx: number;
|
|
150
|
+
endXPx: number;
|
|
151
|
+
endYPx: number;
|
|
152
|
+
thicknessPx: number;
|
|
153
|
+
};
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* One visible pulse square rendered above the grid lines.
|
|
157
|
+
*
|
|
158
|
+
* These pulses are tiny accent lights, not gameplay markers. Their job is to
|
|
159
|
+
* give the lower band a hint of moving circuitry without competing with birds,
|
|
160
|
+
* pipes, or the active network HUD.
|
|
161
|
+
*/
|
|
162
|
+
export type PlaybackGroundGridPulse = {
|
|
163
|
+
centerXPx: number;
|
|
164
|
+
centerYPx: number;
|
|
165
|
+
sizePx: number;
|
|
166
|
+
alpha: number;
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Pure geometry bundle generated before canvas drawing begins.
|
|
171
|
+
*
|
|
172
|
+
* Horizontal bands, vertical rays, and the optional pulse are resolved into one
|
|
173
|
+
* package so the draw layer can stay strictly about paint order.
|
|
174
|
+
*/
|
|
175
|
+
export type PlaybackGroundGridGeometry = {
|
|
176
|
+
horizontalLineBatches: readonly PlaybackGroundGridSegmentBatch[];
|
|
177
|
+
pulse: PlaybackGroundGridPulse | null;
|
|
178
|
+
verticalLineBatches: readonly PlaybackGroundGridSegmentBatch[];
|
|
179
|
+
};
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Cached horizontal geometry bundle reused across matching scene sizes.
|
|
183
|
+
*
|
|
184
|
+
* Horizontal depth lines are stable for a given viewport, which makes them the
|
|
185
|
+
* cheapest part of the grid to cache aggressively.
|
|
186
|
+
*/
|
|
187
|
+
export type PlaybackGroundGridHorizontalGeometry = {
|
|
188
|
+
horizontalLineBatches: readonly PlaybackGroundGridSegmentBatch[];
|
|
189
|
+
horizontalLines: readonly PlaybackGroundGridLineSegment[];
|
|
190
|
+
preferredHorizontalPulsePaths: readonly PlaybackGroundGridPulsePath[];
|
|
191
|
+
};
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Cached vertical geometry bundle reused across one wrapped scroll cycle.
|
|
195
|
+
*
|
|
196
|
+
* Vertical rays move with scroll, but only within a repeating wrapped cycle.
|
|
197
|
+
* Caching at that granularity captures most of the reuse without pretending the
|
|
198
|
+
* rays are globally static.
|
|
199
|
+
*/
|
|
200
|
+
export type PlaybackGroundGridVerticalGeometry = {
|
|
201
|
+
verticalLineBatches: readonly PlaybackGroundGridSegmentBatch[];
|
|
202
|
+
verticalPulsePaths: readonly PlaybackGroundGridPulsePath[];
|
|
203
|
+
visibleVerticalPulsePaths: readonly PlaybackGroundGridPulsePath[];
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Cached scene metrics reused across matching vertical-grid frames.
|
|
208
|
+
*
|
|
209
|
+
* These metrics answer the expensive geometric questions once per viewport,
|
|
210
|
+
* such as how wide the visible anchor span is and how many perspective lanes
|
|
211
|
+
* can fit while preserving the intended spacing.
|
|
212
|
+
*/
|
|
213
|
+
export type PlaybackGroundGridVerticalSceneMetrics = {
|
|
214
|
+
visibleAnchorBounds: PlaybackGroundGridAnchorBounds;
|
|
215
|
+
totalVisibleLaneCount: number;
|
|
216
|
+
safeLaneSpacingPx: number;
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Visible horizon bounds projected onto the bottom anchor line.
|
|
221
|
+
*
|
|
222
|
+
* Perspective rays begin conceptually at the horizon and terminate on the floor
|
|
223
|
+
* anchor line, so this structure captures the visible lane span after the
|
|
224
|
+
* horizon segment has been projected downward.
|
|
225
|
+
*/
|
|
226
|
+
export type PlaybackGroundGridAnchorBounds = {
|
|
227
|
+
leftAnchorXPx: number;
|
|
228
|
+
rightAnchorXPx: number;
|
|
229
|
+
anchorSpanPx: number;
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Input used when projecting a visible horizon span onto anchor space.
|
|
234
|
+
*/
|
|
235
|
+
export type PlaybackGroundGridAnchorBoundsInput = {
|
|
236
|
+
horizonLeftXPx: number;
|
|
237
|
+
horizonRightXPx: number;
|
|
238
|
+
sceneContext: PlaybackBackgroundGroundGridSceneContext;
|
|
239
|
+
};
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Input used when projecting one horizon x-position onto the floor anchor line.
|
|
243
|
+
*/
|
|
244
|
+
export type PlaybackGroundGridAnchorProjectionInput = {
|
|
245
|
+
horizonXPx: number;
|
|
246
|
+
sceneContext: PlaybackBackgroundGroundGridSceneContext;
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Wrapped vertical-cycle state derived from scroll for one frame.
|
|
251
|
+
*
|
|
252
|
+
* The perspective rays repeat on a fixed cycle. Wrapping the scroll state lets
|
|
253
|
+
* the renderer reuse cached geometry while still appearing to drift sideways.
|
|
254
|
+
*/
|
|
255
|
+
export type PlaybackGroundGridVerticalCycleContext = {
|
|
256
|
+
wrappedOffsetPx: number;
|
|
257
|
+
safeLaneSpacingPx: number;
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Input contract used while resolving one deterministic pulse event.
|
|
262
|
+
*
|
|
263
|
+
* Pulses are deterministic decoration: given the same frame and scene, the same
|
|
264
|
+
* lane should light up. This input bundle gathers the candidate paths needed to
|
|
265
|
+
* make that choice without consulting external state.
|
|
266
|
+
*/
|
|
267
|
+
export type PlaybackGroundGridPulseInput = {
|
|
268
|
+
frameIndex: number;
|
|
269
|
+
horizontalPulsePaths: readonly PlaybackGroundGridPulsePath[];
|
|
270
|
+
sceneContext: PlaybackBackgroundGroundGridSceneContext;
|
|
271
|
+
visibleVerticalPulsePaths: readonly PlaybackGroundGridPulsePath[];
|
|
272
|
+
verticalPulsePaths: readonly PlaybackGroundGridPulsePath[];
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Timing state resolved for one deterministic ground-grid pulse slot.
|
|
277
|
+
*
|
|
278
|
+
* The slot model keeps pulse timing legible: each pulse has a start bucket, an
|
|
279
|
+
* elapsed time inside that bucket, and a normalized progress value used by the
|
|
280
|
+
* position and fade helpers.
|
|
281
|
+
*/
|
|
282
|
+
export type PlaybackGroundGridPulseTimingState = {
|
|
283
|
+
pulseSlotIndex: number;
|
|
284
|
+
pulseElapsedMs: number;
|
|
285
|
+
lifetimeProgressRatio: number;
|
|
286
|
+
};
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Direction and timing state used when resolving pulse travel progress.
|
|
290
|
+
*
|
|
291
|
+
* Some pulse lanes feel better moving away from the viewer and others toward
|
|
292
|
+
* it, so travel resolution keeps orientation and forward/reverse intent paired
|
|
293
|
+
* with the current lifetime progress.
|
|
294
|
+
*/
|
|
295
|
+
export type PlaybackGroundGridPulseTravelRatioInput = {
|
|
296
|
+
directionIsForward: boolean;
|
|
297
|
+
lifetimeProgressRatio: number;
|
|
298
|
+
orientation: PlaybackGroundGridPulseOrientation;
|
|
299
|
+
};
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Input used when adapting a pulse position into a local track thickness.
|
|
303
|
+
*
|
|
304
|
+
* Because the grid uses perspective-weighted stroke widths, the pulse size must
|
|
305
|
+
* be adjusted to the local lane thickness rather than using one fixed square.
|
|
306
|
+
*/
|
|
307
|
+
export type PlaybackGroundGridPulseTrackThicknessInput = {
|
|
308
|
+
pulseCenterYPx: number;
|
|
309
|
+
pulsePath: PlaybackGroundGridPulsePath;
|
|
310
|
+
sceneContext: PlaybackBackgroundGroundGridSceneContext;
|
|
311
|
+
};
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Cached continuation state used to keep one vertical pulse on the same ray.
|
|
315
|
+
*
|
|
316
|
+
* Without this continuity state a vertical pulse could jitter between adjacent
|
|
317
|
+
* rays across frames, which looks like noise instead of a deliberate light.
|
|
318
|
+
*/
|
|
319
|
+
export type PlaybackGroundGridVerticalPulseContinuationState = {
|
|
320
|
+
centerXPx: number;
|
|
321
|
+
centerYPx: number;
|
|
322
|
+
frameIndex: number;
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* Helper alias used when adapting the shared background scene context.
|
|
327
|
+
*
|
|
328
|
+
* The parent background module owns the full sky-plus-ground scene contract;
|
|
329
|
+
* the grid renderer narrows that shape to only the fields needed for the lower
|
|
330
|
+
* band so the dependency direction stays clear.
|
|
331
|
+
*/
|
|
332
|
+
export type PlaybackBackgroundGroundGridSourceScene = Pick<
|
|
333
|
+
PlaybackBackgroundSceneContext,
|
|
334
|
+
| 'viewportLeftXPx'
|
|
335
|
+
| 'visibleWorldWidthPx'
|
|
336
|
+
| 'alignedHorizonYPx'
|
|
337
|
+
| 'lowerBandTopYPx'
|
|
338
|
+
| 'lowerBandHeightPx'
|
|
339
|
+
| 'lowerBandBottomYPx'
|
|
340
|
+
| 'vanishingPointXPx'
|
|
341
|
+
| 'vanishingPointYPx'
|
|
342
|
+
>;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export {
|
|
2
|
+
interpolatePlaybackGroundGridPoint,
|
|
3
|
+
resolvePlaybackGroundGridDepthCurve,
|
|
4
|
+
resolvePlaybackGroundGridDepthFromHorizonDistance,
|
|
5
|
+
resolvePlaybackGroundGridLineAlpha,
|
|
6
|
+
resolvePlaybackGroundGridLineBlur,
|
|
7
|
+
resolvePlaybackGroundGridLineThickness,
|
|
8
|
+
} from './playback.background.ground-grid.math.utils';
|
|
9
|
+
export { resolvePlaybackGroundGridGeometry } from './playback.background.ground-grid.geometry.services';
|
|
10
|
+
export { resolvePlaybackGroundGridSceneContext } from './playback.background.ground-grid.scene.services';
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
PlaybackBackgroundLayout,
|
|
3
|
+
PlaybackBackgroundLayoutFactory,
|
|
4
|
+
} from './playback.background.types';
|
|
5
|
+
|
|
6
|
+
let cachedViewportSizeKey: string | null = null;
|
|
7
|
+
|
|
8
|
+
const cachedLayoutsByHeightPx = new Map<number, PlaybackBackgroundLayout>();
|
|
9
|
+
const cachedTileCoverageCountsByTileWidthPx = new Map<number, number>();
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Ensures background caches only retain entries for the current viewport size.
|
|
13
|
+
*
|
|
14
|
+
* When the page size changes, cached geometry and coverage counts become
|
|
15
|
+
* obsolete because the background bands and tile coverage both depend on the
|
|
16
|
+
* current viewport dimensions.
|
|
17
|
+
*
|
|
18
|
+
* @param visibleWorldWidthPx - Current visible world width in pixels.
|
|
19
|
+
* @param visibleWorldHeightPx - Current visible world height in pixels.
|
|
20
|
+
* @returns Stable viewport-size cache key for the current frame.
|
|
21
|
+
*/
|
|
22
|
+
export function ensurePlaybackBackgroundViewportCacheValidity(
|
|
23
|
+
visibleWorldWidthPx: number,
|
|
24
|
+
visibleWorldHeightPx: number,
|
|
25
|
+
): string {
|
|
26
|
+
const viewportSizeKey = resolvePlaybackBackgroundViewportCacheKey(
|
|
27
|
+
visibleWorldWidthPx,
|
|
28
|
+
visibleWorldHeightPx,
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
if (cachedViewportSizeKey === viewportSizeKey) {
|
|
32
|
+
return viewportSizeKey;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
cachedViewportSizeKey = viewportSizeKey;
|
|
36
|
+
cachedLayoutsByHeightPx.clear();
|
|
37
|
+
cachedTileCoverageCountsByTileWidthPx.clear();
|
|
38
|
+
return viewportSizeKey;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Resolves the stable viewport-size cache key used by background caches.
|
|
43
|
+
*
|
|
44
|
+
* @param visibleWorldWidthPx - Current visible world width in pixels.
|
|
45
|
+
* @param visibleWorldHeightPx - Current visible world height in pixels.
|
|
46
|
+
* @returns Cache key that changes whenever the page size changes.
|
|
47
|
+
*/
|
|
48
|
+
export function resolvePlaybackBackgroundViewportCacheKey(
|
|
49
|
+
visibleWorldWidthPx: number,
|
|
50
|
+
visibleWorldHeightPx: number,
|
|
51
|
+
): string {
|
|
52
|
+
return `${visibleWorldWidthPx}x${visibleWorldHeightPx}`;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Resolves cached background layout for the current viewport height.
|
|
57
|
+
*
|
|
58
|
+
* @param visibleWorldHeightPx - Current visible world height in pixels.
|
|
59
|
+
* @param factory - Lazy layout builder used when the cache misses.
|
|
60
|
+
* @returns Cached background layout for the current viewport size.
|
|
61
|
+
*/
|
|
62
|
+
export function resolveCachedPlaybackBackgroundLayout(
|
|
63
|
+
visibleWorldHeightPx: number,
|
|
64
|
+
factory: PlaybackBackgroundLayoutFactory,
|
|
65
|
+
): PlaybackBackgroundLayout {
|
|
66
|
+
const cachedLayout = cachedLayoutsByHeightPx.get(visibleWorldHeightPx);
|
|
67
|
+
if (cachedLayout) {
|
|
68
|
+
return cachedLayout;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const resolvedLayout = factory();
|
|
72
|
+
cachedLayoutsByHeightPx.set(visibleWorldHeightPx, resolvedLayout);
|
|
73
|
+
return resolvedLayout;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Resolves cached tile coverage count for one tile width.
|
|
78
|
+
*
|
|
79
|
+
* @param tileWidthPx - Width of one repeated starfield tile in pixels.
|
|
80
|
+
* @param factory - Lazy coverage builder used when the cache misses.
|
|
81
|
+
* @returns Cached tile coverage count for the active viewport width.
|
|
82
|
+
*/
|
|
83
|
+
export function resolveCachedPlaybackTileCoverageCount(
|
|
84
|
+
tileWidthPx: number,
|
|
85
|
+
factory: () => number,
|
|
86
|
+
): number {
|
|
87
|
+
const cachedCoverageCount =
|
|
88
|
+
cachedTileCoverageCountsByTileWidthPx.get(tileWidthPx);
|
|
89
|
+
if (cachedCoverageCount !== undefined) {
|
|
90
|
+
return cachedCoverageCount;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const resolvedCoverageCount = factory();
|
|
94
|
+
cachedTileCoverageCountsByTileWidthPx.set(tileWidthPx, resolvedCoverageCount);
|
|
95
|
+
return resolvedCoverageCount;
|
|
96
|
+
}
|
package/test/examples/flappy_bird/browser-entry/playback/background/playback.background.constants.ts
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { FLAPPY_NEON_PALETTE } from '../../../constants/constants';
|
|
2
|
+
import type { PlaybackHorizonStyle } from './playback.background.types';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Background layout ratio reserved for the starfield sky band.
|
|
6
|
+
*
|
|
7
|
+
* The top band intentionally occupies most of the scene so the future ground
|
|
8
|
+
* layer can take over the lower strip without competing with the stars.
|
|
9
|
+
*/
|
|
10
|
+
export const FLAPPY_BACKGROUND_SKY_HEIGHT_RATIO = 2 / 3;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Minimum safe viewport dimension used by background render math (pixels).
|
|
14
|
+
*
|
|
15
|
+
* Canvas helpers in this module assume positive dimensions. Clamping tiny or
|
|
16
|
+
* temporarily zero-sized layouts to this floor prevents resize races from
|
|
17
|
+
* producing invalid cache keys or negative geometry.
|
|
18
|
+
*/
|
|
19
|
+
export const FLAPPY_BACKGROUND_MIN_VIEWPORT_DIMENSION_PX = 1;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Index offset used to draw one extra tile before the visible left edge.
|
|
23
|
+
*
|
|
24
|
+
* Starting one tile early hides wrap seams when the parallax offset lands near
|
|
25
|
+
* a tile boundary and the camera reveals a sliver of content just off-screen.
|
|
26
|
+
*/
|
|
27
|
+
export const FLAPPY_BACKGROUND_TILE_ROW_START_INDEX = -1;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Extra tile count rendered past the visible right edge for seamless wrap.
|
|
31
|
+
*
|
|
32
|
+
* The starfield is drawn as repeated cached strips. One buffered strip beyond
|
|
33
|
+
* the viewport prevents empty columns from appearing while the parallax offset
|
|
34
|
+
* advances between frames.
|
|
35
|
+
*/
|
|
36
|
+
export const FLAPPY_BACKGROUND_TILE_ROW_BUFFER_COUNT = 1;
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Half-thickness multiplier used to center the horizon line on the split.
|
|
40
|
+
*
|
|
41
|
+
* The layout computes the horizon around the sky/lower-band seam, so this
|
|
42
|
+
* multiplier converts stroke thickness into the offset needed to center the
|
|
43
|
+
* divider on that seam rather than placing it fully below it.
|
|
44
|
+
*/
|
|
45
|
+
export const FLAPPY_BACKGROUND_HORIZON_HALF_THICKNESS_MULTIPLIER = 0.5;
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Divisor used to detect odd stroke widths for pixel snapping.
|
|
49
|
+
*
|
|
50
|
+
* Canvas 2D strokes look soft when odd-width lines are left on whole pixels.
|
|
51
|
+
* This constant supports the classic half-pixel alignment check used to keep
|
|
52
|
+
* the horizon divider visually crisp.
|
|
53
|
+
*/
|
|
54
|
+
export const FLAPPY_BACKGROUND_ODD_STROKE_DIVISOR = 2;
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Pixel offset used to align odd-width strokes to the device pixel grid.
|
|
58
|
+
*
|
|
59
|
+
* Offsetting odd-width lines by half a pixel is a standard raster technique
|
|
60
|
+
* for reducing blur in canvas line rendering.
|
|
61
|
+
*/
|
|
62
|
+
export const FLAPPY_BACKGROUND_ODD_STROKE_ALIGNMENT_OFFSET_PX = 0.5;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Composite mode used for standard opaque drawing passes.
|
|
66
|
+
*
|
|
67
|
+
* Most background passes should replace pixels normally so the scene remains
|
|
68
|
+
* predictable before selective glow passes are added on top.
|
|
69
|
+
*/
|
|
70
|
+
export const FLAPPY_BACKGROUND_COMPOSITE_SOURCE_OVER = 'source-over';
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Composite mode used when stacking glow-heavy starfield layers.
|
|
74
|
+
*
|
|
75
|
+
* The background currently resets to ordinary compositing for main passes, but
|
|
76
|
+
* this constant documents the additive blend mode used when glow layers need to
|
|
77
|
+
* visually accumulate rather than overwrite one another.
|
|
78
|
+
*/
|
|
79
|
+
export const FLAPPY_BACKGROUND_COMPOSITE_LIGHTER = 'lighter';
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Transparent shadow color used to reset canvas glow state.
|
|
83
|
+
*
|
|
84
|
+
* Canvas shadow state is sticky, so explicit transparent resets prevent one
|
|
85
|
+
* glow-heavy pass from leaking blur into later solid fills or line work.
|
|
86
|
+
*/
|
|
87
|
+
export const FLAPPY_BACKGROUND_TRANSPARENT_SHADOW_COLOR = 'transparent';
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Thickness of the neon horizon divider line (pixels).
|
|
91
|
+
*
|
|
92
|
+
* A slightly heavier stroke helps the divider remain legible against both the
|
|
93
|
+
* starfield and the bright grid below it.
|
|
94
|
+
*/
|
|
95
|
+
export const FLAPPY_BACKGROUND_HORIZON_LINE_THICKNESS_PX = 4;
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Soft glow opacity applied during the horizon glow pass.
|
|
99
|
+
*
|
|
100
|
+
* The glow is intentionally strong enough to read as neon, but still shy of a
|
|
101
|
+
* full opaque bloom so the crisp core line remains visible.
|
|
102
|
+
*/
|
|
103
|
+
export const FLAPPY_BACKGROUND_HORIZON_GLOW_ALPHA = 0.92;
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Blur radius used to bloom the horizon divider glow (pixels).
|
|
107
|
+
*
|
|
108
|
+
* This is the main control for how far the horizon's light appears to bleed
|
|
109
|
+
* into the neighboring sky and ground bands.
|
|
110
|
+
*/
|
|
111
|
+
export const FLAPPY_BACKGROUND_HORIZON_GLOW_BLUR_PX = 14;
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Frozen neon paint bundle reused by the playback horizon renderer.
|
|
115
|
+
*
|
|
116
|
+
* Keeping this style object in the constants module prevents repeated
|
|
117
|
+
* allocation during every background frame while still keeping the palette
|
|
118
|
+
* centrally theme-owned.
|
|
119
|
+
*/
|
|
120
|
+
export const FLAPPY_BACKGROUND_HORIZON_STYLE: PlaybackHorizonStyle =
|
|
121
|
+
Object.freeze({
|
|
122
|
+
lineColor: FLAPPY_NEON_PALETTE.horizonLine,
|
|
123
|
+
glowColor: FLAPPY_NEON_PALETTE.horizonGlow,
|
|
124
|
+
glowAlpha: FLAPPY_BACKGROUND_HORIZON_GLOW_ALPHA,
|
|
125
|
+
glowBlurPx: FLAPPY_BACKGROUND_HORIZON_GLOW_BLUR_PX,
|
|
126
|
+
lineThicknessPx: FLAPPY_BACKGROUND_HORIZON_LINE_THICKNESS_PX,
|
|
127
|
+
});
|