redscript-mc 2.6.2 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/ci.yml +11 -0
- package/CHANGELOG.md +18 -9
- package/README-benchmarks.md +48 -0
- package/README-vscode-test.md +251 -0
- package/RELEASE_NOTES.md +74 -0
- package/ROADMAP.md +131 -167
- package/benchmarks/_shared.ts +468 -0
- package/benchmarks/baseline.json +2816 -0
- package/benchmarks/baseline.md +13 -0
- package/benchmarks/compiler-perf.report.json +207 -0
- package/benchmarks/compiler-perf.ts +76 -0
- package/benchmarks/results.md +13 -0
- package/benchmarks/stdlib-complexity.report.json +2606 -0
- package/benchmarks/stdlib-complexity.ts +54 -0
- package/benchmarks/stdlib-size.md +57 -0
- package/benchmarks/stdlib-size.ts +91 -0
- package/coverage-report.md +177 -0
- package/dist/src/__tests__/budget.test.js +4 -0
- package/dist/src/__tests__/cache/cache-behavior.test.d.ts +10 -0
- package/dist/src/__tests__/cache/cache-behavior.test.js +425 -0
- package/dist/src/__tests__/cache-extra.test.d.ts +5 -0
- package/dist/src/__tests__/cache-extra.test.js +211 -0
- package/dist/src/__tests__/cli-init.test.d.ts +1 -0
- package/dist/src/__tests__/cli-init.test.js +97 -0
- package/dist/src/__tests__/cli-publish.test.d.ts +9 -0
- package/dist/src/__tests__/cli-publish.test.js +189 -0
- package/dist/src/__tests__/cli.test.js +76 -0
- package/dist/src/__tests__/compile-preprocess.test.d.ts +11 -0
- package/dist/src/__tests__/compile-preprocess.test.js +328 -0
- package/dist/src/__tests__/compiler/break-stmt.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/break-stmt.test.js +58 -0
- package/dist/src/__tests__/compiler/const-decl.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/const-decl.test.js +123 -0
- package/dist/src/__tests__/compiler/continue-stmt.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/continue-stmt.test.js +67 -0
- package/dist/src/__tests__/compiler/coroutine-extended.test.d.ts +17 -0
- package/dist/src/__tests__/compiler/coroutine-extended.test.js +565 -0
- package/dist/src/__tests__/compiler/deprecated.test.d.ts +4 -0
- package/dist/src/__tests__/compiler/deprecated.test.js +285 -0
- package/dist/src/__tests__/compiler/do-while.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/do-while.test.js +120 -0
- package/dist/src/__tests__/compiler/enum-payload.test.d.ts +9 -0
- package/dist/src/__tests__/compiler/enum-payload.test.js +272 -0
- package/dist/src/__tests__/compiler/interface.test.d.ts +10 -0
- package/dist/src/__tests__/compiler/interface.test.js +258 -0
- package/dist/src/__tests__/compiler/labeled-loops.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/labeled-loops.test.js +263 -0
- package/dist/src/__tests__/compiler/match-string.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/match-string.test.js +43 -0
- package/dist/src/__tests__/compiler/memoize.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/memoize.test.js +113 -0
- package/dist/src/__tests__/compiler/method-chain.test.d.ts +5 -0
- package/dist/src/__tests__/compiler/method-chain.test.js +115 -0
- package/dist/src/__tests__/compiler/module-import.test.d.ts +12 -0
- package/dist/src/__tests__/compiler/module-import.test.js +261 -0
- package/dist/src/__tests__/compiler/option-extensions.test.d.ts +6 -0
- package/dist/src/__tests__/compiler/option-extensions.test.js +191 -0
- package/dist/src/__tests__/compiler/profile-decorator.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/profile-decorator.test.js +69 -0
- package/dist/src/__tests__/compiler/string-advanced.test.d.ts +7 -0
- package/dist/src/__tests__/compiler/string-advanced.test.js +281 -0
- package/dist/src/__tests__/compiler/struct-extends.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/struct-extends.test.js +95 -0
- package/dist/src/__tests__/compiler/throttle-retry.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/throttle-retry.test.js +166 -0
- package/dist/src/__tests__/compiler/tuple-type.test.d.ts +10 -0
- package/dist/src/__tests__/compiler/tuple-type.test.js +229 -0
- package/dist/src/__tests__/compiler/watch-decorator.test.d.ts +1 -0
- package/dist/src/__tests__/compiler/watch-decorator.test.js +65 -0
- package/dist/src/__tests__/config/project-config.test.d.ts +1 -0
- package/dist/src/__tests__/config/project-config.test.js +199 -0
- package/dist/src/__tests__/config-decorator.test.d.ts +8 -0
- package/dist/src/__tests__/config-decorator.test.js +142 -0
- package/dist/src/__tests__/diagnostics-extra.test.d.ts +6 -0
- package/dist/src/__tests__/diagnostics-extra.test.js +132 -0
- package/dist/src/__tests__/emit/compile-branches.test.d.ts +1 -0
- package/dist/src/__tests__/emit/compile-branches.test.js +123 -0
- package/dist/src/__tests__/emit/compile-coverage.test.d.ts +25 -0
- package/dist/src/__tests__/emit/compile-coverage.test.js +617 -0
- package/dist/src/__tests__/emit/compile-extra-branches.test.d.ts +12 -0
- package/dist/src/__tests__/emit/compile-extra-branches.test.js +225 -0
- package/dist/src/__tests__/emit/compile-mocked-branches.test.d.ts +0 -0
- package/dist/src/__tests__/emit/compile-mocked-branches.test.js +238 -0
- package/dist/src/__tests__/emit/execute-chain.test.d.ts +10 -0
- package/dist/src/__tests__/emit/execute-chain.test.js +94 -0
- package/dist/src/__tests__/emit/index.test.js +2 -1
- package/dist/src/__tests__/emit/modules-branches.test.d.ts +1 -0
- package/dist/src/__tests__/emit/modules-branches.test.js +88 -0
- package/dist/src/__tests__/emit/modules-coverage.test.d.ts +15 -0
- package/dist/src/__tests__/emit/modules-coverage.test.js +221 -0
- package/dist/src/__tests__/emit/modules-errors.test.d.ts +12 -0
- package/dist/src/__tests__/emit/modules-errors.test.js +169 -0
- package/dist/src/__tests__/emit/modules-rewrite.test.d.ts +17 -0
- package/dist/src/__tests__/emit/modules-rewrite.test.js +204 -0
- package/dist/src/__tests__/emit/source-map.test.d.ts +1 -0
- package/dist/src/__tests__/emit/source-map.test.js +167 -0
- package/dist/src/__tests__/enum.test.js +9 -4
- package/dist/src/__tests__/error-recovery.test.d.ts +7 -0
- package/dist/src/__tests__/error-recovery.test.js +217 -0
- package/dist/src/__tests__/events-types-extra.test.d.ts +10 -0
- package/dist/src/__tests__/events-types-extra.test.js +91 -0
- package/dist/src/__tests__/events-types.test.d.ts +4 -0
- package/dist/src/__tests__/events-types.test.js +56 -0
- package/dist/src/__tests__/formatter.test.js +13 -5
- package/dist/src/__tests__/hir/lower-extra.test.d.ts +9 -0
- package/dist/src/__tests__/hir/lower-extra.test.js +140 -0
- package/dist/src/__tests__/hir/monomorphize-extra.test.d.ts +15 -0
- package/dist/src/__tests__/hir/monomorphize-extra.test.js +200 -0
- package/dist/src/__tests__/hir/monomorphize-extra2.test.d.ts +16 -0
- package/dist/src/__tests__/hir/monomorphize-extra2.test.js +316 -0
- package/dist/src/__tests__/incremental.test.js +10 -2
- package/dist/src/__tests__/index-extra.test.d.ts +10 -0
- package/dist/src/__tests__/index-extra.test.js +71 -0
- package/dist/src/__tests__/lexer.test.js +2 -2
- package/dist/src/__tests__/lint/rules.test.d.ts +5 -0
- package/dist/src/__tests__/lint/rules.test.js +208 -0
- package/dist/src/__tests__/lir/lower.test.js +29 -0
- package/dist/src/__tests__/lir/verify.test.js +30 -0
- package/dist/src/__tests__/lsp/completion.test.d.ts +7 -0
- package/dist/src/__tests__/lsp/completion.test.js +583 -0
- package/dist/src/__tests__/lsp/definition.test.d.ts +7 -0
- package/dist/src/__tests__/lsp/definition.test.js +454 -0
- package/dist/src/__tests__/lsp/diagnostics.test.d.ts +10 -0
- package/dist/src/__tests__/lsp/diagnostics.test.js +98 -0
- package/dist/src/__tests__/lsp/hover-docs.test.d.ts +10 -0
- package/dist/src/__tests__/lsp/hover-docs.test.js +210 -0
- package/dist/src/__tests__/lsp.test.js +4 -1
- package/dist/src/__tests__/mc-integration/item-entity-events.test.js +4 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-2.test.js +4 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-3.test.d.ts +13 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-3.test.js +1227 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-4.test.d.ts +13 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-4.test.js +1509 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-5.test.d.ts +14 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-5.test.js +1374 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-6.test.d.ts +10 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-6.test.js +759 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-7.test.d.ts +13 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage-7.test.js +855 -0
- package/dist/src/__tests__/mc-integration/stdlib-coverage.test.js +4 -0
- package/dist/src/__tests__/mc-integration/syntax-coverage.test.js +4 -0
- package/dist/src/__tests__/mc-validator-coverage.test.d.ts +13 -0
- package/dist/src/__tests__/mc-validator-coverage.test.js +296 -0
- package/dist/src/__tests__/mc-validator-extra.test.d.ts +13 -0
- package/dist/src/__tests__/mc-validator-extra.test.js +245 -0
- package/dist/src/__tests__/mir/lower-extra.test.d.ts +20 -0
- package/dist/src/__tests__/mir/lower-extra.test.js +361 -0
- package/dist/src/__tests__/mir/lower-extra2.test.d.ts +17 -0
- package/dist/src/__tests__/mir/lower-extra2.test.js +317 -0
- package/dist/src/__tests__/mir/lower-extra3.test.d.ts +19 -0
- package/dist/src/__tests__/mir/lower-extra3.test.js +249 -0
- package/dist/src/__tests__/mir/lower-extra4.test.d.ts +23 -0
- package/dist/src/__tests__/mir/lower-extra4.test.js +606 -0
- package/dist/src/__tests__/mir/lower-extra5.test.d.ts +25 -0
- package/dist/src/__tests__/mir/lower-extra5.test.js +543 -0
- package/dist/src/__tests__/mir/lower-extra6.test.d.ts +16 -0
- package/dist/src/__tests__/mir/lower-extra6.test.js +471 -0
- package/dist/src/__tests__/mir/lower-extra7.test.d.ts +35 -0
- package/dist/src/__tests__/mir/lower-extra7.test.js +921 -0
- package/dist/src/__tests__/mir/lower-extra8.test.d.ts +19 -0
- package/dist/src/__tests__/mir/lower-extra8.test.js +626 -0
- package/dist/src/__tests__/mir/lower-extra9.test.d.ts +14 -0
- package/dist/src/__tests__/mir/lower-extra9.test.js +717 -0
- package/dist/src/__tests__/optimizer/auto-inline.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/auto-inline.test.js +176 -0
- package/dist/src/__tests__/optimizer/cse.test.d.ts +4 -0
- package/dist/src/__tests__/optimizer/cse.test.js +178 -0
- package/dist/src/__tests__/optimizer/inline_fn.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/inline_fn.test.js +221 -0
- package/dist/src/__tests__/optimizer/licm.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/licm.test.js +244 -0
- package/dist/src/__tests__/optimizer/optimizer-extended.test.d.ts +12 -0
- package/dist/src/__tests__/optimizer/optimizer-extended.test.js +993 -0
- package/dist/src/__tests__/optimizer/strength-reduction.test.d.ts +1 -0
- package/dist/src/__tests__/optimizer/strength-reduction.test.js +86 -0
- package/dist/src/__tests__/optimizer/tco.test.d.ts +14 -0
- package/dist/src/__tests__/optimizer/tco.test.js +203 -0
- package/dist/src/__tests__/parser-coverage.test.d.ts +25 -0
- package/dist/src/__tests__/parser-coverage.test.js +491 -0
- package/dist/src/__tests__/parser-extra.test.d.ts +6 -0
- package/dist/src/__tests__/parser-extra.test.js +451 -0
- package/dist/src/__tests__/parser.test.js +12 -0
- package/dist/src/__tests__/repl-extra.test.d.ts +13 -0
- package/dist/src/__tests__/repl-extra.test.js +174 -0
- package/dist/src/__tests__/repl-server-extra.test.d.ts +10 -0
- package/dist/src/__tests__/repl-server-extra.test.js +161 -0
- package/dist/src/__tests__/repl-server.test.d.ts +6 -0
- package/dist/src/__tests__/repl-server.test.js +146 -0
- package/dist/src/__tests__/runtime-extra.test.d.ts +15 -0
- package/dist/src/__tests__/runtime-extra.test.js +732 -0
- package/dist/src/__tests__/singleton-decorator.test.d.ts +11 -0
- package/dist/src/__tests__/singleton-decorator.test.js +260 -0
- package/dist/src/__tests__/sourcemap.test.js +1 -1
- package/dist/src/__tests__/stdlib/advanced.test.d.ts +5 -0
- package/dist/src/__tests__/stdlib/advanced.test.js +301 -0
- package/dist/src/__tests__/stdlib/bigint.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/bigint.test.js +83 -0
- package/dist/src/__tests__/stdlib/bits.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/bits.test.js +96 -0
- package/dist/src/__tests__/stdlib/bossbar.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/bossbar.test.js +72 -0
- package/dist/src/__tests__/stdlib/color.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/color.test.js +84 -0
- package/dist/src/__tests__/stdlib/combat.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/combat.test.js +64 -0
- package/dist/src/__tests__/stdlib/cooldown.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/cooldown.test.js +64 -0
- package/dist/src/__tests__/stdlib/dialog.test.js +15 -7
- package/dist/src/__tests__/stdlib/ecs.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/ecs.test.js +81 -0
- package/dist/src/__tests__/stdlib/effects.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/effects.test.js +72 -0
- package/dist/src/__tests__/stdlib/events.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/events.test.js +55 -0
- package/dist/src/__tests__/stdlib/expr.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/expr.test.js +77 -0
- package/dist/src/__tests__/stdlib/fft.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/fft.test.js +82 -0
- package/dist/src/__tests__/stdlib/graph.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/graph.test.js +102 -0
- package/dist/src/__tests__/stdlib/interactions.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/interactions.test.js +60 -0
- package/dist/src/__tests__/stdlib/inventory.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/inventory.test.js +68 -0
- package/dist/src/__tests__/stdlib/linalg.test.d.ts +5 -0
- package/dist/src/__tests__/stdlib/linalg.test.js +78 -0
- package/dist/src/__tests__/stdlib/map.test.d.ts +1 -0
- package/dist/src/__tests__/stdlib/map.test.js +84 -0
- package/dist/src/__tests__/stdlib/math.test.js +19 -6
- package/dist/src/__tests__/stdlib/math_hp.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/math_hp.test.js +80 -0
- package/dist/src/__tests__/stdlib/mobs.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/mobs.test.js +61 -0
- package/dist/src/__tests__/stdlib/noise.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/noise.test.js +73 -0
- package/dist/src/__tests__/stdlib/ode.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/ode.test.js +68 -0
- package/dist/src/__tests__/stdlib/parabola.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/parabola.test.js +77 -0
- package/dist/src/__tests__/stdlib/particles.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/particles.test.js +68 -0
- package/dist/src/__tests__/stdlib/physics.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/physics.test.js +76 -0
- package/dist/src/__tests__/stdlib/player.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/player.test.js +64 -0
- package/dist/src/__tests__/stdlib/quaternion.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/quaternion.test.js +73 -0
- package/dist/src/__tests__/stdlib/queue.test.d.ts +1 -0
- package/dist/src/__tests__/stdlib/queue.test.js +97 -0
- package/dist/src/__tests__/stdlib/random.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/random.test.js +76 -0
- package/dist/src/__tests__/stdlib/result.test.d.ts +12 -0
- package/dist/src/__tests__/stdlib/result.test.js +329 -0
- package/dist/src/__tests__/stdlib/scheduler.test.js +19 -8
- package/dist/src/__tests__/stdlib/set_int.test.d.ts +1 -0
- package/dist/src/__tests__/stdlib/set_int.test.js +88 -0
- package/dist/src/__tests__/stdlib/sets.test.d.ts +6 -0
- package/dist/src/__tests__/stdlib/sets.test.js +60 -0
- package/dist/src/__tests__/stdlib/signal.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/signal.test.js +84 -0
- package/dist/src/__tests__/stdlib/spawn.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/spawn.test.js +68 -0
- package/dist/src/__tests__/stdlib/string.test.d.ts +12 -0
- package/dist/src/__tests__/stdlib/string.test.js +231 -0
- package/dist/src/__tests__/stdlib/strings.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/strings.test.js +83 -0
- package/dist/src/__tests__/stdlib/tags.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/tags.test.js +57 -0
- package/dist/src/__tests__/stdlib/teams.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/teams.test.js +72 -0
- package/dist/src/__tests__/stdlib/timer.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/timer.test.js +79 -0
- package/dist/src/__tests__/stdlib/vec.test.d.ts +5 -0
- package/dist/src/__tests__/stdlib/vec.test.js +94 -0
- package/dist/src/__tests__/stdlib/world.test.d.ts +4 -0
- package/dist/src/__tests__/stdlib/world.test.js +72 -0
- package/dist/src/__tests__/struct-display.test.d.ts +1 -0
- package/dist/src/__tests__/struct-display.test.js +64 -0
- package/dist/src/__tests__/test-framework/runner.test.d.ts +10 -0
- package/dist/src/__tests__/test-framework/runner.test.js +193 -0
- package/dist/src/__tests__/tuner/adapters.test.d.ts +14 -0
- package/dist/src/__tests__/tuner/adapters.test.js +194 -0
- package/dist/src/__tests__/tuner/simulator-extra.test.d.ts +4 -0
- package/dist/src/__tests__/tuner/simulator-extra.test.js +193 -0
- package/dist/src/__tests__/typechecker-coverage.test.d.ts +30 -0
- package/dist/src/__tests__/typechecker-coverage.test.js +627 -0
- package/dist/src/__tests__/typechecker.test.js +3 -3
- package/dist/src/__tests__/watch-decorator.test.d.ts +1 -0
- package/dist/src/__tests__/watch-decorator.test.js +54 -0
- package/dist/src/ast/types.d.ts +102 -3
- package/dist/src/cache/incremental.d.ts +13 -14
- package/dist/src/cache/incremental.js +106 -89
- package/dist/src/cache/index.d.ts +8 -2
- package/dist/src/cache/index.js +18 -6
- package/dist/src/cli.d.ts +1 -0
- package/dist/src/cli.js +466 -17
- package/dist/src/config/project-config.d.ts +29 -0
- package/dist/src/config/project-config.js +180 -0
- package/dist/src/diagnostics/index.d.ts +9 -0
- package/dist/src/diagnostics/index.js +18 -1
- package/dist/src/emit/compile.d.ts +10 -0
- package/dist/src/emit/compile.js +395 -50
- package/dist/src/emit/index.d.ts +40 -0
- package/dist/src/emit/index.js +307 -14
- package/dist/src/emit/modules.js +21 -3
- package/dist/src/emit/sourcemap.d.ts +23 -27
- package/dist/src/emit/sourcemap.js +52 -30
- package/dist/src/formatter/index.js +33 -8
- package/dist/src/hir/deprecated.d.ts +13 -0
- package/dist/src/hir/deprecated.js +218 -0
- package/dist/src/hir/lower.js +114 -8
- package/dist/src/hir/monomorphize.js +22 -2
- package/dist/src/hir/types.d.ts +65 -1
- package/dist/src/index.d.ts +6 -0
- package/dist/src/index.js +18 -3
- package/dist/src/lexer/index.d.ts +2 -1
- package/dist/src/lexer/index.js +39 -3
- package/dist/src/lint/index.d.ts +45 -0
- package/dist/src/lint/index.js +930 -0
- package/dist/src/lir/lower.js +29 -2
- package/dist/src/lir/types.d.ts +2 -0
- package/dist/src/lsp/server.js +92 -5
- package/dist/src/mir/lower.js +775 -34
- package/dist/src/mir/macro.js +36 -2
- package/dist/src/mir/types.d.ts +12 -0
- package/dist/src/mir/verify.js +9 -0
- package/dist/src/optimizer/auto-inline.d.ts +2 -0
- package/dist/src/optimizer/auto-inline.js +67 -0
- package/dist/src/optimizer/cse.d.ts +20 -0
- package/dist/src/optimizer/cse.js +234 -0
- package/dist/src/optimizer/inline.d.ts +26 -0
- package/dist/src/optimizer/inline.js +286 -0
- package/dist/src/optimizer/interprocedural.js +4 -0
- package/dist/src/optimizer/licm.d.ts +32 -0
- package/dist/src/optimizer/licm.js +371 -0
- package/dist/src/optimizer/pipeline.js +12 -2
- package/dist/src/optimizer/strength_reduction.d.ts +15 -0
- package/dist/src/optimizer/strength_reduction.js +90 -0
- package/dist/src/optimizer/tco.d.ts +53 -0
- package/dist/src/optimizer/tco.js +238 -0
- package/dist/src/parser/index.d.ts +32 -0
- package/dist/src/parser/index.js +421 -59
- package/dist/src/repl-server.d.ts +13 -0
- package/dist/src/repl-server.js +127 -0
- package/dist/src/structs/expand.d.ts +15 -0
- package/dist/src/structs/expand.js +46 -0
- package/dist/src/testing/runner.d.ts +40 -0
- package/dist/src/testing/runner.js +237 -0
- package/dist/src/typechecker/index.d.ts +3 -0
- package/dist/src/typechecker/index.js +254 -9
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/doc-drafts/redscript-docs/docs/en/stdlib/graph.md +104 -0
- package/doc-drafts/redscript-docs/docs/en/stdlib/parabola.md +113 -0
- package/doc-drafts/redscript-docs/docs/en/stdlib/pathfind.md +104 -0
- package/doc-drafts/redscript-docs/docs/en/stdlib/physics.md +134 -0
- package/doc-drafts/redscript-docs/docs/en/stdlib/quaternion.md +135 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/graph.md +104 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/parabola.md +113 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/pathfind.md +104 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/physics.md +134 -0
- package/doc-drafts/redscript-docs/docs/zh/stdlib/quaternion.md +135 -0
- package/docs/stdlib/result.md +156 -0
- package/docs/stdlib/result.zh.md +156 -0
- package/editors/vscode/fixtures/test.mcrs +7 -0
- package/editors/vscode/out/extension.js +2095 -225
- package/editors/vscode/out/lsp-server.js +519 -51
- package/editors/vscode/package-lock.json +9 -4
- package/editors/vscode/package.json +1 -1
- package/examples/display-demo.mcrs +64 -0
- package/examples/game/racing.mcrs +301 -0
- package/examples/game/tower_defense.mcrs +311 -0
- package/examples/math/physics_sim.mcrs +322 -0
- package/examples/rpg/boss_fight.mcrs +313 -0
- package/examples/rpg/health_system.mcrs +237 -0
- package/examples/rpg/inventory.mcrs +265 -0
- package/examples/util/debug_hud.mcrs +279 -0
- package/jest.config.js +10 -0
- package/package.json +12 -3
- package/playground/index.html +823 -0
- package/scripts/gen-docs.ts +533 -0
- package/scripts/update-redscript-docs-stdlib.sh +770 -0
- package/src/__tests__/budget.test.ts +5 -0
- package/src/__tests__/cache/cache-behavior.test.ts +480 -0
- package/src/__tests__/cache-extra.test.ts +199 -0
- package/src/__tests__/cli-docs.test.ts +77 -0
- package/src/__tests__/cli-init.test.ts +91 -0
- package/src/__tests__/cli-publish.test.ts +190 -0
- package/src/__tests__/cli.test.ts +117 -1
- package/src/__tests__/compile-preprocess.test.ts +366 -0
- package/src/__tests__/compiler/break-stmt.test.ts +66 -0
- package/src/__tests__/compiler/const-decl.test.ts +141 -0
- package/src/__tests__/compiler/continue-stmt.test.ts +81 -0
- package/src/__tests__/compiler/coroutine-extended.test.ts +723 -0
- package/src/__tests__/compiler/deprecated.test.ts +305 -0
- package/src/__tests__/compiler/do-while.test.ts +130 -0
- package/src/__tests__/compiler/enum-payload.test.ts +299 -0
- package/src/__tests__/compiler/interface.test.ts +287 -0
- package/src/__tests__/compiler/labeled-loops.test.ts +279 -0
- package/src/__tests__/compiler/match-string.test.ts +45 -0
- package/src/__tests__/compiler/memoize.test.ts +126 -0
- package/src/__tests__/compiler/method-chain.test.ts +121 -0
- package/src/__tests__/compiler/module-import.test.ts +240 -0
- package/src/__tests__/compiler/option-extensions.test.ts +207 -0
- package/src/__tests__/compiler/profile-decorator.test.ts +79 -0
- package/src/__tests__/compiler/string-advanced.test.ts +310 -0
- package/src/__tests__/compiler/struct-extends.test.ts +109 -0
- package/src/__tests__/compiler/throttle-retry.test.ts +191 -0
- package/src/__tests__/compiler/tuple-type.test.ts +263 -0
- package/src/__tests__/compiler/watch-decorator.test.ts +72 -0
- package/src/__tests__/config/project-config.test.ts +181 -0
- package/src/__tests__/config-decorator.test.ts +157 -0
- package/src/__tests__/diagnostics-extra.test.ts +155 -0
- package/src/__tests__/emit/compile-branches.test.ts +135 -0
- package/src/__tests__/emit/compile-coverage.test.ts +696 -0
- package/src/__tests__/emit/compile-extra-branches.test.ts +228 -0
- package/src/__tests__/emit/compile-mocked-branches.test.ts +249 -0
- package/src/__tests__/emit/compile.test.ts +6 -1
- package/src/__tests__/emit/execute-chain.test.ts +114 -0
- package/src/__tests__/emit/index.test.ts +2 -1
- package/src/__tests__/emit/modules-branches.test.ts +90 -0
- package/src/__tests__/emit/modules-coverage.test.ts +241 -0
- package/src/__tests__/emit/modules-errors.test.ts +192 -0
- package/src/__tests__/emit/modules-rewrite.test.ts +232 -0
- package/src/__tests__/emit/source-map.test.ts +152 -0
- package/src/__tests__/enum.test.ts +9 -4
- package/src/__tests__/error-recovery.test.ts +226 -0
- package/src/__tests__/events-types-extra.test.ts +110 -0
- package/src/__tests__/events-types.test.ts +66 -0
- package/src/__tests__/formatter.test.ts +15 -5
- package/src/__tests__/generics.test.ts +16 -9
- package/src/__tests__/hir/lower-extra.test.ts +151 -0
- package/src/__tests__/hir/monomorphize-coverage.test.ts +432 -0
- package/src/__tests__/hir/monomorphize-extra.test.ts +220 -0
- package/src/__tests__/hir/monomorphize-extra2.test.ts +350 -0
- package/src/__tests__/impl.test.ts +12 -8
- package/src/__tests__/incremental.test.ts +10 -2
- package/src/__tests__/index-extra.test.ts +79 -0
- package/src/__tests__/lexer.test.ts +2 -2
- package/src/__tests__/lint/hir-coverage.test.ts +1716 -0
- package/src/__tests__/lint/rules-coverage.test.ts +598 -0
- package/src/__tests__/lint/rules.test.ts +230 -0
- package/src/__tests__/lir/lower.test.ts +33 -0
- package/src/__tests__/lir/verify.test.ts +33 -0
- package/src/__tests__/lsp/completion.test.ts +687 -0
- package/src/__tests__/lsp/definition.test.ts +499 -0
- package/src/__tests__/lsp/diagnostics.test.ts +108 -0
- package/src/__tests__/lsp/hover-docs.test.ts +222 -0
- package/src/__tests__/lsp.test.ts +4 -1
- package/src/__tests__/mc-integration/item-entity-events.test.ts +5 -0
- package/src/__tests__/mc-integration/stdlib-coverage-2.test.ts +5 -0
- package/src/__tests__/mc-integration/stdlib-coverage-3.test.ts +1105 -0
- package/src/__tests__/mc-integration/stdlib-coverage-4.test.ts +1366 -0
- package/src/__tests__/mc-integration/stdlib-coverage-5.test.ts +1245 -0
- package/src/__tests__/mc-integration/stdlib-coverage-6.test.ts +755 -0
- package/src/__tests__/mc-integration/stdlib-coverage-7.test.ts +771 -0
- package/src/__tests__/mc-integration/stdlib-coverage.test.ts +5 -0
- package/src/__tests__/mc-integration/syntax-coverage.test.ts +5 -0
- package/src/__tests__/mc-validator-coverage.test.ts +325 -0
- package/src/__tests__/mc-validator-extra.test.ts +252 -0
- package/src/__tests__/mir/lower-extra.test.ts +402 -0
- package/src/__tests__/mir/lower-extra2.test.ts +348 -0
- package/src/__tests__/mir/lower-extra3.test.ts +277 -0
- package/src/__tests__/mir/lower-extra4.test.ts +636 -0
- package/src/__tests__/mir/lower-extra5.test.ts +612 -0
- package/src/__tests__/mir/lower-extra6.test.ts +520 -0
- package/src/__tests__/mir/lower-extra7.test.ts +1045 -0
- package/src/__tests__/mir/lower-extra8.test.ts +704 -0
- package/src/__tests__/mir/lower-extra9.test.ts +821 -0
- package/src/__tests__/optimizer/auto-inline.test.ts +206 -0
- package/src/__tests__/optimizer/cse.test.ts +195 -0
- package/src/__tests__/optimizer/inline_fn.test.ts +263 -0
- package/src/__tests__/optimizer/licm.test.ts +358 -0
- package/src/__tests__/optimizer/nbt-coalesce.test.ts +147 -0
- package/src/__tests__/optimizer/optimizer-extended.test.ts +1081 -0
- package/src/__tests__/optimizer/scoreboard-batch.test.ts +141 -0
- package/src/__tests__/optimizer/strength-reduction.test.ts +111 -0
- package/src/__tests__/optimizer/tco-coverage.test.ts +309 -0
- package/src/__tests__/optimizer/tco.test.ts +238 -0
- package/src/__tests__/option.test.ts +14 -7
- package/src/__tests__/parser-coverage.test.ts +576 -0
- package/src/__tests__/parser-extra.test.ts +531 -0
- package/src/__tests__/parser.test.ts +14 -0
- package/src/__tests__/repl-extra.test.ts +195 -0
- package/src/__tests__/repl-server-extra.test.ts +150 -0
- package/src/__tests__/repl-server.test.ts +122 -0
- package/src/__tests__/runtime-extra.test.ts +862 -0
- package/src/__tests__/singleton-decorator.test.ts +285 -0
- package/src/__tests__/sourcemap.test.ts +1 -1
- package/src/__tests__/stdlib/advanced.test.ts +312 -0
- package/src/__tests__/stdlib/bigint.test.ts +57 -0
- package/src/__tests__/stdlib/bits.test.ts +75 -0
- package/src/__tests__/stdlib/bossbar.test.ts +45 -0
- package/src/__tests__/stdlib/color.test.ts +60 -0
- package/src/__tests__/stdlib/combat.test.ts +35 -0
- package/src/__tests__/stdlib/cooldown.test.ts +35 -0
- package/src/__tests__/stdlib/dialog.test.ts +14 -6
- package/src/__tests__/stdlib/ecs.test.ts +54 -0
- package/src/__tests__/stdlib/effects.test.ts +45 -0
- package/src/__tests__/stdlib/events.test.ts +23 -0
- package/src/__tests__/stdlib/expr.test.ts +48 -0
- package/src/__tests__/stdlib/fft.test.ts +54 -0
- package/src/__tests__/stdlib/graph.test.ts +77 -0
- package/src/__tests__/stdlib/interactions.test.ts +30 -0
- package/src/__tests__/stdlib/inventory.test.ts +40 -0
- package/src/__tests__/stdlib/linalg.test.ts +52 -0
- package/src/__tests__/stdlib/map.test.ts +55 -0
- package/src/__tests__/stdlib/math.test.ts +19 -5
- package/src/__tests__/stdlib/math_hp.test.ts +55 -0
- package/src/__tests__/stdlib/mobs.test.ts +40 -0
- package/src/__tests__/stdlib/noise.test.ts +46 -0
- package/src/__tests__/stdlib/ode.test.ts +40 -0
- package/src/__tests__/stdlib/parabola.test.ts +51 -0
- package/src/__tests__/stdlib/particles.test.ts +40 -0
- package/src/__tests__/stdlib/physics.test.ts +50 -0
- package/src/__tests__/stdlib/player.test.ts +35 -0
- package/src/__tests__/stdlib/quaternion.test.ts +46 -0
- package/src/__tests__/stdlib/queue.test.ts +73 -0
- package/src/__tests__/stdlib/random.test.ts +50 -0
- package/src/__tests__/stdlib/result.test.ts +326 -0
- package/src/__tests__/stdlib/scheduler.test.ts +18 -7
- package/src/__tests__/stdlib/set_int.test.ts +62 -0
- package/src/__tests__/stdlib/sets.test.ts +28 -0
- package/src/__tests__/stdlib/signal.test.ts +60 -0
- package/src/__tests__/stdlib/spawn.test.ts +40 -0
- package/src/__tests__/stdlib/string.test.ts +224 -0
- package/src/__tests__/stdlib/strings.test.ts +55 -0
- package/src/__tests__/stdlib/tags.test.ts +32 -0
- package/src/__tests__/stdlib/teams.test.ts +45 -0
- package/src/__tests__/stdlib/timer.test.ts +53 -0
- package/src/__tests__/stdlib/vec.test.ts +72 -0
- package/src/__tests__/stdlib/world.test.ts +45 -0
- package/src/__tests__/struct-display.test.ts +69 -0
- package/src/__tests__/test-framework/runner.test.ts +208 -0
- package/src/__tests__/tuner/adapters.test.ts +232 -0
- package/src/__tests__/tuner/simulator-extra.test.ts +222 -0
- package/src/__tests__/tuple.test.ts +11 -4
- package/src/__tests__/typechecker-coverage.test.ts +671 -0
- package/src/__tests__/typechecker.test.ts +4 -3
- package/src/__tests__/watch-decorator.test.ts +59 -0
- package/src/ast/types.ts +65 -3
- package/src/cache/incremental.ts +128 -99
- package/src/cache/index.ts +35 -8
- package/src/cli.ts +538 -29
- package/src/config/project-config.ts +176 -0
- package/src/diagnostics/index.ts +22 -0
- package/src/docs.ts +98 -0
- package/src/emit/compile.ts +408 -51
- package/src/emit/index.ts +366 -18
- package/src/emit/modules.ts +19 -3
- package/src/emit/sourcemap.ts +64 -43
- package/src/formatter/index.ts +35 -8
- package/src/hir/deprecated.ts +212 -0
- package/src/hir/lower.ts +128 -8
- package/src/hir/monomorphize.ts +24 -2
- package/src/hir/types.ts +26 -1
- package/src/index.ts +23 -3
- package/src/lexer/index.ts +45 -6
- package/src/lint/index.ts +922 -0
- package/src/lir/lower.ts +30 -2
- package/src/lir/types.ts +4 -0
- package/src/lsp/server.ts +100 -1
- package/src/mir/lower.ts +785 -40
- package/src/mir/macro.ts +30 -2
- package/src/mir/types.ts +13 -0
- package/src/mir/verify.ts +10 -2
- package/src/optimizer/auto-inline.ts +86 -0
- package/src/optimizer/copy_prop.ts +2 -2
- package/src/optimizer/coroutine.ts +3 -3
- package/src/optimizer/cse.ts +205 -0
- package/src/optimizer/dce.ts +2 -2
- package/src/optimizer/inline.ts +335 -0
- package/src/optimizer/interprocedural.ts +5 -1
- package/src/optimizer/licm.ts +454 -0
- package/src/optimizer/nbt-coalesce.ts +109 -0
- package/src/optimizer/pipeline.ts +16 -2
- package/src/optimizer/scoreboard-batch.ts +52 -0
- package/src/optimizer/strength_reduction.ts +95 -0
- package/src/optimizer/tco.ts +267 -0
- package/src/optimizer/unroll.ts +2 -2
- package/src/parser/index.ts +426 -53
- package/src/repl-server.ts +102 -0
- package/src/stdlib/advanced.mcrs +271 -101
- package/src/stdlib/bigint.mcrs +97 -11
- package/src/stdlib/bits.mcrs +75 -12
- package/src/stdlib/bossbar.mcrs +37 -8
- package/src/stdlib/calculus.mcrs +82 -26
- package/src/stdlib/color.mcrs +98 -16
- package/src/stdlib/combat.mcrs +23 -5
- package/src/stdlib/cooldown.mcrs +19 -0
- package/src/stdlib/dialog.mcrs +45 -7
- package/src/stdlib/easing.mcrs +132 -12
- package/src/stdlib/ecs.mcrs +142 -25
- package/src/stdlib/effects.mcrs +88 -12
- package/src/stdlib/events.mcrs +21 -2
- package/src/stdlib/expr.mcrs +18 -3
- package/src/stdlib/fft.mcrs +66 -56
- package/src/stdlib/geometry.mcrs +137 -39
- package/src/stdlib/graph.mcrs +73 -0
- package/src/stdlib/heap.mcrs +49 -8
- package/src/stdlib/i18n/zh.yaml +2891 -0
- package/src/stdlib/interactions.mcrs +43 -20
- package/src/stdlib/inventory.mcrs +14 -3
- package/src/stdlib/linalg.mcrs +185 -30
- package/src/stdlib/list.mcrs +168 -18
- package/src/stdlib/map.mcrs +112 -0
- package/src/stdlib/math.mcrs +68 -18
- package/src/stdlib/math_hp.mcrs +124 -33
- package/src/stdlib/matrix.mcrs +133 -20
- package/src/stdlib/mobs.mcrs +87 -0
- package/src/stdlib/noise.mcrs +65 -21
- package/src/stdlib/ode.mcrs +96 -0
- package/src/stdlib/parabola.mcrs +104 -29
- package/src/stdlib/particles.mcrs +78 -21
- package/src/stdlib/pathfind.mcrs +89 -35
- package/src/stdlib/physics.mcrs +134 -26
- package/src/stdlib/player.mcrs +18 -0
- package/src/stdlib/quaternion.mcrs +213 -9
- package/src/stdlib/queue.mcrs +123 -0
- package/src/stdlib/random.mcrs +63 -18
- package/src/stdlib/result.mcrs +111 -0
- package/src/stdlib/scheduler.mcrs +59 -10
- package/src/stdlib/set_int.mcrs +240 -0
- package/src/stdlib/sets.mcrs +49 -19
- package/src/stdlib/signal.mcrs +151 -79
- package/src/stdlib/sort.mcrs +44 -24
- package/src/stdlib/spawn.mcrs +30 -7
- package/src/stdlib/state.mcrs +40 -5
- package/src/stdlib/strings.mcrs +131 -3
- package/src/stdlib/tags.mcrs +2 -2
- package/src/stdlib/teams.mcrs +22 -10
- package/src/stdlib/timer.mcrs +36 -6
- package/src/stdlib/vec.mcrs +44 -9
- package/src/stdlib/world.mcrs +57 -25
- package/src/structs/expand.ts +64 -0
- package/src/testing/runner.ts +271 -0
- package/src/typechecker/index.ts +273 -9
package/src/stdlib/math_hp.mcrs
CHANGED
|
@@ -24,18 +24,24 @@ module library;
|
|
|
24
24
|
// Do NOT kill or modify entities with this tag.
|
|
25
25
|
let _TRIG_TAG: string = "rs_trig";
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
/// Initialise the Marker entity used by `sin_hp` and `cos_hp`.
|
|
28
|
+
/// Safe to call multiple times (guarded by `execute unless entity`).
|
|
29
|
+
/// Must be called from your `@load` function.
|
|
30
|
+
/// @since 1.3.0
|
|
31
|
+
/// @example
|
|
32
|
+
/// @load fn setup() { init_trig(); }
|
|
30
33
|
@require_on_load(init_trig)
|
|
31
34
|
fn init_trig() {
|
|
32
35
|
raw("execute unless entity @e[tag=rs_trig,limit=1] run summon minecraft:marker ~ 0 ~ {Tags:[\"rs_trig\"]}");
|
|
33
36
|
}
|
|
34
37
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
38
|
+
/// High-precision sine using the MC Marker entity rotation trick (~15 sig. figs).
|
|
39
|
+
/// @since 1.3.0
|
|
40
|
+
/// @param angle Angle in degrees × 10000 (e.g. 450000 = 45°, 900000 = 90°)
|
|
41
|
+
/// @returns sin(angle / 10000 °) × 10000
|
|
42
|
+
/// @example
|
|
43
|
+
/// let s: int = sin_hp(900000); // 10000 (sin 90° = 1.0)
|
|
44
|
+
/// let s2: int = sin_hp(450000); // ≈ 7071 (sin 45° ≈ 0.7071)
|
|
39
45
|
@require_on_load(init_trig)
|
|
40
46
|
fn sin_hp(angle: int): int {
|
|
41
47
|
// Step 1: store angle into scoreboard, then use execute store to set Rotation[0]
|
|
@@ -50,9 +56,13 @@ fn sin_hp(angle: int): int {
|
|
|
50
56
|
return scoreboard_get("$sin_hp_out", "__rs_math_hp");
|
|
51
57
|
}
|
|
52
58
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
59
|
+
/// High-precision cosine using the MC Marker entity rotation trick (~15 sig. figs).
|
|
60
|
+
/// @since 1.3.0
|
|
61
|
+
/// @param angle Angle in degrees × 10000 (e.g. 450000 = 45°)
|
|
62
|
+
/// @returns cos(angle / 10000 °) × 10000
|
|
63
|
+
/// @example
|
|
64
|
+
/// let c: int = cos_hp(0); // 10000 (cos 0° = 1.0)
|
|
65
|
+
/// let c2: int = cos_hp(450000); // ≈ 7071 (cos 45° ≈ 0.7071)
|
|
56
66
|
@require_on_load(init_trig)
|
|
57
67
|
fn cos_hp(angle: int): int {
|
|
58
68
|
scoreboard_set("$cos_hp_in", "__rs_math_hp", angle);
|
|
@@ -80,16 +90,23 @@ fn cos_hp(angle: int): int {
|
|
|
80
90
|
// Uses a SEPARATE entity tagged "rs_div" for SVD operations.
|
|
81
91
|
// init_trig() does NOT create rs_div — call init_div() separately.
|
|
82
92
|
|
|
83
|
-
|
|
84
|
-
|
|
93
|
+
/// Initialise the `block_display` entity used for SVD-based division operations.
|
|
94
|
+
/// Must be called from your `@load` function (separate from `init_trig`).
|
|
95
|
+
/// @since 1.3.0
|
|
96
|
+
/// @example
|
|
97
|
+
/// @load fn setup() { init_trig(); init_div(); }
|
|
85
98
|
@require_on_load(init_div)
|
|
86
99
|
fn init_div() {
|
|
87
100
|
raw("execute unless entity @e[tag=rs_div,limit=1] run summon minecraft:block_display ~ 0 ~ {Tags:[\"rs_div\"]}");
|
|
88
101
|
}
|
|
89
102
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
103
|
+
/// High-precision division a / b using the Display Entity SVD trick (~15 sig. figs).
|
|
104
|
+
/// @since 1.3.0
|
|
105
|
+
/// @param a Dividend × 10000
|
|
106
|
+
/// @param b Divisor × 10000 (must not be zero)
|
|
107
|
+
/// @returns (a / b) × 10000
|
|
108
|
+
/// @example
|
|
109
|
+
/// let r: int = div_hp(10000, 3000); // ≈ 33333 (10000/3000 = 3.333…)
|
|
93
110
|
@require_on_load(init_div)
|
|
94
111
|
fn div_hp(a: int, b: int): int {
|
|
95
112
|
// Set transformation matrix: [a,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,b]
|
|
@@ -106,9 +123,14 @@ fn div_hp(a: int, b: int): int {
|
|
|
106
123
|
return scoreboard_get("$div_result", "__rs_math_hp");
|
|
107
124
|
}
|
|
108
125
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
126
|
+
/// Divide three values by the same divisor simultaneously using the Display Entity SVD trick.
|
|
127
|
+
/// Results are stored in scoreboards `$div3_x`, `$div3_y`, `$div3_z` on `__rs_math_hp`.
|
|
128
|
+
/// @since 1.3.0
|
|
129
|
+
/// @param a First numerator × 10000
|
|
130
|
+
/// @param b Second numerator × 10000
|
|
131
|
+
/// @param c Third numerator × 10000
|
|
132
|
+
/// @param d Common denominator × 10000 (must not be zero)
|
|
133
|
+
/// @returns a / d × 10000 (also writes b/d and c/d to `$div3_y`/`$div3_z`)
|
|
112
134
|
@require_on_load(init_div)
|
|
113
135
|
fn div3_hp(a: int, b: int, c: int, d: int): int {
|
|
114
136
|
scoreboard_set("$div3_a", "__rs_math_hp", a);
|
|
@@ -133,9 +155,12 @@ fn div3_hp(a: int, b: int, c: int, d: int): int {
|
|
|
133
155
|
return scoreboard_get("$div3_x", "__rs_math_hp");
|
|
134
156
|
}
|
|
135
157
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
158
|
+
/// High-precision square root via Newton iteration refined with `div_hp`.
|
|
159
|
+
/// @since 1.3.0
|
|
160
|
+
/// @param x Input value × 10000 (must be ≥ 0)
|
|
161
|
+
/// @returns √(x / 10000) × 10000
|
|
162
|
+
/// @example
|
|
163
|
+
/// let r: int = sqrt_hp(20000); // ≈ 14142 (√2 ≈ 1.4142)
|
|
139
164
|
@require_on_load(init_div)
|
|
140
165
|
fn sqrt_hp(x: int): int {
|
|
141
166
|
// Use trig entity: tp it to (sqrt(x), 0, 0) direction
|
|
@@ -157,9 +182,12 @@ fn sqrt_hp(x: int): int {
|
|
|
157
182
|
return g;
|
|
158
183
|
}
|
|
159
184
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
185
|
+
/// High-precision 3-D vector magnitude √(x² + y² + z²) using `sqrt_hp`.
|
|
186
|
+
/// @since 1.3.0
|
|
187
|
+
/// @param x X component × 10000
|
|
188
|
+
/// @param y Y component × 10000
|
|
189
|
+
/// @param z Z component × 10000
|
|
190
|
+
/// @returns √(x²+y²+z²) / 10000, result × 10000
|
|
163
191
|
@require_on_load(init_trig)
|
|
164
192
|
fn norm3_hp(x: int, y: int, z: int): int {
|
|
165
193
|
// Store x,y,z as float in storage
|
|
@@ -205,6 +233,14 @@ fn __dmul_apply_scale() {
|
|
|
205
233
|
raw("$execute store result storage rs:d __dp0 double $(scale) run data get storage rs:d __dp0 1");
|
|
206
234
|
}
|
|
207
235
|
|
|
236
|
+
/// Multiply a double-precision value `d` by a fixed-point integer `f` (× 10000)
|
|
237
|
+
/// using a macro trick to keep all arithmetic in IEEE 754 double precision.
|
|
238
|
+
/// @since 1.3.0
|
|
239
|
+
/// @param d Double operand (stored in NBT as IEEE 754 double)
|
|
240
|
+
/// @param f Fixed-point multiplier × 10000 (e.g. 15000 = 1.5)
|
|
241
|
+
/// @returns d × (f / 10000) as a double
|
|
242
|
+
/// @example
|
|
243
|
+
/// let r: double = double_mul_fixed(3.14d, 20000); // 6.28 (3.14 × 2.0)
|
|
208
244
|
fn double_mul_fixed(d: double, f: int): double {
|
|
209
245
|
// Step 1: store f into math_hp scoreboard, then compute scale = f × 0.0001
|
|
210
246
|
scoreboard_set("$dmul_f", "__rs_math_hp", f);
|
|
@@ -232,8 +268,9 @@ fn double_mul_fixed(d: double, f: int): double {
|
|
|
232
268
|
// ⚠ Precision: full double (~15 sig figs). No overflow within double range.
|
|
233
269
|
//
|
|
234
270
|
|
|
235
|
-
|
|
236
|
-
|
|
271
|
+
/// Initialise the `area_effect_cloud` marker entity used by `double_add` and `double_sub`.
|
|
272
|
+
/// Called automatically via `@require_on_load`.
|
|
273
|
+
/// @since 1.3.0
|
|
237
274
|
@require_on_load(init_double_add)
|
|
238
275
|
fn init_double_add() {
|
|
239
276
|
raw("execute unless entity b54f1a4f-d7ac-4002-915e-3c2a3bf6f8a4 run summon minecraft:area_effect_cloud ~ ~ ~ {UUID:[I;-1238834609,-698744574,-1879932794,1006600372],NoGravity:1b,Duration:2147483647,Tags:[\"rs_math_hp_marker\"]}");
|
|
@@ -251,8 +288,12 @@ fn __dadd_tp_rel() {
|
|
|
251
288
|
raw("$execute at b54f1a4f-d7ac-4002-915e-3c2a3bf6f8a4 run tp b54f1a4f-d7ac-4002-915e-3c2a3bf6f8a4 ~$(dx) 0.0 0.0");
|
|
252
289
|
}
|
|
253
290
|
|
|
254
|
-
|
|
255
|
-
|
|
291
|
+
/// Add two double-precision values in true IEEE 754 double precision
|
|
292
|
+
/// using the MC entity position trick.
|
|
293
|
+
/// @since 1.3.0
|
|
294
|
+
/// @param a First addend (double, stored in `__dp0`)
|
|
295
|
+
/// @param b Second addend (double, stored in `__dp1`)
|
|
296
|
+
/// @returns a + b as a double
|
|
256
297
|
@require_on_load(init_double_add)
|
|
257
298
|
fn double_add(a: double, b: double): double {
|
|
258
299
|
// __dp0 = a, __dp1 = b (set by caller)
|
|
@@ -280,8 +321,11 @@ fn double_add(a: double, b: double): double {
|
|
|
280
321
|
// Catastrophic cancellation warning applies when a ≈ b (same as all FP subtraction).
|
|
281
322
|
//
|
|
282
323
|
|
|
283
|
-
|
|
284
|
-
|
|
324
|
+
/// Subtract two double-precision values (a − b) using the entity position trick.
|
|
325
|
+
/// @since 1.3.0
|
|
326
|
+
/// @param a Minuend (double)
|
|
327
|
+
/// @param b Subtrahend (double) — negated then added via `double_add`
|
|
328
|
+
/// @returns a − b as a double
|
|
285
329
|
@require_on_load(init_double_add)
|
|
286
330
|
fn double_sub(a: double, b: double): double {
|
|
287
331
|
// Negate __dp1 (b): read as ×10000 long, store back as double × -0.0001
|
|
@@ -318,6 +362,12 @@ fn double_sub(a: double, b: double): double {
|
|
|
318
362
|
// double-precision ln/exp are available.
|
|
319
363
|
//
|
|
320
364
|
|
|
365
|
+
/// Multiply two doubles via scoreboard integer approximation (~4 decimal digits).
|
|
366
|
+
/// ⚠ Overflows for |a| × |b| > ~21474. Use `double_mul_fixed` for higher precision.
|
|
367
|
+
/// @since 1.3.0
|
|
368
|
+
/// @param a First factor (double)
|
|
369
|
+
/// @param b Second factor (double)
|
|
370
|
+
/// @returns a × b (scoreboard approximation, ~4 sig. figs.)
|
|
321
371
|
fn double_mul(a: double, b: double): double {
|
|
322
372
|
// Convert a and b to ×10000 integer scores
|
|
323
373
|
raw("execute store result score $dmul_a __rs_math_hp run data get storage rs:d __dp0 10000");
|
|
@@ -353,9 +403,12 @@ fn __ddiv_set_mat() {
|
|
|
353
403
|
raw("$data modify entity @e[tag=rs_div,limit=1] transformation set value [$(da)f,0f,0f,0f,0f,1f,0f,0f,0f,0f,1f,0f,0f,0f,0f,$(db)f]");
|
|
354
404
|
}
|
|
355
405
|
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
406
|
+
/// Divide two doubles in true IEEE 754 double precision via the Display Entity SVD trick.
|
|
407
|
+
/// ⚠ `b` must not be zero (produces Java `Infinity`, corrupts NBT).
|
|
408
|
+
/// @since 1.3.0
|
|
409
|
+
/// @param a Dividend (double)
|
|
410
|
+
/// @param b Divisor (double, must not be zero)
|
|
411
|
+
/// @returns a / b as a double
|
|
359
412
|
@require_on_load(init_div)
|
|
360
413
|
fn double_div(a: double, b: double): double {
|
|
361
414
|
// Store a and b as float in macro args compound for __ddiv_set_mat
|
|
@@ -383,6 +436,14 @@ fn double_div(a: double, b: double): double {
|
|
|
383
436
|
// Precision: one Newton step squares the error, improving from ~6 digits to ~11 digits.
|
|
384
437
|
// Since exp_fx itself has ~6-digit precision, the effective output is ~8–9 digits.
|
|
385
438
|
//
|
|
439
|
+
|
|
440
|
+
/// High-precision natural logarithm via one Newton refinement of the 5-term atanh series.
|
|
441
|
+
/// Precision ~8–9 significant digits. Valid for x ∈ [100, 1 000 000] (× 10000 scale).
|
|
442
|
+
/// @since 1.3.0
|
|
443
|
+
/// @param x Input value × 10000 (e.g. 10000 = 1.0, 27183 ≈ e)
|
|
444
|
+
/// @returns ln(x / 10000) × 10000
|
|
445
|
+
/// @example
|
|
446
|
+
/// let r: int = ln_hp(27183); // ≈ 10000 (ln(e) ≈ 1.0)
|
|
386
447
|
fn ln_hp(x: int): int {
|
|
387
448
|
// Step 1: initial estimate via 5-term atanh series
|
|
388
449
|
let y: int = ln_5term(x);
|
|
@@ -408,6 +469,12 @@ fn ln_hp(x: int): int {
|
|
|
408
469
|
// max_error ≈ 0.000002 (2× better than 3-term ln())
|
|
409
470
|
// Cost: ~5 more scoreboard operations than ln()
|
|
410
471
|
//
|
|
472
|
+
|
|
473
|
+
/// Natural logarithm using a 5-term atanh series (more accurate than the 3-term `ln()`).
|
|
474
|
+
/// Max error ≈ 0.000002. Valid for x ∈ [100, 1 000 000] (× 10000 scale).
|
|
475
|
+
/// @since 1.3.0
|
|
476
|
+
/// @param x Input value × 10000
|
|
477
|
+
/// @returns ln(x / 10000) × 10000
|
|
411
478
|
fn ln_5term(x: int): int {
|
|
412
479
|
let scale: int = 10000;
|
|
413
480
|
let ln2: int = 6931;
|
|
@@ -448,6 +515,12 @@ fn ln_5term(x: int): int {
|
|
|
448
515
|
// Scale r by 100 more to get √x in ×10000 units: r_scaled = r * 100.
|
|
449
516
|
// Then convert to double with scale 0.0001.
|
|
450
517
|
//
|
|
518
|
+
|
|
519
|
+
/// Square root of a double-precision value, returned as a double.
|
|
520
|
+
/// Internally converts to × 10000 fixed-point, applies `isqrt`, then converts back.
|
|
521
|
+
/// @since 1.3.0
|
|
522
|
+
/// @param x Input double (must be ≥ 0)
|
|
523
|
+
/// @returns √x as a double
|
|
451
524
|
fn double_sqrt(x: double): double {
|
|
452
525
|
// Convert double → ×10000 int
|
|
453
526
|
let x_fixed: int = x as int;
|
|
@@ -475,6 +548,15 @@ fn double_sqrt(x: double): double {
|
|
|
475
548
|
// 5. result_fixed = exp_fx(exponent) — ×10000, ≈ e^(ln(base)*exp_val)
|
|
476
549
|
// 6. Convert result_fixed to double via scoreboard
|
|
477
550
|
//
|
|
551
|
+
|
|
552
|
+
/// Real-valued power: base^exp_val for double base and double exponent.
|
|
553
|
+
/// Uses the identity a^b = e^(b·ln(a)) via fixed-point helpers. Precision ~8–9 digits.
|
|
554
|
+
/// @since 1.3.0
|
|
555
|
+
/// @param base Base value (double, must be > 0)
|
|
556
|
+
/// @param exp_val Exponent (double)
|
|
557
|
+
/// @returns base^exp_val as a double
|
|
558
|
+
/// @example
|
|
559
|
+
/// let r: double = pow_real(2.0d, 0.5d); // ≈ 1.4142 (√2)
|
|
478
560
|
@require_on_load(init_trig)
|
|
479
561
|
fn pow_real(base: double, exp_val: double): double {
|
|
480
562
|
// Read base ×10000 from __dp0 (first double param)
|
|
@@ -501,6 +583,15 @@ fn pow_real(base: double, exp_val: double): double {
|
|
|
501
583
|
// Uses binary exponentiation. Handles negative exponents via double_div.
|
|
502
584
|
// Recursion supported in RedScript.
|
|
503
585
|
//
|
|
586
|
+
|
|
587
|
+
/// Double base raised to an integer exponent using binary exponentiation (O(log n)).
|
|
588
|
+
/// Handles negative exponents via `double_div`.
|
|
589
|
+
/// @since 1.3.0
|
|
590
|
+
/// @param base Base value (double)
|
|
591
|
+
/// @param exp_val Integer exponent (may be negative)
|
|
592
|
+
/// @returns base^exp_val as a double
|
|
593
|
+
/// @example
|
|
594
|
+
/// let r: double = pow_fast(2.0d, 10); // 1024.0
|
|
504
595
|
fn pow_fast(base: double, exp_val: int): double {
|
|
505
596
|
if (exp_val == 0) { return 1.0d; }
|
|
506
597
|
if (exp_val < 0) {
|
package/src/stdlib/matrix.mcrs
CHANGED
|
@@ -15,14 +15,28 @@ module library;
|
|
|
15
15
|
|
|
16
16
|
// ─── 2D transform helpers ────────────────────────────────────────────────────
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
/// X component after 2D rotation of `(x, y)` by `angle_deg` (×10000).
|
|
19
|
+
///
|
|
20
|
+
/// @since 2.0.0
|
|
21
|
+
/// @param x Input X coordinate ×10000
|
|
22
|
+
/// @param y Input Y coordinate ×10000
|
|
23
|
+
/// @param angle_deg Angle in degrees ×10000 (e.g. `450000` = 45°)
|
|
24
|
+
/// @returns `x*cos(angle) - y*sin(angle)` in ×10000
|
|
25
|
+
/// @example
|
|
26
|
+
/// let rx: int = rotate2d_x(10000, 0, 900000)
|
|
20
27
|
fn rotate2d_x(x: int, y: int, angle_deg: int): int {
|
|
21
28
|
let c: int = cos_fixed(angle_deg / 10000);
|
|
22
29
|
let s: int = sin_fixed(angle_deg / 10000);
|
|
23
30
|
return x * c / 1000 - y * s / 1000;
|
|
24
31
|
}
|
|
25
32
|
|
|
33
|
+
/// Y component after 2D rotation of `(x, y)` by `angle_deg` (×10000).
|
|
34
|
+
///
|
|
35
|
+
/// @since 2.0.0
|
|
36
|
+
/// @param x Input X coordinate ×10000
|
|
37
|
+
/// @param y Input Y coordinate ×10000
|
|
38
|
+
/// @param angle_deg Angle in degrees ×10000
|
|
39
|
+
/// @returns `x*sin(angle) + y*cos(angle)` in ×10000
|
|
26
40
|
fn rotate2d_y(x: int, y: int, angle_deg: int): int {
|
|
27
41
|
let c: int = cos_fixed(angle_deg / 10000);
|
|
28
42
|
let s: int = sin_fixed(angle_deg / 10000);
|
|
@@ -31,36 +45,86 @@ fn rotate2d_y(x: int, y: int, angle_deg: int): int {
|
|
|
31
45
|
|
|
32
46
|
// ─── Scale helpers ────────────────────────────────────────────────────────────
|
|
33
47
|
|
|
34
|
-
|
|
48
|
+
/// Scale X coordinate by `sx_fx` (×10000).
|
|
49
|
+
///
|
|
50
|
+
/// @since 2.0.0
|
|
51
|
+
/// @param x Input X value ×10000
|
|
52
|
+
/// @param sx_fx Scale factor ×10000 (e.g. `20000` = 2×)
|
|
53
|
+
/// @returns `x * sx_fx / 10000`
|
|
35
54
|
fn scale_x(x: int, sx_fx: int): int { return x * sx_fx / 10000; }
|
|
55
|
+
|
|
56
|
+
/// Scale Y coordinate by `sy_fx` (×10000).
|
|
57
|
+
///
|
|
58
|
+
/// @since 2.0.0
|
|
59
|
+
/// @param y Input Y value ×10000
|
|
60
|
+
/// @param sy_fx Scale factor ×10000
|
|
61
|
+
/// @returns `y * sy_fx / 10000`
|
|
36
62
|
fn scale_y(y: int, sy_fx: int): int { return y * sy_fx / 10000; }
|
|
63
|
+
|
|
64
|
+
/// Scale Z coordinate by `sz_fx` (×10000).
|
|
65
|
+
///
|
|
66
|
+
/// @since 2.0.0
|
|
67
|
+
/// @param z Input Z value ×10000
|
|
68
|
+
/// @param sz_fx Scale factor ×10000
|
|
69
|
+
/// @returns `z * sz_fx / 10000`
|
|
37
70
|
fn scale_z(z: int, sz_fx: int): int { return z * sz_fx / 10000; }
|
|
38
71
|
|
|
39
|
-
|
|
72
|
+
/// Apply a uniform scale factor to a single component.
|
|
73
|
+
///
|
|
74
|
+
/// @since 2.0.0
|
|
75
|
+
/// @param v Input component value ×10000
|
|
76
|
+
/// @param s_fx Uniform scale factor ×10000
|
|
77
|
+
/// @returns `v * s_fx / 10000`
|
|
40
78
|
fn uniform_scale(v: int, s_fx: int): int { return v * s_fx / 10000; }
|
|
41
79
|
|
|
42
80
|
// ─── 3D rotation (Euler angles, Y-up) ────────────────────────────────────────
|
|
43
81
|
|
|
44
|
-
|
|
82
|
+
/// X component after rotation around the Y axis by `angle_deg` (×10000).
|
|
83
|
+
///
|
|
84
|
+
/// @since 2.0.0
|
|
85
|
+
/// @param x Input X coordinate ×10000
|
|
86
|
+
/// @param z Input Z coordinate ×10000
|
|
87
|
+
/// @param angle_deg Angle in degrees ×10000
|
|
88
|
+
/// @returns `x*cos(angle) + z*sin(angle)` in ×10000
|
|
45
89
|
fn rotate_y_x(x: int, z: int, angle_deg: int): int {
|
|
46
90
|
let c: int = cos_fixed(angle_deg / 10000);
|
|
47
91
|
let s: int = sin_fixed(angle_deg / 10000);
|
|
48
92
|
return x * c / 1000 + z * s / 1000;
|
|
49
93
|
}
|
|
50
94
|
|
|
95
|
+
/// Z component after rotation around the Y axis by `angle_deg` (×10000).
|
|
96
|
+
///
|
|
97
|
+
/// @since 2.0.0
|
|
98
|
+
/// @param x Input X coordinate ×10000
|
|
99
|
+
/// @param z Input Z coordinate ×10000
|
|
100
|
+
/// @param angle_deg Angle in degrees ×10000
|
|
101
|
+
/// @returns `-x*sin(angle) + z*cos(angle)` in ×10000
|
|
51
102
|
fn rotate_y_z(x: int, z: int, angle_deg: int): int {
|
|
52
103
|
let c: int = cos_fixed(angle_deg / 10000);
|
|
53
104
|
let s: int = sin_fixed(angle_deg / 10000);
|
|
54
105
|
return 0 - x * s / 1000 + z * c / 1000;
|
|
55
106
|
}
|
|
56
107
|
|
|
57
|
-
|
|
108
|
+
/// Y component after rotation around the X axis by `angle_deg` (×10000).
|
|
109
|
+
///
|
|
110
|
+
/// @since 2.0.0
|
|
111
|
+
/// @param y Input Y coordinate ×10000
|
|
112
|
+
/// @param z Input Z coordinate ×10000
|
|
113
|
+
/// @param angle_deg Angle in degrees ×10000
|
|
114
|
+
/// @returns `y*cos(angle) - z*sin(angle)` in ×10000
|
|
58
115
|
fn rotate_x_y(y: int, z: int, angle_deg: int): int {
|
|
59
116
|
let c: int = cos_fixed(angle_deg / 10000);
|
|
60
117
|
let s: int = sin_fixed(angle_deg / 10000);
|
|
61
118
|
return y * c / 1000 - z * s / 1000;
|
|
62
119
|
}
|
|
63
120
|
|
|
121
|
+
/// Z component after rotation around the X axis by `angle_deg` (×10000).
|
|
122
|
+
///
|
|
123
|
+
/// @since 2.0.0
|
|
124
|
+
/// @param y Input Y coordinate ×10000
|
|
125
|
+
/// @param z Input Z coordinate ×10000
|
|
126
|
+
/// @param angle_deg Angle in degrees ×10000
|
|
127
|
+
/// @returns `y*sin(angle) + z*cos(angle)` in ×10000
|
|
64
128
|
fn rotate_x_z(y: int, z: int, angle_deg: int): int {
|
|
65
129
|
let c: int = cos_fixed(angle_deg / 10000);
|
|
66
130
|
let s: int = sin_fixed(angle_deg / 10000);
|
|
@@ -77,20 +141,33 @@ fn rotate_x_z(y: int, z: int, angle_deg: int): int {
|
|
|
77
141
|
//
|
|
78
142
|
// These helpers compute quaternion components (×10000)
|
|
79
143
|
|
|
80
|
-
|
|
81
|
-
|
|
144
|
+
/// sin(angle/2) in ×1000 for a Display Entity Y-axis quaternion.
|
|
145
|
+
///
|
|
146
|
+
/// @since 2.0.0
|
|
147
|
+
/// @param angle_deg_fx Full rotation angle in degrees ×10000
|
|
148
|
+
/// @returns `sin(angle/2)` in ×1000
|
|
82
149
|
fn quat_sin_half(angle_deg_fx: int): int {
|
|
83
150
|
return sin_fixed(angle_deg_fx / 20000); // angle/2 in degrees, then /10000 for sin_fixed
|
|
84
151
|
}
|
|
85
152
|
|
|
153
|
+
/// cos(angle/2) in ×1000 for a Display Entity Y-axis quaternion.
|
|
154
|
+
///
|
|
155
|
+
/// @since 2.0.0
|
|
156
|
+
/// @param angle_deg_fx Full rotation angle in degrees ×10000
|
|
157
|
+
/// @returns `cos(angle/2)` in ×1000
|
|
86
158
|
fn quat_cos_half(angle_deg_fx: int): int {
|
|
87
159
|
return cos_fixed(angle_deg_fx / 20000);
|
|
88
160
|
}
|
|
89
161
|
|
|
90
162
|
// ─── Billboard helpers ────────────────────────────────────────────────────────
|
|
91
163
|
|
|
92
|
-
|
|
93
|
-
|
|
164
|
+
/// Compute the Y rotation for a billboard that faces the player.
|
|
165
|
+
///
|
|
166
|
+
/// @since 2.0.0
|
|
167
|
+
/// @param player_yaw_fx Player yaw angle ×10000 (from entity NBT `Rotation[0]`)
|
|
168
|
+
/// @returns Billboard Y rotation ×10000 (opposite of player yaw, in [0, 3600000))
|
|
169
|
+
/// @example
|
|
170
|
+
/// let by: int = billboard_y(player_yaw)
|
|
94
171
|
fn billboard_y(player_yaw_fx: int): int {
|
|
95
172
|
// Billboard should face opposite direction
|
|
96
173
|
return (player_yaw_fx + 1800000) % 3600000;
|
|
@@ -98,7 +175,17 @@ fn billboard_y(player_yaw_fx: int): int {
|
|
|
98
175
|
|
|
99
176
|
// ─── Interpolation for smooth animation ──────────────────────────────────────
|
|
100
177
|
|
|
101
|
-
|
|
178
|
+
/// Interpolate between two angles (×10000) taking the shortest arc.
|
|
179
|
+
///
|
|
180
|
+
/// Normalises the angular difference to [−1800000, 1800000] before interpolating.
|
|
181
|
+
///
|
|
182
|
+
/// @since 2.0.0
|
|
183
|
+
/// @param a_fx Start angle ×10000
|
|
184
|
+
/// @param b_fx End angle ×10000
|
|
185
|
+
/// @param t Interpolation factor ×10000 (0 = a, 10000 = b)
|
|
186
|
+
/// @returns Interpolated angle ×10000
|
|
187
|
+
/// @example
|
|
188
|
+
/// let a: int = lerp_angle(0, 3600000, 5000)
|
|
102
189
|
fn lerp_angle(a_fx: int, b_fx: int, t: int): int {
|
|
103
190
|
let diff: int = b_fx - a_fx;
|
|
104
191
|
// Normalize to [-1800000, 1800000]
|
|
@@ -116,11 +203,17 @@ fn lerp_angle(a_fx: int, b_fx: int, t: int): int {
|
|
|
116
203
|
// a10 a11 a12
|
|
117
204
|
// a20 a21 a22
|
|
118
205
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
206
|
+
/// Compute element `C[row][col]` of the 3×3 matrix product `A × B`.
|
|
207
|
+
///
|
|
208
|
+
/// All matrix values are ×10000 fixed-point. Pass all 18 components of A and B
|
|
209
|
+
/// individually. `row` and `col` are each in {0, 1, 2}.
|
|
210
|
+
///
|
|
211
|
+
/// @since 2.0.0
|
|
212
|
+
/// @param a00 A[0,0] … a22 A[2,2] (9 elements, row-major)
|
|
213
|
+
/// @param b00 B[0,0] … b22 B[2,2] (9 elements, row-major)
|
|
214
|
+
/// @param row Target row index (0–2)
|
|
215
|
+
/// @param col Target column index (0–2)
|
|
216
|
+
/// @returns `C[row][col]` in ×10000
|
|
124
217
|
fn mat3_mul_elem(
|
|
125
218
|
a00: int, a01: int, a02: int,
|
|
126
219
|
a10: int, a11: int, a12: int,
|
|
@@ -150,8 +243,13 @@ fn mat3_mul_elem(
|
|
|
150
243
|
return r0 + r1 + r2;
|
|
151
244
|
}
|
|
152
245
|
|
|
153
|
-
|
|
154
|
-
|
|
246
|
+
/// Compute one component of the 3×3 matrix–vector product `A × v`.
|
|
247
|
+
///
|
|
248
|
+
/// @since 2.0.0
|
|
249
|
+
/// @param a00 A[0,0] … a22 A[2,2] (9 elements, row-major, ×10000)
|
|
250
|
+
/// @param vx Vector X ×10000 @param vy Vector Y ×10000 @param vz Vector Z ×10000
|
|
251
|
+
/// @param comp Output component index (0=x, 1=y, 2=z)
|
|
252
|
+
/// @returns `(A × v)[comp]` in ×10000
|
|
155
253
|
fn mat3_mul_vec3_elem(
|
|
156
254
|
a00: int, a01: int, a02: int,
|
|
157
255
|
a10: int, a11: int, a12: int,
|
|
@@ -174,6 +272,16 @@ fn mat3_mul_vec3_elem(
|
|
|
174
272
|
// mat4_mul_elem: compute one element C[row][col] of a 4×4 matrix product.
|
|
175
273
|
// Row-major, 16+16=32 components. Returns C[row][col] ×10000.
|
|
176
274
|
|
|
275
|
+
/// Compute element `C[row][col]` of the 4×4 matrix product `A × B`.
|
|
276
|
+
///
|
|
277
|
+
/// Row-major layout, all values ×10000. `row` and `col` are each in {0, 1, 2, 3}.
|
|
278
|
+
///
|
|
279
|
+
/// @since 2.0.0
|
|
280
|
+
/// @param a00 A[0,0] … a33 A[3,3] (16 elements, row-major, ×10000)
|
|
281
|
+
/// @param b00 B[0,0] … b33 B[3,3] (16 elements, row-major, ×10000)
|
|
282
|
+
/// @param row Target row index (0–3)
|
|
283
|
+
/// @param col Target column index (0–3)
|
|
284
|
+
/// @returns `C[row][col]` in ×10000
|
|
177
285
|
fn mat4_mul_elem(
|
|
178
286
|
a00: int, a01: int, a02: int, a03: int,
|
|
179
287
|
a10: int, a11: int, a12: int, a13: int,
|
|
@@ -200,8 +308,13 @@ fn mat4_mul_elem(
|
|
|
200
308
|
return ar0 * bc0 / 10000 + ar1 * bc1 / 10000 + ar2 * bc2 / 10000 + ar3 * bc3 / 10000;
|
|
201
309
|
}
|
|
202
310
|
|
|
203
|
-
|
|
204
|
-
|
|
311
|
+
/// Compute one component of the 4×4 matrix–homogeneous-vector product `A × v`.
|
|
312
|
+
///
|
|
313
|
+
/// @since 2.0.0
|
|
314
|
+
/// @param a00 A[0,0] … a33 A[3,3] (16 elements, row-major, ×10000)
|
|
315
|
+
/// @param vx Vector X ×10000 @param vy Y @param vz Z @param vw W
|
|
316
|
+
/// @param comp Output component index (0=x, 1=y, 2=z, 3=w)
|
|
317
|
+
/// @returns `(A × v)[comp]` in ×10000
|
|
205
318
|
fn mat4_mul_vec4_elem(
|
|
206
319
|
a00: int, a01: int, a02: int, a03: int,
|
|
207
320
|
a10: int, a11: int, a12: int, a13: int,
|