@fairyhunter13/opentui-core 0.1.114 → 0.1.115
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/3d/SpriteResourceManager.d.ts +74 -0
- package/3d/SpriteUtils.d.ts +13 -0
- package/3d/TextureUtils.d.ts +24 -0
- package/3d/ThreeRenderable.d.ts +40 -0
- package/3d/WGPURenderer.d.ts +61 -0
- package/3d/animation/ExplodingSpriteEffect.d.ts +71 -0
- package/3d/animation/PhysicsExplodingSpriteEffect.d.ts +76 -0
- package/3d/animation/SpriteAnimator.d.ts +124 -0
- package/3d/animation/SpriteParticleGenerator.d.ts +62 -0
- package/3d/canvas.d.ts +44 -0
- package/3d/index.d.ts +12 -0
- package/3d/physics/PlanckPhysicsAdapter.d.ts +19 -0
- package/3d/physics/RapierPhysicsAdapter.d.ts +19 -0
- package/3d/physics/physics-interface.d.ts +27 -0
- package/3d.d.ts +2 -0
- package/3d.js +34041 -0
- package/3d.js.map +155 -0
- package/LICENSE +21 -0
- package/NativeSpanFeed.d.ts +41 -0
- package/Renderable.d.ts +334 -0
- package/animation/Timeline.d.ts +126 -0
- package/ansi.d.ts +13 -0
- package/buffer.d.ts +111 -0
- package/console.d.ts +144 -0
- package/edit-buffer.d.ts +98 -0
- package/editor-view.d.ts +73 -0
- package/index-j4m38kjn.js +411 -0
- package/index-j4m38kjn.js.map +10 -0
- package/index-tse8gzh0.js +20614 -0
- package/index-tse8gzh0.js.map +67 -0
- package/index-vv2jcd4r.js +12299 -0
- package/index-vv2jcd4r.js.map +42 -0
- package/index.d.ts +23 -0
- package/index.js +478 -0
- package/index.js.map +9 -0
- package/lib/KeyHandler.d.ts +61 -0
- package/lib/RGBA.d.ts +25 -0
- package/lib/ascii.font.d.ts +508 -0
- package/lib/border.d.ts +51 -0
- package/lib/bunfs.d.ts +7 -0
- package/lib/clipboard.d.ts +17 -0
- package/lib/clock.d.ts +15 -0
- package/lib/data-paths.d.ts +26 -0
- package/lib/debounce.d.ts +42 -0
- package/lib/detect-links.d.ts +6 -0
- package/lib/env.d.ts +42 -0
- package/lib/extmarks-history.d.ts +17 -0
- package/lib/extmarks.d.ts +89 -0
- package/lib/hast-styled-text.d.ts +17 -0
- package/lib/index.d.ts +21 -0
- package/lib/keymapping.d.ts +25 -0
- package/lib/objects-in-viewport.d.ts +24 -0
- package/lib/output.capture.d.ts +24 -0
- package/lib/parse.keypress-kitty.d.ts +2 -0
- package/lib/parse.keypress.d.ts +26 -0
- package/lib/parse.mouse.d.ts +30 -0
- package/lib/paste.d.ts +7 -0
- package/lib/queue.d.ts +15 -0
- package/lib/renderable.validations.d.ts +12 -0
- package/lib/scroll-acceleration.d.ts +43 -0
- package/lib/selection.d.ts +63 -0
- package/lib/singleton.d.ts +7 -0
- package/lib/stdin-parser.d.ts +87 -0
- package/lib/styled-text.d.ts +63 -0
- package/lib/terminal-capability-detection.d.ts +30 -0
- package/lib/terminal-palette.d.ts +50 -0
- package/lib/tree-sitter/assets/update.d.ts +11 -0
- package/lib/tree-sitter/client.d.ts +47 -0
- package/lib/tree-sitter/default-parsers.d.ts +2 -0
- package/lib/tree-sitter/download-utils.d.ts +21 -0
- package/lib/tree-sitter/index.d.ts +8 -0
- package/lib/tree-sitter/parser.worker.d.ts +1 -0
- package/lib/tree-sitter/parsers-config.d.ts +53 -0
- package/lib/tree-sitter/resolve-ft.d.ts +5 -0
- package/lib/tree-sitter/types.d.ts +82 -0
- package/lib/tree-sitter-styled-text.d.ts +14 -0
- package/lib/validate-dir-name.d.ts +1 -0
- package/lib/yoga.options.d.ts +32 -0
- package/package.json +50 -62
- package/parser.worker.js +899 -0
- package/parser.worker.js.map +12 -0
- package/plugins/core-slot.d.ts +72 -0
- package/plugins/registry.d.ts +42 -0
- package/plugins/types.d.ts +34 -0
- package/post/effects.d.ts +147 -0
- package/post/filters.d.ts +65 -0
- package/post/matrices.d.ts +20 -0
- package/renderables/ASCIIFont.d.ts +52 -0
- package/renderables/Box.d.ts +81 -0
- package/renderables/Code.d.ts +78 -0
- package/renderables/Diff.d.ts +142 -0
- package/renderables/EditBufferRenderable.d.ts +237 -0
- package/renderables/FrameBuffer.d.ts +16 -0
- package/renderables/Input.d.ts +67 -0
- package/renderables/LineNumberRenderable.d.ts +78 -0
- package/renderables/Markdown.d.ts +185 -0
- package/renderables/ScrollBar.d.ts +77 -0
- package/renderables/ScrollBox.d.ts +124 -0
- package/renderables/Select.d.ts +115 -0
- package/renderables/Slider.d.ts +47 -0
- package/renderables/TabSelect.d.ts +96 -0
- package/renderables/Text.d.ts +36 -0
- package/renderables/TextBufferRenderable.d.ts +105 -0
- package/renderables/TextNode.d.ts +91 -0
- package/renderables/TextTable.d.ts +140 -0
- package/renderables/Textarea.d.ts +63 -0
- package/renderables/TimeToFirstDraw.d.ts +24 -0
- package/renderables/__tests__/renderable-test-utils.d.ts +12 -0
- package/renderables/composition/VRenderable.d.ts +16 -0
- package/renderables/composition/constructs.d.ts +35 -0
- package/renderables/composition/vnode.d.ts +46 -0
- package/renderables/index.d.ts +23 -0
- package/renderables/markdown-parser.d.ts +10 -0
- package/renderer.d.ts +419 -0
- package/runtime-plugin-support.d.ts +3 -0
- package/runtime-plugin-support.js +29 -0
- package/runtime-plugin-support.js.map +10 -0
- package/runtime-plugin.d.ts +16 -0
- package/runtime-plugin.js +16 -0
- package/runtime-plugin.js.map +9 -0
- package/syntax-style.d.ts +54 -0
- package/testing/manual-clock.d.ts +17 -0
- package/testing/mock-keys.d.ts +81 -0
- package/testing/mock-mouse.d.ts +38 -0
- package/testing/mock-tree-sitter-client.d.ts +23 -0
- package/testing/spy.d.ts +7 -0
- package/testing/test-recorder.d.ts +61 -0
- package/testing/test-renderer.d.ts +23 -0
- package/testing.d.ts +6 -0
- package/testing.js +697 -0
- package/testing.js.map +15 -0
- package/text-buffer-view.d.ts +42 -0
- package/text-buffer.d.ts +67 -0
- package/types.d.ts +139 -0
- package/utils.d.ts +14 -0
- package/zig-structs.d.ts +155 -0
- package/zig.d.ts +353 -0
- package/dev/keypress-debug-renderer.ts +0 -148
- package/dev/keypress-debug.ts +0 -43
- package/dev/print-env-vars.ts +0 -32
- package/dev/test-tmux-graphics-334.sh +0 -68
- package/dev/thai-debug-test.ts +0 -68
- package/docs/development.md +0 -144
- package/scripts/build.ts +0 -400
- package/scripts/publish.ts +0 -60
- package/src/3d/SpriteResourceManager.ts +0 -286
- package/src/3d/SpriteUtils.ts +0 -70
- package/src/3d/TextureUtils.ts +0 -196
- package/src/3d/ThreeRenderable.ts +0 -197
- package/src/3d/WGPURenderer.ts +0 -294
- package/src/3d/animation/ExplodingSpriteEffect.ts +0 -513
- package/src/3d/animation/PhysicsExplodingSpriteEffect.ts +0 -429
- package/src/3d/animation/SpriteAnimator.ts +0 -633
- package/src/3d/animation/SpriteParticleGenerator.ts +0 -435
- package/src/3d/canvas.ts +0 -464
- package/src/3d/index.ts +0 -12
- package/src/3d/physics/PlanckPhysicsAdapter.ts +0 -72
- package/src/3d/physics/RapierPhysicsAdapter.ts +0 -66
- package/src/3d/physics/physics-interface.ts +0 -31
- package/src/3d/shaders/supersampling.wgsl +0 -201
- package/src/3d.ts +0 -3
- package/src/NativeSpanFeed.ts +0 -300
- package/src/Renderable.ts +0 -1704
- package/src/__snapshots__/buffer.test.ts.snap +0 -28
- package/src/animation/Timeline.test.ts +0 -2709
- package/src/animation/Timeline.ts +0 -598
- package/src/ansi.ts +0 -18
- package/src/benchmark/attenuation-benchmark.ts +0 -81
- package/src/benchmark/colormatrix-benchmark.ts +0 -128
- package/src/benchmark/gain-benchmark.ts +0 -80
- package/src/benchmark/latest-all-bench-run.json +0 -707
- package/src/benchmark/latest-async-bench-run.json +0 -336
- package/src/benchmark/latest-default-bench-run.json +0 -657
- package/src/benchmark/latest-large-bench-run.json +0 -707
- package/src/benchmark/latest-quick-bench-run.json +0 -207
- package/src/benchmark/markdown-benchmark.ts +0 -1796
- package/src/benchmark/native-span-feed-async-benchmark.ts +0 -355
- package/src/benchmark/native-span-feed-benchmark.md +0 -56
- package/src/benchmark/native-span-feed-benchmark.ts +0 -596
- package/src/benchmark/native-span-feed-compare.ts +0 -280
- package/src/benchmark/renderer-benchmark.ts +0 -754
- package/src/benchmark/text-table-benchmark.ts +0 -948
- package/src/buffer.test.ts +0 -291
- package/src/buffer.ts +0 -554
- package/src/console.test.ts +0 -612
- package/src/console.ts +0 -1254
- package/src/edit-buffer.test.ts +0 -1769
- package/src/edit-buffer.ts +0 -411
- package/src/editor-view.test.ts +0 -1032
- package/src/editor-view.ts +0 -284
- package/src/examples/ascii-font-selection-demo.ts +0 -245
- package/src/examples/assets/Water_2_M_Normal.jpg +0 -0
- package/src/examples/assets/concrete.png +0 -0
- package/src/examples/assets/crate.png +0 -0
- package/src/examples/assets/crate_emissive.png +0 -0
- package/src/examples/assets/forrest_background.png +0 -0
- package/src/examples/assets/hast-example.json +0 -1018
- package/src/examples/assets/heart.png +0 -0
- package/src/examples/assets/main_char_heavy_attack.png +0 -0
- package/src/examples/assets/main_char_idle.png +0 -0
- package/src/examples/assets/main_char_jump_end.png +0 -0
- package/src/examples/assets/main_char_jump_landing.png +0 -0
- package/src/examples/assets/main_char_jump_start.png +0 -0
- package/src/examples/assets/main_char_run_loop.png +0 -0
- package/src/examples/assets/roughness_map.jpg +0 -0
- package/src/examples/build.ts +0 -115
- package/src/examples/code-demo.ts +0 -924
- package/src/examples/console-demo.ts +0 -358
- package/src/examples/core-plugin-slots-demo.ts +0 -759
- package/src/examples/diff-demo.ts +0 -701
- package/src/examples/draggable-three-demo.ts +0 -259
- package/src/examples/editor-demo.ts +0 -322
- package/src/examples/extmarks-demo.ts +0 -196
- package/src/examples/focus-restore-demo.ts +0 -310
- package/src/examples/fonts.ts +0 -245
- package/src/examples/fractal-shader-demo.ts +0 -268
- package/src/examples/framebuffer-demo.ts +0 -674
- package/src/examples/full-unicode-demo.ts +0 -241
- package/src/examples/golden-star-demo.ts +0 -933
- package/src/examples/grayscale-buffer-demo.ts +0 -249
- package/src/examples/hast-syntax-highlighting-demo.ts +0 -129
- package/src/examples/index.ts +0 -926
- package/src/examples/input-demo.ts +0 -377
- package/src/examples/input-select-layout-demo.ts +0 -425
- package/src/examples/install.sh +0 -143
- package/src/examples/keypress-debug-demo.ts +0 -452
- package/src/examples/lib/HexList.ts +0 -122
- package/src/examples/lib/PaletteGrid.ts +0 -125
- package/src/examples/lib/standalone-keys.ts +0 -25
- package/src/examples/lib/tab-controller.ts +0 -243
- package/src/examples/lights-phong-demo.ts +0 -290
- package/src/examples/link-demo.ts +0 -220
- package/src/examples/live-state-demo.ts +0 -480
- package/src/examples/markdown-demo.ts +0 -725
- package/src/examples/mouse-interaction-demo.ts +0 -428
- package/src/examples/nested-zindex-demo.ts +0 -357
- package/src/examples/opacity-example.ts +0 -235
- package/src/examples/opentui-demo.ts +0 -1057
- package/src/examples/physx-planck-2d-demo.ts +0 -623
- package/src/examples/physx-rapier-2d-demo.ts +0 -655
- package/src/examples/relative-positioning-demo.ts +0 -323
- package/src/examples/scroll-example.ts +0 -214
- package/src/examples/scrollbox-mouse-test.ts +0 -112
- package/src/examples/scrollbox-overlay-hit-test.ts +0 -206
- package/src/examples/select-demo.ts +0 -237
- package/src/examples/shader-cube-demo.ts +0 -1015
- package/src/examples/simple-layout-example.ts +0 -591
- package/src/examples/slider-demo.ts +0 -617
- package/src/examples/split-mode-demo.ts +0 -453
- package/src/examples/sprite-animation-demo.ts +0 -443
- package/src/examples/sprite-particle-generator-demo.ts +0 -486
- package/src/examples/static-sprite-demo.ts +0 -193
- package/src/examples/sticky-scroll-example.ts +0 -308
- package/src/examples/styled-text-demo.ts +0 -282
- package/src/examples/tab-select-demo.ts +0 -219
- package/src/examples/terminal-title.ts +0 -29
- package/src/examples/terminal.ts +0 -305
- package/src/examples/text-node-demo.ts +0 -416
- package/src/examples/text-selection-demo.ts +0 -377
- package/src/examples/text-table-demo.ts +0 -503
- package/src/examples/text-truncation-demo.ts +0 -481
- package/src/examples/text-wrap.ts +0 -757
- package/src/examples/texture-loading-demo.ts +0 -259
- package/src/examples/timeline-example.ts +0 -670
- package/src/examples/transparency-demo.ts +0 -400
- package/src/examples/vnode-composition-demo.ts +0 -404
- package/src/examples/wide-grapheme-overlay-demo.ts +0 -280
- package/src/index.ts +0 -24
- package/src/lib/KeyHandler.integration.test.ts +0 -292
- package/src/lib/KeyHandler.stopPropagation.test.ts +0 -289
- package/src/lib/KeyHandler.test.ts +0 -662
- package/src/lib/KeyHandler.ts +0 -222
- package/src/lib/RGBA.test.ts +0 -984
- package/src/lib/RGBA.ts +0 -204
- package/src/lib/ascii.font.ts +0 -330
- package/src/lib/border.test.ts +0 -83
- package/src/lib/border.ts +0 -170
- package/src/lib/bunfs.test.ts +0 -27
- package/src/lib/bunfs.ts +0 -18
- package/src/lib/clipboard.test.ts +0 -41
- package/src/lib/clipboard.ts +0 -47
- package/src/lib/clock.ts +0 -35
- package/src/lib/data-paths.test.ts +0 -133
- package/src/lib/data-paths.ts +0 -109
- package/src/lib/debounce.ts +0 -106
- package/src/lib/detect-links.test.ts +0 -98
- package/src/lib/detect-links.ts +0 -56
- package/src/lib/env.test.ts +0 -228
- package/src/lib/env.ts +0 -209
- package/src/lib/extmarks-history.ts +0 -51
- package/src/lib/extmarks-multiwidth.test.ts +0 -322
- package/src/lib/extmarks.test.ts +0 -3457
- package/src/lib/extmarks.ts +0 -843
- package/src/lib/fonts/block.json +0 -405
- package/src/lib/fonts/grid.json +0 -265
- package/src/lib/fonts/huge.json +0 -741
- package/src/lib/fonts/pallet.json +0 -314
- package/src/lib/fonts/shade.json +0 -591
- package/src/lib/fonts/slick.json +0 -321
- package/src/lib/fonts/tiny.json +0 -69
- package/src/lib/hast-styled-text.ts +0 -59
- package/src/lib/index.ts +0 -21
- package/src/lib/keymapping.test.ts +0 -317
- package/src/lib/keymapping.ts +0 -115
- package/src/lib/objects-in-viewport.test.ts +0 -787
- package/src/lib/objects-in-viewport.ts +0 -153
- package/src/lib/output.capture.ts +0 -58
- package/src/lib/parse.keypress-kitty.protocol.test.ts +0 -340
- package/src/lib/parse.keypress-kitty.test.ts +0 -663
- package/src/lib/parse.keypress-kitty.ts +0 -439
- package/src/lib/parse.keypress.test.ts +0 -1849
- package/src/lib/parse.keypress.ts +0 -397
- package/src/lib/parse.mouse.test.ts +0 -552
- package/src/lib/parse.mouse.ts +0 -232
- package/src/lib/paste.ts +0 -16
- package/src/lib/queue.ts +0 -65
- package/src/lib/renderable.validations.test.ts +0 -87
- package/src/lib/renderable.validations.ts +0 -83
- package/src/lib/scroll-acceleration.ts +0 -98
- package/src/lib/selection.ts +0 -240
- package/src/lib/singleton.ts +0 -28
- package/src/lib/stdin-parser.test.ts +0 -2290
- package/src/lib/stdin-parser.ts +0 -1810
- package/src/lib/styled-text.ts +0 -178
- package/src/lib/terminal-capability-detection.test.ts +0 -202
- package/src/lib/terminal-capability-detection.ts +0 -79
- package/src/lib/terminal-palette.test.ts +0 -878
- package/src/lib/terminal-palette.ts +0 -383
- package/src/lib/tree-sitter/assets/README.md +0 -118
- package/src/lib/tree-sitter/assets/update.ts +0 -334
- package/src/lib/tree-sitter/assets.d.ts +0 -9
- package/src/lib/tree-sitter/cache.test.ts +0 -273
- package/src/lib/tree-sitter/client.test.ts +0 -1165
- package/src/lib/tree-sitter/client.ts +0 -607
- package/src/lib/tree-sitter/default-parsers.ts +0 -86
- package/src/lib/tree-sitter/download-utils.ts +0 -148
- package/src/lib/tree-sitter/index.ts +0 -28
- package/src/lib/tree-sitter/parser.worker.ts +0 -1042
- package/src/lib/tree-sitter/parsers-config.ts +0 -81
- package/src/lib/tree-sitter/resolve-ft.test.ts +0 -55
- package/src/lib/tree-sitter/resolve-ft.ts +0 -189
- package/src/lib/tree-sitter/types.ts +0 -82
- package/src/lib/tree-sitter-styled-text.test.ts +0 -1253
- package/src/lib/tree-sitter-styled-text.ts +0 -306
- package/src/lib/validate-dir-name.ts +0 -55
- package/src/lib/yoga.options.test.ts +0 -628
- package/src/lib/yoga.options.ts +0 -346
- package/src/plugins/core-slot.ts +0 -579
- package/src/plugins/registry.ts +0 -402
- package/src/plugins/types.ts +0 -46
- package/src/post/effects.ts +0 -930
- package/src/post/filters.ts +0 -489
- package/src/post/matrices.ts +0 -288
- package/src/renderables/ASCIIFont.ts +0 -219
- package/src/renderables/Box.test.ts +0 -205
- package/src/renderables/Box.ts +0 -326
- package/src/renderables/Code.test.ts +0 -2062
- package/src/renderables/Code.ts +0 -357
- package/src/renderables/Diff.regression.test.ts +0 -226
- package/src/renderables/Diff.test.ts +0 -3101
- package/src/renderables/Diff.ts +0 -1211
- package/src/renderables/EditBufferRenderable.test.ts +0 -288
- package/src/renderables/EditBufferRenderable.ts +0 -1166
- package/src/renderables/FrameBuffer.ts +0 -47
- package/src/renderables/Input.test.ts +0 -1228
- package/src/renderables/Input.ts +0 -247
- package/src/renderables/LineNumberRenderable.ts +0 -724
- package/src/renderables/Markdown.ts +0 -1393
- package/src/renderables/ScrollBar.ts +0 -422
- package/src/renderables/ScrollBox.ts +0 -883
- package/src/renderables/Select.test.ts +0 -1033
- package/src/renderables/Select.ts +0 -524
- package/src/renderables/Slider.test.ts +0 -456
- package/src/renderables/Slider.ts +0 -342
- package/src/renderables/TabSelect.test.ts +0 -197
- package/src/renderables/TabSelect.ts +0 -455
- package/src/renderables/Text.selection-buffer.test.ts +0 -123
- package/src/renderables/Text.test.ts +0 -2660
- package/src/renderables/Text.ts +0 -147
- package/src/renderables/TextBufferRenderable.ts +0 -518
- package/src/renderables/TextNode.test.ts +0 -1058
- package/src/renderables/TextNode.ts +0 -325
- package/src/renderables/TextTable.test.ts +0 -1421
- package/src/renderables/TextTable.ts +0 -1344
- package/src/renderables/Textarea.ts +0 -430
- package/src/renderables/TimeToFirstDraw.ts +0 -89
- package/src/renderables/__snapshots__/Code.test.ts.snap +0 -13
- package/src/renderables/__snapshots__/Diff.test.ts.snap +0 -785
- package/src/renderables/__snapshots__/Text.test.ts.snap +0 -421
- package/src/renderables/__snapshots__/TextTable.test.ts.snap +0 -215
- package/src/renderables/__tests__/LineNumberRenderable.scrollbox-simple.test.ts +0 -144
- package/src/renderables/__tests__/LineNumberRenderable.scrollbox.test.ts +0 -816
- package/src/renderables/__tests__/LineNumberRenderable.test.ts +0 -1865
- package/src/renderables/__tests__/LineNumberRenderable.wrapping.test.ts +0 -85
- package/src/renderables/__tests__/Markdown.code-colors.test.ts +0 -242
- package/src/renderables/__tests__/Markdown.test.ts +0 -2518
- package/src/renderables/__tests__/MultiRenderable.selection.test.ts +0 -87
- package/src/renderables/__tests__/Textarea.buffer.test.ts +0 -682
- package/src/renderables/__tests__/Textarea.destroyed-events.test.ts +0 -675
- package/src/renderables/__tests__/Textarea.editing.test.ts +0 -2041
- package/src/renderables/__tests__/Textarea.error-handling.test.ts +0 -35
- package/src/renderables/__tests__/Textarea.events.test.ts +0 -738
- package/src/renderables/__tests__/Textarea.highlights.test.ts +0 -590
- package/src/renderables/__tests__/Textarea.keybinding.test.ts +0 -3149
- package/src/renderables/__tests__/Textarea.paste.test.ts +0 -357
- package/src/renderables/__tests__/Textarea.rendering.test.ts +0 -1866
- package/src/renderables/__tests__/Textarea.scroll.test.ts +0 -733
- package/src/renderables/__tests__/Textarea.selection.test.ts +0 -1590
- package/src/renderables/__tests__/Textarea.stress.test.ts +0 -670
- package/src/renderables/__tests__/Textarea.undo-redo.test.ts +0 -383
- package/src/renderables/__tests__/Textarea.visual-lines.test.ts +0 -310
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.code.test.ts.snap +0 -221
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox-simple.test.ts.snap +0 -89
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.scrollbox.test.ts.snap +0 -457
- package/src/renderables/__tests__/__snapshots__/LineNumberRenderable.test.ts.snap +0 -158
- package/src/renderables/__tests__/__snapshots__/Textarea.rendering.test.ts.snap +0 -387
- package/src/renderables/__tests__/markdown-parser.test.ts +0 -217
- package/src/renderables/__tests__/renderable-test-utils.ts +0 -60
- package/src/renderables/composition/README.md +0 -8
- package/src/renderables/composition/VRenderable.ts +0 -32
- package/src/renderables/composition/constructs.ts +0 -127
- package/src/renderables/composition/vnode.ts +0 -289
- package/src/renderables/index.ts +0 -23
- package/src/renderables/markdown-parser.ts +0 -66
- package/src/renderer.ts +0 -2681
- package/src/runtime-plugin-support.ts +0 -39
- package/src/runtime-plugin.ts +0 -615
- package/src/syntax-style.test.ts +0 -841
- package/src/syntax-style.ts +0 -257
- package/src/testing/README.md +0 -210
- package/src/testing/capture-spans.test.ts +0 -194
- package/src/testing/integration.test.ts +0 -276
- package/src/testing/manual-clock.ts +0 -117
- package/src/testing/mock-keys.test.ts +0 -1378
- package/src/testing/mock-keys.ts +0 -457
- package/src/testing/mock-mouse.test.ts +0 -218
- package/src/testing/mock-mouse.ts +0 -247
- package/src/testing/mock-tree-sitter-client.ts +0 -73
- package/src/testing/spy.ts +0 -13
- package/src/testing/test-recorder.test.ts +0 -415
- package/src/testing/test-recorder.ts +0 -145
- package/src/testing/test-renderer.ts +0 -132
- package/src/testing.ts +0 -7
- package/src/tests/__snapshots__/absolute-positioning.snapshot.test.ts.snap +0 -481
- package/src/tests/__snapshots__/renderable.snapshot.test.ts.snap +0 -19
- package/src/tests/__snapshots__/scrollbox.test.ts.snap +0 -29
- package/src/tests/absolute-positioning.snapshot.test.ts +0 -638
- package/src/tests/allocator-stats.test.ts +0 -38
- package/src/tests/destroy-during-render.test.ts +0 -200
- package/src/tests/destroy-on-exit.fixture.ts +0 -36
- package/src/tests/destroy-on-exit.test.ts +0 -41
- package/src/tests/hover-cursor.test.ts +0 -98
- package/src/tests/native-span-feed-async.test.ts +0 -173
- package/src/tests/native-span-feed-close.test.ts +0 -120
- package/src/tests/native-span-feed-coverage.test.ts +0 -227
- package/src/tests/native-span-feed-edge-cases.test.ts +0 -352
- package/src/tests/native-span-feed-use-after-free.test.ts +0 -45
- package/src/tests/opacity.test.ts +0 -123
- package/src/tests/renderable.snapshot.test.ts +0 -524
- package/src/tests/renderable.test.ts +0 -1281
- package/src/tests/renderer.clock.test.ts +0 -158
- package/src/tests/renderer.console-startup.test.ts +0 -185
- package/src/tests/renderer.control.test.ts +0 -425
- package/src/tests/renderer.core-slot-binding.test.ts +0 -952
- package/src/tests/renderer.cursor.test.ts +0 -26
- package/src/tests/renderer.destroy-during-render.test.ts +0 -147
- package/src/tests/renderer.focus-restore.test.ts +0 -257
- package/src/tests/renderer.focus.test.ts +0 -294
- package/src/tests/renderer.idle.test.ts +0 -219
- package/src/tests/renderer.input.test.ts +0 -2237
- package/src/tests/renderer.kitty-flags.test.ts +0 -195
- package/src/tests/renderer.mouse.test.ts +0 -1274
- package/src/tests/renderer.palette.test.ts +0 -629
- package/src/tests/renderer.selection.test.ts +0 -49
- package/src/tests/renderer.slot-registry.test.ts +0 -684
- package/src/tests/renderer.useMouse.test.ts +0 -47
- package/src/tests/runtime-plugin-node-modules-cycle.fixture.ts +0 -76
- package/src/tests/runtime-plugin-node-modules-mjs.fixture.ts +0 -43
- package/src/tests/runtime-plugin-node-modules-no-bare-rewrite.fixture.ts +0 -67
- package/src/tests/runtime-plugin-node-modules-package-type-cache.fixture.ts +0 -72
- package/src/tests/runtime-plugin-node-modules-runtime-specifier.fixture.ts +0 -44
- package/src/tests/runtime-plugin-node-modules-scoped-package-bare-rewrite.fixture.ts +0 -85
- package/src/tests/runtime-plugin-path-alias.fixture.ts +0 -43
- package/src/tests/runtime-plugin-resolve-roots.fixture.ts +0 -65
- package/src/tests/runtime-plugin-support.fixture.ts +0 -11
- package/src/tests/runtime-plugin-support.test.ts +0 -19
- package/src/tests/runtime-plugin-windows-file-url.fixture.ts +0 -30
- package/src/tests/runtime-plugin.fixture.ts +0 -40
- package/src/tests/runtime-plugin.test.ts +0 -354
- package/src/tests/scrollbox-culling-bug.test.ts +0 -114
- package/src/tests/scrollbox-hitgrid-resize.test.ts +0 -136
- package/src/tests/scrollbox-hitgrid.test.ts +0 -909
- package/src/tests/scrollbox.test.ts +0 -1530
- package/src/tests/wrap-resize-perf.test.ts +0 -276
- package/src/tests/yoga-setters.test.ts +0 -921
- package/src/text-buffer-view.test.ts +0 -705
- package/src/text-buffer-view.ts +0 -189
- package/src/text-buffer.test.ts +0 -347
- package/src/text-buffer.ts +0 -250
- package/src/types.ts +0 -161
- package/src/utils.ts +0 -88
- package/src/zig/ansi.zig +0 -268
- package/src/zig/bench/README.md +0 -50
- package/src/zig/bench/buffer-draw-text-buffer_bench.zig +0 -887
- package/src/zig/bench/edit-buffer_bench.zig +0 -476
- package/src/zig/bench/native-span-feed_bench.zig +0 -100
- package/src/zig/bench/rope-markers_bench.zig +0 -713
- package/src/zig/bench/rope_bench.zig +0 -514
- package/src/zig/bench/styled-text_bench.zig +0 -470
- package/src/zig/bench/text-buffer-coords_bench.zig +0 -362
- package/src/zig/bench/text-buffer-view_bench.zig +0 -459
- package/src/zig/bench/text-chunk-graphemes_bench.zig +0 -273
- package/src/zig/bench/utf8_bench.zig +0 -799
- package/src/zig/bench-utils.zig +0 -431
- package/src/zig/bench.zig +0 -217
- package/src/zig/buffer-methods.zig +0 -211
- package/src/zig/buffer.zig +0 -2281
- package/src/zig/build.zig +0 -289
- package/src/zig/build.zig.zon +0 -16
- package/src/zig/edit-buffer.zig +0 -825
- package/src/zig/editor-view.zig +0 -802
- package/src/zig/event-bus.zig +0 -13
- package/src/zig/event-emitter.zig +0 -65
- package/src/zig/file-logger.zig +0 -92
- package/src/zig/grapheme.zig +0 -599
- package/src/zig/lib.zig +0 -1854
- package/src/zig/link.zig +0 -333
- package/src/zig/logger.zig +0 -43
- package/src/zig/mem-registry.zig +0 -125
- package/src/zig/native-span-feed-bench-lib.zig +0 -7
- package/src/zig/native-span-feed.zig +0 -708
- package/src/zig/renderer.zig +0 -1393
- package/src/zig/rope.zig +0 -1220
- package/src/zig/syntax-style.zig +0 -161
- package/src/zig/terminal.zig +0 -987
- package/src/zig/test.zig +0 -72
- package/src/zig/tests/README.md +0 -18
- package/src/zig/tests/buffer-methods_test.zig +0 -1109
- package/src/zig/tests/buffer_test.zig +0 -2557
- package/src/zig/tests/edit-buffer-history_test.zig +0 -271
- package/src/zig/tests/edit-buffer_test.zig +0 -1689
- package/src/zig/tests/editor-view_test.zig +0 -3299
- package/src/zig/tests/event-emitter_test.zig +0 -249
- package/src/zig/tests/grapheme_test.zig +0 -1304
- package/src/zig/tests/link_test.zig +0 -190
- package/src/zig/tests/mem-registry_test.zig +0 -473
- package/src/zig/tests/memory_leak_regression_test.zig +0 -159
- package/src/zig/tests/native-span-feed_test.zig +0 -1264
- package/src/zig/tests/renderer_test.zig +0 -1017
- package/src/zig/tests/rope-nested_test.zig +0 -712
- package/src/zig/tests/rope_fuzz_test.zig +0 -238
- package/src/zig/tests/rope_test.zig +0 -2362
- package/src/zig/tests/segment-merge.test.zig +0 -148
- package/src/zig/tests/syntax-style_test.zig +0 -557
- package/src/zig/tests/terminal_test.zig +0 -754
- package/src/zig/tests/text-buffer-drawing_test.zig +0 -3237
- package/src/zig/tests/text-buffer-highlights_test.zig +0 -666
- package/src/zig/tests/text-buffer-iterators_test.zig +0 -776
- package/src/zig/tests/text-buffer-segment_test.zig +0 -320
- package/src/zig/tests/text-buffer-selection_test.zig +0 -1035
- package/src/zig/tests/text-buffer-selection_viewport_test.zig +0 -358
- package/src/zig/tests/text-buffer-view_test.zig +0 -3649
- package/src/zig/tests/text-buffer_test.zig +0 -2191
- package/src/zig/tests/unicode-width-map.zon +0 -3909
- package/src/zig/tests/utf8_no_zwj_test.zig +0 -260
- package/src/zig/tests/utf8_test.zig +0 -4057
- package/src/zig/tests/utf8_wcwidth_cursor_test.zig +0 -267
- package/src/zig/tests/utf8_wcwidth_test.zig +0 -357
- package/src/zig/tests/word-wrap-editing_test.zig +0 -498
- package/src/zig/tests/wrap-cache-perf_test.zig +0 -113
- package/src/zig/text-buffer-iterators.zig +0 -499
- package/src/zig/text-buffer-segment.zig +0 -404
- package/src/zig/text-buffer-view.zig +0 -1371
- package/src/zig/text-buffer.zig +0 -1180
- package/src/zig/utf8.zig +0 -1948
- package/src/zig/utils.zig +0 -9
- package/src/zig-structs.ts +0 -261
- package/src/zig.ts +0 -3884
- package/tsconfig.build.json +0 -24
- package/tsconfig.json +0 -27
- /package/{src/lib/tree-sitter/assets → assets}/javascript/highlights.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/javascript/tree-sitter-javascript.wasm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/markdown/highlights.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/markdown/injections.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/markdown/tree-sitter-markdown.wasm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/markdown_inline/highlights.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/markdown_inline/tree-sitter-markdown_inline.wasm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/typescript/highlights.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/typescript/tree-sitter-typescript.wasm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/zig/highlights.scm +0 -0
- /package/{src/lib/tree-sitter/assets → assets}/zig/tree-sitter-zig.wasm +0 -0
package/src/post/effects.ts
DELETED
|
@@ -1,930 +0,0 @@
|
|
|
1
|
-
import type { OptimizedBuffer } from "../buffer.js"
|
|
2
|
-
|
|
3
|
-
interface ActiveGlitch {
|
|
4
|
-
y: number
|
|
5
|
-
type: "shift" | "flip" | "color"
|
|
6
|
-
amount: number
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export class DistortionEffect {
|
|
10
|
-
// --- Configurable Parameters ---
|
|
11
|
-
public glitchChancePerSecond: number = 0.5
|
|
12
|
-
public maxGlitchLines: number = 3
|
|
13
|
-
public minGlitchDuration: number = 0.05
|
|
14
|
-
public maxGlitchDuration: number = 0.2
|
|
15
|
-
public maxShiftAmount: number = 10
|
|
16
|
-
public shiftFlipRatio: number = 0.6
|
|
17
|
-
public colorGlitchChance: number = 0.2
|
|
18
|
-
|
|
19
|
-
// --- Internal State ---
|
|
20
|
-
private lastGlitchTime: number = 0
|
|
21
|
-
private glitchDuration: number = 0
|
|
22
|
-
private activeGlitches: ActiveGlitch[] = []
|
|
23
|
-
|
|
24
|
-
constructor(options?: Partial<DistortionEffect>) {
|
|
25
|
-
if (options) {
|
|
26
|
-
Object.assign(this, options)
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Applies the animated distortion/glitch effect to the buffer.
|
|
32
|
-
*/
|
|
33
|
-
public apply(buffer: OptimizedBuffer, deltaTime: number): void {
|
|
34
|
-
const width = buffer.width
|
|
35
|
-
const height = buffer.height
|
|
36
|
-
const buf = buffer.buffers
|
|
37
|
-
// Note: Using internal timer based on deltaTime is more reliable than Date.now()
|
|
38
|
-
|
|
39
|
-
// Update glitch timer
|
|
40
|
-
this.lastGlitchTime += deltaTime
|
|
41
|
-
|
|
42
|
-
// End current glitch if duration is over
|
|
43
|
-
if (this.activeGlitches.length > 0 && this.lastGlitchTime >= this.glitchDuration) {
|
|
44
|
-
this.activeGlitches = []
|
|
45
|
-
this.glitchDuration = 0
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// Chance to start a new glitch
|
|
49
|
-
if (this.activeGlitches.length === 0 && Math.random() < this.glitchChancePerSecond * deltaTime) {
|
|
50
|
-
this.lastGlitchTime = 0
|
|
51
|
-
this.glitchDuration = this.minGlitchDuration + Math.random() * (this.maxGlitchDuration - this.minGlitchDuration)
|
|
52
|
-
const numGlitches = 1 + Math.floor(Math.random() * this.maxGlitchLines)
|
|
53
|
-
|
|
54
|
-
for (let i = 0; i < numGlitches; i++) {
|
|
55
|
-
const y = Math.floor(Math.random() * height)
|
|
56
|
-
let type: ActiveGlitch["type"]
|
|
57
|
-
let amount = 0
|
|
58
|
-
|
|
59
|
-
const typeRoll = Math.random()
|
|
60
|
-
if (typeRoll < this.colorGlitchChance) {
|
|
61
|
-
type = "color"
|
|
62
|
-
} else {
|
|
63
|
-
// Determine shift or flip based on remaining probability
|
|
64
|
-
const shiftRoll = (typeRoll - this.colorGlitchChance) / (1 - this.colorGlitchChance)
|
|
65
|
-
if (shiftRoll < this.shiftFlipRatio) {
|
|
66
|
-
type = "shift"
|
|
67
|
-
amount = Math.floor((Math.random() - 0.5) * 2 * this.maxShiftAmount)
|
|
68
|
-
} else {
|
|
69
|
-
type = "flip"
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// Avoid glitching the same line twice in one burst
|
|
74
|
-
if (!this.activeGlitches.some((g) => g.y === y)) {
|
|
75
|
-
this.activeGlitches.push({ y, type, amount })
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// Apply active glitches
|
|
81
|
-
if (this.activeGlitches.length > 0) {
|
|
82
|
-
// Create temporary arrays lazily if needed (minor optimization for shift/flip)
|
|
83
|
-
let tempChar: Uint32Array | null = null
|
|
84
|
-
let tempFg: Float32Array | null = null
|
|
85
|
-
let tempBg: Float32Array | null = null
|
|
86
|
-
let tempAttr: Uint8Array | null = null
|
|
87
|
-
|
|
88
|
-
for (const glitch of this.activeGlitches) {
|
|
89
|
-
const y = glitch.y
|
|
90
|
-
// Ensure y is within bounds (safer)
|
|
91
|
-
if (y < 0 || y >= height) continue
|
|
92
|
-
const baseIndex = y * width
|
|
93
|
-
|
|
94
|
-
if (glitch.type === "shift" || glitch.type === "flip") {
|
|
95
|
-
// Lazily create temp buffers only when needed for shift/flip
|
|
96
|
-
if (!tempChar) {
|
|
97
|
-
tempChar = new Uint32Array(width)
|
|
98
|
-
tempFg = new Float32Array(width * 4)
|
|
99
|
-
tempBg = new Float32Array(width * 4)
|
|
100
|
-
tempAttr = new Uint8Array(width)
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// 1. Copy original row data to temp buffers
|
|
104
|
-
try {
|
|
105
|
-
tempChar.set(buf.char.subarray(baseIndex, baseIndex + width))
|
|
106
|
-
tempFg!.set(buf.fg.subarray(baseIndex * 4, (baseIndex + width) * 4))
|
|
107
|
-
tempBg!.set(buf.bg.subarray(baseIndex * 4, (baseIndex + width) * 4))
|
|
108
|
-
tempAttr!.set(buf.attributes.subarray(baseIndex, baseIndex + width))
|
|
109
|
-
} catch (e) {
|
|
110
|
-
// Handle potential range errors if buffer size changes unexpectedly
|
|
111
|
-
console.error(`Error copying row ${y} for distortion:`, e)
|
|
112
|
-
continue
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
if (glitch.type === "shift") {
|
|
116
|
-
const shift = glitch.amount
|
|
117
|
-
for (let x = 0; x < width; x++) {
|
|
118
|
-
const srcX = (x - shift + width) % width // Wrap around shift
|
|
119
|
-
const destIndex = baseIndex + x
|
|
120
|
-
const srcTempIndex = srcX
|
|
121
|
-
|
|
122
|
-
buf.char[destIndex] = tempChar[srcTempIndex]
|
|
123
|
-
buf.attributes[destIndex] = tempAttr![srcTempIndex]
|
|
124
|
-
|
|
125
|
-
const destColorIndex = destIndex * 4
|
|
126
|
-
const srcTempColorIndex = srcTempIndex * 4
|
|
127
|
-
|
|
128
|
-
buf.fg.set(tempFg!.subarray(srcTempColorIndex, srcTempColorIndex + 4), destColorIndex)
|
|
129
|
-
buf.bg.set(tempBg!.subarray(srcTempColorIndex, srcTempColorIndex + 4), destColorIndex)
|
|
130
|
-
}
|
|
131
|
-
} else {
|
|
132
|
-
// type === 'flip'
|
|
133
|
-
for (let x = 0; x < width; x++) {
|
|
134
|
-
const srcX = width - 1 - x // Flipped index
|
|
135
|
-
const destIndex = baseIndex + x
|
|
136
|
-
const srcTempIndex = srcX
|
|
137
|
-
|
|
138
|
-
buf.char[destIndex] = tempChar[srcTempIndex]
|
|
139
|
-
buf.attributes[destIndex] = tempAttr![srcTempIndex]
|
|
140
|
-
|
|
141
|
-
const destColorIndex = destIndex * 4
|
|
142
|
-
const srcTempColorIndex = srcTempIndex * 4
|
|
143
|
-
|
|
144
|
-
buf.fg.set(tempFg!.subarray(srcTempColorIndex, srcTempColorIndex + 4), destColorIndex)
|
|
145
|
-
buf.bg.set(tempBg!.subarray(srcTempColorIndex, srcTempColorIndex + 4), destColorIndex)
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
} else if (glitch.type === "color") {
|
|
149
|
-
const glitchStart = Math.floor(Math.random() * width)
|
|
150
|
-
// Make glitch length at least 1 pixel, up to the rest of the line
|
|
151
|
-
const maxPossibleLength = width - glitchStart
|
|
152
|
-
// Introduce more variability: sometimes short, sometimes long, but not always full width
|
|
153
|
-
let glitchLength = Math.floor(Math.random() * maxPossibleLength) + 1
|
|
154
|
-
if (Math.random() < 0.2) {
|
|
155
|
-
// 20% chance of a shorter, more intense glitch segment
|
|
156
|
-
glitchLength = Math.floor(Math.random() * (width / 4)) + 1
|
|
157
|
-
}
|
|
158
|
-
glitchLength = Math.min(glitchLength, maxPossibleLength)
|
|
159
|
-
|
|
160
|
-
for (let x = glitchStart; x < glitchStart + glitchLength; x++) {
|
|
161
|
-
if (x >= width) break // Boundary check
|
|
162
|
-
|
|
163
|
-
const destIndex = baseIndex + x
|
|
164
|
-
const destColorIndex = destIndex * 4
|
|
165
|
-
|
|
166
|
-
let rFg, gFg, bFg, rBg, gBg, bBg
|
|
167
|
-
|
|
168
|
-
// More varied and "glitchy" colors
|
|
169
|
-
const colorMode = Math.random()
|
|
170
|
-
if (colorMode < 0.33) {
|
|
171
|
-
// Pure random
|
|
172
|
-
rFg = Math.random()
|
|
173
|
-
gFg = Math.random()
|
|
174
|
-
bFg = Math.random()
|
|
175
|
-
rBg = Math.random()
|
|
176
|
-
gBg = Math.random()
|
|
177
|
-
bBg = Math.random()
|
|
178
|
-
} else if (colorMode < 0.66) {
|
|
179
|
-
// Single channel emphasis or block color
|
|
180
|
-
const emphasis = Math.random()
|
|
181
|
-
if (emphasis < 0.25) {
|
|
182
|
-
rFg = Math.random()
|
|
183
|
-
gFg = 0
|
|
184
|
-
bFg = 0
|
|
185
|
-
} // Red
|
|
186
|
-
else if (emphasis < 0.5) {
|
|
187
|
-
rFg = 0
|
|
188
|
-
gFg = Math.random()
|
|
189
|
-
bFg = 0
|
|
190
|
-
} // Green
|
|
191
|
-
else if (emphasis < 0.75) {
|
|
192
|
-
rFg = 0
|
|
193
|
-
gFg = 0
|
|
194
|
-
bFg = Math.random()
|
|
195
|
-
} // Blue
|
|
196
|
-
else {
|
|
197
|
-
// Bright glitch color
|
|
198
|
-
const glitchColorRoll = Math.random()
|
|
199
|
-
if (glitchColorRoll < 0.33) {
|
|
200
|
-
rFg = 1
|
|
201
|
-
gFg = 0
|
|
202
|
-
bFg = 1
|
|
203
|
-
} // Magenta
|
|
204
|
-
else if (glitchColorRoll < 0.66) {
|
|
205
|
-
rFg = 0
|
|
206
|
-
gFg = 1
|
|
207
|
-
bFg = 1
|
|
208
|
-
} // Cyan
|
|
209
|
-
else {
|
|
210
|
-
rFg = 1
|
|
211
|
-
gFg = 1
|
|
212
|
-
bFg = 0
|
|
213
|
-
} // Yellow
|
|
214
|
-
}
|
|
215
|
-
// Background can be inverted or similar to FG
|
|
216
|
-
if (Math.random() < 0.5) {
|
|
217
|
-
rBg = 1 - rFg
|
|
218
|
-
gBg = 1 - gFg
|
|
219
|
-
bBg = 1 - bFg
|
|
220
|
-
} else {
|
|
221
|
-
rBg = rFg * (Math.random() * 0.5 + 0.2) // Darker shade of fg
|
|
222
|
-
gBg = gFg * (Math.random() * 0.5 + 0.2)
|
|
223
|
-
bBg = bFg * (Math.random() * 0.5 + 0.2)
|
|
224
|
-
}
|
|
225
|
-
} else {
|
|
226
|
-
// Inverted or high contrast
|
|
227
|
-
rFg = Math.random() > 0.5 ? 1 : 0
|
|
228
|
-
gFg = Math.random() > 0.5 ? 1 : 0
|
|
229
|
-
bFg = Math.random() > 0.5 ? 1 : 0
|
|
230
|
-
rBg = 1 - rFg
|
|
231
|
-
gBg = 1 - gFg
|
|
232
|
-
bBg = 1 - bFg
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
buf.fg[destColorIndex] = rFg
|
|
236
|
-
buf.fg[destColorIndex + 1] = gFg
|
|
237
|
-
buf.fg[destColorIndex + 2] = bFg
|
|
238
|
-
// Keep alpha buf.fg[destColorIndex + 3]
|
|
239
|
-
|
|
240
|
-
buf.bg[destColorIndex] = rBg
|
|
241
|
-
buf.bg[destColorIndex + 1] = gBg
|
|
242
|
-
buf.bg[destColorIndex + 2] = bBg
|
|
243
|
-
// Keep alpha buf.bg[destColorIndex + 3]
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
/**
|
|
252
|
-
* Applies a vignette effect by darkening the corners, optimized with precomputation.
|
|
253
|
-
* Uses native colorMatrix with a zero matrix for attenuation.
|
|
254
|
-
*/
|
|
255
|
-
export class VignetteEffect {
|
|
256
|
-
private _strength: number
|
|
257
|
-
// Stores packed cell masks [x, y, attenuation] per pixel
|
|
258
|
-
private precomputedAttenuationCellMask: Float32Array | null = null
|
|
259
|
-
private cachedWidth: number = -1
|
|
260
|
-
private cachedHeight: number = -1
|
|
261
|
-
// Zero matrix for attenuation (maps everything toward black based on strength)
|
|
262
|
-
private static zeroMatrix = new Float32Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
|
|
263
|
-
|
|
264
|
-
constructor(strength: number = 0.5) {
|
|
265
|
-
this._strength = strength
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
public set strength(newStrength: number) {
|
|
269
|
-
this._strength = Math.max(0, newStrength) // Ensure strength is non-negative
|
|
270
|
-
// Invalidate cached cell masks when strength changes
|
|
271
|
-
this.cachedWidth = -1
|
|
272
|
-
this.cachedHeight = -1
|
|
273
|
-
this.precomputedAttenuationCellMask = null
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
public get strength(): number {
|
|
277
|
-
return this._strength
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
private _computeFactors(width: number, height: number): void {
|
|
281
|
-
this.precomputedAttenuationCellMask = new Float32Array(width * height * 3)
|
|
282
|
-
const centerX = width / 2
|
|
283
|
-
const centerY = height / 2
|
|
284
|
-
const maxDistSq = centerX * centerX + centerY * centerY
|
|
285
|
-
const safeMaxDistSq = maxDistSq === 0 ? 1 : maxDistSq // Avoid division by zero
|
|
286
|
-
const strength = this._strength
|
|
287
|
-
let i = 0
|
|
288
|
-
|
|
289
|
-
for (let y = 0; y < height; y++) {
|
|
290
|
-
const dy = y - centerY
|
|
291
|
-
const dySq = dy * dy
|
|
292
|
-
for (let x = 0; x < width; x++) {
|
|
293
|
-
const dx = x - centerX
|
|
294
|
-
const distSq = dx * dx + dySq
|
|
295
|
-
// Calculate base attenuation (0 to 1 based on distance)
|
|
296
|
-
const baseAttenuation = Math.min(1, distSq / safeMaxDistSq)
|
|
297
|
-
// Precompute final attenuation value including strength
|
|
298
|
-
const attenuation = baseAttenuation * strength
|
|
299
|
-
this.precomputedAttenuationCellMask[i++] = x
|
|
300
|
-
this.precomputedAttenuationCellMask[i++] = y
|
|
301
|
-
this.precomputedAttenuationCellMask[i++] = attenuation
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
this.cachedWidth = width
|
|
305
|
-
this.cachedHeight = height
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
/**
|
|
309
|
-
* Applies the vignette effect using native colorMatrix with a zero matrix.
|
|
310
|
-
* The zero matrix maps all colors to black, and the attenuation cell masks
|
|
311
|
-
* control how much of the effect is applied (strength-based blending).
|
|
312
|
-
*/
|
|
313
|
-
public apply(buffer: OptimizedBuffer): void {
|
|
314
|
-
const width = buffer.width
|
|
315
|
-
const height = buffer.height
|
|
316
|
-
|
|
317
|
-
// Recompute attenuation cell masks if dimensions changed, strength changed,
|
|
318
|
-
// or factors haven't been computed yet
|
|
319
|
-
if (width !== this.cachedWidth || height !== this.cachedHeight || !this.precomputedAttenuationCellMask) {
|
|
320
|
-
this._computeFactors(width, height)
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
// Use colorMatrix with zero matrix to apply attenuation
|
|
324
|
-
// colorMatrix blends: result = original + (transformed - original) × strength
|
|
325
|
-
// With zero matrix: transformed = 0
|
|
326
|
-
// Result = original + (0 - original) × attenuation = original × (1 - attenuation)
|
|
327
|
-
buffer.colorMatrix(VignetteEffect.zeroMatrix, this.precomputedAttenuationCellMask!, 1.0, 3)
|
|
328
|
-
}
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
/**
|
|
332
|
-
* Simple Perlin noise implementation for procedural cloud generation.
|
|
333
|
-
* Uses gradient vectors and smooth interpolation.
|
|
334
|
-
*/
|
|
335
|
-
class PerlinNoise {
|
|
336
|
-
private perm: Uint8Array
|
|
337
|
-
private grad3: number[][] = [
|
|
338
|
-
[1, 1, 0],
|
|
339
|
-
[-1, 1, 0],
|
|
340
|
-
[1, -1, 0],
|
|
341
|
-
[-1, -1, 0],
|
|
342
|
-
[1, 0, 1],
|
|
343
|
-
[-1, 0, 1],
|
|
344
|
-
[1, 0, -1],
|
|
345
|
-
[-1, 0, -1],
|
|
346
|
-
[0, 1, 1],
|
|
347
|
-
[0, -1, 1],
|
|
348
|
-
[0, 1, -1],
|
|
349
|
-
[0, -1, -1],
|
|
350
|
-
]
|
|
351
|
-
|
|
352
|
-
constructor() {
|
|
353
|
-
// Permutation table for pseudo-random gradient selection
|
|
354
|
-
this.perm = new Uint8Array(512)
|
|
355
|
-
const p = new Uint8Array(256)
|
|
356
|
-
for (let i = 0; i < 256; i++) {
|
|
357
|
-
p[i] = i
|
|
358
|
-
}
|
|
359
|
-
// Shuffle
|
|
360
|
-
for (let i = 255; i > 0; i--) {
|
|
361
|
-
const r = Math.floor(Math.random() * (i + 1))
|
|
362
|
-
;[p[i], p[r]] = [p[r], p[i]]
|
|
363
|
-
}
|
|
364
|
-
// Duplicate for overflow handling
|
|
365
|
-
for (let i = 0; i < 512; i++) {
|
|
366
|
-
this.perm[i] = p[i & 255]
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
private dot(g: number[], x: number, y: number, z: number): number {
|
|
371
|
-
return g[0] * x + g[1] * y + g[2] * z
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
private mix(a: number, b: number, t: number): number {
|
|
375
|
-
return a + (b - a) * t
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
private fade(t: number): number {
|
|
379
|
-
return t * t * t * (t * (t * 6 - 15) + 10)
|
|
380
|
-
}
|
|
381
|
-
|
|
382
|
-
/**
|
|
383
|
-
* 3D Perlin noise at coordinates (x, y, z)
|
|
384
|
-
* Returns value in range [-1, 1]
|
|
385
|
-
*/
|
|
386
|
-
noise3d(x: number, y: number, z: number): number {
|
|
387
|
-
// Find unit grid cell containing point
|
|
388
|
-
const X = Math.floor(x) & 255
|
|
389
|
-
const Y = Math.floor(y) & 255
|
|
390
|
-
const Z = Math.floor(z) & 255
|
|
391
|
-
|
|
392
|
-
// Get relative xyz coordinates of point within that cell
|
|
393
|
-
const xf = x - Math.floor(x)
|
|
394
|
-
const yf = y - Math.floor(y)
|
|
395
|
-
const zf = z - Math.floor(z)
|
|
396
|
-
|
|
397
|
-
// Compute fade curves for each of x, y, z
|
|
398
|
-
const u = this.fade(xf)
|
|
399
|
-
const v = this.fade(yf)
|
|
400
|
-
const w = this.fade(zf)
|
|
401
|
-
|
|
402
|
-
// Hash coordinates of the 8 cube corners
|
|
403
|
-
const A = this.perm[X] + Y
|
|
404
|
-
const AA = this.perm[A] + Z
|
|
405
|
-
const AB = this.perm[A + 1] + Z
|
|
406
|
-
const B = this.perm[X + 1] + Y
|
|
407
|
-
const BA = this.perm[B] + Z
|
|
408
|
-
const BB = this.perm[B + 1] + Z
|
|
409
|
-
|
|
410
|
-
// Add blended results from 8 corners of the cube
|
|
411
|
-
let res = this.mix(
|
|
412
|
-
this.mix(
|
|
413
|
-
this.mix(
|
|
414
|
-
this.dot(this.grad3[this.perm[AA] % 12], xf, yf, zf),
|
|
415
|
-
this.dot(this.grad3[this.perm[BA] % 12], xf - 1, yf, zf),
|
|
416
|
-
u,
|
|
417
|
-
),
|
|
418
|
-
this.mix(
|
|
419
|
-
this.dot(this.grad3[this.perm[AB] % 12], xf, yf - 1, zf),
|
|
420
|
-
this.dot(this.grad3[this.perm[BB] % 12], xf - 1, yf - 1, zf),
|
|
421
|
-
u,
|
|
422
|
-
),
|
|
423
|
-
v,
|
|
424
|
-
),
|
|
425
|
-
this.mix(
|
|
426
|
-
this.mix(
|
|
427
|
-
this.dot(this.grad3[this.perm[AA + 1] % 12], xf, yf, zf - 1),
|
|
428
|
-
this.dot(this.grad3[this.perm[BA + 1] % 12], xf - 1, yf, zf - 1),
|
|
429
|
-
u,
|
|
430
|
-
),
|
|
431
|
-
this.mix(
|
|
432
|
-
this.dot(this.grad3[this.perm[AB + 1] % 12], xf, yf - 1, zf - 1),
|
|
433
|
-
this.dot(this.grad3[this.perm[BB + 1] % 12], xf - 1, yf - 1, zf - 1),
|
|
434
|
-
u,
|
|
435
|
-
),
|
|
436
|
-
v,
|
|
437
|
-
),
|
|
438
|
-
w,
|
|
439
|
-
)
|
|
440
|
-
|
|
441
|
-
return res
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
/**
|
|
446
|
-
* Applies animated cloud shadows using Perlin noise.
|
|
447
|
-
* Darkens the background buffer based on procedural cloud density.
|
|
448
|
-
*/
|
|
449
|
-
export class CloudsEffect {
|
|
450
|
-
private noise: PerlinNoise
|
|
451
|
-
private _scale: number
|
|
452
|
-
private _speed: number
|
|
453
|
-
private _density: number
|
|
454
|
-
private _darkness: number
|
|
455
|
-
private time: number = 0
|
|
456
|
-
|
|
457
|
-
constructor(scale: number = 0.02, speed: number = 0.5, density: number = 0.6, darkness: number = 0.7) {
|
|
458
|
-
this.noise = new PerlinNoise()
|
|
459
|
-
this._scale = scale
|
|
460
|
-
this._speed = speed
|
|
461
|
-
this._density = density
|
|
462
|
-
this._darkness = darkness
|
|
463
|
-
}
|
|
464
|
-
|
|
465
|
-
public set scale(newScale: number) {
|
|
466
|
-
this._scale = Math.max(0.001, newScale)
|
|
467
|
-
}
|
|
468
|
-
public get scale(): number {
|
|
469
|
-
return this._scale
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
public set speed(newSpeed: number) {
|
|
473
|
-
this._speed = Math.max(0, newSpeed)
|
|
474
|
-
}
|
|
475
|
-
public get speed(): number {
|
|
476
|
-
return this._speed
|
|
477
|
-
}
|
|
478
|
-
|
|
479
|
-
public set density(newDensity: number) {
|
|
480
|
-
this._density = Math.max(0, Math.min(1, newDensity))
|
|
481
|
-
}
|
|
482
|
-
public get density(): number {
|
|
483
|
-
return this._density
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
public set darkness(newDarkness: number) {
|
|
487
|
-
this._darkness = Math.max(0, Math.min(1, newDarkness))
|
|
488
|
-
}
|
|
489
|
-
public get darkness(): number {
|
|
490
|
-
return this._darkness
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
/**
|
|
494
|
-
* Applies cloud shadow effect using Perlin noise mask with native colorMatrix.
|
|
495
|
-
* Uses FBM (Fractal Brownian Motion) for detailed clouds, offloaded to native code.
|
|
496
|
-
*/
|
|
497
|
-
public apply(buffer: OptimizedBuffer, deltaTime: number): void {
|
|
498
|
-
const width = buffer.width
|
|
499
|
-
const height = buffer.height
|
|
500
|
-
|
|
501
|
-
// Update time for animation
|
|
502
|
-
this.time += deltaTime * this._speed
|
|
503
|
-
|
|
504
|
-
const scale = this._scale
|
|
505
|
-
const timeOffset = this.time
|
|
506
|
-
|
|
507
|
-
// Build cell mask with per-pixel attenuation values
|
|
508
|
-
// Format: [x, y, attenuation] for each pixel
|
|
509
|
-
const cellMask = new Float32Array(width * height * 3)
|
|
510
|
-
let maskIdx = 0
|
|
511
|
-
|
|
512
|
-
for (let y = 0; y < height; y++) {
|
|
513
|
-
for (let x = 0; x < width; x++) {
|
|
514
|
-
// FBM - combine multiple octaves for detail
|
|
515
|
-
let noiseValue = 0
|
|
516
|
-
let amplitude = 1
|
|
517
|
-
let frequency = 1
|
|
518
|
-
let maxValue = 0
|
|
519
|
-
|
|
520
|
-
// 4 octaves of noise
|
|
521
|
-
for (let i = 0; i < 4; i++) {
|
|
522
|
-
const nx = (x * scale * frequency + timeOffset) * 0.5
|
|
523
|
-
const ny = y * scale * frequency * 0.5
|
|
524
|
-
const nz = timeOffset * 0.3 // Use time as z for evolution
|
|
525
|
-
|
|
526
|
-
noiseValue += this.noise.noise3d(nx, ny, nz) * amplitude
|
|
527
|
-
maxValue += amplitude
|
|
528
|
-
amplitude *= 0.5
|
|
529
|
-
frequency *= 2
|
|
530
|
-
}
|
|
531
|
-
|
|
532
|
-
// Normalize to [0, 1]
|
|
533
|
-
noiseValue = (noiseValue / maxValue + 1) * 0.5
|
|
534
|
-
|
|
535
|
-
// Apply density threshold - lower density = more clouds
|
|
536
|
-
const cloudDensity = Math.max(0, noiseValue - (1 - this._density))
|
|
537
|
-
|
|
538
|
-
// Scale to actual darkness (0 = no change, 1 = full darkness)
|
|
539
|
-
const attenuation = cloudDensity * this._darkness
|
|
540
|
-
|
|
541
|
-
// Add to cell mask
|
|
542
|
-
cellMask[maskIdx++] = x
|
|
543
|
-
cellMask[maskIdx++] = y
|
|
544
|
-
cellMask[maskIdx++] = attenuation
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
// Use native colorMatrix with zero matrix to apply attenuation
|
|
549
|
-
// Zero matrix: transformed = 0 (black)
|
|
550
|
-
// Result = original + (0 - original) × attenuation = original × (1 - attenuation)
|
|
551
|
-
const zeroMatrix = new Float32Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
|
|
552
|
-
buffer.colorMatrix(zeroMatrix, cellMask, 1.0, 2) // target = 2 (background only)
|
|
553
|
-
}
|
|
554
|
-
}
|
|
555
|
-
|
|
556
|
-
/**
|
|
557
|
-
* Applies animated flames rising from the bottom using Perlin noise.
|
|
558
|
-
* Creates warm fire effect that fades as it rises.
|
|
559
|
-
*/
|
|
560
|
-
export class FlamesEffect {
|
|
561
|
-
private noise: PerlinNoise
|
|
562
|
-
private _scale: number
|
|
563
|
-
private _speed: number
|
|
564
|
-
private _intensity: number
|
|
565
|
-
private time: number = 0
|
|
566
|
-
|
|
567
|
-
constructor(scale: number = 0.03, speed: number = 0.02, intensity: number = 0.8) {
|
|
568
|
-
this.noise = new PerlinNoise()
|
|
569
|
-
this._scale = scale
|
|
570
|
-
this._speed = speed
|
|
571
|
-
this._intensity = intensity
|
|
572
|
-
}
|
|
573
|
-
|
|
574
|
-
public set scale(newScale: number) {
|
|
575
|
-
this._scale = Math.max(0.001, newScale)
|
|
576
|
-
}
|
|
577
|
-
public get scale(): number {
|
|
578
|
-
return this._scale
|
|
579
|
-
}
|
|
580
|
-
|
|
581
|
-
public set speed(newSpeed: number) {
|
|
582
|
-
this._speed = Math.max(0, newSpeed)
|
|
583
|
-
}
|
|
584
|
-
public get speed(): number {
|
|
585
|
-
return this._speed
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
public set intensity(newIntensity: number) {
|
|
589
|
-
this._intensity = Math.max(0, Math.min(1, newIntensity))
|
|
590
|
-
}
|
|
591
|
-
public get intensity(): number {
|
|
592
|
-
return this._intensity
|
|
593
|
-
}
|
|
594
|
-
|
|
595
|
-
/**
|
|
596
|
-
* Applies flame effect rising from bottom using Perlin noise.
|
|
597
|
-
* Flames get cooler (redder) and fade as they rise.
|
|
598
|
-
*/
|
|
599
|
-
public apply(buffer: OptimizedBuffer, deltaTime: number): void {
|
|
600
|
-
const width = buffer.width
|
|
601
|
-
const height = buffer.height
|
|
602
|
-
const bg = buffer.buffers.bg
|
|
603
|
-
|
|
604
|
-
// Update time for animation
|
|
605
|
-
this.time += deltaTime * this._speed
|
|
606
|
-
|
|
607
|
-
const scale = this._scale
|
|
608
|
-
const timeOffset = this.time
|
|
609
|
-
|
|
610
|
-
for (let y = 0; y < height; y++) {
|
|
611
|
-
// Calculate height factor - stronger at bottom (1.0), fading toward top (0.0)
|
|
612
|
-
const heightFactor = 1.0 - y / height
|
|
613
|
-
|
|
614
|
-
for (let x = 0; x < width; x++) {
|
|
615
|
-
// FBM - combine multiple octaves for organic flame detail
|
|
616
|
-
let noiseValue = 0
|
|
617
|
-
let amplitude = 1
|
|
618
|
-
let frequency = 1
|
|
619
|
-
let maxValue = 0
|
|
620
|
-
|
|
621
|
-
// 3 octaves of noise for flames
|
|
622
|
-
for (let i = 0; i < 3; i++) {
|
|
623
|
-
// Flip y coordinate so flames rise from bottom
|
|
624
|
-
const nx = (x * scale * frequency + timeOffset) * 0.5
|
|
625
|
-
const ny = (height - y) * scale * frequency * 2 * 0.5
|
|
626
|
-
const nz = timeOffset * 2.0 // Faster z evolution for more flicker
|
|
627
|
-
|
|
628
|
-
noiseValue += this.noise.noise3d(nx, ny, nz) * amplitude
|
|
629
|
-
maxValue += amplitude
|
|
630
|
-
amplitude *= 0.5
|
|
631
|
-
frequency *= 2
|
|
632
|
-
}
|
|
633
|
-
|
|
634
|
-
// Normalize to [0, 1]
|
|
635
|
-
noiseValue = (noiseValue / maxValue + 1) * 0.5
|
|
636
|
-
|
|
637
|
-
// Combine with height factor for rising fade effect
|
|
638
|
-
const flameIntensity = noiseValue * heightFactor * this._intensity
|
|
639
|
-
|
|
640
|
-
if (flameIntensity > 0) {
|
|
641
|
-
const colorIndex = (y * width + x) * 4
|
|
642
|
-
|
|
643
|
-
// Fire color gradient based on intensity
|
|
644
|
-
// High intensity = white/yellow (hottest), low = red (coolest)
|
|
645
|
-
let r: number, g: number, b: number
|
|
646
|
-
|
|
647
|
-
if (flameIntensity > 0.7) {
|
|
648
|
-
// White/yellow hot core
|
|
649
|
-
r = 1.0
|
|
650
|
-
g = 1.0
|
|
651
|
-
b = 0.3 + (flameIntensity - 0.7) * 2.3 // 0.3 to 1.0
|
|
652
|
-
} else if (flameIntensity > 0.4) {
|
|
653
|
-
// Orange
|
|
654
|
-
r = 1.0
|
|
655
|
-
g = 0.5 + (flameIntensity - 0.4) * 1.67 // 0.5 to 1.0
|
|
656
|
-
b = 0.0
|
|
657
|
-
} else {
|
|
658
|
-
// Red fading to dark
|
|
659
|
-
r = 0.3 + flameIntensity * 1.75 // 0.3 to 1.0
|
|
660
|
-
g = flameIntensity * 0.5 // 0.0 to 0.2
|
|
661
|
-
b = 0.0
|
|
662
|
-
}
|
|
663
|
-
|
|
664
|
-
// Blend with existing background
|
|
665
|
-
bg[colorIndex] = Math.max(bg[colorIndex], r * flameIntensity)
|
|
666
|
-
bg[colorIndex + 1] = Math.max(bg[colorIndex + 1], g * flameIntensity)
|
|
667
|
-
bg[colorIndex + 2] = Math.max(bg[colorIndex + 2], b * flameIntensity)
|
|
668
|
-
}
|
|
669
|
-
}
|
|
670
|
-
}
|
|
671
|
-
}
|
|
672
|
-
}
|
|
673
|
-
|
|
674
|
-
/**
|
|
675
|
-
* Applies a CRT rolling bar effect - a horizontal bar that slowly scans down the screen.
|
|
676
|
-
* Simulates the classic CRT monitor rolling bar artifact.
|
|
677
|
-
*/
|
|
678
|
-
export class CRTRollingBarEffect {
|
|
679
|
-
private _speed: number
|
|
680
|
-
private _height: number
|
|
681
|
-
private _intensity: number
|
|
682
|
-
private _fadeDistance: number
|
|
683
|
-
private position: number = 0
|
|
684
|
-
|
|
685
|
-
constructor(speed: number = 0.5, height: number = 0.15, intensity: number = 0.3, fadeDistance: number = 0.3) {
|
|
686
|
-
this._speed = speed
|
|
687
|
-
this._height = Math.max(0.01, Math.min(0.5, height))
|
|
688
|
-
this._intensity = Math.max(0, Math.min(1, intensity))
|
|
689
|
-
this._fadeDistance = Math.max(0, Math.min(1, fadeDistance))
|
|
690
|
-
}
|
|
691
|
-
|
|
692
|
-
public set speed(newSpeed: number) {
|
|
693
|
-
this._speed = newSpeed
|
|
694
|
-
}
|
|
695
|
-
public get speed(): number {
|
|
696
|
-
return this._speed
|
|
697
|
-
}
|
|
698
|
-
|
|
699
|
-
public set height(newHeight: number) {
|
|
700
|
-
this._height = Math.max(0.01, Math.min(0.5, newHeight))
|
|
701
|
-
}
|
|
702
|
-
public get height(): number {
|
|
703
|
-
return this._height
|
|
704
|
-
}
|
|
705
|
-
|
|
706
|
-
public set intensity(newIntensity: number) {
|
|
707
|
-
this._intensity = Math.max(0, Math.min(1, newIntensity))
|
|
708
|
-
}
|
|
709
|
-
public get intensity(): number {
|
|
710
|
-
return this._intensity
|
|
711
|
-
}
|
|
712
|
-
|
|
713
|
-
public set fadeDistance(newFadeDistance: number) {
|
|
714
|
-
this._fadeDistance = Math.max(0, Math.min(1, newFadeDistance))
|
|
715
|
-
}
|
|
716
|
-
public get fadeDistance(): number {
|
|
717
|
-
return this._fadeDistance
|
|
718
|
-
}
|
|
719
|
-
|
|
720
|
-
/**
|
|
721
|
-
* Applies the rolling bar effect to the buffer.
|
|
722
|
-
* Creates a smooth horizontal bar that scans down the screen with a bell-curve gradient.
|
|
723
|
-
* The bar has a bright center that smoothly fades to the edges.
|
|
724
|
-
*/
|
|
725
|
-
public apply(buffer: OptimizedBuffer, deltaTime: number): void {
|
|
726
|
-
const width = buffer.width
|
|
727
|
-
const height = buffer.height
|
|
728
|
-
const fg = buffer.buffers.fg
|
|
729
|
-
const bg = buffer.buffers.bg
|
|
730
|
-
|
|
731
|
-
// Update bar position (convert deltaTime from ms to seconds)
|
|
732
|
-
this.position += (deltaTime / 1000) * this._speed
|
|
733
|
-
// Wrap position to keep it rolling continuously
|
|
734
|
-
const cycleHeight = height + this._height * height * 2
|
|
735
|
-
this.position = this.position % cycleHeight
|
|
736
|
-
|
|
737
|
-
const barPixelHeight = this._height * height
|
|
738
|
-
const fadePixelDistance = this._fadeDistance * barPixelHeight
|
|
739
|
-
const totalEffectHeight = barPixelHeight + fadePixelDistance * 2
|
|
740
|
-
const effectCenter = this.position - totalEffectHeight / 2 + barPixelHeight / 2
|
|
741
|
-
|
|
742
|
-
for (let y = 0; y < height; y++) {
|
|
743
|
-
// Calculate distance from the bar center
|
|
744
|
-
const distFromCenter = Math.abs(y - effectCenter)
|
|
745
|
-
|
|
746
|
-
// Create a smooth bell-curve effect
|
|
747
|
-
// Full intensity at center, smooth falloff using Gaussian-like curve
|
|
748
|
-
let barFactor = 0
|
|
749
|
-
|
|
750
|
-
if (distFromCenter <= totalEffectHeight / 2) {
|
|
751
|
-
// Normalize distance to 0-1 range across the whole effect
|
|
752
|
-
const normalizedDist = distFromCenter / (totalEffectHeight / 2)
|
|
753
|
-
// Cosine falloff: 1 at center, 0 at edge
|
|
754
|
-
// cos(0) = 1, cos(π/2) = 0
|
|
755
|
-
barFactor = Math.cos((normalizedDist * Math.PI) / 2)
|
|
756
|
-
}
|
|
757
|
-
|
|
758
|
-
if (barFactor > 0.001) {
|
|
759
|
-
const rowMultiplier = 1 + this._intensity * barFactor
|
|
760
|
-
|
|
761
|
-
for (let x = 0; x < width; x++) {
|
|
762
|
-
const colorIndex = (y * width + x) * 4
|
|
763
|
-
|
|
764
|
-
// Brighten foreground
|
|
765
|
-
fg[colorIndex] = Math.min(1, fg[colorIndex] * rowMultiplier)
|
|
766
|
-
fg[colorIndex + 1] = Math.min(1, fg[colorIndex + 1] * rowMultiplier)
|
|
767
|
-
fg[colorIndex + 2] = Math.min(1, fg[colorIndex + 2] * rowMultiplier)
|
|
768
|
-
|
|
769
|
-
// Brighten background
|
|
770
|
-
bg[colorIndex] = Math.min(1, bg[colorIndex] * rowMultiplier)
|
|
771
|
-
bg[colorIndex + 1] = Math.min(1, bg[colorIndex + 1] * rowMultiplier)
|
|
772
|
-
bg[colorIndex + 2] = Math.min(1, bg[colorIndex + 2] * rowMultiplier)
|
|
773
|
-
}
|
|
774
|
-
}
|
|
775
|
-
}
|
|
776
|
-
}
|
|
777
|
-
}
|
|
778
|
-
|
|
779
|
-
/**
|
|
780
|
-
* Applies animated rainbow colors to cells with white foreground.
|
|
781
|
-
* Cycles through HSV hue spectrum over time.
|
|
782
|
-
*/
|
|
783
|
-
export class RainbowTextEffect {
|
|
784
|
-
private _speed: number
|
|
785
|
-
private _saturation: number
|
|
786
|
-
private _value: number
|
|
787
|
-
private _repeats: number
|
|
788
|
-
private time: number = 0
|
|
789
|
-
|
|
790
|
-
constructor(speed: number = 0.01, saturation: number = 1.0, value: number = 1.0, repeats: number = 3.0) {
|
|
791
|
-
this._speed = speed
|
|
792
|
-
this._saturation = saturation
|
|
793
|
-
this._value = value
|
|
794
|
-
this._repeats = repeats
|
|
795
|
-
}
|
|
796
|
-
|
|
797
|
-
public set speed(newSpeed: number) {
|
|
798
|
-
this._speed = Math.max(0, newSpeed)
|
|
799
|
-
}
|
|
800
|
-
public get speed(): number {
|
|
801
|
-
return this._speed
|
|
802
|
-
}
|
|
803
|
-
|
|
804
|
-
public set saturation(newSaturation: number) {
|
|
805
|
-
this._saturation = Math.max(0, Math.min(1, newSaturation))
|
|
806
|
-
}
|
|
807
|
-
public get saturation(): number {
|
|
808
|
-
return this._saturation
|
|
809
|
-
}
|
|
810
|
-
|
|
811
|
-
public set value(newValue: number) {
|
|
812
|
-
this._value = Math.max(0, Math.min(1, newValue))
|
|
813
|
-
}
|
|
814
|
-
public get value(): number {
|
|
815
|
-
return this._value
|
|
816
|
-
}
|
|
817
|
-
|
|
818
|
-
public set repeats(newRepeats: number) {
|
|
819
|
-
this._repeats = Math.max(0.1, newRepeats)
|
|
820
|
-
}
|
|
821
|
-
public get repeats(): number {
|
|
822
|
-
return this._repeats
|
|
823
|
-
}
|
|
824
|
-
|
|
825
|
-
/**
|
|
826
|
-
* Converts HSV color to RGB
|
|
827
|
-
* @param h - Hue [0, 1]
|
|
828
|
-
* @param s - Saturation [0, 1]
|
|
829
|
-
* @param v - Value [0, 1]
|
|
830
|
-
* @returns [r, g, b] each in [0, 1]
|
|
831
|
-
*/
|
|
832
|
-
private hsvToRgb(h: number, s: number, v: number): [number, number, number] {
|
|
833
|
-
let r = 0,
|
|
834
|
-
g = 0,
|
|
835
|
-
b = 0
|
|
836
|
-
|
|
837
|
-
const i = Math.floor(h * 6)
|
|
838
|
-
const f = h * 6 - i
|
|
839
|
-
const p = v * (1 - s)
|
|
840
|
-
const q = v * (1 - f * s)
|
|
841
|
-
const t = v * (1 - (1 - f) * s)
|
|
842
|
-
|
|
843
|
-
switch (i % 6) {
|
|
844
|
-
case 0:
|
|
845
|
-
r = v
|
|
846
|
-
g = t
|
|
847
|
-
b = p
|
|
848
|
-
break
|
|
849
|
-
case 1:
|
|
850
|
-
r = q
|
|
851
|
-
g = v
|
|
852
|
-
b = p
|
|
853
|
-
break
|
|
854
|
-
case 2:
|
|
855
|
-
r = p
|
|
856
|
-
g = v
|
|
857
|
-
b = t
|
|
858
|
-
break
|
|
859
|
-
case 3:
|
|
860
|
-
r = p
|
|
861
|
-
g = q
|
|
862
|
-
b = v
|
|
863
|
-
break
|
|
864
|
-
case 4:
|
|
865
|
-
r = t
|
|
866
|
-
g = p
|
|
867
|
-
b = v
|
|
868
|
-
break
|
|
869
|
-
case 5:
|
|
870
|
-
r = v
|
|
871
|
-
g = p
|
|
872
|
-
b = q
|
|
873
|
-
break
|
|
874
|
-
}
|
|
875
|
-
|
|
876
|
-
return [r, g, b]
|
|
877
|
-
}
|
|
878
|
-
|
|
879
|
-
/**
|
|
880
|
-
* Applies rainbow colors to cells with white foreground.
|
|
881
|
-
* White is defined as R, G, B all >= 0.9
|
|
882
|
-
*/
|
|
883
|
-
public apply(buffer: OptimizedBuffer, deltaTime: number): void {
|
|
884
|
-
const width = buffer.width
|
|
885
|
-
const height = buffer.height
|
|
886
|
-
const fg = buffer.buffers.fg
|
|
887
|
-
|
|
888
|
-
// Update time for animation
|
|
889
|
-
this.time += deltaTime * this._speed
|
|
890
|
-
|
|
891
|
-
const saturation = this._saturation
|
|
892
|
-
const value = this._value
|
|
893
|
-
const repeats = this._repeats
|
|
894
|
-
|
|
895
|
-
// 25 degree angle for diagonal rainbow
|
|
896
|
-
const angleRad = (25 * Math.PI) / 180
|
|
897
|
-
const cosAngle = Math.cos(angleRad)
|
|
898
|
-
const sinAngle = Math.sin(angleRad)
|
|
899
|
-
|
|
900
|
-
// Define white threshold
|
|
901
|
-
const whiteThreshold = 0.9
|
|
902
|
-
|
|
903
|
-
for (let y = 0; y < height; y++) {
|
|
904
|
-
for (let x = 0; x < width; x++) {
|
|
905
|
-
const colorIndex = (y * width + x) * 4
|
|
906
|
-
|
|
907
|
-
const r = fg[colorIndex]
|
|
908
|
-
const g = fg[colorIndex + 1]
|
|
909
|
-
const b = fg[colorIndex + 2]
|
|
910
|
-
|
|
911
|
-
// Check if foreground is white-ish (all components >= threshold)
|
|
912
|
-
if (r >= whiteThreshold && g >= whiteThreshold && b >= whiteThreshold) {
|
|
913
|
-
// Calculate hue based on position projected at 25-degree angle
|
|
914
|
-
// Creates a diagonal moving rainbow wave effect
|
|
915
|
-
const projection = x * cosAngle + y * sinAngle
|
|
916
|
-
const maxProjection = width * cosAngle + height * sinAngle
|
|
917
|
-
const hue = ((projection / maxProjection) * repeats + this.time * 0.1) % 1.0
|
|
918
|
-
|
|
919
|
-
// Convert HSV to RGB
|
|
920
|
-
const [newR, newG, newB] = this.hsvToRgb(hue, saturation, value)
|
|
921
|
-
|
|
922
|
-
fg[colorIndex] = newR
|
|
923
|
-
fg[colorIndex + 1] = newG
|
|
924
|
-
fg[colorIndex + 2] = newB
|
|
925
|
-
// Keep alpha unchanged
|
|
926
|
-
}
|
|
927
|
-
}
|
|
928
|
-
}
|
|
929
|
-
}
|
|
930
|
-
}
|