xbintsc 0.5.23 → 0.5.32
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/AGENTS.md +11 -2
- package/README.md +47 -16
- package/README.zh-CN.md +21 -2
- package/dist/scripts/support-matrix.d.ts +18 -0
- package/dist/scripts/support-matrix.js +141 -0
- package/dist/scripts/support-matrix.js.map +1 -0
- package/dist/src/ast/common.d.ts +2 -2
- package/dist/src/ast/declarations.d.ts +7 -1
- package/dist/src/ast/expressions.d.ts +5 -0
- package/dist/src/ast/kinds.d.ts +2 -0
- package/dist/src/ast/kinds.js +2 -0
- package/dist/src/ast/kinds.js.map +1 -1
- package/dist/src/binder/binder.d.ts +2 -1
- package/dist/src/binder/binder.js +2 -0
- package/dist/src/binder/binder.js.map +1 -1
- package/dist/src/binder/declarations.d.ts +9 -0
- package/dist/src/binder/declarations.js +64 -0
- package/dist/src/binder/declarations.js.map +1 -1
- package/dist/src/binder/references.js +99 -4
- package/dist/src/binder/references.js.map +1 -1
- package/dist/src/binder/types.d.ts +32 -0
- package/dist/src/binder/types.js.map +1 -1
- package/dist/src/canonical.d.ts +29 -0
- package/dist/src/canonical.js +35 -0
- package/dist/src/canonical.js.map +1 -0
- package/dist/src/checker/assignability.d.ts +13 -0
- package/dist/src/checker/assignability.js +146 -0
- package/dist/src/checker/assignability.js.map +1 -0
- package/dist/src/checker/calls.d.ts +13 -0
- package/dist/src/checker/calls.js +127 -0
- package/dist/src/checker/calls.js.map +1 -0
- package/dist/src/checker/checker.d.ts +26 -0
- package/dist/src/checker/checker.js +31 -0
- package/dist/src/checker/checker.js.map +1 -0
- package/dist/src/checker/declarations.d.ts +9 -0
- package/dist/src/checker/declarations.js +15 -0
- package/dist/src/checker/declarations.js.map +1 -0
- package/dist/src/checker/flow.d.ts +21 -0
- package/dist/src/checker/flow.js +241 -0
- package/dist/src/checker/flow.js.map +1 -0
- package/dist/src/checker/globals.d.ts +9 -0
- package/dist/src/checker/globals.js +29 -0
- package/dist/src/checker/globals.js.map +1 -0
- package/dist/src/checker/source.d.ts +38 -0
- package/dist/src/checker/source.js +48 -0
- package/dist/src/checker/source.js.map +1 -0
- package/dist/src/checker/type-infer.d.ts +18 -0
- package/dist/src/checker/type-infer.js +173 -0
- package/dist/src/checker/type-infer.js.map +1 -0
- package/dist/src/checker/type-model.d.ts +73 -0
- package/dist/src/checker/type-model.js +151 -0
- package/dist/src/checker/type-model.js.map +1 -0
- package/dist/src/checker/type-system.d.ts +58 -0
- package/dist/src/checker/type-system.js +569 -0
- package/dist/src/checker/type-system.js.map +1 -0
- package/dist/src/checker/typecheck-types.d.ts +22 -0
- package/dist/src/checker/typecheck-types.js +109 -0
- package/dist/src/checker/typecheck-types.js.map +1 -0
- package/dist/src/checker/typecheck.d.ts +62 -0
- package/dist/src/checker/typecheck.js +574 -0
- package/dist/src/checker/typecheck.js.map +1 -0
- package/dist/src/checker/undefined.d.ts +14 -0
- package/dist/src/checker/undefined.js +32 -0
- package/dist/src/checker/undefined.js.map +1 -0
- package/dist/src/checker/walk.d.ts +10 -0
- package/dist/src/checker/walk.js +15 -0
- package/dist/src/checker/walk.js.map +1 -0
- package/dist/src/cli/help.d.ts +7 -0
- package/dist/src/cli/help.js +64 -0
- package/dist/src/cli/help.js.map +1 -0
- package/dist/src/cli/hints.js +2 -1
- package/dist/src/cli/hints.js.map +1 -1
- package/dist/src/cli/main.js +12 -48
- package/dist/src/cli/main.js.map +1 -1
- package/dist/src/codegen/generator/calls/access.js +8 -8
- package/dist/src/codegen/generator/calls/access.js.map +1 -1
- package/dist/src/codegen/generator/calls/invocation.js +9 -4
- package/dist/src/codegen/generator/calls/invocation.js.map +1 -1
- package/dist/src/codegen/generator/calls/super.d.ts +9 -1
- package/dist/src/codegen/generator/calls/super.js +56 -5
- package/dist/src/codegen/generator/calls/super.js.map +1 -1
- package/dist/src/codegen/generator/context.d.ts +13 -2
- package/dist/src/codegen/generator/context.js +25 -19
- package/dist/src/codegen/generator/context.js.map +1 -1
- package/dist/src/codegen/generator/debug.js +2 -1
- package/dist/src/codegen/generator/debug.js.map +1 -1
- package/dist/src/codegen/generator/expressions/primary.d.ts +4 -1
- package/dist/src/codegen/generator/expressions/primary.js +68 -8
- package/dist/src/codegen/generator/expressions/primary.js.map +1 -1
- package/dist/src/codegen/generator/generator.js +11 -1
- package/dist/src/codegen/generator/generator.js.map +1 -1
- package/dist/src/codegen/generator/module.d.ts +3 -0
- package/dist/src/codegen/generator/module.js +116 -26
- package/dist/src/codegen/generator/module.js.map +1 -1
- package/dist/src/codegen/generator/state.d.ts +11 -1
- package/dist/src/codegen/generator/state.js.map +1 -1
- package/dist/src/codegen/generator/statements/variables.js +26 -7
- package/dist/src/codegen/generator/statements/variables.js.map +1 -1
- package/dist/src/codegen/generator/tables.d.ts +2 -0
- package/dist/src/codegen/generator/tables.js +4 -0
- package/dist/src/codegen/generator/tables.js.map +1 -1
- package/dist/src/driver/build-key.d.ts +2 -0
- package/dist/src/driver/build-key.js +1 -0
- package/dist/src/driver/build-key.js.map +1 -1
- package/dist/src/driver/bundler/graph.js +5 -1
- package/dist/src/driver/bundler/graph.js.map +1 -1
- package/dist/src/driver/bundler/merge.js +16 -1
- package/dist/src/driver/bundler/merge.js.map +1 -1
- package/dist/src/driver/bundler/types.d.ts +12 -0
- package/dist/src/driver/compiler.d.ts +1 -1
- package/dist/src/driver/compiler.js +3 -0
- package/dist/src/driver/compiler.js.map +1 -1
- package/dist/src/driver/fingerprint.js +2 -1
- package/dist/src/driver/fingerprint.js.map +1 -1
- package/dist/src/driver/frontend.d.ts +8 -6
- package/dist/src/driver/frontend.js +4 -0
- package/dist/src/driver/frontend.js.map +1 -1
- package/dist/src/driver/options.d.ts +6 -0
- package/dist/src/driver/version.d.ts +1 -1
- package/dist/src/driver/version.js +1 -1
- package/dist/src/extensions/gui/css.d.ts +26 -0
- package/dist/src/extensions/gui/css.js +100 -0
- package/dist/src/extensions/gui/css.js.map +1 -0
- package/dist/src/extensions/gui/html.js +28 -7
- package/dist/src/extensions/gui/html.js.map +1 -1
- package/dist/src/extensions/gui/index.js +79 -2
- package/dist/src/extensions/gui/index.js.map +1 -1
- package/dist/src/extensions/gui/three.d.ts +16 -0
- package/dist/src/extensions/gui/three.js +22 -0
- package/dist/src/extensions/gui/three.js.map +1 -0
- package/dist/src/extensions/media/index.d.ts +6 -5
- package/dist/src/extensions/media/index.js +12 -14
- package/dist/src/extensions/media/index.js.map +1 -1
- package/dist/src/extensions/registry.d.ts +38 -0
- package/dist/src/extensions/registry.js +10 -0
- package/dist/src/extensions/registry.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/parser/declarations/classes.js +7 -0
- package/dist/src/parser/declarations/classes.js.map +1 -1
- package/dist/src/parser/expressions.js +14 -1
- package/dist/src/parser/expressions.js.map +1 -1
- package/dist/src/parser/literals.js +6 -2
- package/dist/src/parser/literals.js.map +1 -1
- package/dist/tests/binder/binder.test.js +29 -0
- package/dist/tests/binder/binder.test.js.map +1 -1
- package/dist/tests/canonical.test.d.ts +1 -0
- package/dist/tests/canonical.test.js +19 -0
- package/dist/tests/canonical.test.js.map +1 -0
- package/dist/tests/checker/checker.test.d.ts +1 -0
- package/dist/tests/checker/checker.test.js +245 -0
- package/dist/tests/checker/checker.test.js.map +1 -0
- package/dist/tests/cli/check.test.js +20 -0
- package/dist/tests/cli/check.test.js.map +1 -1
- package/dist/tests/conformance/matrix.test.d.ts +6 -0
- package/dist/tests/conformance/matrix.test.js +23 -0
- package/dist/tests/conformance/matrix.test.js.map +1 -0
- package/dist/tests/conformance/test262/manifest.d.ts +115 -0
- package/dist/tests/conformance/test262/manifest.js +257 -0
- package/dist/tests/conformance/test262/manifest.js.map +1 -0
- package/dist/tests/conformance/test262.test.d.ts +11 -0
- package/dist/tests/conformance/test262.test.js +74 -0
- package/dist/tests/conformance/test262.test.js.map +1 -0
- package/dist/tests/docs/structure.test.js +9 -11
- package/dist/tests/docs/structure.test.js.map +1 -1
- package/dist/tests/e2e/child-process.test.js +3 -2
- package/dist/tests/e2e/child-process.test.js.map +1 -1
- package/dist/tests/e2e/compile-builtins.test.js +45 -0
- package/dist/tests/e2e/compile-builtins.test.js.map +1 -1
- package/dist/tests/e2e/compile-objects-classes.test.js +77 -0
- package/dist/tests/e2e/compile-objects-classes.test.js.map +1 -1
- package/dist/tests/e2e/differential-syntax.test.d.ts +5 -0
- package/dist/tests/e2e/differential-syntax.test.js +95 -0
- package/dist/tests/e2e/differential-syntax.test.js.map +1 -0
- package/dist/tests/e2e/differential-values.test.js +15 -0
- package/dist/tests/e2e/differential-values.test.js.map +1 -1
- package/dist/tests/e2e/gui-browser.test.d.ts +13 -0
- package/dist/tests/e2e/gui-browser.test.js +163 -0
- package/dist/tests/e2e/gui-browser.test.js.map +1 -0
- package/dist/tests/e2e/gui-effects.test.d.ts +6 -0
- package/dist/tests/e2e/gui-effects.test.js +262 -0
- package/dist/tests/e2e/gui-effects.test.js.map +1 -0
- package/dist/tests/e2e/gui-example-browser.test.js +2 -2
- package/dist/tests/e2e/gui-example-browser.test.js.map +1 -1
- package/dist/tests/e2e/gui-example-canvas.test.js +5 -4
- package/dist/tests/e2e/gui-example-canvas.test.js.map +1 -1
- package/dist/tests/e2e/gui-example-svg.test.js +4 -3
- package/dist/tests/e2e/gui-example-svg.test.js.map +1 -1
- package/dist/tests/e2e/gui-example-webgl.test.d.ts +10 -0
- package/dist/tests/e2e/gui-example-webgl.test.js +75 -0
- package/dist/tests/e2e/gui-example-webgl.test.js.map +1 -0
- package/dist/tests/e2e/gui-example-webgl2.test.d.ts +8 -0
- package/dist/tests/e2e/gui-example-webgl2.test.js +72 -0
- package/dist/tests/e2e/gui-example-webgl2.test.js.map +1 -0
- package/dist/tests/e2e/gui-example.test.js +4 -3
- package/dist/tests/e2e/gui-example.test.js.map +1 -1
- package/dist/tests/e2e/gui-helpers.js +4 -3
- package/dist/tests/e2e/gui-helpers.js.map +1 -1
- package/dist/tests/e2e/gui-layout.test.js +48 -0
- package/dist/tests/e2e/gui-layout.test.js.map +1 -1
- package/dist/tests/e2e/gui-media.test.js +10 -8
- package/dist/tests/e2e/gui-media.test.js.map +1 -1
- package/dist/tests/e2e/gui-webgl.test.d.ts +11 -0
- package/dist/tests/e2e/gui-webgl.test.js +179 -0
- package/dist/tests/e2e/gui-webgl.test.js.map +1 -0
- package/dist/tests/e2e/gui-webgl2.test.d.ts +10 -0
- package/dist/tests/e2e/gui-webgl2.test.js +238 -0
- package/dist/tests/e2e/gui-webgl2.test.js.map +1 -0
- package/dist/tests/e2e/harness.d.ts +9 -0
- package/dist/tests/e2e/harness.js +14 -2
- package/dist/tests/e2e/harness.js.map +1 -1
- package/dist/tests/e2e/native-extensions.test.js +2 -1
- package/dist/tests/e2e/native-extensions.test.js.map +1 -1
- package/dist/tests/e2e/property-descriptors.test.js +20 -0
- package/dist/tests/e2e/property-descriptors.test.js.map +1 -1
- package/dist/tests/e2e/unicode-output.test.js +5 -3
- package/dist/tests/e2e/unicode-output.test.js.map +1 -1
- package/dist/tests/e2e/weak-collections.test.js +16 -2
- package/dist/tests/e2e/weak-collections.test.js.map +1 -1
- package/dist/tests/extensions/gui.test.js +41 -0
- package/dist/tests/extensions/gui.test.js.map +1 -1
- package/dist/tests/extensions/media.test.js +7 -3
- package/dist/tests/extensions/media.test.js.map +1 -1
- package/dist/tests/helpers.d.ts +1 -0
- package/dist/tests/helpers.js +1 -0
- package/dist/tests/helpers.js.map +1 -1
- package/dist/tests/parser/declarations.test.js +20 -0
- package/dist/tests/parser/declarations.test.js.map +1 -1
- package/dist/tests/parser/expressions.test.js +36 -0
- package/dist/tests/parser/expressions.test.js.map +1 -1
- package/dist/tests/platform.d.ts +32 -0
- package/dist/tests/platform.js +40 -0
- package/dist/tests/platform.js.map +1 -0
- package/dist/tests/platform.test.d.ts +12 -0
- package/dist/tests/platform.test.js +51 -0
- package/dist/tests/platform.test.js.map +1 -0
- package/dist/tests/version.test.js +4 -4
- package/dist/tests/version.test.js.map +1 -1
- package/doc/ai/README.md +10 -4
- package/doc/ai/build-recipe.md +1 -0
- package/doc/ai/cli.md +17 -5
- package/doc/ai/contributing.md +59 -2
- package/doc/ai/extensions.md +38 -7
- package/doc/ai/language-support.md +25 -16
- package/doc/ai/troubleshooting.md +12 -8
- package/doc/ai/zh-CN/README.md +9 -4
- package/doc/ai/zh-CN/build-recipe.md +1 -0
- package/doc/ai/zh-CN/cli.md +13 -3
- package/doc/ai/zh-CN/contributing.md +49 -3
- package/doc/ai/zh-CN/extensions.md +33 -6
- package/doc/ai/zh-CN/language-support.md +23 -14
- package/doc/ai/zh-CN/troubleshooting.md +10 -6
- package/doc/gui/api.md +47 -1
- package/doc/gui/build.md +72 -16
- package/doc/gui/canvas.md +11 -3
- package/doc/gui/dom.md +33 -18
- package/doc/gui/known-issues.md +58 -15
- package/doc/gui/layout.md +18 -0
- package/doc/gui/media.md +17 -13
- package/doc/gui/rendering.md +50 -3
- package/doc/gui/runtime.md +18 -0
- package/doc/gui/webgl.md +256 -0
- package/doc/gui-scripts.md +7 -0
- package/doc/gui.md +108 -17
- package/doc/implemented/binder.md +2 -0
- package/doc/implemented/checker.md +117 -0
- package/doc/implemented/cli.md +13 -1
- package/doc/implemented/codegen.md +3 -2
- package/doc/implemented/driver.md +2 -2
- package/doc/implemented/operators.md +2 -1
- package/doc/implemented/parser.md +3 -2
- package/doc/implemented/pipeline.md +8 -1
- package/doc/implemented/stdlib.md +2 -1
- package/doc/implemented/tests.md +3 -1
- package/doc/implemented.md +2 -0
- package/doc/npm-package.md +419 -0
- package/doc/requirements.md +22 -10
- package/doc/support-matrix.md +83 -0
- package/doc/unimplemented/classes.md +3 -0
- package/doc/unimplemented/deviations.md +3 -2
- package/doc/unimplemented/toolchain.md +1 -1
- package/doc/unimplemented/types.md +24 -8
- package/doc/unimplemented.md +1 -1
- package/doc/zh-CN/gui/api.md +43 -1
- package/doc/zh-CN/gui/build.md +64 -15
- package/doc/zh-CN/gui/canvas.md +9 -2
- package/doc/zh-CN/gui/dom.md +20 -7
- package/doc/zh-CN/gui/known-issues.md +46 -13
- package/doc/zh-CN/gui/layout.md +14 -0
- package/doc/zh-CN/gui/media.md +15 -11
- package/doc/zh-CN/gui/rendering.md +41 -4
- package/doc/zh-CN/gui/runtime.md +16 -0
- package/doc/zh-CN/gui/webgl.md +115 -0
- package/doc/zh-CN/gui-scripts.md +5 -0
- package/doc/zh-CN/gui.md +89 -14
- package/doc/zh-CN/implemented/binder.md +2 -0
- package/doc/zh-CN/implemented/checker.md +99 -0
- package/doc/zh-CN/implemented/cli.md +12 -1
- package/doc/zh-CN/implemented/codegen.md +3 -2
- package/doc/zh-CN/implemented/driver.md +2 -2
- package/doc/zh-CN/implemented/operators.md +1 -1
- package/doc/zh-CN/implemented/parser.md +3 -2
- package/doc/zh-CN/implemented/pipeline.md +3 -1
- package/doc/zh-CN/implemented/stdlib.md +2 -1
- package/doc/zh-CN/implemented/tests.md +3 -1
- package/doc/zh-CN/implemented.md +2 -0
- package/doc/zh-CN/npm-package.md +394 -0
- package/doc/zh-CN/post/announce.md +47 -47
- package/doc/zh-CN/requirements.md +16 -7
- package/doc/zh-CN/support-matrix.md +82 -0
- package/doc/zh-CN/unimplemented/classes.md +3 -0
- package/doc/zh-CN/unimplemented/deviations.md +3 -2
- package/doc/zh-CN/unimplemented/toolchain.md +1 -1
- package/doc/zh-CN/unimplemented/types.md +16 -6
- package/doc/zh-CN/unimplemented.md +1 -1
- package/llms.txt +6 -1
- package/package.json +2 -1
- package/runtime/ext_gui/audio.cpp +316 -0
- package/runtime/ext_gui/browser.cpp +573 -0
- package/runtime/ext_gui/browser_escape.cpp +85 -0
- package/runtime/ext_gui/browser_loop.cpp +83 -0
- package/runtime/ext_gui/canvas.cpp +12 -21
- package/runtime/ext_gui/canvas_internal.h +10 -0
- package/runtime/ext_gui/canvas_raster.cpp +79 -1
- package/runtime/ext_gui/clip_values.cpp +246 -0
- package/runtime/ext_gui/css.cpp +94 -0
- package/runtime/ext_gui/css.h +22 -1
- package/runtime/ext_gui/css_match.cpp +3 -0
- package/runtime/ext_gui/css_selector.cpp +9 -0
- package/runtime/ext_gui/css_sheet.cpp +89 -45
- package/runtime/ext_gui/document.cpp +4 -1
- package/runtime/ext_gui/document.h +2 -0
- package/runtime/ext_gui/dom.h +16 -0
- package/runtime/ext_gui/dom_api.cpp +37 -0
- package/runtime/ext_gui/dom_api_canvas.cpp +17 -80
- package/runtime/ext_gui/dom_api_canvas_extra.cpp +130 -1
- package/runtime/ext_gui/dom_api_canvas_pending.cpp +41 -0
- package/runtime/ext_gui/dom_api_document.cpp +96 -5
- package/runtime/ext_gui/dom_api_events.cpp +20 -0
- package/runtime/ext_gui/dom_api_internal.h +278 -0
- package/runtime/ext_gui/dom_api_proto.cpp +6 -0
- package/runtime/ext_gui/dom_api_webgl.cpp +376 -0
- package/runtime/ext_gui/dom_api_webgl2.cpp +434 -0
- package/runtime/ext_gui/dom_api_webgl2_draw.cpp +269 -0
- package/runtime/ext_gui/dom_api_webgl_buffer.cpp +212 -0
- package/runtime/ext_gui/dom_api_webgl_rt.h +30 -0
- package/runtime/ext_gui/dom_api_webgl_shader.cpp +443 -0
- package/runtime/ext_gui/dom_api_webgl_state.cpp +444 -0
- package/runtime/ext_gui/dom_api_webgl_texture.cpp +445 -0
- package/runtime/ext_gui/effect_values.cpp +312 -0
- package/runtime/ext_gui/gradient_values.cpp +476 -0
- package/runtime/ext_gui/grid_values.cpp +230 -0
- package/runtime/ext_gui/gui.cpp +90 -23
- package/runtime/ext_gui/gui_canvas.cpp +50 -2
- package/runtime/ext_gui/gui_engine.h +71 -0
- package/runtime/ext_gui/gui_events.cpp +4 -1
- package/runtime/ext_gui/gui_media.cpp +1 -1
- package/runtime/ext_gui/gui_webgl.cpp +83 -0
- package/runtime/ext_gui/layout.cpp +21 -0
- package/runtime/ext_gui/layout_flow.cpp +81 -4
- package/runtime/ext_gui/layout_flow_internal.h +31 -0
- package/runtime/ext_gui/layout_grid.cpp +374 -0
- package/runtime/ext_gui/media.h +1 -1
- package/runtime/ext_gui/media_api.h +2 -2
- package/runtime/ext_gui/media_query.cpp +211 -0
- package/runtime/ext_gui/paint.cpp +111 -77
- package/runtime/ext_gui/paint.h +33 -3
- package/runtime/ext_gui/paint_background.cpp +229 -0
- package/runtime/ext_gui/paint_clip.cpp +268 -0
- package/runtime/ext_gui/paint_effects.cpp +324 -0
- package/runtime/ext_gui/paint_internal.h +85 -0
- package/runtime/ext_gui/renderer.cpp +8 -31
- package/runtime/ext_gui/renderer_clip.cpp +196 -0
- package/runtime/ext_gui/renderer_image.cpp +13 -8
- package/runtime/ext_gui/renderer_internal.h +15 -8
- package/runtime/ext_gui/renderer_text.cpp +6 -31
- package/runtime/ext_gui/style.cpp +343 -20
- package/runtime/ext_gui/style.h +144 -3
- package/runtime/ext_gui/style_print.cpp +134 -1
- package/runtime/ext_gui/style_values.cpp +152 -126
- package/runtime/ext_gui/style_values_internal.h +35 -0
- package/runtime/ext_gui/webgl.h +466 -0
- package/runtime/ext_gui/webgl2_constants.h +274 -0
- package/runtime/ext_gui/webgl_buffer.cpp +565 -0
- package/runtime/ext_gui/webgl_constants.h +317 -0
- package/runtime/ext_gui/webgl_context.cpp +466 -0
- package/runtime/ext_gui/webgl_draw.cpp +495 -0
- package/runtime/ext_gui/webgl_glsl.h +125 -0
- package/runtime/ext_gui/webgl_glsl_compile.cpp +431 -0
- package/runtime/ext_gui/webgl_glsl_rewrite.cpp +349 -0
- package/runtime/ext_gui/webgl_glsl_scan.cpp +581 -0
- package/runtime/ext_gui/webgl_msl.cpp +62 -0
- package/runtime/ext_gui/webgl_msl.h +33 -0
- package/runtime/ext_gui/webgl_pipeline.cpp +274 -0
- package/runtime/ext_gui/webgl_program_internal.h +18 -0
- package/runtime/ext_gui/webgl_shader.cpp +582 -0
- package/runtime/ext_gui/webgl_texture.cpp +293 -0
- package/runtime/ext_gui/webgl_uniform.cpp +167 -0
- package/runtime/ext_gui/webgl_webgl2.cpp +224 -0
- package/runtime/ext_gui/window.cpp +9 -0
- package/runtime/ext_media/media.cpp +1 -1
- package/runtime/ext_media/media_bridge.c +9 -3
- package/runtime/ext_node/path/path.c +7 -7
- package/runtime/ext_node/url/url.c +4 -2
- package/runtime/rt.h +15 -0
- package/runtime/rt_internal.h +1 -0
- package/runtime/xt_constructors.c +2 -1
- package/runtime/xt_containers/access.inc +8 -0
- package/runtime/xt_containers/objects.inc +22 -2
- package/runtime/xt_io/exception.inc +4 -2
- package/runtime/xt_regex/api.inc +2 -0
- package/runtime/xt_regex/matcher.inc +16 -3
- package/runtime/xt_regex/parser.inc +8 -2
- package/runtime/xt_regex/types.inc +3 -0
- package/runtime/xt_stdlib/math.inc +62 -0
- package/runtime/xt_stdlib2/date.inc +7 -1
- package/runtime/xt_stdlib2/objects.inc +14 -0
- package/runtime/xt_stdlib2/regexp-match.inc +60 -21
- package/runtime/xt_stdlib2/regexp.inc +1 -0
- package/runtime/xt_typed_array.c +1 -1
- package/scripts/build-gui.ts +90 -3
- package/scripts/build-media.ts +323 -58
- package/scripts/setup-vs-toolchain.ps1 +152 -0
- package/scripts/support-matrix.ts +167 -0
- package/src/ast/common.ts +2 -0
- package/src/ast/declarations.ts +12 -1
- package/src/ast/expressions.ts +6 -0
- package/src/ast/kinds.ts +2 -0
- package/src/binder/binder.ts +3 -0
- package/src/binder/declarations.ts +70 -0
- package/src/binder/references.ts +97 -4
- package/src/binder/types.ts +30 -0
- package/src/canonical.ts +37 -0
- package/src/checker/assignability.ts +134 -0
- package/src/checker/calls.ts +135 -0
- package/src/checker/checker.ts +47 -0
- package/src/checker/declarations.ts +26 -0
- package/src/checker/flow.ts +236 -0
- package/src/checker/globals.ts +40 -0
- package/src/checker/source.ts +53 -0
- package/src/checker/type-infer.ts +185 -0
- package/src/checker/type-model.ts +212 -0
- package/src/checker/type-system.ts +578 -0
- package/src/checker/typecheck-types.ts +112 -0
- package/src/checker/typecheck.ts +586 -0
- package/src/checker/undefined.ts +43 -0
- package/src/checker/walk.ts +16 -0
- package/src/cli/help.ts +65 -0
- package/src/cli/hints.ts +2 -1
- package/src/cli/main.ts +12 -49
- package/src/codegen/generator/calls/access.ts +8 -8
- package/src/codegen/generator/calls/invocation.ts +8 -5
- package/src/codegen/generator/calls/super.ts +67 -5
- package/src/codegen/generator/context.ts +31 -19
- package/src/codegen/generator/debug.ts +2 -1
- package/src/codegen/generator/expressions/primary.ts +84 -13
- package/src/codegen/generator/generator.ts +11 -1
- package/src/codegen/generator/module.ts +115 -24
- package/src/codegen/generator/state.ts +11 -1
- package/src/codegen/generator/statements/variables.ts +26 -6
- package/src/codegen/generator/tables.ts +5 -0
- package/src/driver/build-key.ts +3 -0
- package/src/driver/bundler/graph.ts +6 -2
- package/src/driver/bundler/merge.ts +14 -1
- package/src/driver/bundler/types.ts +13 -0
- package/src/driver/compiler.ts +4 -1
- package/src/driver/fingerprint.ts +2 -1
- package/src/driver/frontend.ts +13 -2
- package/src/driver/options.ts +6 -0
- package/src/driver/version.ts +1 -1
- package/src/extensions/gui/css.ts +113 -0
- package/src/extensions/gui/html.ts +31 -11
- package/src/extensions/gui/index.ts +81 -2
- package/src/extensions/gui/three.ts +25 -0
- package/src/extensions/media/index.ts +13 -16
- package/src/extensions/registry.ts +48 -0
- package/src/index.ts +1 -0
- package/src/parser/declarations/classes.ts +7 -0
- package/src/parser/expressions.ts +13 -1
- package/src/parser/literals.ts +6 -2
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* xbintsc GUI engine — WebGL buffer, vertex-attribute and draw bindings.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
#include "dom_api_internal.h"
|
|
6
|
+
|
|
7
|
+
#include <string>
|
|
8
|
+
#include <vector>
|
|
9
|
+
|
|
10
|
+
#include "webgl.h"
|
|
11
|
+
|
|
12
|
+
#define METHOD(name) xt_value name(xt_value self, xt_value env, int32_t argc, xt_value *argv)
|
|
13
|
+
|
|
14
|
+
namespace domapi {
|
|
15
|
+
namespace {
|
|
16
|
+
|
|
17
|
+
xtgui::WebGLContext *context_of(xt_value self) { return webgl_from_context(self); }
|
|
18
|
+
|
|
19
|
+
uint32_t buffer_argument(xt_value value) { return webgl_object_id(value, "__xt_gl_buffer"); }
|
|
20
|
+
|
|
21
|
+
} // namespace
|
|
22
|
+
|
|
23
|
+
METHOD(webgl_create_buffer) {
|
|
24
|
+
(void)env;
|
|
25
|
+
(void)argc;
|
|
26
|
+
(void)argv;
|
|
27
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
28
|
+
if (context == nullptr) return XT_NULL;
|
|
29
|
+
return webgl_make_object(self, "__xt_gl_buffer", context->create_buffer(), "buffer");
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
METHOD(webgl_delete_buffer) {
|
|
33
|
+
(void)env;
|
|
34
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
35
|
+
if (context != nullptr) context->delete_buffer(buffer_argument(xt_arg(argc, argv, 0)));
|
|
36
|
+
return XT_UNDEFINED;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
METHOD(webgl_bind_buffer) {
|
|
40
|
+
(void)env;
|
|
41
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
42
|
+
if (context != nullptr) {
|
|
43
|
+
context->bind_buffer(webgl_int(argc, argv, 0, 0), buffer_argument(xt_arg(argc, argv, 1)));
|
|
44
|
+
}
|
|
45
|
+
return XT_UNDEFINED;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
METHOD(webgl_buffer_data) {
|
|
49
|
+
(void)env;
|
|
50
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
51
|
+
if (context == nullptr) return XT_UNDEFINED;
|
|
52
|
+
const int target = webgl_int(argc, argv, 0, 0);
|
|
53
|
+
const uint32_t buffer = context->bound_buffer(target);
|
|
54
|
+
if (buffer == 0) return XT_UNDEFINED;
|
|
55
|
+
const xt_value data = xt_arg(argc, argv, 1);
|
|
56
|
+
const int usage = webgl_int(argc, argv, 2, GL_STATIC_DRAW);
|
|
57
|
+
if (XT_IS_OBJECT(data)) {
|
|
58
|
+
const std::vector<uint8_t> bytes = webgl_bytes(data);
|
|
59
|
+
context->buffer_data(buffer, bytes.empty() ? nullptr : bytes.data(), (uint32_t)bytes.size(),
|
|
60
|
+
usage);
|
|
61
|
+
} else {
|
|
62
|
+
const uint32_t size = (uint32_t)xt_to_number(data);
|
|
63
|
+
context->buffer_data(buffer, nullptr, size, usage);
|
|
64
|
+
}
|
|
65
|
+
return XT_UNDEFINED;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
METHOD(webgl_buffer_sub_data) {
|
|
69
|
+
(void)env;
|
|
70
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
71
|
+
if (context == nullptr) return XT_UNDEFINED;
|
|
72
|
+
const int target = webgl_int(argc, argv, 0, 0);
|
|
73
|
+
const uint32_t buffer = context->bound_buffer(target);
|
|
74
|
+
const uint32_t offset = (uint32_t)webgl_number(argc, argv, 1, 0.0);
|
|
75
|
+
const std::vector<uint8_t> bytes = webgl_bytes(xt_arg(argc, argv, 2));
|
|
76
|
+
if (buffer != 0) context->buffer_sub_data(buffer, offset, bytes.data(), (uint32_t)bytes.size());
|
|
77
|
+
return XT_UNDEFINED;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
METHOD(webgl_get_buffer_parameter) {
|
|
81
|
+
(void)env;
|
|
82
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
83
|
+
if (context == nullptr) return XT_NULL;
|
|
84
|
+
const int target = webgl_int(argc, argv, 0, 0);
|
|
85
|
+
const int pname = webgl_int(argc, argv, 1, 0);
|
|
86
|
+
const uint32_t buffer = context->bound_buffer(target);
|
|
87
|
+
if (pname == GL_BUFFER_SIZE) return xt_number((double)context->buffer_size(buffer));
|
|
88
|
+
return xt_number(0);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
METHOD(webgl_enable_vertex_attrib_array) {
|
|
92
|
+
(void)env;
|
|
93
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
94
|
+
if (context != nullptr) context->enable_attrib(webgl_int(argc, argv, 0, 0), true);
|
|
95
|
+
return XT_UNDEFINED;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
METHOD(webgl_disable_vertex_attrib_array) {
|
|
99
|
+
(void)env;
|
|
100
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
101
|
+
if (context != nullptr) context->enable_attrib(webgl_int(argc, argv, 0, 0), false);
|
|
102
|
+
return XT_UNDEFINED;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
METHOD(webgl_vertex_attrib_pointer) {
|
|
106
|
+
(void)env;
|
|
107
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
108
|
+
if (context != nullptr) {
|
|
109
|
+
context->attrib_pointer(webgl_int(argc, argv, 0, 0), webgl_int(argc, argv, 1, 4),
|
|
110
|
+
webgl_int(argc, argv, 2, GL_FLOAT), value_truthy(xt_arg(argc, argv, 3)),
|
|
111
|
+
webgl_int(argc, argv, 4, 0), webgl_int(argc, argv, 5, 0));
|
|
112
|
+
}
|
|
113
|
+
return XT_UNDEFINED;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
namespace {
|
|
117
|
+
|
|
118
|
+
void attrib_value(xt_value self, int32_t argc, xt_value *argv, int components) {
|
|
119
|
+
xtgui::WebGLContext *context = webgl_from_context(self);
|
|
120
|
+
if (context == nullptr) return;
|
|
121
|
+
float values[4] = {0.0f, 0.0f, 0.0f, 1.0f};
|
|
122
|
+
for (int i = 0; i < components; i++) values[i] = (float)webgl_number(argc, argv, i + 1, 0.0);
|
|
123
|
+
if (components < 4) values[3] = 1.0f;
|
|
124
|
+
context->attrib_value(webgl_int(argc, argv, 0, 0), components, values);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
} // namespace
|
|
128
|
+
|
|
129
|
+
METHOD(webgl_vertex_attrib1f) {
|
|
130
|
+
attrib_value(self, argc, argv, 1);
|
|
131
|
+
return XT_UNDEFINED;
|
|
132
|
+
}
|
|
133
|
+
METHOD(webgl_vertex_attrib2f) {
|
|
134
|
+
attrib_value(self, argc, argv, 2);
|
|
135
|
+
return XT_UNDEFINED;
|
|
136
|
+
}
|
|
137
|
+
METHOD(webgl_vertex_attrib3f) {
|
|
138
|
+
attrib_value(self, argc, argv, 3);
|
|
139
|
+
return XT_UNDEFINED;
|
|
140
|
+
}
|
|
141
|
+
METHOD(webgl_vertex_attrib4f) {
|
|
142
|
+
attrib_value(self, argc, argv, 4);
|
|
143
|
+
return XT_UNDEFINED;
|
|
144
|
+
}
|
|
145
|
+
METHOD(webgl_vertex_attrib1fv) {
|
|
146
|
+
attrib_value(self, argc, argv, 1);
|
|
147
|
+
return XT_UNDEFINED;
|
|
148
|
+
}
|
|
149
|
+
METHOD(webgl_vertex_attrib2fv) {
|
|
150
|
+
attrib_value(self, argc, argv, 2);
|
|
151
|
+
return XT_UNDEFINED;
|
|
152
|
+
}
|
|
153
|
+
METHOD(webgl_vertex_attrib3fv) {
|
|
154
|
+
attrib_value(self, argc, argv, 3);
|
|
155
|
+
return XT_UNDEFINED;
|
|
156
|
+
}
|
|
157
|
+
METHOD(webgl_vertex_attrib4fv) {
|
|
158
|
+
attrib_value(self, argc, argv, 4);
|
|
159
|
+
return XT_UNDEFINED;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
METHOD(webgl_get_vertex_attrib) {
|
|
163
|
+
(void)env;
|
|
164
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
165
|
+
if (context == nullptr) return XT_NULL;
|
|
166
|
+
const int index = webgl_int(argc, argv, 0, -1);
|
|
167
|
+
const int pname = webgl_int(argc, argv, 1, 0);
|
|
168
|
+
if (index < 0 || index >= 16) return XT_NULL;
|
|
169
|
+
int size = 4;
|
|
170
|
+
int type = GL_FLOAT;
|
|
171
|
+
int stride = 0;
|
|
172
|
+
bool normalized = false;
|
|
173
|
+
float current[4] = {0, 0, 0, 1};
|
|
174
|
+
context->attrib_state(index, &size, &type, &stride, &normalized, current);
|
|
175
|
+
if (pname == GL_CURRENT_VERTEX_ATTRIB) {
|
|
176
|
+
xt_value values = xt_array_new(0, nullptr);
|
|
177
|
+
for (float value : current) xt_array_push(values, xt_number(value));
|
|
178
|
+
return values;
|
|
179
|
+
}
|
|
180
|
+
if (pname == GL_VERTEX_ATTRIB_ARRAY_ENABLED) return xt_bool(context->attrib_enabled(index));
|
|
181
|
+
if (pname == GL_VERTEX_ATTRIB_ARRAY_SIZE) return xt_number(size);
|
|
182
|
+
if (pname == GL_VERTEX_ATTRIB_ARRAY_TYPE) return xt_number(type);
|
|
183
|
+
if (pname == GL_VERTEX_ATTRIB_ARRAY_STRIDE) return xt_number(stride);
|
|
184
|
+
if (pname == GL_VERTEX_ATTRIB_ARRAY_NORMALIZED) return xt_bool(normalized);
|
|
185
|
+
if (pname == GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING) {
|
|
186
|
+
const uint32_t buffer = context->attrib_buffer(index);
|
|
187
|
+
return buffer != 0 ? webgl_make_object(self, "__xt_gl_buffer", buffer, "buffer") : XT_NULL;
|
|
188
|
+
}
|
|
189
|
+
return xt_number(0);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
METHOD(webgl_draw_arrays) {
|
|
193
|
+
(void)env;
|
|
194
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
195
|
+
if (context != nullptr) {
|
|
196
|
+
context->draw_arrays(webgl_int(argc, argv, 0, 0), webgl_int(argc, argv, 1, 0),
|
|
197
|
+
webgl_int(argc, argv, 2, 0));
|
|
198
|
+
}
|
|
199
|
+
return XT_UNDEFINED;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
METHOD(webgl_draw_elements) {
|
|
203
|
+
(void)env;
|
|
204
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
205
|
+
if (context != nullptr) {
|
|
206
|
+
context->draw_elements(webgl_int(argc, argv, 0, 0), webgl_int(argc, argv, 1, 0),
|
|
207
|
+
webgl_int(argc, argv, 2, 0), webgl_int(argc, argv, 3, 0));
|
|
208
|
+
}
|
|
209
|
+
return XT_UNDEFINED;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
} // namespace domapi
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* xbintsc GUI engine — the runtime's typed-array/ArrayBuffer accessors.
|
|
3
|
+
*
|
|
4
|
+
* Those helpers are declared in the C-only `rt_internal.h`; the WebGL bindings
|
|
5
|
+
* are C++, so this small header re-declares the handful they use with C
|
|
6
|
+
* linkage.
|
|
7
|
+
*/
|
|
8
|
+
#ifndef XT_GUI_DOM_API_WEBGL_RT_H
|
|
9
|
+
#define XT_GUI_DOM_API_WEBGL_RT_H
|
|
10
|
+
|
|
11
|
+
#include "rt.h"
|
|
12
|
+
|
|
13
|
+
#ifdef __cplusplus
|
|
14
|
+
extern "C" {
|
|
15
|
+
#endif
|
|
16
|
+
|
|
17
|
+
int xt_typed_array_kind_of(xt_value value);
|
|
18
|
+
xt_value xt_typed_array_read(xt_value array, uint32_t index);
|
|
19
|
+
void xt_typed_array_write(xt_value array, uint32_t index, xt_value value);
|
|
20
|
+
xt_value xt_typed_array_buffer_of(xt_value array);
|
|
21
|
+
uint32_t xt_typed_array_byte_offset_of(xt_value array);
|
|
22
|
+
int xt_is_array_buffer(xt_value value);
|
|
23
|
+
uint32_t xt_array_buffer_byte_length(xt_value value);
|
|
24
|
+
uint8_t xt_array_buffer_get_byte(xt_value buffer, uint32_t index);
|
|
25
|
+
|
|
26
|
+
#ifdef __cplusplus
|
|
27
|
+
}
|
|
28
|
+
#endif
|
|
29
|
+
|
|
30
|
+
#endif /* XT_GUI_DOM_API_WEBGL_RT_H */
|
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* xbintsc GUI engine — WebGL shader, program and uniform bindings.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
#include "dom_api_internal.h"
|
|
6
|
+
|
|
7
|
+
#include <string>
|
|
8
|
+
#include <vector>
|
|
9
|
+
|
|
10
|
+
#include "webgl.h"
|
|
11
|
+
|
|
12
|
+
#define METHOD(name) xt_value name(xt_value self, xt_value env, int32_t argc, xt_value *argv)
|
|
13
|
+
|
|
14
|
+
namespace domapi {
|
|
15
|
+
namespace {
|
|
16
|
+
|
|
17
|
+
xtgui::WebGLContext *context_of(xt_value self) { return webgl_from_context(self); }
|
|
18
|
+
|
|
19
|
+
xt_value shader_argument(xt_value value) {
|
|
20
|
+
return webgl_object_id(value, "__xt_gl_shader");
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Resolve a `WebGLUniformLocation` handle into its program and table index. */
|
|
24
|
+
bool location_of(xt_value handle, uint32_t *program, int *location) {
|
|
25
|
+
if (!XT_IS_OBJECT(handle)) return false;
|
|
26
|
+
xt_value program_value = xt_object_get_cstr(handle, "__xt_gl_program");
|
|
27
|
+
xt_value location_value = xt_object_get_cstr(handle, "__xt_gl_location");
|
|
28
|
+
if (!XT_IS_NUMBER(program_value) || !XT_IS_NUMBER(location_value)) return false;
|
|
29
|
+
*program = (uint32_t)xt_to_number(program_value);
|
|
30
|
+
*location = (int)xt_to_number(location_value);
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
int attribute_type(const std::string &type) {
|
|
35
|
+
if (type == "float") return GL_FLOAT;
|
|
36
|
+
if (type == "vec2") return GL_FLOAT_VEC2;
|
|
37
|
+
if (type == "vec3") return GL_FLOAT_VEC3;
|
|
38
|
+
if (type == "vec4") return GL_FLOAT_VEC4;
|
|
39
|
+
if (type == "mat2") return GL_FLOAT_MAT2;
|
|
40
|
+
if (type == "mat3") return GL_FLOAT_MAT3;
|
|
41
|
+
if (type == "mat4") return GL_FLOAT_MAT4;
|
|
42
|
+
if (type == "int") return GL_INT;
|
|
43
|
+
if (type == "ivec2") return GL_INT_VEC2;
|
|
44
|
+
if (type == "ivec3") return GL_INT_VEC3;
|
|
45
|
+
if (type == "ivec4") return GL_INT_VEC4;
|
|
46
|
+
return GL_FLOAT;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
xt_value uniform_values_object(xtgui::WebGLContext *context, uint32_t program, int location) {
|
|
50
|
+
std::vector<double> values;
|
|
51
|
+
if (!context->uniform_values(program, location, &values)) return XT_NULL;
|
|
52
|
+
xt_value array = xt_array_new(0, nullptr);
|
|
53
|
+
for (double value : values) xt_array_push(array, xt_number(value));
|
|
54
|
+
return array;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
} // namespace
|
|
58
|
+
|
|
59
|
+
METHOD(webgl_create_shader) {
|
|
60
|
+
(void)env;
|
|
61
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
62
|
+
if (context == nullptr) return XT_NULL;
|
|
63
|
+
const uint32_t id = context->create_shader(webgl_int(argc, argv, 0, 0));
|
|
64
|
+
return webgl_make_object(self, "__xt_gl_shader", id, "shader");
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
METHOD(webgl_delete_shader) {
|
|
68
|
+
(void)env;
|
|
69
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
70
|
+
if (context != nullptr) context->delete_shader(shader_argument(xt_arg(argc, argv, 0)));
|
|
71
|
+
return XT_UNDEFINED;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
METHOD(webgl_shader_source) {
|
|
75
|
+
(void)env;
|
|
76
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
77
|
+
if (context != nullptr) {
|
|
78
|
+
context->shader_source(shader_argument(xt_arg(argc, argv, 0)),
|
|
79
|
+
webgl_string(argc, argv, 1));
|
|
80
|
+
}
|
|
81
|
+
return XT_UNDEFINED;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
METHOD(webgl_compile_shader) {
|
|
85
|
+
(void)env;
|
|
86
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
87
|
+
if (context != nullptr) context->compile_shader(shader_argument(xt_arg(argc, argv, 0)));
|
|
88
|
+
return XT_UNDEFINED;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
METHOD(webgl_get_shader_parameter) {
|
|
92
|
+
(void)env;
|
|
93
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
94
|
+
if (context == nullptr) return XT_NULL;
|
|
95
|
+
const uint32_t shader = shader_argument(xt_arg(argc, argv, 0));
|
|
96
|
+
const int pname = webgl_int(argc, argv, 1, 0);
|
|
97
|
+
xtgui::WebGLShader *record = context->shader(shader);
|
|
98
|
+
if (record == nullptr) return XT_NULL;
|
|
99
|
+
if (pname == GL_COMPILE_STATUS) return xt_bool(context->shader_compiled(shader));
|
|
100
|
+
if (pname == GL_DELETE_STATUS) return XT_FALSE;
|
|
101
|
+
if (pname == GL_SHADER_TYPE) return xt_number(record->type);
|
|
102
|
+
return XT_NULL;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
METHOD(webgl_get_shader_info_log) {
|
|
106
|
+
(void)env;
|
|
107
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
108
|
+
if (context == nullptr) return xt_string_from_cstr("");
|
|
109
|
+
return xt_string_from_cstr(context->shader_info_log(shader_argument(xt_arg(argc, argv, 0))).c_str());
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
METHOD(webgl_get_shader_source) {
|
|
113
|
+
(void)env;
|
|
114
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
115
|
+
if (context == nullptr) return xt_string_from_cstr("");
|
|
116
|
+
return xt_string_from_cstr(
|
|
117
|
+
context->shader_source_text(shader_argument(xt_arg(argc, argv, 0))).c_str());
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
METHOD(webgl_create_program) {
|
|
121
|
+
(void)env;
|
|
122
|
+
(void)argc;
|
|
123
|
+
(void)argv;
|
|
124
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
125
|
+
if (context == nullptr) return XT_NULL;
|
|
126
|
+
return webgl_make_object(self, "__xt_gl_program", context->create_program(), "program");
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
METHOD(webgl_delete_program) {
|
|
130
|
+
(void)env;
|
|
131
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
132
|
+
if (context != nullptr) {
|
|
133
|
+
context->delete_program(webgl_object_id(xt_arg(argc, argv, 0), "__xt_gl_program"));
|
|
134
|
+
}
|
|
135
|
+
return XT_UNDEFINED;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
METHOD(webgl_attach_shader) {
|
|
139
|
+
(void)env;
|
|
140
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
141
|
+
if (context != nullptr) {
|
|
142
|
+
context->attach_shader(webgl_object_id(xt_arg(argc, argv, 0), "__xt_gl_program"),
|
|
143
|
+
shader_argument(xt_arg(argc, argv, 1)));
|
|
144
|
+
}
|
|
145
|
+
return XT_UNDEFINED;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
METHOD(webgl_detach_shader) {
|
|
149
|
+
(void)env;
|
|
150
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
151
|
+
if (context != nullptr) {
|
|
152
|
+
context->detach_shader(webgl_object_id(xt_arg(argc, argv, 0), "__xt_gl_program"),
|
|
153
|
+
shader_argument(xt_arg(argc, argv, 1)));
|
|
154
|
+
}
|
|
155
|
+
return XT_UNDEFINED;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
METHOD(webgl_link_program) {
|
|
159
|
+
(void)env;
|
|
160
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
161
|
+
if (context != nullptr) {
|
|
162
|
+
context->link_program(webgl_object_id(xt_arg(argc, argv, 0), "__xt_gl_program"));
|
|
163
|
+
}
|
|
164
|
+
return XT_UNDEFINED;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
METHOD(webgl_use_program) {
|
|
168
|
+
(void)env;
|
|
169
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
170
|
+
if (context != nullptr) {
|
|
171
|
+
context->use_program(webgl_object_id(xt_arg(argc, argv, 0), "__xt_gl_program"));
|
|
172
|
+
}
|
|
173
|
+
return XT_UNDEFINED;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
METHOD(webgl_get_program_parameter) {
|
|
177
|
+
(void)env;
|
|
178
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
179
|
+
if (context == nullptr) return XT_NULL;
|
|
180
|
+
const uint32_t program = webgl_object_id(xt_arg(argc, argv, 0), "__xt_gl_program");
|
|
181
|
+
const int pname = webgl_int(argc, argv, 1, 0);
|
|
182
|
+
if (pname == GL_LINK_STATUS) return xt_bool(context->program_linked(program));
|
|
183
|
+
if (pname == GL_VALIDATE_STATUS) return xt_bool(context->program_linked(program));
|
|
184
|
+
if (pname == GL_DELETE_STATUS) return XT_FALSE;
|
|
185
|
+
if (pname == GL_ATTACHED_SHADERS) {
|
|
186
|
+
return xt_number((double)context->attached_shaders(program).size());
|
|
187
|
+
}
|
|
188
|
+
if (pname == GL_ACTIVE_UNIFORMS) return xt_number((double)context->active_uniform_count(program));
|
|
189
|
+
if (pname == GL_ACTIVE_ATTRIBUTES) return xt_number((double)context->active_attrib_count(program));
|
|
190
|
+
return xt_number(0);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
METHOD(webgl_get_program_info_log) {
|
|
194
|
+
(void)env;
|
|
195
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
196
|
+
if (context == nullptr) return xt_string_from_cstr("");
|
|
197
|
+
return xt_string_from_cstr(
|
|
198
|
+
context->program_info_log(webgl_object_id(xt_arg(argc, argv, 0), "__xt_gl_program")).c_str());
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
METHOD(webgl_get_attached_shaders) {
|
|
202
|
+
(void)env;
|
|
203
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
204
|
+
xt_value result = xt_array_new(0, nullptr);
|
|
205
|
+
if (context == nullptr) return result;
|
|
206
|
+
const uint32_t program = webgl_object_id(xt_arg(argc, argv, 0), "__xt_gl_program");
|
|
207
|
+
for (uint32_t shader : context->attached_shaders(program)) {
|
|
208
|
+
xt_array_push(result, webgl_make_object(self, "__xt_gl_shader", shader, "shader"));
|
|
209
|
+
}
|
|
210
|
+
return result;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
METHOD(webgl_validate_program) {
|
|
214
|
+
(void)env;
|
|
215
|
+
(void)argc;
|
|
216
|
+
(void)argv;
|
|
217
|
+
return XT_UNDEFINED;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
METHOD(webgl_get_active_uniform) {
|
|
221
|
+
(void)env;
|
|
222
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
223
|
+
if (context == nullptr) return XT_NULL;
|
|
224
|
+
const uint32_t program = webgl_object_id(xt_arg(argc, argv, 0), "__xt_gl_program");
|
|
225
|
+
const int index = webgl_int(argc, argv, 1, -1);
|
|
226
|
+
const xtgui::WebGLUniform *uniform = context->active_uniform(program, index);
|
|
227
|
+
if (uniform == nullptr) return XT_NULL;
|
|
228
|
+
xt_value info = xt_object_new_with_proto(webgl_object_proto("info"));
|
|
229
|
+
std::string name = uniform->name;
|
|
230
|
+
if (uniform->layout.is_array) name += "[0]";
|
|
231
|
+
xt_object_set(info, xt_string_from_cstr("name"), xt_string_from_cstr(name.c_str()));
|
|
232
|
+
xt_object_set(info, xt_string_from_cstr("size"),
|
|
233
|
+
xt_number((double)(uniform->layout.is_array ? uniform->layout.array_size : 1)));
|
|
234
|
+
xt_object_set(info, xt_string_from_cstr("type"), xt_number((double)uniform->layout.gl_type));
|
|
235
|
+
return info;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
METHOD(webgl_get_active_attrib) {
|
|
239
|
+
(void)env;
|
|
240
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
241
|
+
if (context == nullptr) return XT_NULL;
|
|
242
|
+
const uint32_t program = webgl_object_id(xt_arg(argc, argv, 0), "__xt_gl_program");
|
|
243
|
+
const int index = webgl_int(argc, argv, 1, -1);
|
|
244
|
+
const xtgui::GlslUniformDecl *attrib = context->active_attrib(program, index);
|
|
245
|
+
if (attrib == nullptr) return XT_NULL;
|
|
246
|
+
xt_value info = xt_object_new_with_proto(webgl_object_proto("info"));
|
|
247
|
+
xt_object_set(info, xt_string_from_cstr("name"), xt_string_from_cstr(attrib->name.c_str()));
|
|
248
|
+
xt_object_set(info, xt_string_from_cstr("size"), xt_number(1));
|
|
249
|
+
xt_object_set(info, xt_string_from_cstr("type"), xt_number(attribute_type(attrib->type)));
|
|
250
|
+
return info;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
METHOD(webgl_get_uniform_location) {
|
|
254
|
+
(void)env;
|
|
255
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
256
|
+
if (context == nullptr) return XT_NULL;
|
|
257
|
+
const uint32_t program = webgl_object_id(xt_arg(argc, argv, 0), "__xt_gl_program");
|
|
258
|
+
const int location = context->uniform_location(program, webgl_string(argc, argv, 1));
|
|
259
|
+
if (location < 0) return XT_NULL;
|
|
260
|
+
xt_value handle = webgl_make_object(self, "__xt_gl_program", program, "uniform");
|
|
261
|
+
xt_object_set(handle, xt_string_from_cstr("__xt_gl_location"), xt_number((double)location));
|
|
262
|
+
return handle;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
METHOD(webgl_get_attrib_location) {
|
|
266
|
+
(void)env;
|
|
267
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
268
|
+
if (context == nullptr) return xt_number(-1);
|
|
269
|
+
const uint32_t program = webgl_object_id(xt_arg(argc, argv, 0), "__xt_gl_program");
|
|
270
|
+
return xt_number((double)context->attrib_location(program, webgl_string(argc, argv, 1)));
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
METHOD(webgl_bind_attrib_location) {
|
|
274
|
+
(void)env;
|
|
275
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
276
|
+
if (context != nullptr) {
|
|
277
|
+
context->bind_attrib_location(webgl_object_id(xt_arg(argc, argv, 0), "__xt_gl_program"),
|
|
278
|
+
webgl_int(argc, argv, 1, 0), webgl_string(argc, argv, 2));
|
|
279
|
+
}
|
|
280
|
+
return XT_UNDEFINED;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
METHOD(webgl_get_uniform) {
|
|
284
|
+
(void)env;
|
|
285
|
+
xtgui::WebGLContext *context = context_of(self);
|
|
286
|
+
if (context == nullptr) return XT_NULL;
|
|
287
|
+
uint32_t program = 0;
|
|
288
|
+
int location = 0;
|
|
289
|
+
/* `getUniform(program, location)` — the context object is `this`, so the
|
|
290
|
+
* program is the first argument and the location the second. */
|
|
291
|
+
if (!location_of(xt_arg(argc, argv, 1), &program, &location)) return XT_NULL;
|
|
292
|
+
return uniform_values_object(context, program, location);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
namespace {
|
|
296
|
+
|
|
297
|
+
void uniform_scalars(xt_value self, int32_t argc, xt_value *argv, int components, bool integer) {
|
|
298
|
+
xtgui::WebGLContext *context = webgl_from_context(self);
|
|
299
|
+
if (context == nullptr) return;
|
|
300
|
+
uint32_t program = 0;
|
|
301
|
+
int location = 0;
|
|
302
|
+
if (!location_of(xt_arg(argc, argv, 0), &program, &location)) return;
|
|
303
|
+
if (integer) {
|
|
304
|
+
int values[4] = {0, 0, 0, 0};
|
|
305
|
+
for (int i = 0; i < components; i++) values[i] = webgl_int(argc, argv, i + 1, 0);
|
|
306
|
+
context->uniform_ints(program, location, components, values, 1);
|
|
307
|
+
} else {
|
|
308
|
+
double values[4] = {0, 0, 0, 0};
|
|
309
|
+
for (int i = 0; i < components; i++) values[i] = webgl_number(argc, argv, i + 1, 0.0);
|
|
310
|
+
context->uniform_floats(program, location, components, values, 1);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
void uniform_vectors(xt_value self, int32_t argc, xt_value *argv, int components, bool integer) {
|
|
315
|
+
xtgui::WebGLContext *context = webgl_from_context(self);
|
|
316
|
+
if (context == nullptr) return;
|
|
317
|
+
uint32_t program = 0;
|
|
318
|
+
int location = 0;
|
|
319
|
+
if (!location_of(xt_arg(argc, argv, 0), &program, &location)) return;
|
|
320
|
+
const std::vector<double> numbers =
|
|
321
|
+
webgl_numbers(argc > 1 ? xt_arg(argc, argv, 1) : XT_UNDEFINED);
|
|
322
|
+
if (numbers.empty()) return;
|
|
323
|
+
const int count = (int)(numbers.size() / components);
|
|
324
|
+
if (integer) {
|
|
325
|
+
std::vector<int> values(numbers.size());
|
|
326
|
+
for (size_t i = 0; i < numbers.size(); i++) values[i] = (int)numbers[i];
|
|
327
|
+
context->uniform_ints(program, location, components, values.data(), count);
|
|
328
|
+
} else {
|
|
329
|
+
context->uniform_floats(program, location, components, numbers.data(), count);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
} // namespace
|
|
334
|
+
|
|
335
|
+
METHOD(webgl_uniform1f) {
|
|
336
|
+
uniform_scalars(self, argc, argv, 1, false);
|
|
337
|
+
return XT_UNDEFINED;
|
|
338
|
+
}
|
|
339
|
+
METHOD(webgl_uniform2f) {
|
|
340
|
+
uniform_scalars(self, argc, argv, 2, false);
|
|
341
|
+
return XT_UNDEFINED;
|
|
342
|
+
}
|
|
343
|
+
METHOD(webgl_uniform3f) {
|
|
344
|
+
uniform_scalars(self, argc, argv, 3, false);
|
|
345
|
+
return XT_UNDEFINED;
|
|
346
|
+
}
|
|
347
|
+
METHOD(webgl_uniform4f) {
|
|
348
|
+
uniform_scalars(self, argc, argv, 4, false);
|
|
349
|
+
return XT_UNDEFINED;
|
|
350
|
+
}
|
|
351
|
+
METHOD(webgl_uniform1i) {
|
|
352
|
+
uniform_scalars(self, argc, argv, 1, true);
|
|
353
|
+
return XT_UNDEFINED;
|
|
354
|
+
}
|
|
355
|
+
METHOD(webgl_uniform2i) {
|
|
356
|
+
uniform_scalars(self, argc, argv, 2, true);
|
|
357
|
+
return XT_UNDEFINED;
|
|
358
|
+
}
|
|
359
|
+
METHOD(webgl_uniform3i) {
|
|
360
|
+
uniform_scalars(self, argc, argv, 3, true);
|
|
361
|
+
return XT_UNDEFINED;
|
|
362
|
+
}
|
|
363
|
+
METHOD(webgl_uniform4i) {
|
|
364
|
+
uniform_scalars(self, argc, argv, 4, true);
|
|
365
|
+
return XT_UNDEFINED;
|
|
366
|
+
}
|
|
367
|
+
METHOD(webgl_uniform1fv) {
|
|
368
|
+
uniform_vectors(self, argc, argv, 1, false);
|
|
369
|
+
return XT_UNDEFINED;
|
|
370
|
+
}
|
|
371
|
+
METHOD(webgl_uniform2fv) {
|
|
372
|
+
uniform_vectors(self, argc, argv, 2, false);
|
|
373
|
+
return XT_UNDEFINED;
|
|
374
|
+
}
|
|
375
|
+
METHOD(webgl_uniform3fv) {
|
|
376
|
+
uniform_vectors(self, argc, argv, 3, false);
|
|
377
|
+
return XT_UNDEFINED;
|
|
378
|
+
}
|
|
379
|
+
METHOD(webgl_uniform4fv) {
|
|
380
|
+
uniform_vectors(self, argc, argv, 4, false);
|
|
381
|
+
return XT_UNDEFINED;
|
|
382
|
+
}
|
|
383
|
+
METHOD(webgl_uniform1iv) {
|
|
384
|
+
uniform_vectors(self, argc, argv, 1, true);
|
|
385
|
+
return XT_UNDEFINED;
|
|
386
|
+
}
|
|
387
|
+
METHOD(webgl_uniform2iv) {
|
|
388
|
+
uniform_vectors(self, argc, argv, 2, true);
|
|
389
|
+
return XT_UNDEFINED;
|
|
390
|
+
}
|
|
391
|
+
METHOD(webgl_uniform3iv) {
|
|
392
|
+
uniform_vectors(self, argc, argv, 3, true);
|
|
393
|
+
return XT_UNDEFINED;
|
|
394
|
+
}
|
|
395
|
+
METHOD(webgl_uniform4iv) {
|
|
396
|
+
uniform_vectors(self, argc, argv, 4, true);
|
|
397
|
+
return XT_UNDEFINED;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
namespace {
|
|
401
|
+
|
|
402
|
+
void uniform_matrix(xt_value self, int32_t argc, xt_value *argv, int dimensions) {
|
|
403
|
+
xtgui::WebGLContext *context = webgl_from_context(self);
|
|
404
|
+
if (context == nullptr) return;
|
|
405
|
+
uint32_t program = 0;
|
|
406
|
+
int location = 0;
|
|
407
|
+
if (!location_of(xt_arg(argc, argv, 0), &program, &location)) return;
|
|
408
|
+
const std::vector<double> values =
|
|
409
|
+
webgl_numbers(argc > 2 ? xt_arg(argc, argv, 2) : XT_UNDEFINED);
|
|
410
|
+
if (values.empty()) return;
|
|
411
|
+
context->uniform_matrix(program, location, dimensions, values.data());
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
} // namespace
|
|
415
|
+
|
|
416
|
+
METHOD(webgl_uniform_matrix2fv) {
|
|
417
|
+
uniform_matrix(self, argc, argv, 2);
|
|
418
|
+
return XT_UNDEFINED;
|
|
419
|
+
}
|
|
420
|
+
METHOD(webgl_uniform_matrix3fv) {
|
|
421
|
+
uniform_matrix(self, argc, argv, 3);
|
|
422
|
+
return XT_UNDEFINED;
|
|
423
|
+
}
|
|
424
|
+
METHOD(webgl_uniform_matrix4fv) {
|
|
425
|
+
uniform_matrix(self, argc, argv, 4);
|
|
426
|
+
return XT_UNDEFINED;
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
METHOD(webgl_get_shader_precision_format) {
|
|
430
|
+
(void)env;
|
|
431
|
+
(void)argc;
|
|
432
|
+
(void)argv;
|
|
433
|
+
/* Every stage runs at highp on the Vulkan backend; a positive precision is
|
|
434
|
+
* what capability probes (three.js among them) need to avoid dropping to
|
|
435
|
+
* mediump. */
|
|
436
|
+
xt_value result = xt_object_new();
|
|
437
|
+
xt_object_set(result, xt_string_from_cstr("rangeMin"), xt_number(127));
|
|
438
|
+
xt_object_set(result, xt_string_from_cstr("rangeMax"), xt_number(127));
|
|
439
|
+
xt_object_set(result, xt_string_from_cstr("precision"), xt_number(23));
|
|
440
|
+
return result;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
} // namespace domapi
|