Spaces:
Running
Running
Upload folder using huggingface_hub
Browse files- README.md +2 -1
- src/README.md +2 -1
- src/backend/gradio_polygonannotator/templates/component/Index-CzQ497_5.js +0 -0
- src/backend/gradio_polygonannotator/templates/component/SharedSystems-Cd96rNl9.js +2766 -0
- src/backend/gradio_polygonannotator/templates/component/WebGLRenderer-CcnJ7_Ew.js +2643 -0
- src/backend/gradio_polygonannotator/templates/component/WebGPURenderer-CLzW5yah.js +1655 -0
- src/backend/gradio_polygonannotator/templates/component/browserAll-BoGsSDHg.js +1869 -0
- src/backend/gradio_polygonannotator/templates/component/index.js +1 -1
- src/backend/gradio_polygonannotator/templates/component/webworkerAll-BMMxBtBd.js +0 -0
README.md
CHANGED
|
@@ -16,7 +16,7 @@ sdk_version: 5.46.1
|
|
| 16 |
---
|
| 17 |
|
| 18 |
# `gradio_polygonannotator`
|
| 19 |
-
<a href="https://pypi.org/project/gradio_polygonannotator/" target="_blank"><img alt="PyPI - Version" src="https://img.shields.io/pypi/v/gradio_polygonannotator"></a> <a href="https://github.com/yourusername/gradio-polygonannotator/issues" target="_blank"><img alt="Static Badge" src="https://img.shields.io/badge/Issues-white?logo=github&logoColor=black"></a>
|
| 20 |
|
| 21 |
Interactive polygon annotation component for Gradio with multi-selection, hover effects, and customizable appearance
|
| 22 |
|
|
@@ -746,3 +746,4 @@ The code snippet below is accurate in cases where the component is used as both
|
|
| 746 |
) -> dict | None:
|
| 747 |
return value
|
| 748 |
```
|
|
|
|
|
|
| 16 |
---
|
| 17 |
|
| 18 |
# `gradio_polygonannotator`
|
| 19 |
+
<a href="https://pypi.org/project/gradio_polygonannotator/" target="_blank"><img alt="PyPI - Version" src="https://img.shields.io/pypi/v/gradio_polygonannotator"></a> <a href="https://github.com/yourusername/gradio-polygonannotator/issues" target="_blank"><img alt="Static Badge" src="https://img.shields.io/badge/Issues-white?logo=github&logoColor=black"></a>
|
| 20 |
|
| 21 |
Interactive polygon annotation component for Gradio with multi-selection, hover effects, and customizable appearance
|
| 22 |
|
|
|
|
| 746 |
) -> dict | None:
|
| 747 |
return value
|
| 748 |
```
|
| 749 |
+
|
src/README.md
CHANGED
|
@@ -16,7 +16,7 @@ sdk_version: 5.46.1
|
|
| 16 |
---
|
| 17 |
|
| 18 |
# `gradio_polygonannotator`
|
| 19 |
-
<a href="https://pypi.org/project/gradio_polygonannotator/" target="_blank"><img alt="PyPI - Version" src="https://img.shields.io/pypi/v/gradio_polygonannotator"></a> <a href="https://github.com/yourusername/gradio-polygonannotator/issues" target="_blank"><img alt="Static Badge" src="https://img.shields.io/badge/Issues-white?logo=github&logoColor=black"></a>
|
| 20 |
|
| 21 |
Interactive polygon annotation component for Gradio with multi-selection, hover effects, and customizable appearance
|
| 22 |
|
|
@@ -746,3 +746,4 @@ The code snippet below is accurate in cases where the component is used as both
|
|
| 746 |
) -> dict | None:
|
| 747 |
return value
|
| 748 |
```
|
|
|
|
|
|
| 16 |
---
|
| 17 |
|
| 18 |
# `gradio_polygonannotator`
|
| 19 |
+
<a href="https://pypi.org/project/gradio_polygonannotator/" target="_blank"><img alt="PyPI - Version" src="https://img.shields.io/pypi/v/gradio_polygonannotator"></a> <a href="https://github.com/yourusername/gradio-polygonannotator/issues" target="_blank"><img alt="Static Badge" src="https://img.shields.io/badge/Issues-white?logo=github&logoColor=black"></a>
|
| 20 |
|
| 21 |
Interactive polygon annotation component for Gradio with multi-selection, hover effects, and customizable appearance
|
| 22 |
|
|
|
|
| 746 |
) -> dict | None:
|
| 747 |
return value
|
| 748 |
```
|
| 749 |
+
|
src/backend/gradio_polygonannotator/templates/component/Index-CzQ497_5.js
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|
src/backend/gradio_polygonannotator/templates/component/SharedSystems-Cd96rNl9.js
ADDED
|
@@ -0,0 +1,2766 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { q as He, G as ne, t as ie, u as ze, k as oe, M as v, v as le, E as u, e as O, x as S, y as We, z as F, F as b, R as L, H as ue, I as Ve, s as m, S as f, h as B, w as H, J, K as Ne, b as X, B as k, i as U, L as je, N as M, j as T, O as w, Q as $e, a as qe, V as de, W as ce, X as he, Y as fe, C as P, Z as Ke, _ as A, $ as Q, D as z, a0 as Ye, P as Je, c as Xe, T as Z, a1 as ee, a2 as Qe, a3 as Ze, a4 as et } from "./Index-CzQ497_5.js";
|
| 2 |
+
import { S as pe, B as me, c as tt } from "./colorToUniform-zJcCVLeu.js";
|
| 3 |
+
const ve = class I extends He {
|
| 4 |
+
/**
|
| 5 |
+
* @param options - The optional parameters of this filter.
|
| 6 |
+
*/
|
| 7 |
+
constructor(e) {
|
| 8 |
+
e = { ...I.defaultOptions, ...e }, super(e), this.enabled = !0, this._state = pe.for2d(), this.blendMode = e.blendMode, this.padding = e.padding, typeof e.antialias == "boolean" ? this.antialias = e.antialias ? "on" : "off" : this.antialias = e.antialias, this.resolution = e.resolution, this.blendRequired = e.blendRequired, this.clipToViewport = e.clipToViewport, this.addResource("uTexture", 0, 1);
|
| 9 |
+
}
|
| 10 |
+
/**
|
| 11 |
+
* Applies the filter
|
| 12 |
+
* @param filterManager - The renderer to retrieve the filter from
|
| 13 |
+
* @param input - The input render target.
|
| 14 |
+
* @param output - The target to output to.
|
| 15 |
+
* @param clearMode - Should the output be cleared before rendering to it
|
| 16 |
+
*/
|
| 17 |
+
apply(e, t, r, s) {
|
| 18 |
+
e.applyFilter(this, t, r, s);
|
| 19 |
+
}
|
| 20 |
+
/**
|
| 21 |
+
* Get the blend mode of the filter.
|
| 22 |
+
* @default "normal"
|
| 23 |
+
*/
|
| 24 |
+
get blendMode() {
|
| 25 |
+
return this._state.blendMode;
|
| 26 |
+
}
|
| 27 |
+
/** Sets the blend mode of the filter. */
|
| 28 |
+
set blendMode(e) {
|
| 29 |
+
this._state.blendMode = e;
|
| 30 |
+
}
|
| 31 |
+
/**
|
| 32 |
+
* A short hand function to create a filter based of a vertex and fragment shader src.
|
| 33 |
+
* @param options
|
| 34 |
+
* @returns A shiny new PixiJS filter!
|
| 35 |
+
*/
|
| 36 |
+
static from(e) {
|
| 37 |
+
const { gpu: t, gl: r, ...s } = e;
|
| 38 |
+
let a, i;
|
| 39 |
+
return t && (a = ne.from(t)), r && (i = ie.from(r)), new I({
|
| 40 |
+
gpuProgram: a,
|
| 41 |
+
glProgram: i,
|
| 42 |
+
...s
|
| 43 |
+
});
|
| 44 |
+
}
|
| 45 |
+
};
|
| 46 |
+
ve.defaultOptions = {
|
| 47 |
+
blendMode: "normal",
|
| 48 |
+
resolution: 1,
|
| 49 |
+
padding: 0,
|
| 50 |
+
antialias: "off",
|
| 51 |
+
blendRequired: !1,
|
| 52 |
+
clipToViewport: !0
|
| 53 |
+
};
|
| 54 |
+
let rt = ve;
|
| 55 |
+
var st = `in vec2 vMaskCoord;
|
| 56 |
+
in vec2 vTextureCoord;
|
| 57 |
+
|
| 58 |
+
uniform sampler2D uTexture;
|
| 59 |
+
uniform sampler2D uMaskTexture;
|
| 60 |
+
|
| 61 |
+
uniform float uAlpha;
|
| 62 |
+
uniform vec4 uMaskClamp;
|
| 63 |
+
uniform float uInverse;
|
| 64 |
+
|
| 65 |
+
out vec4 finalColor;
|
| 66 |
+
|
| 67 |
+
void main(void)
|
| 68 |
+
{
|
| 69 |
+
float clip = step(3.5,
|
| 70 |
+
step(uMaskClamp.x, vMaskCoord.x) +
|
| 71 |
+
step(uMaskClamp.y, vMaskCoord.y) +
|
| 72 |
+
step(vMaskCoord.x, uMaskClamp.z) +
|
| 73 |
+
step(vMaskCoord.y, uMaskClamp.w));
|
| 74 |
+
|
| 75 |
+
// TODO look into why this is needed
|
| 76 |
+
float npmAlpha = uAlpha;
|
| 77 |
+
vec4 original = texture(uTexture, vTextureCoord);
|
| 78 |
+
vec4 masky = texture(uMaskTexture, vMaskCoord);
|
| 79 |
+
float alphaMul = 1.0 - npmAlpha * (1.0 - masky.a);
|
| 80 |
+
|
| 81 |
+
float a = alphaMul * masky.r * npmAlpha * clip;
|
| 82 |
+
|
| 83 |
+
if (uInverse == 1.0) {
|
| 84 |
+
a = 1.0 - a;
|
| 85 |
+
}
|
| 86 |
+
|
| 87 |
+
finalColor = original * a;
|
| 88 |
+
}
|
| 89 |
+
`, at = `in vec2 aPosition;
|
| 90 |
+
|
| 91 |
+
out vec2 vTextureCoord;
|
| 92 |
+
out vec2 vMaskCoord;
|
| 93 |
+
|
| 94 |
+
|
| 95 |
+
uniform vec4 uInputSize;
|
| 96 |
+
uniform vec4 uOutputFrame;
|
| 97 |
+
uniform vec4 uOutputTexture;
|
| 98 |
+
uniform mat3 uFilterMatrix;
|
| 99 |
+
|
| 100 |
+
vec4 filterVertexPosition( vec2 aPosition )
|
| 101 |
+
{
|
| 102 |
+
vec2 position = aPosition * uOutputFrame.zw + uOutputFrame.xy;
|
| 103 |
+
|
| 104 |
+
position.x = position.x * (2.0 / uOutputTexture.x) - 1.0;
|
| 105 |
+
position.y = position.y * (2.0*uOutputTexture.z / uOutputTexture.y) - uOutputTexture.z;
|
| 106 |
+
|
| 107 |
+
return vec4(position, 0.0, 1.0);
|
| 108 |
+
}
|
| 109 |
+
|
| 110 |
+
vec2 filterTextureCoord( vec2 aPosition )
|
| 111 |
+
{
|
| 112 |
+
return aPosition * (uOutputFrame.zw * uInputSize.zw);
|
| 113 |
+
}
|
| 114 |
+
|
| 115 |
+
vec2 getFilterCoord( vec2 aPosition )
|
| 116 |
+
{
|
| 117 |
+
return ( uFilterMatrix * vec3( filterTextureCoord(aPosition), 1.0) ).xy;
|
| 118 |
+
}
|
| 119 |
+
|
| 120 |
+
void main(void)
|
| 121 |
+
{
|
| 122 |
+
gl_Position = filterVertexPosition(aPosition);
|
| 123 |
+
vTextureCoord = filterTextureCoord(aPosition);
|
| 124 |
+
vMaskCoord = getFilterCoord(aPosition);
|
| 125 |
+
}
|
| 126 |
+
`, te = `struct GlobalFilterUniforms {
|
| 127 |
+
uInputSize:vec4<f32>,
|
| 128 |
+
uInputPixel:vec4<f32>,
|
| 129 |
+
uInputClamp:vec4<f32>,
|
| 130 |
+
uOutputFrame:vec4<f32>,
|
| 131 |
+
uGlobalFrame:vec4<f32>,
|
| 132 |
+
uOutputTexture:vec4<f32>,
|
| 133 |
+
};
|
| 134 |
+
|
| 135 |
+
struct MaskUniforms {
|
| 136 |
+
uFilterMatrix:mat3x3<f32>,
|
| 137 |
+
uMaskClamp:vec4<f32>,
|
| 138 |
+
uAlpha:f32,
|
| 139 |
+
uInverse:f32,
|
| 140 |
+
};
|
| 141 |
+
|
| 142 |
+
@group(0) @binding(0) var<uniform> gfu: GlobalFilterUniforms;
|
| 143 |
+
@group(0) @binding(1) var uTexture: texture_2d<f32>;
|
| 144 |
+
@group(0) @binding(2) var uSampler : sampler;
|
| 145 |
+
|
| 146 |
+
@group(1) @binding(0) var<uniform> filterUniforms : MaskUniforms;
|
| 147 |
+
@group(1) @binding(1) var uMaskTexture: texture_2d<f32>;
|
| 148 |
+
|
| 149 |
+
struct VSOutput {
|
| 150 |
+
@builtin(position) position: vec4<f32>,
|
| 151 |
+
@location(0) uv : vec2<f32>,
|
| 152 |
+
@location(1) filterUv : vec2<f32>,
|
| 153 |
+
};
|
| 154 |
+
|
| 155 |
+
fn filterVertexPosition(aPosition:vec2<f32>) -> vec4<f32>
|
| 156 |
+
{
|
| 157 |
+
var position = aPosition * gfu.uOutputFrame.zw + gfu.uOutputFrame.xy;
|
| 158 |
+
|
| 159 |
+
position.x = position.x * (2.0 / gfu.uOutputTexture.x) - 1.0;
|
| 160 |
+
position.y = position.y * (2.0*gfu.uOutputTexture.z / gfu.uOutputTexture.y) - gfu.uOutputTexture.z;
|
| 161 |
+
|
| 162 |
+
return vec4(position, 0.0, 1.0);
|
| 163 |
+
}
|
| 164 |
+
|
| 165 |
+
fn filterTextureCoord( aPosition:vec2<f32> ) -> vec2<f32>
|
| 166 |
+
{
|
| 167 |
+
return aPosition * (gfu.uOutputFrame.zw * gfu.uInputSize.zw);
|
| 168 |
+
}
|
| 169 |
+
|
| 170 |
+
fn globalTextureCoord( aPosition:vec2<f32> ) -> vec2<f32>
|
| 171 |
+
{
|
| 172 |
+
return (aPosition.xy / gfu.uGlobalFrame.zw) + (gfu.uGlobalFrame.xy / gfu.uGlobalFrame.zw);
|
| 173 |
+
}
|
| 174 |
+
|
| 175 |
+
fn getFilterCoord(aPosition:vec2<f32> ) -> vec2<f32>
|
| 176 |
+
{
|
| 177 |
+
return ( filterUniforms.uFilterMatrix * vec3( filterTextureCoord(aPosition), 1.0) ).xy;
|
| 178 |
+
}
|
| 179 |
+
|
| 180 |
+
fn getSize() -> vec2<f32>
|
| 181 |
+
{
|
| 182 |
+
return gfu.uGlobalFrame.zw;
|
| 183 |
+
}
|
| 184 |
+
|
| 185 |
+
@vertex
|
| 186 |
+
fn mainVertex(
|
| 187 |
+
@location(0) aPosition : vec2<f32>,
|
| 188 |
+
) -> VSOutput {
|
| 189 |
+
return VSOutput(
|
| 190 |
+
filterVertexPosition(aPosition),
|
| 191 |
+
filterTextureCoord(aPosition),
|
| 192 |
+
getFilterCoord(aPosition)
|
| 193 |
+
);
|
| 194 |
+
}
|
| 195 |
+
|
| 196 |
+
@fragment
|
| 197 |
+
fn mainFragment(
|
| 198 |
+
@location(0) uv: vec2<f32>,
|
| 199 |
+
@location(1) filterUv: vec2<f32>,
|
| 200 |
+
@builtin(position) position: vec4<f32>
|
| 201 |
+
) -> @location(0) vec4<f32> {
|
| 202 |
+
|
| 203 |
+
var maskClamp = filterUniforms.uMaskClamp;
|
| 204 |
+
var uAlpha = filterUniforms.uAlpha;
|
| 205 |
+
|
| 206 |
+
var clip = step(3.5,
|
| 207 |
+
step(maskClamp.x, filterUv.x) +
|
| 208 |
+
step(maskClamp.y, filterUv.y) +
|
| 209 |
+
step(filterUv.x, maskClamp.z) +
|
| 210 |
+
step(filterUv.y, maskClamp.w));
|
| 211 |
+
|
| 212 |
+
var mask = textureSample(uMaskTexture, uSampler, filterUv);
|
| 213 |
+
var source = textureSample(uTexture, uSampler, uv);
|
| 214 |
+
var alphaMul = 1.0 - uAlpha * (1.0 - mask.a);
|
| 215 |
+
|
| 216 |
+
var a: f32 = alphaMul * mask.r * uAlpha * clip;
|
| 217 |
+
|
| 218 |
+
if (filterUniforms.uInverse == 1.0) {
|
| 219 |
+
a = 1.0 - a;
|
| 220 |
+
}
|
| 221 |
+
|
| 222 |
+
return source * a;
|
| 223 |
+
}
|
| 224 |
+
`;
|
| 225 |
+
class nt extends rt {
|
| 226 |
+
constructor(e) {
|
| 227 |
+
const { sprite: t, ...r } = e, s = new ze(t.texture), a = new oe({
|
| 228 |
+
uFilterMatrix: { value: new v(), type: "mat3x3<f32>" },
|
| 229 |
+
uMaskClamp: { value: s.uClampFrame, type: "vec4<f32>" },
|
| 230 |
+
uAlpha: { value: 1, type: "f32" },
|
| 231 |
+
uInverse: { value: e.inverse ? 1 : 0, type: "f32" }
|
| 232 |
+
}), i = ne.from({
|
| 233 |
+
vertex: {
|
| 234 |
+
source: te,
|
| 235 |
+
entryPoint: "mainVertex"
|
| 236 |
+
},
|
| 237 |
+
fragment: {
|
| 238 |
+
source: te,
|
| 239 |
+
entryPoint: "mainFragment"
|
| 240 |
+
}
|
| 241 |
+
}), o = ie.from({
|
| 242 |
+
vertex: at,
|
| 243 |
+
fragment: st,
|
| 244 |
+
name: "mask-filter"
|
| 245 |
+
});
|
| 246 |
+
super({
|
| 247 |
+
...r,
|
| 248 |
+
gpuProgram: i,
|
| 249 |
+
glProgram: o,
|
| 250 |
+
clipToViewport: !1,
|
| 251 |
+
resources: {
|
| 252 |
+
filterUniforms: a,
|
| 253 |
+
uMaskTexture: t.texture.source
|
| 254 |
+
}
|
| 255 |
+
}), this.sprite = t, this._textureMatrix = s;
|
| 256 |
+
}
|
| 257 |
+
set inverse(e) {
|
| 258 |
+
this.resources.filterUniforms.uniforms.uInverse = e ? 1 : 0;
|
| 259 |
+
}
|
| 260 |
+
get inverse() {
|
| 261 |
+
return this.resources.filterUniforms.uniforms.uInverse === 1;
|
| 262 |
+
}
|
| 263 |
+
apply(e, t, r, s) {
|
| 264 |
+
this._textureMatrix.texture = this.sprite.texture, e.calculateSpriteMatrix(
|
| 265 |
+
this.resources.filterUniforms.uniforms.uFilterMatrix,
|
| 266 |
+
this.sprite
|
| 267 |
+
).prepend(this._textureMatrix.mapCoord), this.resources.uMaskTexture = this.sprite.texture.source, e.applyFilter(this, t, r, s);
|
| 268 |
+
}
|
| 269 |
+
}
|
| 270 |
+
const W = class ge {
|
| 271 |
+
constructor(e, t) {
|
| 272 |
+
var r, s;
|
| 273 |
+
this.state = pe.for2d(), this._batchersByInstructionSet = /* @__PURE__ */ Object.create(null), this._activeBatches = /* @__PURE__ */ Object.create(null), this.renderer = e, this._adaptor = t, (s = (r = this._adaptor).init) == null || s.call(r, this);
|
| 274 |
+
}
|
| 275 |
+
static getBatcher(e) {
|
| 276 |
+
return new this._availableBatchers[e]();
|
| 277 |
+
}
|
| 278 |
+
buildStart(e) {
|
| 279 |
+
let t = this._batchersByInstructionSet[e.uid];
|
| 280 |
+
t || (t = this._batchersByInstructionSet[e.uid] = /* @__PURE__ */ Object.create(null), t.default || (t.default = new le({
|
| 281 |
+
maxTextures: this.renderer.limits.maxBatchableTextures
|
| 282 |
+
}))), this._activeBatches = t, this._activeBatch = this._activeBatches.default;
|
| 283 |
+
for (const r in this._activeBatches)
|
| 284 |
+
this._activeBatches[r].begin();
|
| 285 |
+
}
|
| 286 |
+
addToBatch(e, t) {
|
| 287 |
+
if (this._activeBatch.name !== e.batcherName) {
|
| 288 |
+
this._activeBatch.break(t);
|
| 289 |
+
let r = this._activeBatches[e.batcherName];
|
| 290 |
+
r || (r = this._activeBatches[e.batcherName] = ge.getBatcher(e.batcherName), r.begin()), this._activeBatch = r;
|
| 291 |
+
}
|
| 292 |
+
this._activeBatch.add(e);
|
| 293 |
+
}
|
| 294 |
+
break(e) {
|
| 295 |
+
this._activeBatch.break(e);
|
| 296 |
+
}
|
| 297 |
+
buildEnd(e) {
|
| 298 |
+
this._activeBatch.break(e);
|
| 299 |
+
const t = this._activeBatches;
|
| 300 |
+
for (const r in t) {
|
| 301 |
+
const s = t[r], a = s.geometry;
|
| 302 |
+
a.indexBuffer.setDataWithSize(s.indexBuffer, s.indexSize, !0), a.buffers[0].setDataWithSize(s.attributeBuffer.float32View, s.attributeSize, !1);
|
| 303 |
+
}
|
| 304 |
+
}
|
| 305 |
+
upload(e) {
|
| 306 |
+
const t = this._batchersByInstructionSet[e.uid];
|
| 307 |
+
for (const r in t) {
|
| 308 |
+
const s = t[r], a = s.geometry;
|
| 309 |
+
s.dirty && (s.dirty = !1, a.buffers[0].update(s.attributeSize * 4));
|
| 310 |
+
}
|
| 311 |
+
}
|
| 312 |
+
execute(e) {
|
| 313 |
+
if (e.action === "startBatch") {
|
| 314 |
+
const t = e.batcher, r = t.geometry, s = t.shader;
|
| 315 |
+
this._adaptor.start(this, r, s);
|
| 316 |
+
}
|
| 317 |
+
this._adaptor.execute(this, e);
|
| 318 |
+
}
|
| 319 |
+
destroy() {
|
| 320 |
+
this.state = null, this.renderer = null, this._adaptor = null;
|
| 321 |
+
for (const e in this._activeBatches)
|
| 322 |
+
this._activeBatches[e].destroy();
|
| 323 |
+
this._activeBatches = null;
|
| 324 |
+
}
|
| 325 |
+
};
|
| 326 |
+
W.extension = {
|
| 327 |
+
type: [
|
| 328 |
+
u.WebGLPipes,
|
| 329 |
+
u.WebGPUPipes,
|
| 330 |
+
u.CanvasPipes
|
| 331 |
+
],
|
| 332 |
+
name: "batch"
|
| 333 |
+
};
|
| 334 |
+
W._availableBatchers = /* @__PURE__ */ Object.create(null);
|
| 335 |
+
let xe = W;
|
| 336 |
+
O.handleByMap(u.Batcher, xe._availableBatchers);
|
| 337 |
+
O.add(le);
|
| 338 |
+
const It = {
|
| 339 |
+
name: "texture-bit",
|
| 340 |
+
vertex: {
|
| 341 |
+
header: (
|
| 342 |
+
/* wgsl */
|
| 343 |
+
`
|
| 344 |
+
|
| 345 |
+
struct TextureUniforms {
|
| 346 |
+
uTextureMatrix:mat3x3<f32>,
|
| 347 |
+
}
|
| 348 |
+
|
| 349 |
+
@group(2) @binding(2) var<uniform> textureUniforms : TextureUniforms;
|
| 350 |
+
`
|
| 351 |
+
),
|
| 352 |
+
main: (
|
| 353 |
+
/* wgsl */
|
| 354 |
+
`
|
| 355 |
+
uv = (textureUniforms.uTextureMatrix * vec3(uv, 1.0)).xy;
|
| 356 |
+
`
|
| 357 |
+
)
|
| 358 |
+
},
|
| 359 |
+
fragment: {
|
| 360 |
+
header: (
|
| 361 |
+
/* wgsl */
|
| 362 |
+
`
|
| 363 |
+
@group(2) @binding(0) var uTexture: texture_2d<f32>;
|
| 364 |
+
@group(2) @binding(1) var uSampler: sampler;
|
| 365 |
+
|
| 366 |
+
|
| 367 |
+
`
|
| 368 |
+
),
|
| 369 |
+
main: (
|
| 370 |
+
/* wgsl */
|
| 371 |
+
`
|
| 372 |
+
outColor = textureSample(uTexture, uSampler, vUV);
|
| 373 |
+
`
|
| 374 |
+
)
|
| 375 |
+
}
|
| 376 |
+
}, Gt = {
|
| 377 |
+
name: "texture-bit",
|
| 378 |
+
vertex: {
|
| 379 |
+
header: (
|
| 380 |
+
/* glsl */
|
| 381 |
+
`
|
| 382 |
+
uniform mat3 uTextureMatrix;
|
| 383 |
+
`
|
| 384 |
+
),
|
| 385 |
+
main: (
|
| 386 |
+
/* glsl */
|
| 387 |
+
`
|
| 388 |
+
uv = (uTextureMatrix * vec3(uv, 1.0)).xy;
|
| 389 |
+
`
|
| 390 |
+
)
|
| 391 |
+
},
|
| 392 |
+
fragment: {
|
| 393 |
+
header: (
|
| 394 |
+
/* glsl */
|
| 395 |
+
`
|
| 396 |
+
uniform sampler2D uTexture;
|
| 397 |
+
|
| 398 |
+
|
| 399 |
+
`
|
| 400 |
+
),
|
| 401 |
+
main: (
|
| 402 |
+
/* glsl */
|
| 403 |
+
`
|
| 404 |
+
outColor = texture(uTexture, vUV);
|
| 405 |
+
`
|
| 406 |
+
)
|
| 407 |
+
}
|
| 408 |
+
}, it = new F();
|
| 409 |
+
class ot extends ue {
|
| 410 |
+
constructor() {
|
| 411 |
+
super(), this.filters = [new nt({
|
| 412 |
+
sprite: new Ve(m.EMPTY),
|
| 413 |
+
inverse: !1,
|
| 414 |
+
resolution: "inherit",
|
| 415 |
+
antialias: "inherit"
|
| 416 |
+
})];
|
| 417 |
+
}
|
| 418 |
+
get sprite() {
|
| 419 |
+
return this.filters[0].sprite;
|
| 420 |
+
}
|
| 421 |
+
set sprite(e) {
|
| 422 |
+
this.filters[0].sprite = e;
|
| 423 |
+
}
|
| 424 |
+
get inverse() {
|
| 425 |
+
return this.filters[0].inverse;
|
| 426 |
+
}
|
| 427 |
+
set inverse(e) {
|
| 428 |
+
this.filters[0].inverse = e;
|
| 429 |
+
}
|
| 430 |
+
}
|
| 431 |
+
class _e {
|
| 432 |
+
constructor(e) {
|
| 433 |
+
this._activeMaskStage = [], this._renderer = e;
|
| 434 |
+
}
|
| 435 |
+
push(e, t, r) {
|
| 436 |
+
const s = this._renderer;
|
| 437 |
+
if (s.renderPipes.batch.break(r), r.add({
|
| 438 |
+
renderPipeId: "alphaMask",
|
| 439 |
+
action: "pushMaskBegin",
|
| 440 |
+
mask: e,
|
| 441 |
+
inverse: t._maskOptions.inverse,
|
| 442 |
+
canBundle: !1,
|
| 443 |
+
maskedContainer: t
|
| 444 |
+
}), e.inverse = t._maskOptions.inverse, e.renderMaskToTexture) {
|
| 445 |
+
const a = e.mask;
|
| 446 |
+
a.includeInBuild = !0, a.collectRenderables(
|
| 447 |
+
r,
|
| 448 |
+
s,
|
| 449 |
+
null
|
| 450 |
+
), a.includeInBuild = !1;
|
| 451 |
+
}
|
| 452 |
+
s.renderPipes.batch.break(r), r.add({
|
| 453 |
+
renderPipeId: "alphaMask",
|
| 454 |
+
action: "pushMaskEnd",
|
| 455 |
+
mask: e,
|
| 456 |
+
maskedContainer: t,
|
| 457 |
+
inverse: t._maskOptions.inverse,
|
| 458 |
+
canBundle: !1
|
| 459 |
+
});
|
| 460 |
+
}
|
| 461 |
+
pop(e, t, r) {
|
| 462 |
+
this._renderer.renderPipes.batch.break(r), r.add({
|
| 463 |
+
renderPipeId: "alphaMask",
|
| 464 |
+
action: "popMaskEnd",
|
| 465 |
+
mask: e,
|
| 466 |
+
inverse: t._maskOptions.inverse,
|
| 467 |
+
canBundle: !1
|
| 468 |
+
});
|
| 469 |
+
}
|
| 470 |
+
execute(e) {
|
| 471 |
+
const t = this._renderer, r = e.mask.renderMaskToTexture;
|
| 472 |
+
if (e.action === "pushMaskBegin") {
|
| 473 |
+
const s = S.get(ot);
|
| 474 |
+
if (s.inverse = e.inverse, r) {
|
| 475 |
+
e.mask.mask.measurable = !0;
|
| 476 |
+
const a = We(e.mask.mask, !0, it);
|
| 477 |
+
e.mask.mask.measurable = !1, a.ceil();
|
| 478 |
+
const i = t.renderTarget.renderTarget.colorTexture.source, o = b.getOptimalTexture(
|
| 479 |
+
a.width,
|
| 480 |
+
a.height,
|
| 481 |
+
i._resolution,
|
| 482 |
+
i.antialias
|
| 483 |
+
);
|
| 484 |
+
t.renderTarget.push(o, !0), t.globalUniforms.push({
|
| 485 |
+
offset: a,
|
| 486 |
+
worldColor: 4294967295
|
| 487 |
+
});
|
| 488 |
+
const l = s.sprite;
|
| 489 |
+
l.texture = o, l.worldTransform.tx = a.minX, l.worldTransform.ty = a.minY, this._activeMaskStage.push({
|
| 490 |
+
filterEffect: s,
|
| 491 |
+
maskedContainer: e.maskedContainer,
|
| 492 |
+
filterTexture: o
|
| 493 |
+
});
|
| 494 |
+
} else
|
| 495 |
+
s.sprite = e.mask.mask, this._activeMaskStage.push({
|
| 496 |
+
filterEffect: s,
|
| 497 |
+
maskedContainer: e.maskedContainer
|
| 498 |
+
});
|
| 499 |
+
} else if (e.action === "pushMaskEnd") {
|
| 500 |
+
const s = this._activeMaskStage[this._activeMaskStage.length - 1];
|
| 501 |
+
r && (t.type === L.WEBGL && t.renderTarget.finishRenderPass(), t.renderTarget.pop(), t.globalUniforms.pop()), t.filter.push({
|
| 502 |
+
renderPipeId: "filter",
|
| 503 |
+
action: "pushFilter",
|
| 504 |
+
container: s.maskedContainer,
|
| 505 |
+
filterEffect: s.filterEffect,
|
| 506 |
+
canBundle: !1
|
| 507 |
+
});
|
| 508 |
+
} else if (e.action === "popMaskEnd") {
|
| 509 |
+
t.filter.pop();
|
| 510 |
+
const s = this._activeMaskStage.pop();
|
| 511 |
+
r && b.returnTexture(s.filterTexture), S.return(s.filterEffect);
|
| 512 |
+
}
|
| 513 |
+
}
|
| 514 |
+
destroy() {
|
| 515 |
+
this._renderer = null, this._activeMaskStage = null;
|
| 516 |
+
}
|
| 517 |
+
}
|
| 518 |
+
_e.extension = {
|
| 519 |
+
type: [
|
| 520 |
+
u.WebGLPipes,
|
| 521 |
+
u.WebGPUPipes,
|
| 522 |
+
u.CanvasPipes
|
| 523 |
+
],
|
| 524 |
+
name: "alphaMask"
|
| 525 |
+
};
|
| 526 |
+
class be {
|
| 527 |
+
constructor(e) {
|
| 528 |
+
this._colorStack = [], this._colorStackIndex = 0, this._currentColor = 0, this._renderer = e;
|
| 529 |
+
}
|
| 530 |
+
buildStart() {
|
| 531 |
+
this._colorStack[0] = 15, this._colorStackIndex = 1, this._currentColor = 15;
|
| 532 |
+
}
|
| 533 |
+
push(e, t, r) {
|
| 534 |
+
this._renderer.renderPipes.batch.break(r);
|
| 535 |
+
const a = this._colorStack;
|
| 536 |
+
a[this._colorStackIndex] = a[this._colorStackIndex - 1] & e.mask;
|
| 537 |
+
const i = this._colorStack[this._colorStackIndex];
|
| 538 |
+
i !== this._currentColor && (this._currentColor = i, r.add({
|
| 539 |
+
renderPipeId: "colorMask",
|
| 540 |
+
colorMask: i,
|
| 541 |
+
canBundle: !1
|
| 542 |
+
})), this._colorStackIndex++;
|
| 543 |
+
}
|
| 544 |
+
pop(e, t, r) {
|
| 545 |
+
this._renderer.renderPipes.batch.break(r);
|
| 546 |
+
const a = this._colorStack;
|
| 547 |
+
this._colorStackIndex--;
|
| 548 |
+
const i = a[this._colorStackIndex - 1];
|
| 549 |
+
i !== this._currentColor && (this._currentColor = i, r.add({
|
| 550 |
+
renderPipeId: "colorMask",
|
| 551 |
+
colorMask: i,
|
| 552 |
+
canBundle: !1
|
| 553 |
+
}));
|
| 554 |
+
}
|
| 555 |
+
execute(e) {
|
| 556 |
+
this._renderer.colorMask.setMask(e.colorMask);
|
| 557 |
+
}
|
| 558 |
+
destroy() {
|
| 559 |
+
this._renderer = null, this._colorStack = null;
|
| 560 |
+
}
|
| 561 |
+
}
|
| 562 |
+
be.extension = {
|
| 563 |
+
type: [
|
| 564 |
+
u.WebGLPipes,
|
| 565 |
+
u.WebGPUPipes,
|
| 566 |
+
u.CanvasPipes
|
| 567 |
+
],
|
| 568 |
+
name: "colorMask"
|
| 569 |
+
};
|
| 570 |
+
class Te {
|
| 571 |
+
constructor(e) {
|
| 572 |
+
this._maskStackHash = {}, this._maskHash = /* @__PURE__ */ new WeakMap(), this._renderer = e;
|
| 573 |
+
}
|
| 574 |
+
push(e, t, r) {
|
| 575 |
+
var s;
|
| 576 |
+
const a = e, i = this._renderer;
|
| 577 |
+
i.renderPipes.batch.break(r), i.renderPipes.blendMode.setBlendMode(a.mask, "none", r), r.add({
|
| 578 |
+
renderPipeId: "stencilMask",
|
| 579 |
+
action: "pushMaskBegin",
|
| 580 |
+
mask: e,
|
| 581 |
+
inverse: t._maskOptions.inverse,
|
| 582 |
+
canBundle: !1
|
| 583 |
+
});
|
| 584 |
+
const o = a.mask;
|
| 585 |
+
o.includeInBuild = !0, this._maskHash.has(a) || this._maskHash.set(a, {
|
| 586 |
+
instructionsStart: 0,
|
| 587 |
+
instructionsLength: 0
|
| 588 |
+
});
|
| 589 |
+
const l = this._maskHash.get(a);
|
| 590 |
+
l.instructionsStart = r.instructionSize, o.collectRenderables(
|
| 591 |
+
r,
|
| 592 |
+
i,
|
| 593 |
+
null
|
| 594 |
+
), o.includeInBuild = !1, i.renderPipes.batch.break(r), r.add({
|
| 595 |
+
renderPipeId: "stencilMask",
|
| 596 |
+
action: "pushMaskEnd",
|
| 597 |
+
mask: e,
|
| 598 |
+
inverse: t._maskOptions.inverse,
|
| 599 |
+
canBundle: !1
|
| 600 |
+
});
|
| 601 |
+
const d = r.instructionSize - l.instructionsStart - 1;
|
| 602 |
+
l.instructionsLength = d;
|
| 603 |
+
const c = i.renderTarget.renderTarget.uid;
|
| 604 |
+
(s = this._maskStackHash)[c] ?? (s[c] = 0);
|
| 605 |
+
}
|
| 606 |
+
pop(e, t, r) {
|
| 607 |
+
const s = e, a = this._renderer;
|
| 608 |
+
a.renderPipes.batch.break(r), a.renderPipes.blendMode.setBlendMode(s.mask, "none", r), r.add({
|
| 609 |
+
renderPipeId: "stencilMask",
|
| 610 |
+
action: "popMaskBegin",
|
| 611 |
+
inverse: t._maskOptions.inverse,
|
| 612 |
+
canBundle: !1
|
| 613 |
+
});
|
| 614 |
+
const i = this._maskHash.get(e);
|
| 615 |
+
for (let o = 0; o < i.instructionsLength; o++)
|
| 616 |
+
r.instructions[r.instructionSize++] = r.instructions[i.instructionsStart++];
|
| 617 |
+
r.add({
|
| 618 |
+
renderPipeId: "stencilMask",
|
| 619 |
+
action: "popMaskEnd",
|
| 620 |
+
canBundle: !1
|
| 621 |
+
});
|
| 622 |
+
}
|
| 623 |
+
execute(e) {
|
| 624 |
+
var t;
|
| 625 |
+
const r = this._renderer, s = r.renderTarget.renderTarget.uid;
|
| 626 |
+
let a = (t = this._maskStackHash)[s] ?? (t[s] = 0);
|
| 627 |
+
e.action === "pushMaskBegin" ? (r.renderTarget.ensureDepthStencil(), r.stencil.setStencilMode(f.RENDERING_MASK_ADD, a), a++, r.colorMask.setMask(0)) : e.action === "pushMaskEnd" ? (e.inverse ? r.stencil.setStencilMode(f.INVERSE_MASK_ACTIVE, a) : r.stencil.setStencilMode(f.MASK_ACTIVE, a), r.colorMask.setMask(15)) : e.action === "popMaskBegin" ? (r.colorMask.setMask(0), a !== 0 ? r.stencil.setStencilMode(f.RENDERING_MASK_REMOVE, a) : (r.renderTarget.clear(null, B.STENCIL), r.stencil.setStencilMode(f.DISABLED, a)), a--) : e.action === "popMaskEnd" && (e.inverse ? r.stencil.setStencilMode(f.INVERSE_MASK_ACTIVE, a) : r.stencil.setStencilMode(f.MASK_ACTIVE, a), r.colorMask.setMask(15)), this._maskStackHash[s] = a;
|
| 628 |
+
}
|
| 629 |
+
destroy() {
|
| 630 |
+
this._renderer = null, this._maskStackHash = null, this._maskHash = null;
|
| 631 |
+
}
|
| 632 |
+
}
|
| 633 |
+
Te.extension = {
|
| 634 |
+
type: [
|
| 635 |
+
u.WebGLPipes,
|
| 636 |
+
u.WebGPUPipes,
|
| 637 |
+
u.CanvasPipes
|
| 638 |
+
],
|
| 639 |
+
name: "stencilMask"
|
| 640 |
+
};
|
| 641 |
+
function Et(n, e) {
|
| 642 |
+
for (const t in n.attributes) {
|
| 643 |
+
const r = n.attributes[t], s = e[t];
|
| 644 |
+
s ? (r.format ?? (r.format = s.format), r.offset ?? (r.offset = s.offset), r.instance ?? (r.instance = s.instance)) : H(`Attribute ${t} is not present in the shader, but is present in the geometry. Unable to infer attribute details.`);
|
| 645 |
+
}
|
| 646 |
+
lt(n);
|
| 647 |
+
}
|
| 648 |
+
function lt(n) {
|
| 649 |
+
const { buffers: e, attributes: t } = n, r = {}, s = {};
|
| 650 |
+
for (const a in e) {
|
| 651 |
+
const i = e[a];
|
| 652 |
+
r[i.uid] = 0, s[i.uid] = 0;
|
| 653 |
+
}
|
| 654 |
+
for (const a in t) {
|
| 655 |
+
const i = t[a];
|
| 656 |
+
r[i.buffer.uid] += J(i.format).stride;
|
| 657 |
+
}
|
| 658 |
+
for (const a in t) {
|
| 659 |
+
const i = t[a];
|
| 660 |
+
i.stride ?? (i.stride = r[i.buffer.uid]), i.start ?? (i.start = s[i.buffer.uid]), s[i.buffer.uid] += J(i.format).stride;
|
| 661 |
+
}
|
| 662 |
+
}
|
| 663 |
+
const _ = [];
|
| 664 |
+
_[f.NONE] = void 0;
|
| 665 |
+
_[f.DISABLED] = {
|
| 666 |
+
stencilWriteMask: 0,
|
| 667 |
+
stencilReadMask: 0
|
| 668 |
+
};
|
| 669 |
+
_[f.RENDERING_MASK_ADD] = {
|
| 670 |
+
stencilFront: {
|
| 671 |
+
compare: "equal",
|
| 672 |
+
passOp: "increment-clamp"
|
| 673 |
+
},
|
| 674 |
+
stencilBack: {
|
| 675 |
+
compare: "equal",
|
| 676 |
+
passOp: "increment-clamp"
|
| 677 |
+
}
|
| 678 |
+
};
|
| 679 |
+
_[f.RENDERING_MASK_REMOVE] = {
|
| 680 |
+
stencilFront: {
|
| 681 |
+
compare: "equal",
|
| 682 |
+
passOp: "decrement-clamp"
|
| 683 |
+
},
|
| 684 |
+
stencilBack: {
|
| 685 |
+
compare: "equal",
|
| 686 |
+
passOp: "decrement-clamp"
|
| 687 |
+
}
|
| 688 |
+
};
|
| 689 |
+
_[f.MASK_ACTIVE] = {
|
| 690 |
+
stencilWriteMask: 0,
|
| 691 |
+
stencilFront: {
|
| 692 |
+
compare: "equal",
|
| 693 |
+
passOp: "keep"
|
| 694 |
+
},
|
| 695 |
+
stencilBack: {
|
| 696 |
+
compare: "equal",
|
| 697 |
+
passOp: "keep"
|
| 698 |
+
}
|
| 699 |
+
};
|
| 700 |
+
_[f.INVERSE_MASK_ACTIVE] = {
|
| 701 |
+
stencilWriteMask: 0,
|
| 702 |
+
stencilFront: {
|
| 703 |
+
compare: "not-equal",
|
| 704 |
+
passOp: "keep"
|
| 705 |
+
},
|
| 706 |
+
stencilBack: {
|
| 707 |
+
compare: "not-equal",
|
| 708 |
+
passOp: "keep"
|
| 709 |
+
}
|
| 710 |
+
};
|
| 711 |
+
class Dt {
|
| 712 |
+
constructor(e) {
|
| 713 |
+
this._syncFunctionHash = /* @__PURE__ */ Object.create(null), this._adaptor = e, this._systemCheck();
|
| 714 |
+
}
|
| 715 |
+
/**
|
| 716 |
+
* Overridable function by `pixi.js/unsafe-eval` to silence
|
| 717 |
+
* throwing an error if platform doesn't support unsafe-evals.
|
| 718 |
+
* @private
|
| 719 |
+
*/
|
| 720 |
+
_systemCheck() {
|
| 721 |
+
if (!Ne())
|
| 722 |
+
throw new Error("Current environment does not allow unsafe-eval, please use pixi.js/unsafe-eval module to enable support.");
|
| 723 |
+
}
|
| 724 |
+
ensureUniformGroup(e) {
|
| 725 |
+
const t = this.getUniformGroupData(e);
|
| 726 |
+
e.buffer || (e.buffer = new X({
|
| 727 |
+
data: new Float32Array(t.layout.size / 4),
|
| 728 |
+
usage: k.UNIFORM | k.COPY_DST
|
| 729 |
+
}));
|
| 730 |
+
}
|
| 731 |
+
getUniformGroupData(e) {
|
| 732 |
+
return this._syncFunctionHash[e._signature] || this._initUniformGroup(e);
|
| 733 |
+
}
|
| 734 |
+
_initUniformGroup(e) {
|
| 735 |
+
const t = e._signature;
|
| 736 |
+
let r = this._syncFunctionHash[t];
|
| 737 |
+
if (!r) {
|
| 738 |
+
const s = Object.keys(e.uniformStructures).map((o) => e.uniformStructures[o]), a = this._adaptor.createUboElements(s), i = this._generateUboSync(a.uboElements);
|
| 739 |
+
r = this._syncFunctionHash[t] = {
|
| 740 |
+
layout: a,
|
| 741 |
+
syncFunction: i
|
| 742 |
+
};
|
| 743 |
+
}
|
| 744 |
+
return this._syncFunctionHash[t];
|
| 745 |
+
}
|
| 746 |
+
_generateUboSync(e) {
|
| 747 |
+
return this._adaptor.generateUboSync(e);
|
| 748 |
+
}
|
| 749 |
+
syncUniformGroup(e, t, r) {
|
| 750 |
+
const s = this.getUniformGroupData(e);
|
| 751 |
+
e.buffer || (e.buffer = new X({
|
| 752 |
+
data: new Float32Array(s.layout.size / 4),
|
| 753 |
+
usage: k.UNIFORM | k.COPY_DST
|
| 754 |
+
}));
|
| 755 |
+
let a = null;
|
| 756 |
+
return t || (t = e.buffer.data, a = e.buffer.dataInt32), r || (r = 0), s.syncFunction(e.uniforms, t, a, r), !0;
|
| 757 |
+
}
|
| 758 |
+
updateUniformGroup(e) {
|
| 759 |
+
if (e.isStatic && !e._dirtyId)
|
| 760 |
+
return !1;
|
| 761 |
+
e._dirtyId = 0;
|
| 762 |
+
const t = this.syncUniformGroup(e);
|
| 763 |
+
return e.buffer.update(), t;
|
| 764 |
+
}
|
| 765 |
+
destroy() {
|
| 766 |
+
this._syncFunctionHash = null;
|
| 767 |
+
}
|
| 768 |
+
}
|
| 769 |
+
const C = [
|
| 770 |
+
// uploading pixi matrix object to mat3
|
| 771 |
+
{
|
| 772 |
+
type: "mat3x3<f32>",
|
| 773 |
+
test: (n) => n.value.a !== void 0,
|
| 774 |
+
ubo: `
|
| 775 |
+
var matrix = uv[name].toArray(true);
|
| 776 |
+
data[offset] = matrix[0];
|
| 777 |
+
data[offset + 1] = matrix[1];
|
| 778 |
+
data[offset + 2] = matrix[2];
|
| 779 |
+
data[offset + 4] = matrix[3];
|
| 780 |
+
data[offset + 5] = matrix[4];
|
| 781 |
+
data[offset + 6] = matrix[5];
|
| 782 |
+
data[offset + 8] = matrix[6];
|
| 783 |
+
data[offset + 9] = matrix[7];
|
| 784 |
+
data[offset + 10] = matrix[8];
|
| 785 |
+
`,
|
| 786 |
+
uniform: `
|
| 787 |
+
gl.uniformMatrix3fv(ud[name].location, false, uv[name].toArray(true));
|
| 788 |
+
`
|
| 789 |
+
},
|
| 790 |
+
// uploading a pixi rectangle as a vec4
|
| 791 |
+
{
|
| 792 |
+
type: "vec4<f32>",
|
| 793 |
+
test: (n) => n.type === "vec4<f32>" && n.size === 1 && n.value.width !== void 0,
|
| 794 |
+
ubo: `
|
| 795 |
+
v = uv[name];
|
| 796 |
+
data[offset] = v.x;
|
| 797 |
+
data[offset + 1] = v.y;
|
| 798 |
+
data[offset + 2] = v.width;
|
| 799 |
+
data[offset + 3] = v.height;
|
| 800 |
+
`,
|
| 801 |
+
uniform: `
|
| 802 |
+
cv = ud[name].value;
|
| 803 |
+
v = uv[name];
|
| 804 |
+
if (cv[0] !== v.x || cv[1] !== v.y || cv[2] !== v.width || cv[3] !== v.height) {
|
| 805 |
+
cv[0] = v.x;
|
| 806 |
+
cv[1] = v.y;
|
| 807 |
+
cv[2] = v.width;
|
| 808 |
+
cv[3] = v.height;
|
| 809 |
+
gl.uniform4f(ud[name].location, v.x, v.y, v.width, v.height);
|
| 810 |
+
}
|
| 811 |
+
`
|
| 812 |
+
},
|
| 813 |
+
// uploading a pixi point as a vec2
|
| 814 |
+
{
|
| 815 |
+
type: "vec2<f32>",
|
| 816 |
+
test: (n) => n.type === "vec2<f32>" && n.size === 1 && n.value.x !== void 0,
|
| 817 |
+
ubo: `
|
| 818 |
+
v = uv[name];
|
| 819 |
+
data[offset] = v.x;
|
| 820 |
+
data[offset + 1] = v.y;
|
| 821 |
+
`,
|
| 822 |
+
uniform: `
|
| 823 |
+
cv = ud[name].value;
|
| 824 |
+
v = uv[name];
|
| 825 |
+
if (cv[0] !== v.x || cv[1] !== v.y) {
|
| 826 |
+
cv[0] = v.x;
|
| 827 |
+
cv[1] = v.y;
|
| 828 |
+
gl.uniform2f(ud[name].location, v.x, v.y);
|
| 829 |
+
}
|
| 830 |
+
`
|
| 831 |
+
},
|
| 832 |
+
// uploading a pixi color as a vec4
|
| 833 |
+
{
|
| 834 |
+
type: "vec4<f32>",
|
| 835 |
+
test: (n) => n.type === "vec4<f32>" && n.size === 1 && n.value.red !== void 0,
|
| 836 |
+
ubo: `
|
| 837 |
+
v = uv[name];
|
| 838 |
+
data[offset] = v.red;
|
| 839 |
+
data[offset + 1] = v.green;
|
| 840 |
+
data[offset + 2] = v.blue;
|
| 841 |
+
data[offset + 3] = v.alpha;
|
| 842 |
+
`,
|
| 843 |
+
uniform: `
|
| 844 |
+
cv = ud[name].value;
|
| 845 |
+
v = uv[name];
|
| 846 |
+
if (cv[0] !== v.red || cv[1] !== v.green || cv[2] !== v.blue || cv[3] !== v.alpha) {
|
| 847 |
+
cv[0] = v.red;
|
| 848 |
+
cv[1] = v.green;
|
| 849 |
+
cv[2] = v.blue;
|
| 850 |
+
cv[3] = v.alpha;
|
| 851 |
+
gl.uniform4f(ud[name].location, v.red, v.green, v.blue, v.alpha);
|
| 852 |
+
}
|
| 853 |
+
`
|
| 854 |
+
},
|
| 855 |
+
// uploading a pixi color as a vec3
|
| 856 |
+
{
|
| 857 |
+
type: "vec3<f32>",
|
| 858 |
+
test: (n) => n.type === "vec3<f32>" && n.size === 1 && n.value.red !== void 0,
|
| 859 |
+
ubo: `
|
| 860 |
+
v = uv[name];
|
| 861 |
+
data[offset] = v.red;
|
| 862 |
+
data[offset + 1] = v.green;
|
| 863 |
+
data[offset + 2] = v.blue;
|
| 864 |
+
`,
|
| 865 |
+
uniform: `
|
| 866 |
+
cv = ud[name].value;
|
| 867 |
+
v = uv[name];
|
| 868 |
+
if (cv[0] !== v.red || cv[1] !== v.green || cv[2] !== v.blue) {
|
| 869 |
+
cv[0] = v.red;
|
| 870 |
+
cv[1] = v.green;
|
| 871 |
+
cv[2] = v.blue;
|
| 872 |
+
gl.uniform3f(ud[name].location, v.red, v.green, v.blue);
|
| 873 |
+
}
|
| 874 |
+
`
|
| 875 |
+
}
|
| 876 |
+
];
|
| 877 |
+
function Ot(n, e, t, r) {
|
| 878 |
+
const s = [`
|
| 879 |
+
var v = null;
|
| 880 |
+
var v2 = null;
|
| 881 |
+
var t = 0;
|
| 882 |
+
var index = 0;
|
| 883 |
+
var name = null;
|
| 884 |
+
var arrayOffset = null;
|
| 885 |
+
`];
|
| 886 |
+
let a = 0;
|
| 887 |
+
for (let o = 0; o < n.length; o++) {
|
| 888 |
+
const l = n[o], d = l.data.name;
|
| 889 |
+
let c = !1, h = 0;
|
| 890 |
+
for (let p = 0; p < C.length; p++)
|
| 891 |
+
if (C[p].test(l.data)) {
|
| 892 |
+
h = l.offset / 4, s.push(
|
| 893 |
+
`name = "${d}";`,
|
| 894 |
+
`offset += ${h - a};`,
|
| 895 |
+
C[p][e] || C[p].ubo
|
| 896 |
+
), c = !0;
|
| 897 |
+
break;
|
| 898 |
+
}
|
| 899 |
+
if (!c)
|
| 900 |
+
if (l.data.size > 1)
|
| 901 |
+
h = l.offset / 4, s.push(t(l, h - a));
|
| 902 |
+
else {
|
| 903 |
+
const p = r[l.data.type];
|
| 904 |
+
h = l.offset / 4, s.push(
|
| 905 |
+
/* wgsl */
|
| 906 |
+
`
|
| 907 |
+
v = uv.${d};
|
| 908 |
+
offset += ${h - a};
|
| 909 |
+
${p};
|
| 910 |
+
`
|
| 911 |
+
);
|
| 912 |
+
}
|
| 913 |
+
a = h;
|
| 914 |
+
}
|
| 915 |
+
const i = s.join(`
|
| 916 |
+
`);
|
| 917 |
+
return new Function(
|
| 918 |
+
"uv",
|
| 919 |
+
"data",
|
| 920 |
+
"dataInt32",
|
| 921 |
+
"offset",
|
| 922 |
+
i
|
| 923 |
+
);
|
| 924 |
+
}
|
| 925 |
+
function g(n, e) {
|
| 926 |
+
return `
|
| 927 |
+
for (let i = 0; i < ${n * e}; i++) {
|
| 928 |
+
data[offset + (((i / ${n})|0) * 4) + (i % ${n})] = v[i];
|
| 929 |
+
}
|
| 930 |
+
`;
|
| 931 |
+
}
|
| 932 |
+
const ut = {
|
| 933 |
+
f32: `
|
| 934 |
+
data[offset] = v;`,
|
| 935 |
+
i32: `
|
| 936 |
+
dataInt32[offset] = v;`,
|
| 937 |
+
"vec2<f32>": `
|
| 938 |
+
data[offset] = v[0];
|
| 939 |
+
data[offset + 1] = v[1];`,
|
| 940 |
+
"vec3<f32>": `
|
| 941 |
+
data[offset] = v[0];
|
| 942 |
+
data[offset + 1] = v[1];
|
| 943 |
+
data[offset + 2] = v[2];`,
|
| 944 |
+
"vec4<f32>": `
|
| 945 |
+
data[offset] = v[0];
|
| 946 |
+
data[offset + 1] = v[1];
|
| 947 |
+
data[offset + 2] = v[2];
|
| 948 |
+
data[offset + 3] = v[3];`,
|
| 949 |
+
"vec2<i32>": `
|
| 950 |
+
dataInt32[offset] = v[0];
|
| 951 |
+
dataInt32[offset + 1] = v[1];`,
|
| 952 |
+
"vec3<i32>": `
|
| 953 |
+
dataInt32[offset] = v[0];
|
| 954 |
+
dataInt32[offset + 1] = v[1];
|
| 955 |
+
dataInt32[offset + 2] = v[2];`,
|
| 956 |
+
"vec4<i32>": `
|
| 957 |
+
dataInt32[offset] = v[0];
|
| 958 |
+
dataInt32[offset + 1] = v[1];
|
| 959 |
+
dataInt32[offset + 2] = v[2];
|
| 960 |
+
dataInt32[offset + 3] = v[3];`,
|
| 961 |
+
"mat2x2<f32>": `
|
| 962 |
+
data[offset] = v[0];
|
| 963 |
+
data[offset + 1] = v[1];
|
| 964 |
+
data[offset + 4] = v[2];
|
| 965 |
+
data[offset + 5] = v[3];`,
|
| 966 |
+
"mat3x3<f32>": `
|
| 967 |
+
data[offset] = v[0];
|
| 968 |
+
data[offset + 1] = v[1];
|
| 969 |
+
data[offset + 2] = v[2];
|
| 970 |
+
data[offset + 4] = v[3];
|
| 971 |
+
data[offset + 5] = v[4];
|
| 972 |
+
data[offset + 6] = v[5];
|
| 973 |
+
data[offset + 8] = v[6];
|
| 974 |
+
data[offset + 9] = v[7];
|
| 975 |
+
data[offset + 10] = v[8];`,
|
| 976 |
+
"mat4x4<f32>": `
|
| 977 |
+
for (let i = 0; i < 16; i++) {
|
| 978 |
+
data[offset + i] = v[i];
|
| 979 |
+
}`,
|
| 980 |
+
"mat3x2<f32>": g(3, 2),
|
| 981 |
+
"mat4x2<f32>": g(4, 2),
|
| 982 |
+
"mat2x3<f32>": g(2, 3),
|
| 983 |
+
"mat4x3<f32>": g(4, 3),
|
| 984 |
+
"mat2x4<f32>": g(2, 4),
|
| 985 |
+
"mat3x4<f32>": g(3, 4)
|
| 986 |
+
}, Ft = {
|
| 987 |
+
...ut,
|
| 988 |
+
"mat2x2<f32>": `
|
| 989 |
+
data[offset] = v[0];
|
| 990 |
+
data[offset + 1] = v[1];
|
| 991 |
+
data[offset + 2] = v[2];
|
| 992 |
+
data[offset + 3] = v[3];
|
| 993 |
+
`
|
| 994 |
+
};
|
| 995 |
+
function dt(n, e, t, r, s, a) {
|
| 996 |
+
const i = a ? 1 : -1;
|
| 997 |
+
return n.identity(), n.a = 1 / r * 2, n.d = i * (1 / s * 2), n.tx = -1 - e * n.a, n.ty = -i - t * n.d, n;
|
| 998 |
+
}
|
| 999 |
+
const x = /* @__PURE__ */ new Map();
|
| 1000 |
+
je.register(x);
|
| 1001 |
+
function ye(n, e) {
|
| 1002 |
+
if (!x.has(n)) {
|
| 1003 |
+
const t = new m({
|
| 1004 |
+
source: new U({
|
| 1005 |
+
resource: n,
|
| 1006 |
+
...e
|
| 1007 |
+
})
|
| 1008 |
+
}), r = () => {
|
| 1009 |
+
x.get(n) === t && x.delete(n);
|
| 1010 |
+
};
|
| 1011 |
+
t.once("destroy", r), t.source.once("destroy", r), x.set(n, t);
|
| 1012 |
+
}
|
| 1013 |
+
return x.get(n);
|
| 1014 |
+
}
|
| 1015 |
+
function ct(n) {
|
| 1016 |
+
const e = n.colorTexture.source.resource;
|
| 1017 |
+
return globalThis.HTMLCanvasElement && e instanceof HTMLCanvasElement && document.body.contains(e);
|
| 1018 |
+
}
|
| 1019 |
+
const ke = class Ce {
|
| 1020 |
+
/**
|
| 1021 |
+
* @param [descriptor] - Options for creating a render target.
|
| 1022 |
+
*/
|
| 1023 |
+
constructor(e = {}) {
|
| 1024 |
+
if (this.uid = M("renderTarget"), this.colorTextures = [], this.dirtyId = 0, this.isRoot = !1, this._size = new Float32Array(2), this._managedColorTextures = !1, e = { ...Ce.defaultOptions, ...e }, this.stencil = e.stencil, this.depth = e.depth, this.isRoot = e.isRoot, typeof e.colorTextures == "number") {
|
| 1025 |
+
this._managedColorTextures = !0;
|
| 1026 |
+
for (let t = 0; t < e.colorTextures; t++)
|
| 1027 |
+
this.colorTextures.push(
|
| 1028 |
+
new T({
|
| 1029 |
+
width: e.width,
|
| 1030 |
+
height: e.height,
|
| 1031 |
+
resolution: e.resolution,
|
| 1032 |
+
antialias: e.antialias
|
| 1033 |
+
})
|
| 1034 |
+
);
|
| 1035 |
+
} else {
|
| 1036 |
+
this.colorTextures = [...e.colorTextures.map((r) => r.source)];
|
| 1037 |
+
const t = this.colorTexture.source;
|
| 1038 |
+
this.resize(t.width, t.height, t._resolution);
|
| 1039 |
+
}
|
| 1040 |
+
this.colorTexture.source.on("resize", this.onSourceResize, this), (e.depthStencilTexture || this.stencil) && (e.depthStencilTexture instanceof m || e.depthStencilTexture instanceof T ? this.depthStencilTexture = e.depthStencilTexture.source : this.ensureDepthStencilTexture());
|
| 1041 |
+
}
|
| 1042 |
+
get size() {
|
| 1043 |
+
const e = this._size;
|
| 1044 |
+
return e[0] = this.pixelWidth, e[1] = this.pixelHeight, e;
|
| 1045 |
+
}
|
| 1046 |
+
get width() {
|
| 1047 |
+
return this.colorTexture.source.width;
|
| 1048 |
+
}
|
| 1049 |
+
get height() {
|
| 1050 |
+
return this.colorTexture.source.height;
|
| 1051 |
+
}
|
| 1052 |
+
get pixelWidth() {
|
| 1053 |
+
return this.colorTexture.source.pixelWidth;
|
| 1054 |
+
}
|
| 1055 |
+
get pixelHeight() {
|
| 1056 |
+
return this.colorTexture.source.pixelHeight;
|
| 1057 |
+
}
|
| 1058 |
+
get resolution() {
|
| 1059 |
+
return this.colorTexture.source._resolution;
|
| 1060 |
+
}
|
| 1061 |
+
get colorTexture() {
|
| 1062 |
+
return this.colorTextures[0];
|
| 1063 |
+
}
|
| 1064 |
+
onSourceResize(e) {
|
| 1065 |
+
this.resize(e.width, e.height, e._resolution, !0);
|
| 1066 |
+
}
|
| 1067 |
+
/**
|
| 1068 |
+
* This will ensure a depthStencil texture is created for this render target.
|
| 1069 |
+
* Most likely called by the mask system to make sure we have stencil buffer added.
|
| 1070 |
+
* @internal
|
| 1071 |
+
*/
|
| 1072 |
+
ensureDepthStencilTexture() {
|
| 1073 |
+
this.depthStencilTexture || (this.depthStencilTexture = new T({
|
| 1074 |
+
width: this.width,
|
| 1075 |
+
height: this.height,
|
| 1076 |
+
resolution: this.resolution,
|
| 1077 |
+
format: "depth24plus-stencil8",
|
| 1078 |
+
autoGenerateMipmaps: !1,
|
| 1079 |
+
antialias: !1,
|
| 1080 |
+
mipLevelCount: 1
|
| 1081 |
+
// sampleCount: handled by the render target system..
|
| 1082 |
+
}));
|
| 1083 |
+
}
|
| 1084 |
+
resize(e, t, r = this.resolution, s = !1) {
|
| 1085 |
+
this.dirtyId++, this.colorTextures.forEach((a, i) => {
|
| 1086 |
+
s && i === 0 || a.source.resize(e, t, r);
|
| 1087 |
+
}), this.depthStencilTexture && this.depthStencilTexture.source.resize(e, t, r);
|
| 1088 |
+
}
|
| 1089 |
+
destroy() {
|
| 1090 |
+
this.colorTexture.source.off("resize", this.onSourceResize, this), this._managedColorTextures && this.colorTextures.forEach((e) => {
|
| 1091 |
+
e.destroy();
|
| 1092 |
+
}), this.depthStencilTexture && (this.depthStencilTexture.destroy(), delete this.depthStencilTexture);
|
| 1093 |
+
}
|
| 1094 |
+
};
|
| 1095 |
+
ke.defaultOptions = {
|
| 1096 |
+
/** the width of the RenderTarget */
|
| 1097 |
+
width: 0,
|
| 1098 |
+
/** the height of the RenderTarget */
|
| 1099 |
+
height: 0,
|
| 1100 |
+
/** the resolution of the RenderTarget */
|
| 1101 |
+
resolution: 1,
|
| 1102 |
+
/** an array of textures, or a number indicating how many color textures there should be */
|
| 1103 |
+
colorTextures: 1,
|
| 1104 |
+
/** should this render target have a stencil buffer? */
|
| 1105 |
+
stencil: !1,
|
| 1106 |
+
/** should this render target have a depth buffer? */
|
| 1107 |
+
depth: !1,
|
| 1108 |
+
/** should this render target be antialiased? */
|
| 1109 |
+
antialias: !1,
|
| 1110 |
+
// save on perf by default!
|
| 1111 |
+
/** is this a root element, true if this is gl context owners render target */
|
| 1112 |
+
isRoot: !1
|
| 1113 |
+
};
|
| 1114 |
+
let G = ke;
|
| 1115 |
+
class Lt {
|
| 1116 |
+
constructor(e) {
|
| 1117 |
+
this.rootViewPort = new w(), this.viewport = new w(), this.onRenderTargetChange = new $e("onRenderTargetChange"), this.projectionMatrix = new v(), this.defaultClearColor = [0, 0, 0, 0], this._renderSurfaceToRenderTargetHash = /* @__PURE__ */ new Map(), this._gpuRenderTargetHash = /* @__PURE__ */ Object.create(null), this._renderTargetStack = [], this._renderer = e, e.renderableGC.addManagedHash(this, "_gpuRenderTargetHash");
|
| 1118 |
+
}
|
| 1119 |
+
/** called when dev wants to finish a render pass */
|
| 1120 |
+
finishRenderPass() {
|
| 1121 |
+
this.adaptor.finishRenderPass(this.renderTarget);
|
| 1122 |
+
}
|
| 1123 |
+
/**
|
| 1124 |
+
* called when the renderer starts to render a scene.
|
| 1125 |
+
* @param options
|
| 1126 |
+
* @param options.target - the render target to render to
|
| 1127 |
+
* @param options.clear - the clear mode to use. Can be true or a CLEAR number 'COLOR | DEPTH | STENCIL' 0b111
|
| 1128 |
+
* @param options.clearColor - the color to clear to
|
| 1129 |
+
* @param options.frame - the frame to render to
|
| 1130 |
+
*/
|
| 1131 |
+
renderStart({
|
| 1132 |
+
target: e,
|
| 1133 |
+
clear: t,
|
| 1134 |
+
clearColor: r,
|
| 1135 |
+
frame: s
|
| 1136 |
+
}) {
|
| 1137 |
+
var a, i;
|
| 1138 |
+
this._renderTargetStack.length = 0, this.push(
|
| 1139 |
+
e,
|
| 1140 |
+
t,
|
| 1141 |
+
r,
|
| 1142 |
+
s
|
| 1143 |
+
), this.rootViewPort.copyFrom(this.viewport), this.rootRenderTarget = this.renderTarget, this.renderingToScreen = ct(this.rootRenderTarget), (i = (a = this.adaptor).prerender) == null || i.call(a, this.rootRenderTarget);
|
| 1144 |
+
}
|
| 1145 |
+
postrender() {
|
| 1146 |
+
var e, t;
|
| 1147 |
+
(t = (e = this.adaptor).postrender) == null || t.call(e, this.rootRenderTarget);
|
| 1148 |
+
}
|
| 1149 |
+
/**
|
| 1150 |
+
* Binding a render surface! This is the main function of the render target system.
|
| 1151 |
+
* It will take the RenderSurface (which can be a texture, canvas, or render target) and bind it to the renderer.
|
| 1152 |
+
* Once bound all draw calls will be rendered to the render surface.
|
| 1153 |
+
*
|
| 1154 |
+
* If a frame is not provide and the render surface is a texture, the frame of the texture will be used.
|
| 1155 |
+
* @param renderSurface - the render surface to bind
|
| 1156 |
+
* @param clear - the clear mode to use. Can be true or a CLEAR number 'COLOR | DEPTH | STENCIL' 0b111
|
| 1157 |
+
* @param clearColor - the color to clear to
|
| 1158 |
+
* @param frame - the frame to render to
|
| 1159 |
+
* @returns the render target that was bound
|
| 1160 |
+
*/
|
| 1161 |
+
bind(e, t = !0, r, s) {
|
| 1162 |
+
const a = this.getRenderTarget(e), i = this.renderTarget !== a;
|
| 1163 |
+
this.renderTarget = a, this.renderSurface = e;
|
| 1164 |
+
const o = this.getGpuRenderTarget(a);
|
| 1165 |
+
(a.pixelWidth !== o.width || a.pixelHeight !== o.height) && (this.adaptor.resizeGpuRenderTarget(a), o.width = a.pixelWidth, o.height = a.pixelHeight);
|
| 1166 |
+
const l = a.colorTexture, d = this.viewport, c = l.pixelWidth, h = l.pixelHeight;
|
| 1167 |
+
if (!s && e instanceof m && (s = e.frame), s) {
|
| 1168 |
+
const p = l._resolution;
|
| 1169 |
+
d.x = s.x * p + 0.5 | 0, d.y = s.y * p + 0.5 | 0, d.width = s.width * p + 0.5 | 0, d.height = s.height * p + 0.5 | 0;
|
| 1170 |
+
} else
|
| 1171 |
+
d.x = 0, d.y = 0, d.width = c, d.height = h;
|
| 1172 |
+
return dt(
|
| 1173 |
+
this.projectionMatrix,
|
| 1174 |
+
0,
|
| 1175 |
+
0,
|
| 1176 |
+
d.width / l.resolution,
|
| 1177 |
+
d.height / l.resolution,
|
| 1178 |
+
!a.isRoot
|
| 1179 |
+
), this.adaptor.startRenderPass(a, t, r, d), i && this.onRenderTargetChange.emit(a), a;
|
| 1180 |
+
}
|
| 1181 |
+
clear(e, t = B.ALL, r) {
|
| 1182 |
+
t && (e && (e = this.getRenderTarget(e)), this.adaptor.clear(
|
| 1183 |
+
e || this.renderTarget,
|
| 1184 |
+
t,
|
| 1185 |
+
r,
|
| 1186 |
+
this.viewport
|
| 1187 |
+
));
|
| 1188 |
+
}
|
| 1189 |
+
contextChange() {
|
| 1190 |
+
this._gpuRenderTargetHash = /* @__PURE__ */ Object.create(null);
|
| 1191 |
+
}
|
| 1192 |
+
/**
|
| 1193 |
+
* Push a render surface to the renderer. This will bind the render surface to the renderer,
|
| 1194 |
+
* @param renderSurface - the render surface to push
|
| 1195 |
+
* @param clear - the clear mode to use. Can be true or a CLEAR number 'COLOR | DEPTH | STENCIL' 0b111
|
| 1196 |
+
* @param clearColor - the color to clear to
|
| 1197 |
+
* @param frame - the frame to use when rendering to the render surface
|
| 1198 |
+
*/
|
| 1199 |
+
push(e, t = B.ALL, r, s) {
|
| 1200 |
+
const a = this.bind(e, t, r, s);
|
| 1201 |
+
return this._renderTargetStack.push({
|
| 1202 |
+
renderTarget: a,
|
| 1203 |
+
frame: s
|
| 1204 |
+
}), a;
|
| 1205 |
+
}
|
| 1206 |
+
/** Pops the current render target from the renderer and restores the previous render target. */
|
| 1207 |
+
pop() {
|
| 1208 |
+
this._renderTargetStack.pop();
|
| 1209 |
+
const e = this._renderTargetStack[this._renderTargetStack.length - 1];
|
| 1210 |
+
this.bind(e.renderTarget, !1, null, e.frame);
|
| 1211 |
+
}
|
| 1212 |
+
/**
|
| 1213 |
+
* Gets the render target from the provide render surface. Eg if its a texture,
|
| 1214 |
+
* it will return the render target for the texture.
|
| 1215 |
+
* If its a render target, it will return the same render target.
|
| 1216 |
+
* @param renderSurface - the render surface to get the render target for
|
| 1217 |
+
* @returns the render target for the render surface
|
| 1218 |
+
*/
|
| 1219 |
+
getRenderTarget(e) {
|
| 1220 |
+
return e.isTexture && (e = e.source), this._renderSurfaceToRenderTargetHash.get(e) ?? this._initRenderTarget(e);
|
| 1221 |
+
}
|
| 1222 |
+
/**
|
| 1223 |
+
* Copies a render surface to another texture.
|
| 1224 |
+
*
|
| 1225 |
+
* NOTE:
|
| 1226 |
+
* for sourceRenderSurfaceTexture, The render target must be something that is written too by the renderer
|
| 1227 |
+
*
|
| 1228 |
+
* The following is not valid:
|
| 1229 |
+
* @example
|
| 1230 |
+
* const canvas = document.createElement('canvas')
|
| 1231 |
+
* canvas.width = 200;
|
| 1232 |
+
* canvas.height = 200;
|
| 1233 |
+
*
|
| 1234 |
+
* const ctx = canvas2.getContext('2d')!
|
| 1235 |
+
* ctx.fillStyle = 'red'
|
| 1236 |
+
* ctx.fillRect(0, 0, 200, 200);
|
| 1237 |
+
*
|
| 1238 |
+
* const texture = RenderTexture.create({
|
| 1239 |
+
* width: 200,
|
| 1240 |
+
* height: 200,
|
| 1241 |
+
* })
|
| 1242 |
+
* const renderTarget = renderer.renderTarget.getRenderTarget(canvas2);
|
| 1243 |
+
*
|
| 1244 |
+
* renderer.renderTarget.copyToTexture(renderTarget,texture, {x:0,y:0},{width:200,height:200},{x:0,y:0});
|
| 1245 |
+
*
|
| 1246 |
+
* The best way to copy a canvas is to create a texture from it. Then render with that.
|
| 1247 |
+
*
|
| 1248 |
+
* Parsing in a RenderTarget canvas context (with a 2d context)
|
| 1249 |
+
* @param sourceRenderSurfaceTexture - the render surface to copy from
|
| 1250 |
+
* @param destinationTexture - the texture to copy to
|
| 1251 |
+
* @param originSrc - the origin of the copy
|
| 1252 |
+
* @param originSrc.x - the x origin of the copy
|
| 1253 |
+
* @param originSrc.y - the y origin of the copy
|
| 1254 |
+
* @param size - the size of the copy
|
| 1255 |
+
* @param size.width - the width of the copy
|
| 1256 |
+
* @param size.height - the height of the copy
|
| 1257 |
+
* @param originDest - the destination origin (top left to paste from!)
|
| 1258 |
+
* @param originDest.x - the x origin of the paste
|
| 1259 |
+
* @param originDest.y - the y origin of the paste
|
| 1260 |
+
*/
|
| 1261 |
+
copyToTexture(e, t, r, s, a) {
|
| 1262 |
+
r.x < 0 && (s.width += r.x, a.x -= r.x, r.x = 0), r.y < 0 && (s.height += r.y, a.y -= r.y, r.y = 0);
|
| 1263 |
+
const { pixelWidth: i, pixelHeight: o } = e;
|
| 1264 |
+
return s.width = Math.min(s.width, i - r.x), s.height = Math.min(s.height, o - r.y), this.adaptor.copyToTexture(
|
| 1265 |
+
e,
|
| 1266 |
+
t,
|
| 1267 |
+
r,
|
| 1268 |
+
s,
|
| 1269 |
+
a
|
| 1270 |
+
);
|
| 1271 |
+
}
|
| 1272 |
+
/**
|
| 1273 |
+
* ensures that we have a depth stencil buffer available to render to
|
| 1274 |
+
* This is used by the mask system to make sure we have a stencil buffer.
|
| 1275 |
+
*/
|
| 1276 |
+
ensureDepthStencil() {
|
| 1277 |
+
this.renderTarget.stencil || (this.renderTarget.stencil = !0, this.adaptor.startRenderPass(this.renderTarget, !1, null, this.viewport));
|
| 1278 |
+
}
|
| 1279 |
+
/** nukes the render target system */
|
| 1280 |
+
destroy() {
|
| 1281 |
+
this._renderer = null, this._renderSurfaceToRenderTargetHash.forEach((e, t) => {
|
| 1282 |
+
e !== t && e.destroy();
|
| 1283 |
+
}), this._renderSurfaceToRenderTargetHash.clear(), this._gpuRenderTargetHash = /* @__PURE__ */ Object.create(null);
|
| 1284 |
+
}
|
| 1285 |
+
_initRenderTarget(e) {
|
| 1286 |
+
let t = null;
|
| 1287 |
+
return U.test(e) && (e = ye(e).source), e instanceof G ? t = e : e instanceof T && (t = new G({
|
| 1288 |
+
colorTextures: [e]
|
| 1289 |
+
}), e.source instanceof U && (t.isRoot = !0), e.once("destroy", () => {
|
| 1290 |
+
t.destroy(), this._renderSurfaceToRenderTargetHash.delete(e);
|
| 1291 |
+
const r = this._gpuRenderTargetHash[t.uid];
|
| 1292 |
+
r && (this._gpuRenderTargetHash[t.uid] = null, this.adaptor.destroyGpuRenderTarget(r));
|
| 1293 |
+
})), this._renderSurfaceToRenderTargetHash.set(e, t), t;
|
| 1294 |
+
}
|
| 1295 |
+
getGpuRenderTarget(e) {
|
| 1296 |
+
return this._gpuRenderTargetHash[e.uid] || (this._gpuRenderTargetHash[e.uid] = this.adaptor.initGpuRenderTarget(e));
|
| 1297 |
+
}
|
| 1298 |
+
resetState() {
|
| 1299 |
+
this.renderTarget = null, this.renderSurface = null;
|
| 1300 |
+
}
|
| 1301 |
+
}
|
| 1302 |
+
class Ht extends qe {
|
| 1303 |
+
/**
|
| 1304 |
+
* Create a new Buffer Resource.
|
| 1305 |
+
* @param options - The options for the buffer resource
|
| 1306 |
+
* @param options.buffer - The underlying buffer that this resource is using
|
| 1307 |
+
* @param options.offset - The offset of the buffer this resource is using.
|
| 1308 |
+
* If not provided, then it will use the offset of the buffer.
|
| 1309 |
+
* @param options.size - The size of the buffer this resource is using.
|
| 1310 |
+
* If not provided, then it will use the size of the buffer.
|
| 1311 |
+
*/
|
| 1312 |
+
constructor({ buffer: e, offset: t, size: r }) {
|
| 1313 |
+
super(), this.uid = M("buffer"), this._resourceType = "bufferResource", this._touched = 0, this._resourceId = M("resource"), this._bufferResource = !0, this.destroyed = !1, this.buffer = e, this.offset = t | 0, this.size = r, this.buffer.on("change", this.onBufferChange, this);
|
| 1314 |
+
}
|
| 1315 |
+
onBufferChange() {
|
| 1316 |
+
this._resourceId = M("resource"), this.emit("change", this);
|
| 1317 |
+
}
|
| 1318 |
+
/**
|
| 1319 |
+
* Destroys this resource. Make sure the underlying buffer is not used anywhere else
|
| 1320 |
+
* if you want to destroy it as well, or code will explode
|
| 1321 |
+
* @param destroyBuffer - Should the underlying buffer be destroyed as well?
|
| 1322 |
+
*/
|
| 1323 |
+
destroy(e = !1) {
|
| 1324 |
+
this.destroyed = !0, e && this.buffer.destroy(), this.emit("change", this), this.buffer = null;
|
| 1325 |
+
}
|
| 1326 |
+
}
|
| 1327 |
+
class Me {
|
| 1328 |
+
constructor(e) {
|
| 1329 |
+
this._renderer = e;
|
| 1330 |
+
}
|
| 1331 |
+
updateRenderable() {
|
| 1332 |
+
}
|
| 1333 |
+
destroyRenderable() {
|
| 1334 |
+
}
|
| 1335 |
+
validateRenderable() {
|
| 1336 |
+
return !1;
|
| 1337 |
+
}
|
| 1338 |
+
addRenderable(e, t) {
|
| 1339 |
+
this._renderer.renderPipes.batch.break(t), t.add(e);
|
| 1340 |
+
}
|
| 1341 |
+
execute(e) {
|
| 1342 |
+
e.isRenderable && e.render(this._renderer);
|
| 1343 |
+
}
|
| 1344 |
+
destroy() {
|
| 1345 |
+
this._renderer = null;
|
| 1346 |
+
}
|
| 1347 |
+
}
|
| 1348 |
+
Me.extension = {
|
| 1349 |
+
type: [
|
| 1350 |
+
u.WebGLPipes,
|
| 1351 |
+
u.WebGPUPipes,
|
| 1352 |
+
u.CanvasPipes
|
| 1353 |
+
],
|
| 1354 |
+
name: "customRender"
|
| 1355 |
+
};
|
| 1356 |
+
function E(n, e) {
|
| 1357 |
+
const t = n.instructionSet, r = t.instructions;
|
| 1358 |
+
for (let s = 0; s < t.instructionSize; s++) {
|
| 1359 |
+
const a = r[s];
|
| 1360 |
+
e[a.renderPipeId].execute(a);
|
| 1361 |
+
}
|
| 1362 |
+
}
|
| 1363 |
+
const ht = new v();
|
| 1364 |
+
class Se {
|
| 1365 |
+
constructor(e) {
|
| 1366 |
+
this._renderer = e;
|
| 1367 |
+
}
|
| 1368 |
+
addRenderGroup(e, t) {
|
| 1369 |
+
e.isCachedAsTexture ? this._addRenderableCacheAsTexture(e, t) : this._addRenderableDirect(e, t);
|
| 1370 |
+
}
|
| 1371 |
+
execute(e) {
|
| 1372 |
+
e.isRenderable && (e.isCachedAsTexture ? this._executeCacheAsTexture(e) : this._executeDirect(e));
|
| 1373 |
+
}
|
| 1374 |
+
destroy() {
|
| 1375 |
+
this._renderer = null;
|
| 1376 |
+
}
|
| 1377 |
+
_addRenderableDirect(e, t) {
|
| 1378 |
+
this._renderer.renderPipes.batch.break(t), e._batchableRenderGroup && (S.return(e._batchableRenderGroup), e._batchableRenderGroup = null), t.add(e);
|
| 1379 |
+
}
|
| 1380 |
+
_addRenderableCacheAsTexture(e, t) {
|
| 1381 |
+
const r = e._batchableRenderGroup ?? (e._batchableRenderGroup = S.get(me));
|
| 1382 |
+
r.renderable = e.root, r.transform = e.root.relativeGroupTransform, r.texture = e.texture, r.bounds = e._textureBounds, t.add(e), this._renderer.renderPipes.blendMode.pushBlendMode(e, e.root.groupBlendMode, t), this._renderer.renderPipes.batch.addToBatch(r, t), this._renderer.renderPipes.blendMode.popBlendMode(t);
|
| 1383 |
+
}
|
| 1384 |
+
_executeCacheAsTexture(e) {
|
| 1385 |
+
if (e.textureNeedsUpdate) {
|
| 1386 |
+
e.textureNeedsUpdate = !1;
|
| 1387 |
+
const t = ht.identity().translate(
|
| 1388 |
+
-e._textureBounds.x,
|
| 1389 |
+
-e._textureBounds.y
|
| 1390 |
+
);
|
| 1391 |
+
this._renderer.renderTarget.push(e.texture, !0, null, e.texture.frame), this._renderer.globalUniforms.push({
|
| 1392 |
+
worldTransformMatrix: t,
|
| 1393 |
+
worldColor: 4294967295,
|
| 1394 |
+
offset: { x: 0, y: 0 }
|
| 1395 |
+
}), E(e, this._renderer.renderPipes), this._renderer.renderTarget.finishRenderPass(), this._renderer.renderTarget.pop(), this._renderer.globalUniforms.pop();
|
| 1396 |
+
}
|
| 1397 |
+
e._batchableRenderGroup._batcher.updateElement(e._batchableRenderGroup), e._batchableRenderGroup._batcher.geometry.buffers[0].update();
|
| 1398 |
+
}
|
| 1399 |
+
_executeDirect(e) {
|
| 1400 |
+
this._renderer.globalUniforms.push({
|
| 1401 |
+
worldTransformMatrix: e.inverseParentTextureTransform,
|
| 1402 |
+
worldColor: e.worldColorAlpha
|
| 1403 |
+
}), E(e, this._renderer.renderPipes), this._renderer.globalUniforms.pop();
|
| 1404 |
+
}
|
| 1405 |
+
}
|
| 1406 |
+
Se.extension = {
|
| 1407 |
+
type: [
|
| 1408 |
+
u.WebGLPipes,
|
| 1409 |
+
u.WebGPUPipes,
|
| 1410 |
+
u.CanvasPipes
|
| 1411 |
+
],
|
| 1412 |
+
name: "renderGroup"
|
| 1413 |
+
};
|
| 1414 |
+
function D(n, e) {
|
| 1415 |
+
e || (e = 0);
|
| 1416 |
+
for (let t = e; t < n.length && n[t]; t++)
|
| 1417 |
+
n[t] = null;
|
| 1418 |
+
}
|
| 1419 |
+
const ft = new P(), re = ce | he | fe;
|
| 1420 |
+
function we(n, e = !1) {
|
| 1421 |
+
pt(n);
|
| 1422 |
+
const t = n.childrenToUpdate, r = n.updateTick++;
|
| 1423 |
+
for (const s in t) {
|
| 1424 |
+
const a = Number(s), i = t[s], o = i.list, l = i.index;
|
| 1425 |
+
for (let d = 0; d < l; d++) {
|
| 1426 |
+
const c = o[d];
|
| 1427 |
+
c.parentRenderGroup === n && c.relativeRenderGroupDepth === a && Pe(c, r, 0);
|
| 1428 |
+
}
|
| 1429 |
+
D(o, l), i.index = 0;
|
| 1430 |
+
}
|
| 1431 |
+
if (e)
|
| 1432 |
+
for (let s = 0; s < n.renderGroupChildren.length; s++)
|
| 1433 |
+
we(n.renderGroupChildren[s], e);
|
| 1434 |
+
}
|
| 1435 |
+
function pt(n) {
|
| 1436 |
+
const e = n.root;
|
| 1437 |
+
let t;
|
| 1438 |
+
if (n.renderGroupParent) {
|
| 1439 |
+
const r = n.renderGroupParent;
|
| 1440 |
+
n.worldTransform.appendFrom(
|
| 1441 |
+
e.relativeGroupTransform,
|
| 1442 |
+
r.worldTransform
|
| 1443 |
+
), n.worldColor = de(
|
| 1444 |
+
e.groupColor,
|
| 1445 |
+
r.worldColor
|
| 1446 |
+
), t = e.groupAlpha * r.worldAlpha;
|
| 1447 |
+
} else
|
| 1448 |
+
n.worldTransform.copyFrom(e.localTransform), n.worldColor = e.localColor, t = e.localAlpha;
|
| 1449 |
+
t = t < 0 ? 0 : t > 1 ? 1 : t, n.worldAlpha = t, n.worldColorAlpha = n.worldColor + ((t * 255 | 0) << 24);
|
| 1450 |
+
}
|
| 1451 |
+
function Pe(n, e, t) {
|
| 1452 |
+
if (e === n.updateTick)
|
| 1453 |
+
return;
|
| 1454 |
+
n.updateTick = e, n.didChange = !1;
|
| 1455 |
+
const r = n.localTransform;
|
| 1456 |
+
n.updateLocalTransform();
|
| 1457 |
+
const s = n.parent;
|
| 1458 |
+
if (s && !s.renderGroup ? (t |= n._updateFlags, n.relativeGroupTransform.appendFrom(
|
| 1459 |
+
r,
|
| 1460 |
+
s.relativeGroupTransform
|
| 1461 |
+
), t & re && se(n, s, t)) : (t = n._updateFlags, n.relativeGroupTransform.copyFrom(r), t & re && se(n, ft, t)), !n.renderGroup) {
|
| 1462 |
+
const a = n.children, i = a.length;
|
| 1463 |
+
for (let d = 0; d < i; d++)
|
| 1464 |
+
Pe(a[d], e, t);
|
| 1465 |
+
const o = n.parentRenderGroup, l = n;
|
| 1466 |
+
l.renderPipeId && !o.structureDidChange && o.updateRenderable(l);
|
| 1467 |
+
}
|
| 1468 |
+
}
|
| 1469 |
+
function se(n, e, t) {
|
| 1470 |
+
if (t & he) {
|
| 1471 |
+
n.groupColor = de(
|
| 1472 |
+
n.localColor,
|
| 1473 |
+
e.groupColor
|
| 1474 |
+
);
|
| 1475 |
+
let r = n.localAlpha * e.groupAlpha;
|
| 1476 |
+
r = r < 0 ? 0 : r > 1 ? 1 : r, n.groupAlpha = r, n.groupColorAlpha = n.groupColor + ((r * 255 | 0) << 24);
|
| 1477 |
+
}
|
| 1478 |
+
t & fe && (n.groupBlendMode = n.localBlendMode === "inherit" ? e.groupBlendMode : n.localBlendMode), t & ce && (n.globalDisplayStatus = n.localDisplayStatus & e.globalDisplayStatus), n._updateFlags = 0;
|
| 1479 |
+
}
|
| 1480 |
+
function mt(n, e) {
|
| 1481 |
+
const { list: t, index: r } = n.childrenRenderablesToUpdate;
|
| 1482 |
+
let s = !1;
|
| 1483 |
+
for (let a = 0; a < r; a++) {
|
| 1484 |
+
const i = t[a];
|
| 1485 |
+
if (s = e[i.renderPipeId].validateRenderable(i), s)
|
| 1486 |
+
break;
|
| 1487 |
+
}
|
| 1488 |
+
return n.structureDidChange = s, s;
|
| 1489 |
+
}
|
| 1490 |
+
const vt = new v();
|
| 1491 |
+
class Re {
|
| 1492 |
+
constructor(e) {
|
| 1493 |
+
this._renderer = e;
|
| 1494 |
+
}
|
| 1495 |
+
render({ container: e, transform: t }) {
|
| 1496 |
+
const r = e.parent, s = e.renderGroup.renderGroupParent;
|
| 1497 |
+
e.parent = null, e.renderGroup.renderGroupParent = null;
|
| 1498 |
+
const a = this._renderer, i = vt;
|
| 1499 |
+
t && (i.copyFrom(e.renderGroup.localTransform), e.renderGroup.localTransform.copyFrom(t));
|
| 1500 |
+
const o = a.renderPipes;
|
| 1501 |
+
this._updateCachedRenderGroups(e.renderGroup, null), this._updateRenderGroups(e.renderGroup), a.globalUniforms.start({
|
| 1502 |
+
worldTransformMatrix: t ? e.renderGroup.localTransform : e.renderGroup.worldTransform,
|
| 1503 |
+
worldColor: e.renderGroup.worldColorAlpha
|
| 1504 |
+
}), E(e.renderGroup, o), o.uniformBatch && o.uniformBatch.renderEnd(), t && e.renderGroup.localTransform.copyFrom(i), e.parent = r, e.renderGroup.renderGroupParent = s;
|
| 1505 |
+
}
|
| 1506 |
+
destroy() {
|
| 1507 |
+
this._renderer = null;
|
| 1508 |
+
}
|
| 1509 |
+
_updateCachedRenderGroups(e, t) {
|
| 1510 |
+
if (e._parentCacheAsTextureRenderGroup = t, e.isCachedAsTexture) {
|
| 1511 |
+
if (!e.textureNeedsUpdate)
|
| 1512 |
+
return;
|
| 1513 |
+
t = e;
|
| 1514 |
+
}
|
| 1515 |
+
for (let r = e.renderGroupChildren.length - 1; r >= 0; r--)
|
| 1516 |
+
this._updateCachedRenderGroups(e.renderGroupChildren[r], t);
|
| 1517 |
+
if (e.invalidateMatrices(), e.isCachedAsTexture) {
|
| 1518 |
+
if (e.textureNeedsUpdate) {
|
| 1519 |
+
const r = e.root.getLocalBounds();
|
| 1520 |
+
r.ceil();
|
| 1521 |
+
const s = e.texture;
|
| 1522 |
+
e.texture && b.returnTexture(e.texture, !0);
|
| 1523 |
+
const a = this._renderer, i = e.textureOptions.resolution || a.view.resolution, o = e.textureOptions.antialias ?? a.view.antialias, l = e.textureOptions.scaleMode ?? "linear", d = b.getOptimalTexture(
|
| 1524 |
+
r.width,
|
| 1525 |
+
r.height,
|
| 1526 |
+
i,
|
| 1527 |
+
o
|
| 1528 |
+
);
|
| 1529 |
+
d._source.style = new Ke({ scaleMode: l }), e.texture = d, e._textureBounds || (e._textureBounds = new F()), e._textureBounds.copyFrom(r), s !== e.texture && e.renderGroupParent && (e.renderGroupParent.structureDidChange = !0);
|
| 1530 |
+
}
|
| 1531 |
+
} else e.texture && (b.returnTexture(e.texture, !0), e.texture = null);
|
| 1532 |
+
}
|
| 1533 |
+
_updateRenderGroups(e) {
|
| 1534 |
+
const t = this._renderer, r = t.renderPipes;
|
| 1535 |
+
if (e.runOnRender(t), e.instructionSet.renderPipes = r, e.structureDidChange ? D(e.childrenRenderablesToUpdate.list, 0) : mt(e, r), we(e), e.structureDidChange ? (e.structureDidChange = !1, this._buildInstructions(e, t)) : this._updateRenderables(e), e.childrenRenderablesToUpdate.index = 0, t.renderPipes.batch.upload(e.instructionSet), !(e.isCachedAsTexture && !e.textureNeedsUpdate))
|
| 1536 |
+
for (let s = 0; s < e.renderGroupChildren.length; s++)
|
| 1537 |
+
this._updateRenderGroups(e.renderGroupChildren[s]);
|
| 1538 |
+
}
|
| 1539 |
+
_updateRenderables(e) {
|
| 1540 |
+
const { list: t, index: r } = e.childrenRenderablesToUpdate;
|
| 1541 |
+
for (let s = 0; s < r; s++) {
|
| 1542 |
+
const a = t[s];
|
| 1543 |
+
a.didViewUpdate && e.updateRenderable(a);
|
| 1544 |
+
}
|
| 1545 |
+
D(t, r);
|
| 1546 |
+
}
|
| 1547 |
+
_buildInstructions(e, t) {
|
| 1548 |
+
const r = e.root, s = e.instructionSet;
|
| 1549 |
+
s.reset();
|
| 1550 |
+
const a = t.renderPipes ? t : t.batch.renderer, i = a.renderPipes;
|
| 1551 |
+
i.batch.buildStart(s), i.blendMode.buildStart(), i.colorMask.buildStart(), r.sortableChildren && r.sortChildren(), r.collectRenderablesWithEffects(s, a, null), i.batch.buildEnd(s), i.blendMode.buildEnd(s);
|
| 1552 |
+
}
|
| 1553 |
+
}
|
| 1554 |
+
Re.extension = {
|
| 1555 |
+
type: [
|
| 1556 |
+
u.WebGLSystem,
|
| 1557 |
+
u.WebGPUSystem,
|
| 1558 |
+
u.CanvasSystem
|
| 1559 |
+
],
|
| 1560 |
+
name: "renderGroup"
|
| 1561 |
+
};
|
| 1562 |
+
class Be {
|
| 1563 |
+
constructor(e) {
|
| 1564 |
+
this._renderer = e;
|
| 1565 |
+
}
|
| 1566 |
+
addRenderable(e, t) {
|
| 1567 |
+
const r = this._getGpuSprite(e);
|
| 1568 |
+
e.didViewUpdate && this._updateBatchableSprite(e, r), this._renderer.renderPipes.batch.addToBatch(r, t);
|
| 1569 |
+
}
|
| 1570 |
+
updateRenderable(e) {
|
| 1571 |
+
const t = this._getGpuSprite(e);
|
| 1572 |
+
e.didViewUpdate && this._updateBatchableSprite(e, t), t._batcher.updateElement(t);
|
| 1573 |
+
}
|
| 1574 |
+
validateRenderable(e) {
|
| 1575 |
+
const t = this._getGpuSprite(e);
|
| 1576 |
+
return !t._batcher.checkAndUpdateTexture(
|
| 1577 |
+
t,
|
| 1578 |
+
e._texture
|
| 1579 |
+
);
|
| 1580 |
+
}
|
| 1581 |
+
_updateBatchableSprite(e, t) {
|
| 1582 |
+
t.bounds = e.visualBounds, t.texture = e._texture;
|
| 1583 |
+
}
|
| 1584 |
+
_getGpuSprite(e) {
|
| 1585 |
+
return e._gpuData[this._renderer.uid] || this._initGPUSprite(e);
|
| 1586 |
+
}
|
| 1587 |
+
_initGPUSprite(e) {
|
| 1588 |
+
const t = new me();
|
| 1589 |
+
return t.renderable = e, t.transform = e.groupTransform, t.texture = e._texture, t.bounds = e.visualBounds, t.roundPixels = this._renderer._roundPixels | e._roundPixels, e._gpuData[this._renderer.uid] = t, t;
|
| 1590 |
+
}
|
| 1591 |
+
destroy() {
|
| 1592 |
+
this._renderer = null;
|
| 1593 |
+
}
|
| 1594 |
+
}
|
| 1595 |
+
Be.extension = {
|
| 1596 |
+
type: [
|
| 1597 |
+
u.WebGLPipes,
|
| 1598 |
+
u.WebGPUPipes,
|
| 1599 |
+
u.CanvasPipes
|
| 1600 |
+
],
|
| 1601 |
+
name: "sprite"
|
| 1602 |
+
};
|
| 1603 |
+
const V = class Ue {
|
| 1604 |
+
constructor() {
|
| 1605 |
+
this.clearBeforeRender = !0, this._backgroundColor = new A(0), this.color = this._backgroundColor, this.alpha = 1;
|
| 1606 |
+
}
|
| 1607 |
+
/**
|
| 1608 |
+
* initiates the background system
|
| 1609 |
+
* @param options - the options for the background colors
|
| 1610 |
+
*/
|
| 1611 |
+
init(e) {
|
| 1612 |
+
e = { ...Ue.defaultOptions, ...e }, this.clearBeforeRender = e.clearBeforeRender, this.color = e.background || e.backgroundColor || this._backgroundColor, this.alpha = e.backgroundAlpha, this._backgroundColor.setAlpha(e.backgroundAlpha);
|
| 1613 |
+
}
|
| 1614 |
+
/** The background color to fill if not transparent */
|
| 1615 |
+
get color() {
|
| 1616 |
+
return this._backgroundColor;
|
| 1617 |
+
}
|
| 1618 |
+
set color(e) {
|
| 1619 |
+
A.shared.setValue(e).alpha < 1 && this._backgroundColor.alpha === 1 && H(
|
| 1620 |
+
"Cannot set a transparent background on an opaque canvas. To enable transparency, set backgroundAlpha < 1 when initializing your Application."
|
| 1621 |
+
), this._backgroundColor.setValue(e);
|
| 1622 |
+
}
|
| 1623 |
+
/** The background color alpha. Setting this to 0 will make the canvas transparent. */
|
| 1624 |
+
get alpha() {
|
| 1625 |
+
return this._backgroundColor.alpha;
|
| 1626 |
+
}
|
| 1627 |
+
set alpha(e) {
|
| 1628 |
+
this._backgroundColor.setAlpha(e);
|
| 1629 |
+
}
|
| 1630 |
+
/** The background color as an [R, G, B, A] array. */
|
| 1631 |
+
get colorRgba() {
|
| 1632 |
+
return this._backgroundColor.toArray();
|
| 1633 |
+
}
|
| 1634 |
+
/**
|
| 1635 |
+
* destroys the background system
|
| 1636 |
+
* @internal
|
| 1637 |
+
*/
|
| 1638 |
+
destroy() {
|
| 1639 |
+
}
|
| 1640 |
+
};
|
| 1641 |
+
V.extension = {
|
| 1642 |
+
type: [
|
| 1643 |
+
u.WebGLSystem,
|
| 1644 |
+
u.WebGPUSystem,
|
| 1645 |
+
u.CanvasSystem
|
| 1646 |
+
],
|
| 1647 |
+
name: "background",
|
| 1648 |
+
priority: 0
|
| 1649 |
+
};
|
| 1650 |
+
V.defaultOptions = {
|
| 1651 |
+
/**
|
| 1652 |
+
* {@link WebGLOptions.backgroundAlpha}
|
| 1653 |
+
* @default 1
|
| 1654 |
+
*/
|
| 1655 |
+
backgroundAlpha: 1,
|
| 1656 |
+
/**
|
| 1657 |
+
* {@link WebGLOptions.backgroundColor}
|
| 1658 |
+
* @default 0x000000
|
| 1659 |
+
*/
|
| 1660 |
+
backgroundColor: 0,
|
| 1661 |
+
/**
|
| 1662 |
+
* {@link WebGLOptions.clearBeforeRender}
|
| 1663 |
+
* @default true
|
| 1664 |
+
*/
|
| 1665 |
+
clearBeforeRender: !0
|
| 1666 |
+
};
|
| 1667 |
+
let gt = V;
|
| 1668 |
+
const y = {};
|
| 1669 |
+
O.handle(u.BlendMode, (n) => {
|
| 1670 |
+
if (!n.name)
|
| 1671 |
+
throw new Error("BlendMode extension must have a name property");
|
| 1672 |
+
y[n.name] = n.ref;
|
| 1673 |
+
}, (n) => {
|
| 1674 |
+
delete y[n.name];
|
| 1675 |
+
});
|
| 1676 |
+
class Ae {
|
| 1677 |
+
constructor(e) {
|
| 1678 |
+
this._blendModeStack = [], this._isAdvanced = !1, this._filterHash = /* @__PURE__ */ Object.create(null), this._renderer = e, this._renderer.runners.prerender.add(this);
|
| 1679 |
+
}
|
| 1680 |
+
prerender() {
|
| 1681 |
+
this._activeBlendMode = "normal", this._isAdvanced = !1;
|
| 1682 |
+
}
|
| 1683 |
+
/**
|
| 1684 |
+
* Push a blend mode onto the internal stack and apply it to the instruction set if needed.
|
| 1685 |
+
* @param renderable - The renderable or {@link RenderGroup} associated with the change.
|
| 1686 |
+
* @param blendMode - The blend mode to activate.
|
| 1687 |
+
* @param instructionSet - The instruction set being built.
|
| 1688 |
+
*/
|
| 1689 |
+
pushBlendMode(e, t, r) {
|
| 1690 |
+
this._blendModeStack.push(t), this.setBlendMode(e, t, r);
|
| 1691 |
+
}
|
| 1692 |
+
/**
|
| 1693 |
+
* Pop the last blend mode from the stack and apply the new top-of-stack mode.
|
| 1694 |
+
* @param instructionSet - The instruction set being built.
|
| 1695 |
+
*/
|
| 1696 |
+
popBlendMode(e) {
|
| 1697 |
+
this._blendModeStack.pop();
|
| 1698 |
+
const t = this._blendModeStack[this._activeBlendMode.length - 1] ?? "normal";
|
| 1699 |
+
this.setBlendMode(null, t, e);
|
| 1700 |
+
}
|
| 1701 |
+
/**
|
| 1702 |
+
* Ensure a blend mode switch is added to the instruction set when the mode changes.
|
| 1703 |
+
* If an advanced blend mode is active, subsequent renderables will be collected so they can be
|
| 1704 |
+
* rendered within a single filter pass.
|
| 1705 |
+
* @param renderable - The renderable or {@link RenderGroup} to associate with the change, or null when unwinding.
|
| 1706 |
+
* @param blendMode - The target blend mode.
|
| 1707 |
+
* @param instructionSet - The instruction set being built.
|
| 1708 |
+
*/
|
| 1709 |
+
setBlendMode(e, t, r) {
|
| 1710 |
+
var a;
|
| 1711 |
+
const s = e instanceof Q;
|
| 1712 |
+
if (this._activeBlendMode === t) {
|
| 1713 |
+
this._isAdvanced && e && !s && ((a = this._renderableList) == null || a.push(e));
|
| 1714 |
+
return;
|
| 1715 |
+
}
|
| 1716 |
+
this._isAdvanced && this._endAdvancedBlendMode(r), this._activeBlendMode = t, e && (this._isAdvanced = !!y[t], this._isAdvanced && this._beginAdvancedBlendMode(e, r));
|
| 1717 |
+
}
|
| 1718 |
+
_beginAdvancedBlendMode(e, t) {
|
| 1719 |
+
this._renderer.renderPipes.batch.break(t);
|
| 1720 |
+
const r = this._activeBlendMode;
|
| 1721 |
+
if (!y[r]) {
|
| 1722 |
+
H(`Unable to assign BlendMode: '${r}'. You may want to include: import 'pixi.js/advanced-blend-modes'`);
|
| 1723 |
+
return;
|
| 1724 |
+
}
|
| 1725 |
+
const s = this._ensureFilterEffect(r), a = e instanceof Q, i = {
|
| 1726 |
+
renderPipeId: "filter",
|
| 1727 |
+
action: "pushFilter",
|
| 1728 |
+
filterEffect: s,
|
| 1729 |
+
renderables: a ? null : [e],
|
| 1730 |
+
container: a ? e.root : null,
|
| 1731 |
+
canBundle: !1
|
| 1732 |
+
};
|
| 1733 |
+
this._renderableList = i.renderables, t.add(i);
|
| 1734 |
+
}
|
| 1735 |
+
_ensureFilterEffect(e) {
|
| 1736 |
+
let t = this._filterHash[e];
|
| 1737 |
+
return t || (t = this._filterHash[e] = new ue(), t.filters = [new y[e]()]), t;
|
| 1738 |
+
}
|
| 1739 |
+
_endAdvancedBlendMode(e) {
|
| 1740 |
+
this._isAdvanced = !1, this._renderableList = null, this._renderer.renderPipes.batch.break(e), e.add({
|
| 1741 |
+
renderPipeId: "filter",
|
| 1742 |
+
action: "popFilter",
|
| 1743 |
+
canBundle: !1
|
| 1744 |
+
});
|
| 1745 |
+
}
|
| 1746 |
+
/**
|
| 1747 |
+
* called when the instruction build process is starting this will reset internally to the default blend mode
|
| 1748 |
+
* @internal
|
| 1749 |
+
*/
|
| 1750 |
+
buildStart() {
|
| 1751 |
+
this._isAdvanced = !1;
|
| 1752 |
+
}
|
| 1753 |
+
/**
|
| 1754 |
+
* called when the instruction build process is finished, ensuring that if there is an advanced blend mode
|
| 1755 |
+
* active, we add the final render instructions added to the instruction set
|
| 1756 |
+
* @param instructionSet - The instruction set we are adding to
|
| 1757 |
+
* @internal
|
| 1758 |
+
*/
|
| 1759 |
+
buildEnd(e) {
|
| 1760 |
+
this._isAdvanced && this._endAdvancedBlendMode(e);
|
| 1761 |
+
}
|
| 1762 |
+
/** @internal */
|
| 1763 |
+
destroy() {
|
| 1764 |
+
this._renderer = null, this._renderableList = null;
|
| 1765 |
+
for (const e in this._filterHash)
|
| 1766 |
+
this._filterHash[e].destroy();
|
| 1767 |
+
this._filterHash = null;
|
| 1768 |
+
}
|
| 1769 |
+
}
|
| 1770 |
+
Ae.extension = {
|
| 1771 |
+
type: [
|
| 1772 |
+
u.WebGLPipes,
|
| 1773 |
+
u.WebGPUPipes,
|
| 1774 |
+
u.CanvasPipes
|
| 1775 |
+
],
|
| 1776 |
+
name: "blendMode"
|
| 1777 |
+
};
|
| 1778 |
+
const R = {
|
| 1779 |
+
png: "image/png",
|
| 1780 |
+
jpg: "image/jpeg",
|
| 1781 |
+
webp: "image/webp"
|
| 1782 |
+
}, N = class Ie {
|
| 1783 |
+
/** @param renderer - The renderer this System works for. */
|
| 1784 |
+
constructor(e) {
|
| 1785 |
+
this._renderer = e;
|
| 1786 |
+
}
|
| 1787 |
+
_normalizeOptions(e, t = {}) {
|
| 1788 |
+
return e instanceof P || e instanceof m ? {
|
| 1789 |
+
target: e,
|
| 1790 |
+
...t
|
| 1791 |
+
} : {
|
| 1792 |
+
...t,
|
| 1793 |
+
...e
|
| 1794 |
+
};
|
| 1795 |
+
}
|
| 1796 |
+
/**
|
| 1797 |
+
* Creates an IImage from a display object or texture.
|
| 1798 |
+
* @param options - Options for creating the image, or the target to extract
|
| 1799 |
+
* @returns Promise that resolves with the generated IImage
|
| 1800 |
+
* @example
|
| 1801 |
+
* ```ts
|
| 1802 |
+
* // Basic usage with a sprite
|
| 1803 |
+
* const sprite = new Sprite(texture);
|
| 1804 |
+
* const image = await renderer.extract.image(sprite);
|
| 1805 |
+
* document.body.appendChild(image);
|
| 1806 |
+
*
|
| 1807 |
+
* // Advanced usage with options
|
| 1808 |
+
* const image = await renderer.extract.image({
|
| 1809 |
+
* target: container,
|
| 1810 |
+
* format: 'webp',
|
| 1811 |
+
* quality: 0.8,
|
| 1812 |
+
* frame: new Rectangle(0, 0, 100, 100),
|
| 1813 |
+
* resolution: 2,
|
| 1814 |
+
* clearColor: '#ff0000',
|
| 1815 |
+
* antialias: true
|
| 1816 |
+
* });
|
| 1817 |
+
*
|
| 1818 |
+
* // Extract directly from a texture
|
| 1819 |
+
* const texture = Texture.from('myTexture.png');
|
| 1820 |
+
* const image = await renderer.extract.image(texture);
|
| 1821 |
+
* ```
|
| 1822 |
+
* @see {@link ExtractImageOptions} For detailed options
|
| 1823 |
+
* @see {@link ExtractSystem.base64} For base64 string output
|
| 1824 |
+
* @see {@link ExtractSystem.canvas} For canvas output
|
| 1825 |
+
* @see {@link ImageLike} For the image interface
|
| 1826 |
+
* @category rendering
|
| 1827 |
+
*/
|
| 1828 |
+
async image(e) {
|
| 1829 |
+
const t = z.get().createImage();
|
| 1830 |
+
return t.src = await this.base64(e), t;
|
| 1831 |
+
}
|
| 1832 |
+
/**
|
| 1833 |
+
* Converts the target into a base64 encoded string.
|
| 1834 |
+
*
|
| 1835 |
+
* This method works by first creating
|
| 1836 |
+
* a canvas using `Extract.canvas` and then converting it to a base64 string.
|
| 1837 |
+
* @param options - The options for creating the base64 string, or the target to extract
|
| 1838 |
+
* @returns Promise that resolves with the base64 encoded string
|
| 1839 |
+
* @example
|
| 1840 |
+
* ```ts
|
| 1841 |
+
* // Basic usage with a sprite
|
| 1842 |
+
* const sprite = new Sprite(texture);
|
| 1843 |
+
* const base64 = await renderer.extract.base64(sprite);
|
| 1844 |
+
* console.log(base64); // data:image/png;base64,...
|
| 1845 |
+
*
|
| 1846 |
+
* // Advanced usage with options
|
| 1847 |
+
* const base64 = await renderer.extract.base64({
|
| 1848 |
+
* target: container,
|
| 1849 |
+
* format: 'webp',
|
| 1850 |
+
* quality: 0.8,
|
| 1851 |
+
* frame: new Rectangle(0, 0, 100, 100),
|
| 1852 |
+
* resolution: 2
|
| 1853 |
+
* });
|
| 1854 |
+
* ```
|
| 1855 |
+
* @throws Will throw an error if the platform doesn't support any of:
|
| 1856 |
+
* - ICanvas.toDataURL
|
| 1857 |
+
* - ICanvas.toBlob
|
| 1858 |
+
* - ICanvas.convertToBlob
|
| 1859 |
+
* @see {@link ExtractImageOptions} For detailed options
|
| 1860 |
+
* @see {@link ExtractSystem.canvas} For canvas output
|
| 1861 |
+
* @see {@link ExtractSystem.image} For HTMLImage output
|
| 1862 |
+
* @category rendering
|
| 1863 |
+
*/
|
| 1864 |
+
async base64(e) {
|
| 1865 |
+
e = this._normalizeOptions(
|
| 1866 |
+
e,
|
| 1867 |
+
Ie.defaultImageOptions
|
| 1868 |
+
);
|
| 1869 |
+
const { format: t, quality: r } = e, s = this.canvas(e);
|
| 1870 |
+
if (s.toBlob !== void 0)
|
| 1871 |
+
return new Promise((a, i) => {
|
| 1872 |
+
s.toBlob((o) => {
|
| 1873 |
+
if (!o) {
|
| 1874 |
+
i(new Error("ICanvas.toBlob failed!"));
|
| 1875 |
+
return;
|
| 1876 |
+
}
|
| 1877 |
+
const l = new FileReader();
|
| 1878 |
+
l.onload = () => a(l.result), l.onerror = i, l.readAsDataURL(o);
|
| 1879 |
+
}, R[t], r);
|
| 1880 |
+
});
|
| 1881 |
+
if (s.toDataURL !== void 0)
|
| 1882 |
+
return s.toDataURL(R[t], r);
|
| 1883 |
+
if (s.convertToBlob !== void 0) {
|
| 1884 |
+
const a = await s.convertToBlob({ type: R[t], quality: r });
|
| 1885 |
+
return new Promise((i, o) => {
|
| 1886 |
+
const l = new FileReader();
|
| 1887 |
+
l.onload = () => i(l.result), l.onerror = o, l.readAsDataURL(a);
|
| 1888 |
+
});
|
| 1889 |
+
}
|
| 1890 |
+
throw new Error("Extract.base64() requires ICanvas.toDataURL, ICanvas.toBlob, or ICanvas.convertToBlob to be implemented");
|
| 1891 |
+
}
|
| 1892 |
+
/**
|
| 1893 |
+
* Creates a Canvas element, renders the target to it and returns it.
|
| 1894 |
+
* This method is useful for creating static images or when you need direct canvas access.
|
| 1895 |
+
* @param options - The options for creating the canvas, or the target to extract
|
| 1896 |
+
* @returns A Canvas element with the texture rendered on
|
| 1897 |
+
* @example
|
| 1898 |
+
* ```ts
|
| 1899 |
+
* // Basic canvas extraction from a sprite
|
| 1900 |
+
* const sprite = new Sprite(texture);
|
| 1901 |
+
* const canvas = renderer.extract.canvas(sprite);
|
| 1902 |
+
* document.body.appendChild(canvas);
|
| 1903 |
+
*
|
| 1904 |
+
* // Extract with custom region
|
| 1905 |
+
* const canvas = renderer.extract.canvas({
|
| 1906 |
+
* target: container,
|
| 1907 |
+
* frame: new Rectangle(0, 0, 100, 100)
|
| 1908 |
+
* });
|
| 1909 |
+
*
|
| 1910 |
+
* // Extract with high resolution
|
| 1911 |
+
* const canvas = renderer.extract.canvas({
|
| 1912 |
+
* target: sprite,
|
| 1913 |
+
* resolution: 2,
|
| 1914 |
+
* clearColor: '#ff0000'
|
| 1915 |
+
* });
|
| 1916 |
+
*
|
| 1917 |
+
* // Extract directly from a texture
|
| 1918 |
+
* const texture = Texture.from('myTexture.png');
|
| 1919 |
+
* const canvas = renderer.extract.canvas(texture);
|
| 1920 |
+
*
|
| 1921 |
+
* // Extract with anti-aliasing
|
| 1922 |
+
* const canvas = renderer.extract.canvas({
|
| 1923 |
+
* target: graphics,
|
| 1924 |
+
* antialias: true
|
| 1925 |
+
* });
|
| 1926 |
+
* ```
|
| 1927 |
+
* @see {@link ExtractOptions} For detailed options
|
| 1928 |
+
* @see {@link ExtractSystem.image} For HTMLImage output
|
| 1929 |
+
* @see {@link ExtractSystem.pixels} For raw pixel data
|
| 1930 |
+
* @category rendering
|
| 1931 |
+
*/
|
| 1932 |
+
canvas(e) {
|
| 1933 |
+
e = this._normalizeOptions(e);
|
| 1934 |
+
const t = e.target, r = this._renderer;
|
| 1935 |
+
if (t instanceof m)
|
| 1936 |
+
return r.texture.generateCanvas(t);
|
| 1937 |
+
const s = r.textureGenerator.generateTexture(e), a = r.texture.generateCanvas(s);
|
| 1938 |
+
return s.destroy(!0), a;
|
| 1939 |
+
}
|
| 1940 |
+
/**
|
| 1941 |
+
* Returns a one-dimensional array containing the pixel data of the entire texture in RGBA order,
|
| 1942 |
+
* with integer values between 0 and 255 (inclusive).
|
| 1943 |
+
* > [!NOE] The returned array is a flat Uint8Array where every 4 values represent RGBA
|
| 1944 |
+
* @param options - The options for extracting the image, or the target to extract
|
| 1945 |
+
* @returns One-dimensional Uint8Array containing the pixel data in RGBA format
|
| 1946 |
+
* @example
|
| 1947 |
+
* ```ts
|
| 1948 |
+
* // Basic pixel extraction
|
| 1949 |
+
* const sprite = new Sprite(texture);
|
| 1950 |
+
* const pixels = renderer.extract.pixels(sprite);
|
| 1951 |
+
* console.log(pixels[0], pixels[1], pixels[2], pixels[3]); // R,G,B,A values
|
| 1952 |
+
*
|
| 1953 |
+
* // Extract with custom region
|
| 1954 |
+
* const pixels = renderer.extract.pixels({
|
| 1955 |
+
* target: sprite,
|
| 1956 |
+
* frame: new Rectangle(0, 0, 100, 100)
|
| 1957 |
+
* });
|
| 1958 |
+
*
|
| 1959 |
+
* // Extract with high resolution
|
| 1960 |
+
* const pixels = renderer.extract.pixels({
|
| 1961 |
+
* target: sprite,
|
| 1962 |
+
* resolution: 2
|
| 1963 |
+
* });
|
| 1964 |
+
* ```
|
| 1965 |
+
* @see {@link ExtractOptions} For detailed options
|
| 1966 |
+
* @see {@link ExtractSystem.canvas} For canvas output
|
| 1967 |
+
* @see {@link ExtractSystem.image} For image output
|
| 1968 |
+
* @category rendering
|
| 1969 |
+
*/
|
| 1970 |
+
pixels(e) {
|
| 1971 |
+
e = this._normalizeOptions(e);
|
| 1972 |
+
const t = e.target, r = this._renderer, s = t instanceof m ? t : r.textureGenerator.generateTexture(e), a = r.texture.getPixels(s);
|
| 1973 |
+
return t instanceof P && s.destroy(!0), a;
|
| 1974 |
+
}
|
| 1975 |
+
/**
|
| 1976 |
+
* Creates a texture from a display object or existing texture.
|
| 1977 |
+
*
|
| 1978 |
+
* This is useful for creating
|
| 1979 |
+
* reusable textures from rendered content or making copies of existing textures.
|
| 1980 |
+
* > [!NOTE] The returned texture should be destroyed when no longer needed
|
| 1981 |
+
* @param options - The options for creating the texture, or the target to extract
|
| 1982 |
+
* @returns A new texture containing the extracted content
|
| 1983 |
+
* @example
|
| 1984 |
+
* ```ts
|
| 1985 |
+
* // Basic texture extraction from a sprite
|
| 1986 |
+
* const sprite = new Sprite(texture);
|
| 1987 |
+
* const extractedTexture = renderer.extract.texture(sprite);
|
| 1988 |
+
*
|
| 1989 |
+
* // Extract with custom region
|
| 1990 |
+
* const regionTexture = renderer.extract.texture({
|
| 1991 |
+
* target: container,
|
| 1992 |
+
* frame: new Rectangle(0, 0, 100, 100)
|
| 1993 |
+
* });
|
| 1994 |
+
*
|
| 1995 |
+
* // Extract with high resolution
|
| 1996 |
+
* const hiResTexture = renderer.extract.texture({
|
| 1997 |
+
* target: sprite,
|
| 1998 |
+
* resolution: 2,
|
| 1999 |
+
* clearColor: '#ff0000'
|
| 2000 |
+
* });
|
| 2001 |
+
*
|
| 2002 |
+
* // Create a new sprite from extracted texture
|
| 2003 |
+
* const newSprite = new Sprite(
|
| 2004 |
+
* renderer.extract.texture({
|
| 2005 |
+
* target: graphics,
|
| 2006 |
+
* antialias: true
|
| 2007 |
+
* })
|
| 2008 |
+
* );
|
| 2009 |
+
*
|
| 2010 |
+
* // Clean up when done
|
| 2011 |
+
* extractedTexture.destroy(true);
|
| 2012 |
+
* ```
|
| 2013 |
+
* @see {@link ExtractOptions} For detailed options
|
| 2014 |
+
* @see {@link Texture} For texture management
|
| 2015 |
+
* @see {@link GenerateTextureSystem} For texture generation
|
| 2016 |
+
* @category rendering
|
| 2017 |
+
*/
|
| 2018 |
+
texture(e) {
|
| 2019 |
+
return e = this._normalizeOptions(e), e.target instanceof m ? e.target : this._renderer.textureGenerator.generateTexture(e);
|
| 2020 |
+
}
|
| 2021 |
+
/**
|
| 2022 |
+
* Extracts and downloads content from the renderer as an image file.
|
| 2023 |
+
* This is a convenient way to save screenshots or export rendered content.
|
| 2024 |
+
* > [!NOTE] The download will use PNG format regardless of the filename extension
|
| 2025 |
+
* @param options - The options for downloading and extracting the image, or the target to extract
|
| 2026 |
+
* @example
|
| 2027 |
+
* ```ts
|
| 2028 |
+
* // Basic download with default filename
|
| 2029 |
+
* const sprite = new Sprite(texture);
|
| 2030 |
+
* renderer.extract.download(sprite); // Downloads as 'image.png'
|
| 2031 |
+
*
|
| 2032 |
+
* // Download with custom filename
|
| 2033 |
+
* renderer.extract.download({
|
| 2034 |
+
* target: sprite,
|
| 2035 |
+
* filename: 'screenshot.png'
|
| 2036 |
+
* });
|
| 2037 |
+
*
|
| 2038 |
+
* // Download with custom region
|
| 2039 |
+
* renderer.extract.download({
|
| 2040 |
+
* target: container,
|
| 2041 |
+
* filename: 'region.png',
|
| 2042 |
+
* frame: new Rectangle(0, 0, 100, 100)
|
| 2043 |
+
* });
|
| 2044 |
+
*
|
| 2045 |
+
* // Download with high resolution and background
|
| 2046 |
+
* renderer.extract.download({
|
| 2047 |
+
* target: stage,
|
| 2048 |
+
* filename: 'hd-screenshot.png',
|
| 2049 |
+
* resolution: 2,
|
| 2050 |
+
* clearColor: '#ff0000'
|
| 2051 |
+
* });
|
| 2052 |
+
*
|
| 2053 |
+
* // Download with anti-aliasing
|
| 2054 |
+
* renderer.extract.download({
|
| 2055 |
+
* target: graphics,
|
| 2056 |
+
* filename: 'smooth.png',
|
| 2057 |
+
* antialias: true
|
| 2058 |
+
* });
|
| 2059 |
+
* ```
|
| 2060 |
+
* @see {@link ExtractDownloadOptions} For detailed options
|
| 2061 |
+
* @see {@link ExtractSystem.image} For creating images without download
|
| 2062 |
+
* @see {@link ExtractSystem.canvas} For canvas output
|
| 2063 |
+
* @category rendering
|
| 2064 |
+
*/
|
| 2065 |
+
download(e) {
|
| 2066 |
+
e = this._normalizeOptions(e);
|
| 2067 |
+
const t = this.canvas(e), r = document.createElement("a");
|
| 2068 |
+
r.download = e.filename ?? "image.png", r.href = t.toDataURL("image/png"), document.body.appendChild(r), r.click(), document.body.removeChild(r);
|
| 2069 |
+
}
|
| 2070 |
+
/**
|
| 2071 |
+
* Logs the target to the console as an image. This is a useful way to debug what's happening in the renderer.
|
| 2072 |
+
* The image will be displayed in the browser's console using CSS background images.
|
| 2073 |
+
* @param options - The options for logging the image, or the target to log
|
| 2074 |
+
* @param options.width - The width of the logged image preview in the console (in pixels)
|
| 2075 |
+
* @example
|
| 2076 |
+
* ```ts
|
| 2077 |
+
* // Basic usage
|
| 2078 |
+
* const sprite = new Sprite(texture);
|
| 2079 |
+
* renderer.extract.log(sprite);
|
| 2080 |
+
* ```
|
| 2081 |
+
* @see {@link ExtractSystem.canvas} For getting raw canvas output
|
| 2082 |
+
* @see {@link ExtractSystem.pixels} For raw pixel data
|
| 2083 |
+
* @category rendering
|
| 2084 |
+
* @advanced
|
| 2085 |
+
*/
|
| 2086 |
+
log(e) {
|
| 2087 |
+
const t = e.width ?? 200;
|
| 2088 |
+
e = this._normalizeOptions(e);
|
| 2089 |
+
const r = this.canvas(e), s = r.toDataURL();
|
| 2090 |
+
console.log(`[Pixi Texture] ${r.width}px ${r.height}px`);
|
| 2091 |
+
const a = [
|
| 2092 |
+
"font-size: 1px;",
|
| 2093 |
+
`padding: ${t}px 300px;`,
|
| 2094 |
+
`background: url(${s}) no-repeat;`,
|
| 2095 |
+
"background-size: contain;"
|
| 2096 |
+
].join(" ");
|
| 2097 |
+
console.log("%c ", a);
|
| 2098 |
+
}
|
| 2099 |
+
destroy() {
|
| 2100 |
+
this._renderer = null;
|
| 2101 |
+
}
|
| 2102 |
+
};
|
| 2103 |
+
N.extension = {
|
| 2104 |
+
type: [
|
| 2105 |
+
u.WebGLSystem,
|
| 2106 |
+
u.WebGPUSystem
|
| 2107 |
+
],
|
| 2108 |
+
name: "extract"
|
| 2109 |
+
};
|
| 2110 |
+
N.defaultImageOptions = {
|
| 2111 |
+
format: "png",
|
| 2112 |
+
quality: 1
|
| 2113 |
+
};
|
| 2114 |
+
let xt = N;
|
| 2115 |
+
class j extends m {
|
| 2116 |
+
static create(e) {
|
| 2117 |
+
return new j({
|
| 2118 |
+
source: new T(e)
|
| 2119 |
+
});
|
| 2120 |
+
}
|
| 2121 |
+
/**
|
| 2122 |
+
* Resizes the render texture.
|
| 2123 |
+
* @param width - The new width of the render texture.
|
| 2124 |
+
* @param height - The new height of the render texture.
|
| 2125 |
+
* @param resolution - The new resolution of the render texture.
|
| 2126 |
+
* @returns This texture.
|
| 2127 |
+
*/
|
| 2128 |
+
resize(e, t, r) {
|
| 2129 |
+
return this.source.resize(e, t, r), this;
|
| 2130 |
+
}
|
| 2131 |
+
}
|
| 2132 |
+
const _t = new w(), bt = new F(), Tt = [0, 0, 0, 0];
|
| 2133 |
+
class Ge {
|
| 2134 |
+
constructor(e) {
|
| 2135 |
+
this._renderer = e;
|
| 2136 |
+
}
|
| 2137 |
+
/**
|
| 2138 |
+
* Creates a texture from a display object that can be used for creating sprites and other textures.
|
| 2139 |
+
* This is particularly useful for optimizing performance when a complex container needs to be reused.
|
| 2140 |
+
* @param options - Generate texture options or a container to convert to texture
|
| 2141 |
+
* @returns A new RenderTexture containing the rendered display object
|
| 2142 |
+
* @example
|
| 2143 |
+
* ```ts
|
| 2144 |
+
* // Basic usage with a container
|
| 2145 |
+
* const container = new Container();
|
| 2146 |
+
* container.addChild(
|
| 2147 |
+
* new Graphics()
|
| 2148 |
+
* .circle(0, 0, 50)
|
| 2149 |
+
* .fill('red')
|
| 2150 |
+
* );
|
| 2151 |
+
*
|
| 2152 |
+
* const texture = renderer.textureGenerator.generateTexture(container);
|
| 2153 |
+
*
|
| 2154 |
+
* // Advanced usage with options
|
| 2155 |
+
* const texture = renderer.textureGenerator.generateTexture({
|
| 2156 |
+
* target: container,
|
| 2157 |
+
* frame: new Rectangle(0, 0, 100, 100), // Specific region
|
| 2158 |
+
* resolution: 2, // High DPI
|
| 2159 |
+
* clearColor: '#ff0000', // Red background
|
| 2160 |
+
* antialias: true // Smooth edges
|
| 2161 |
+
* });
|
| 2162 |
+
*
|
| 2163 |
+
* // Create a sprite from the generated texture
|
| 2164 |
+
* const sprite = new Sprite(texture);
|
| 2165 |
+
*
|
| 2166 |
+
* // Clean up when done
|
| 2167 |
+
* texture.destroy(true);
|
| 2168 |
+
* ```
|
| 2169 |
+
* @see {@link GenerateTextureOptions} For detailed texture generation options
|
| 2170 |
+
* @see {@link RenderTexture} For the type of texture created
|
| 2171 |
+
* @category rendering
|
| 2172 |
+
*/
|
| 2173 |
+
generateTexture(e) {
|
| 2174 |
+
var d;
|
| 2175 |
+
e instanceof P && (e = {
|
| 2176 |
+
target: e,
|
| 2177 |
+
frame: void 0,
|
| 2178 |
+
textureSourceOptions: {},
|
| 2179 |
+
resolution: void 0
|
| 2180 |
+
});
|
| 2181 |
+
const t = e.resolution || this._renderer.resolution, r = e.antialias || this._renderer.view.antialias, s = e.target;
|
| 2182 |
+
let a = e.clearColor;
|
| 2183 |
+
a ? a = Array.isArray(a) && a.length === 4 ? a : A.shared.setValue(a).toArray() : a = Tt;
|
| 2184 |
+
const i = ((d = e.frame) == null ? void 0 : d.copyTo(_t)) || Ye(s, bt).rectangle;
|
| 2185 |
+
i.width = Math.max(i.width, 1 / t) | 0, i.height = Math.max(i.height, 1 / t) | 0;
|
| 2186 |
+
const o = j.create({
|
| 2187 |
+
...e.textureSourceOptions,
|
| 2188 |
+
width: i.width,
|
| 2189 |
+
height: i.height,
|
| 2190 |
+
resolution: t,
|
| 2191 |
+
antialias: r
|
| 2192 |
+
}), l = v.shared.translate(-i.x, -i.y);
|
| 2193 |
+
return this._renderer.render({
|
| 2194 |
+
container: s,
|
| 2195 |
+
transform: l,
|
| 2196 |
+
target: o,
|
| 2197 |
+
clearColor: a
|
| 2198 |
+
}), o.source.updateMipmaps(), o;
|
| 2199 |
+
}
|
| 2200 |
+
destroy() {
|
| 2201 |
+
this._renderer = null;
|
| 2202 |
+
}
|
| 2203 |
+
}
|
| 2204 |
+
Ge.extension = {
|
| 2205 |
+
type: [
|
| 2206 |
+
u.WebGLSystem,
|
| 2207 |
+
u.WebGPUSystem
|
| 2208 |
+
],
|
| 2209 |
+
name: "textureGenerator"
|
| 2210 |
+
};
|
| 2211 |
+
class Ee {
|
| 2212 |
+
constructor(e) {
|
| 2213 |
+
this._stackIndex = 0, this._globalUniformDataStack = [], this._uniformsPool = [], this._activeUniforms = [], this._bindGroupPool = [], this._activeBindGroups = [], this._renderer = e;
|
| 2214 |
+
}
|
| 2215 |
+
reset() {
|
| 2216 |
+
this._stackIndex = 0;
|
| 2217 |
+
for (let e = 0; e < this._activeUniforms.length; e++)
|
| 2218 |
+
this._uniformsPool.push(this._activeUniforms[e]);
|
| 2219 |
+
for (let e = 0; e < this._activeBindGroups.length; e++)
|
| 2220 |
+
this._bindGroupPool.push(this._activeBindGroups[e]);
|
| 2221 |
+
this._activeUniforms.length = 0, this._activeBindGroups.length = 0;
|
| 2222 |
+
}
|
| 2223 |
+
start(e) {
|
| 2224 |
+
this.reset(), this.push(e);
|
| 2225 |
+
}
|
| 2226 |
+
bind({
|
| 2227 |
+
size: e,
|
| 2228 |
+
projectionMatrix: t,
|
| 2229 |
+
worldTransformMatrix: r,
|
| 2230 |
+
worldColor: s,
|
| 2231 |
+
offset: a
|
| 2232 |
+
}) {
|
| 2233 |
+
const i = this._renderer.renderTarget.renderTarget, o = this._stackIndex ? this._globalUniformDataStack[this._stackIndex - 1] : {
|
| 2234 |
+
worldTransformMatrix: new v(),
|
| 2235 |
+
worldColor: 4294967295,
|
| 2236 |
+
offset: new Je()
|
| 2237 |
+
}, l = {
|
| 2238 |
+
projectionMatrix: t || this._renderer.renderTarget.projectionMatrix,
|
| 2239 |
+
resolution: e || i.size,
|
| 2240 |
+
worldTransformMatrix: r || o.worldTransformMatrix,
|
| 2241 |
+
worldColor: s || o.worldColor,
|
| 2242 |
+
offset: a || o.offset,
|
| 2243 |
+
bindGroup: null
|
| 2244 |
+
}, d = this._uniformsPool.pop() || this._createUniforms();
|
| 2245 |
+
this._activeUniforms.push(d);
|
| 2246 |
+
const c = d.uniforms;
|
| 2247 |
+
c.uProjectionMatrix = l.projectionMatrix, c.uResolution = l.resolution, c.uWorldTransformMatrix.copyFrom(l.worldTransformMatrix), c.uWorldTransformMatrix.tx -= l.offset.x, c.uWorldTransformMatrix.ty -= l.offset.y, tt(
|
| 2248 |
+
l.worldColor,
|
| 2249 |
+
c.uWorldColorAlpha,
|
| 2250 |
+
0
|
| 2251 |
+
), d.update();
|
| 2252 |
+
let h;
|
| 2253 |
+
this._renderer.renderPipes.uniformBatch ? h = this._renderer.renderPipes.uniformBatch.getUniformBindGroup(d, !1) : (h = this._bindGroupPool.pop() || new Xe(), this._activeBindGroups.push(h), h.setResource(d, 0)), l.bindGroup = h, this._currentGlobalUniformData = l;
|
| 2254 |
+
}
|
| 2255 |
+
push(e) {
|
| 2256 |
+
this.bind(e), this._globalUniformDataStack[this._stackIndex++] = this._currentGlobalUniformData;
|
| 2257 |
+
}
|
| 2258 |
+
pop() {
|
| 2259 |
+
this._currentGlobalUniformData = this._globalUniformDataStack[--this._stackIndex - 1], this._renderer.type === L.WEBGL && this._currentGlobalUniformData.bindGroup.resources[0].update();
|
| 2260 |
+
}
|
| 2261 |
+
get bindGroup() {
|
| 2262 |
+
return this._currentGlobalUniformData.bindGroup;
|
| 2263 |
+
}
|
| 2264 |
+
get globalUniformData() {
|
| 2265 |
+
return this._currentGlobalUniformData;
|
| 2266 |
+
}
|
| 2267 |
+
get uniformGroup() {
|
| 2268 |
+
return this._currentGlobalUniformData.bindGroup.resources[0];
|
| 2269 |
+
}
|
| 2270 |
+
_createUniforms() {
|
| 2271 |
+
return new oe({
|
| 2272 |
+
uProjectionMatrix: { value: new v(), type: "mat3x3<f32>" },
|
| 2273 |
+
uWorldTransformMatrix: { value: new v(), type: "mat3x3<f32>" },
|
| 2274 |
+
// TODO - someone smart - set this to be a unorm8x4 rather than a vec4<f32>
|
| 2275 |
+
uWorldColorAlpha: { value: new Float32Array(4), type: "vec4<f32>" },
|
| 2276 |
+
uResolution: { value: [0, 0], type: "vec2<f32>" }
|
| 2277 |
+
}, {
|
| 2278 |
+
isStatic: !0
|
| 2279 |
+
});
|
| 2280 |
+
}
|
| 2281 |
+
destroy() {
|
| 2282 |
+
this._renderer = null, this._globalUniformDataStack.length = 0, this._uniformsPool.length = 0, this._activeUniforms.length = 0, this._bindGroupPool.length = 0, this._activeBindGroups.length = 0, this._currentGlobalUniformData = null;
|
| 2283 |
+
}
|
| 2284 |
+
}
|
| 2285 |
+
Ee.extension = {
|
| 2286 |
+
type: [
|
| 2287 |
+
u.WebGLSystem,
|
| 2288 |
+
u.WebGPUSystem,
|
| 2289 |
+
u.CanvasSystem
|
| 2290 |
+
],
|
| 2291 |
+
name: "globalUniforms"
|
| 2292 |
+
};
|
| 2293 |
+
let yt = 1;
|
| 2294 |
+
class De {
|
| 2295 |
+
constructor() {
|
| 2296 |
+
this._tasks = [], this._offset = 0;
|
| 2297 |
+
}
|
| 2298 |
+
/** Initializes the scheduler system and starts the ticker. */
|
| 2299 |
+
init() {
|
| 2300 |
+
Z.system.add(this._update, this);
|
| 2301 |
+
}
|
| 2302 |
+
/**
|
| 2303 |
+
* Schedules a repeating task.
|
| 2304 |
+
* @param func - The function to execute.
|
| 2305 |
+
* @param duration - The interval duration in milliseconds.
|
| 2306 |
+
* @param useOffset - this will spread out tasks so that they do not all run at the same time
|
| 2307 |
+
* @returns The unique identifier for the scheduled task.
|
| 2308 |
+
*/
|
| 2309 |
+
repeat(e, t, r = !0) {
|
| 2310 |
+
const s = yt++;
|
| 2311 |
+
let a = 0;
|
| 2312 |
+
return r && (this._offset += 1e3, a = this._offset), this._tasks.push({
|
| 2313 |
+
func: e,
|
| 2314 |
+
duration: t,
|
| 2315 |
+
start: performance.now(),
|
| 2316 |
+
offset: a,
|
| 2317 |
+
last: performance.now(),
|
| 2318 |
+
repeat: !0,
|
| 2319 |
+
id: s
|
| 2320 |
+
}), s;
|
| 2321 |
+
}
|
| 2322 |
+
/**
|
| 2323 |
+
* Cancels a scheduled task.
|
| 2324 |
+
* @param id - The unique identifier of the task to cancel.
|
| 2325 |
+
*/
|
| 2326 |
+
cancel(e) {
|
| 2327 |
+
for (let t = 0; t < this._tasks.length; t++)
|
| 2328 |
+
if (this._tasks[t].id === e) {
|
| 2329 |
+
this._tasks.splice(t, 1);
|
| 2330 |
+
return;
|
| 2331 |
+
}
|
| 2332 |
+
}
|
| 2333 |
+
/**
|
| 2334 |
+
* Updates and executes the scheduled tasks.
|
| 2335 |
+
* @private
|
| 2336 |
+
*/
|
| 2337 |
+
_update() {
|
| 2338 |
+
const e = performance.now();
|
| 2339 |
+
for (let t = 0; t < this._tasks.length; t++) {
|
| 2340 |
+
const r = this._tasks[t];
|
| 2341 |
+
if (e - r.offset - r.last >= r.duration) {
|
| 2342 |
+
const s = e - r.start;
|
| 2343 |
+
r.func(s), r.last = e;
|
| 2344 |
+
}
|
| 2345 |
+
}
|
| 2346 |
+
}
|
| 2347 |
+
/**
|
| 2348 |
+
* Destroys the scheduler system and removes all tasks.
|
| 2349 |
+
* @internal
|
| 2350 |
+
*/
|
| 2351 |
+
destroy() {
|
| 2352 |
+
Z.system.remove(this._update, this), this._tasks.length = 0;
|
| 2353 |
+
}
|
| 2354 |
+
}
|
| 2355 |
+
De.extension = {
|
| 2356 |
+
type: [
|
| 2357 |
+
u.WebGLSystem,
|
| 2358 |
+
u.WebGPUSystem,
|
| 2359 |
+
u.CanvasSystem
|
| 2360 |
+
],
|
| 2361 |
+
name: "scheduler",
|
| 2362 |
+
priority: 0
|
| 2363 |
+
};
|
| 2364 |
+
let ae = !1;
|
| 2365 |
+
function kt(n) {
|
| 2366 |
+
if (!ae) {
|
| 2367 |
+
if (z.get().getNavigator().userAgent.toLowerCase().indexOf("chrome") > -1) {
|
| 2368 |
+
const e = [
|
| 2369 |
+
`%c %c %c %c %c PixiJS %c v${ee} (${n}) http://www.pixijs.com/
|
| 2370 |
+
|
| 2371 |
+
`,
|
| 2372 |
+
"background: #E72264; padding:5px 0;",
|
| 2373 |
+
"background: #6CA2EA; padding:5px 0;",
|
| 2374 |
+
"background: #B5D33D; padding:5px 0;",
|
| 2375 |
+
"background: #FED23F; padding:5px 0;",
|
| 2376 |
+
"color: #FFFFFF; background: #E72264; padding:5px 0;",
|
| 2377 |
+
"color: #E72264; background: #FFFFFF; padding:5px 0;"
|
| 2378 |
+
];
|
| 2379 |
+
globalThis.console.log(...e);
|
| 2380 |
+
} else globalThis.console && globalThis.console.log(`PixiJS ${ee} - ${n} - http://www.pixijs.com/`);
|
| 2381 |
+
ae = !0;
|
| 2382 |
+
}
|
| 2383 |
+
}
|
| 2384 |
+
class $ {
|
| 2385 |
+
constructor(e) {
|
| 2386 |
+
this._renderer = e;
|
| 2387 |
+
}
|
| 2388 |
+
/**
|
| 2389 |
+
* It all starts here! This initiates every system, passing in the options for any system by name.
|
| 2390 |
+
* @param options - the config for the renderer and all its systems
|
| 2391 |
+
*/
|
| 2392 |
+
init(e) {
|
| 2393 |
+
if (e.hello) {
|
| 2394 |
+
let t = this._renderer.name;
|
| 2395 |
+
this._renderer.type === L.WEBGL && (t += ` ${this._renderer.context.webGLVersion}`), kt(t);
|
| 2396 |
+
}
|
| 2397 |
+
}
|
| 2398 |
+
}
|
| 2399 |
+
$.extension = {
|
| 2400 |
+
type: [
|
| 2401 |
+
u.WebGLSystem,
|
| 2402 |
+
u.WebGPUSystem,
|
| 2403 |
+
u.CanvasSystem
|
| 2404 |
+
],
|
| 2405 |
+
name: "hello",
|
| 2406 |
+
priority: -2
|
| 2407 |
+
};
|
| 2408 |
+
$.defaultOptions = {
|
| 2409 |
+
/** {@link WebGLOptions.hello} */
|
| 2410 |
+
hello: !1
|
| 2411 |
+
};
|
| 2412 |
+
function Ct(n) {
|
| 2413 |
+
let e = !1;
|
| 2414 |
+
for (const r in n)
|
| 2415 |
+
if (n[r] == null) {
|
| 2416 |
+
e = !0;
|
| 2417 |
+
break;
|
| 2418 |
+
}
|
| 2419 |
+
if (!e)
|
| 2420 |
+
return n;
|
| 2421 |
+
const t = /* @__PURE__ */ Object.create(null);
|
| 2422 |
+
for (const r in n) {
|
| 2423 |
+
const s = n[r];
|
| 2424 |
+
s && (t[r] = s);
|
| 2425 |
+
}
|
| 2426 |
+
return t;
|
| 2427 |
+
}
|
| 2428 |
+
function Mt(n) {
|
| 2429 |
+
let e = 0;
|
| 2430 |
+
for (let t = 0; t < n.length; t++)
|
| 2431 |
+
n[t] == null ? e++ : n[t - e] = n[t];
|
| 2432 |
+
return n.length -= e, n;
|
| 2433 |
+
}
|
| 2434 |
+
let St = 0;
|
| 2435 |
+
const q = class Oe {
|
| 2436 |
+
/**
|
| 2437 |
+
* Creates a new RenderableGCSystem instance.
|
| 2438 |
+
* @param renderer - The renderer this garbage collection system works for
|
| 2439 |
+
*/
|
| 2440 |
+
constructor(e) {
|
| 2441 |
+
this._managedRenderables = [], this._managedHashes = [], this._managedArrays = [], this._renderer = e;
|
| 2442 |
+
}
|
| 2443 |
+
/**
|
| 2444 |
+
* Initializes the garbage collection system with the provided options.
|
| 2445 |
+
* @param options - Configuration options for the renderer
|
| 2446 |
+
*/
|
| 2447 |
+
init(e) {
|
| 2448 |
+
e = { ...Oe.defaultOptions, ...e }, this.maxUnusedTime = e.renderableGCMaxUnusedTime, this._frequency = e.renderableGCFrequency, this.enabled = e.renderableGCActive;
|
| 2449 |
+
}
|
| 2450 |
+
/**
|
| 2451 |
+
* Gets whether the garbage collection system is currently enabled.
|
| 2452 |
+
* @returns True if GC is enabled, false otherwise
|
| 2453 |
+
*/
|
| 2454 |
+
get enabled() {
|
| 2455 |
+
return !!this._handler;
|
| 2456 |
+
}
|
| 2457 |
+
/**
|
| 2458 |
+
* Enables or disables the garbage collection system.
|
| 2459 |
+
* When enabled, schedules periodic cleanup of resources.
|
| 2460 |
+
* When disabled, cancels all scheduled cleanups.
|
| 2461 |
+
*/
|
| 2462 |
+
set enabled(e) {
|
| 2463 |
+
this.enabled !== e && (e ? (this._handler = this._renderer.scheduler.repeat(
|
| 2464 |
+
() => this.run(),
|
| 2465 |
+
this._frequency,
|
| 2466 |
+
!1
|
| 2467 |
+
), this._hashHandler = this._renderer.scheduler.repeat(
|
| 2468 |
+
() => {
|
| 2469 |
+
for (const t of this._managedHashes)
|
| 2470 |
+
t.context[t.hash] = Ct(t.context[t.hash]);
|
| 2471 |
+
},
|
| 2472 |
+
this._frequency
|
| 2473 |
+
), this._arrayHandler = this._renderer.scheduler.repeat(
|
| 2474 |
+
() => {
|
| 2475 |
+
for (const t of this._managedArrays)
|
| 2476 |
+
Mt(t.context[t.hash]);
|
| 2477 |
+
},
|
| 2478 |
+
this._frequency
|
| 2479 |
+
)) : (this._renderer.scheduler.cancel(this._handler), this._renderer.scheduler.cancel(this._hashHandler), this._renderer.scheduler.cancel(this._arrayHandler)));
|
| 2480 |
+
}
|
| 2481 |
+
/**
|
| 2482 |
+
* Adds a hash table to be managed by the garbage collector.
|
| 2483 |
+
* @param context - The object containing the hash table
|
| 2484 |
+
* @param hash - The property name of the hash table
|
| 2485 |
+
*/
|
| 2486 |
+
addManagedHash(e, t) {
|
| 2487 |
+
this._managedHashes.push({ context: e, hash: t });
|
| 2488 |
+
}
|
| 2489 |
+
/**
|
| 2490 |
+
* Adds an array to be managed by the garbage collector.
|
| 2491 |
+
* @param context - The object containing the array
|
| 2492 |
+
* @param hash - The property name of the array
|
| 2493 |
+
*/
|
| 2494 |
+
addManagedArray(e, t) {
|
| 2495 |
+
this._managedArrays.push({ context: e, hash: t });
|
| 2496 |
+
}
|
| 2497 |
+
/**
|
| 2498 |
+
* Updates the GC timestamp and tracking before rendering.
|
| 2499 |
+
* @param options - The render options
|
| 2500 |
+
* @param options.container - The container to render
|
| 2501 |
+
*/
|
| 2502 |
+
prerender({
|
| 2503 |
+
container: e
|
| 2504 |
+
}) {
|
| 2505 |
+
this._now = performance.now(), e.renderGroup.gcTick = St++, this._updateInstructionGCTick(e.renderGroup, e.renderGroup.gcTick);
|
| 2506 |
+
}
|
| 2507 |
+
/**
|
| 2508 |
+
* Starts tracking a renderable for garbage collection.
|
| 2509 |
+
* @param renderable - The renderable to track
|
| 2510 |
+
*/
|
| 2511 |
+
addRenderable(e) {
|
| 2512 |
+
this.enabled && (e._lastUsed === -1 && (this._managedRenderables.push(e), e.once("destroyed", this._removeRenderable, this)), e._lastUsed = this._now);
|
| 2513 |
+
}
|
| 2514 |
+
/**
|
| 2515 |
+
* Performs garbage collection by cleaning up unused renderables.
|
| 2516 |
+
* Removes renderables that haven't been used for longer than maxUnusedTime.
|
| 2517 |
+
*/
|
| 2518 |
+
run() {
|
| 2519 |
+
var a;
|
| 2520 |
+
const e = this._now, t = this._managedRenderables, r = this._renderer.renderPipes;
|
| 2521 |
+
let s = 0;
|
| 2522 |
+
for (let i = 0; i < t.length; i++) {
|
| 2523 |
+
const o = t[i];
|
| 2524 |
+
if (o === null) {
|
| 2525 |
+
s++;
|
| 2526 |
+
continue;
|
| 2527 |
+
}
|
| 2528 |
+
const l = o.renderGroup ?? o.parentRenderGroup, d = ((a = l == null ? void 0 : l.instructionSet) == null ? void 0 : a.gcTick) ?? -1;
|
| 2529 |
+
if (((l == null ? void 0 : l.gcTick) ?? 0) === d && (o._lastUsed = e), e - o._lastUsed > this.maxUnusedTime) {
|
| 2530 |
+
if (!o.destroyed) {
|
| 2531 |
+
const c = r;
|
| 2532 |
+
l && (l.structureDidChange = !0), c[o.renderPipeId].destroyRenderable(o);
|
| 2533 |
+
}
|
| 2534 |
+
o._lastUsed = -1, s++, o.off("destroyed", this._removeRenderable, this);
|
| 2535 |
+
} else
|
| 2536 |
+
t[i - s] = o;
|
| 2537 |
+
}
|
| 2538 |
+
t.length -= s;
|
| 2539 |
+
}
|
| 2540 |
+
/** Cleans up the garbage collection system. Disables GC and removes all tracked resources. */
|
| 2541 |
+
destroy() {
|
| 2542 |
+
this.enabled = !1, this._renderer = null, this._managedRenderables.length = 0, this._managedHashes.length = 0, this._managedArrays.length = 0;
|
| 2543 |
+
}
|
| 2544 |
+
/**
|
| 2545 |
+
* Removes a renderable from being tracked when it's destroyed.
|
| 2546 |
+
* @param renderable - The renderable to stop tracking
|
| 2547 |
+
*/
|
| 2548 |
+
_removeRenderable(e) {
|
| 2549 |
+
const t = this._managedRenderables.indexOf(e);
|
| 2550 |
+
t >= 0 && (e.off("destroyed", this._removeRenderable, this), this._managedRenderables[t] = null);
|
| 2551 |
+
}
|
| 2552 |
+
/**
|
| 2553 |
+
* Updates the GC tick counter for a render group and its children.
|
| 2554 |
+
* @param renderGroup - The render group to update
|
| 2555 |
+
* @param gcTick - The new tick value
|
| 2556 |
+
*/
|
| 2557 |
+
_updateInstructionGCTick(e, t) {
|
| 2558 |
+
e.instructionSet.gcTick = t;
|
| 2559 |
+
for (const r of e.renderGroupChildren)
|
| 2560 |
+
this._updateInstructionGCTick(r, t);
|
| 2561 |
+
}
|
| 2562 |
+
};
|
| 2563 |
+
q.extension = {
|
| 2564 |
+
type: [
|
| 2565 |
+
u.WebGLSystem,
|
| 2566 |
+
u.WebGPUSystem
|
| 2567 |
+
],
|
| 2568 |
+
name: "renderableGC",
|
| 2569 |
+
priority: 0
|
| 2570 |
+
};
|
| 2571 |
+
q.defaultOptions = {
|
| 2572 |
+
/** Enable/disable the garbage collector */
|
| 2573 |
+
renderableGCActive: !0,
|
| 2574 |
+
/** Time in ms before an unused resource is collected (default 1 minute) */
|
| 2575 |
+
renderableGCMaxUnusedTime: 6e4,
|
| 2576 |
+
/** How often to run garbage collection in ms (default 30 seconds) */
|
| 2577 |
+
renderableGCFrequency: 3e4
|
| 2578 |
+
};
|
| 2579 |
+
let wt = q;
|
| 2580 |
+
const K = class Fe {
|
| 2581 |
+
/** @param renderer - The renderer this System works for. */
|
| 2582 |
+
constructor(e) {
|
| 2583 |
+
this._renderer = e, this.count = 0, this.checkCount = 0;
|
| 2584 |
+
}
|
| 2585 |
+
init(e) {
|
| 2586 |
+
e = { ...Fe.defaultOptions, ...e }, this.checkCountMax = e.textureGCCheckCountMax, this.maxIdle = e.textureGCAMaxIdle ?? e.textureGCMaxIdle, this.active = e.textureGCActive;
|
| 2587 |
+
}
|
| 2588 |
+
/**
|
| 2589 |
+
* Checks to see when the last time a texture was used.
|
| 2590 |
+
* If the texture has not been used for a specified amount of time, it will be removed from the GPU.
|
| 2591 |
+
*/
|
| 2592 |
+
postrender() {
|
| 2593 |
+
this._renderer.renderingToScreen && (this.count++, this.active && (this.checkCount++, this.checkCount > this.checkCountMax && (this.checkCount = 0, this.run())));
|
| 2594 |
+
}
|
| 2595 |
+
/**
|
| 2596 |
+
* Checks to see when the last time a texture was used.
|
| 2597 |
+
* If the texture has not been used for a specified amount of time, it will be removed from the GPU.
|
| 2598 |
+
*/
|
| 2599 |
+
run() {
|
| 2600 |
+
const e = this._renderer.texture.managedTextures;
|
| 2601 |
+
for (let t = 0; t < e.length; t++) {
|
| 2602 |
+
const r = e[t];
|
| 2603 |
+
r.autoGarbageCollect && r.resource && r._touched > -1 && this.count - r._touched > this.maxIdle && (r._touched = -1, r.unload());
|
| 2604 |
+
}
|
| 2605 |
+
}
|
| 2606 |
+
destroy() {
|
| 2607 |
+
this._renderer = null;
|
| 2608 |
+
}
|
| 2609 |
+
};
|
| 2610 |
+
K.extension = {
|
| 2611 |
+
type: [
|
| 2612 |
+
u.WebGLSystem,
|
| 2613 |
+
u.WebGPUSystem
|
| 2614 |
+
],
|
| 2615 |
+
name: "textureGC"
|
| 2616 |
+
};
|
| 2617 |
+
K.defaultOptions = {
|
| 2618 |
+
/**
|
| 2619 |
+
* If set to true, this will enable the garbage collector on the GPU.
|
| 2620 |
+
* @default true
|
| 2621 |
+
*/
|
| 2622 |
+
textureGCActive: !0,
|
| 2623 |
+
/**
|
| 2624 |
+
* @deprecated since 8.3.0
|
| 2625 |
+
* @see {@link TextureGCSystemOptions.textureGCMaxIdle}
|
| 2626 |
+
*/
|
| 2627 |
+
textureGCAMaxIdle: null,
|
| 2628 |
+
/**
|
| 2629 |
+
* The maximum idle frames before a texture is destroyed by garbage collection.
|
| 2630 |
+
* @default 60 * 60
|
| 2631 |
+
*/
|
| 2632 |
+
textureGCMaxIdle: 60 * 60,
|
| 2633 |
+
/**
|
| 2634 |
+
* Frames between two garbage collections.
|
| 2635 |
+
* @default 600
|
| 2636 |
+
*/
|
| 2637 |
+
textureGCCheckCountMax: 600
|
| 2638 |
+
};
|
| 2639 |
+
let Pt = K;
|
| 2640 |
+
const Y = class Le {
|
| 2641 |
+
/**
|
| 2642 |
+
* Whether CSS dimensions of canvas view should be resized to screen dimensions automatically.
|
| 2643 |
+
* This is only supported for HTMLCanvasElement and will be ignored if the canvas is an OffscreenCanvas.
|
| 2644 |
+
* @type {boolean}
|
| 2645 |
+
*/
|
| 2646 |
+
get autoDensity() {
|
| 2647 |
+
return this.texture.source.autoDensity;
|
| 2648 |
+
}
|
| 2649 |
+
set autoDensity(e) {
|
| 2650 |
+
this.texture.source.autoDensity = e;
|
| 2651 |
+
}
|
| 2652 |
+
/** The resolution / device pixel ratio of the renderer. */
|
| 2653 |
+
get resolution() {
|
| 2654 |
+
return this.texture.source._resolution;
|
| 2655 |
+
}
|
| 2656 |
+
set resolution(e) {
|
| 2657 |
+
this.texture.source.resize(
|
| 2658 |
+
this.texture.source.width,
|
| 2659 |
+
this.texture.source.height,
|
| 2660 |
+
e
|
| 2661 |
+
);
|
| 2662 |
+
}
|
| 2663 |
+
/**
|
| 2664 |
+
* initiates the view system
|
| 2665 |
+
* @param options - the options for the view
|
| 2666 |
+
*/
|
| 2667 |
+
init(e) {
|
| 2668 |
+
e = {
|
| 2669 |
+
...Le.defaultOptions,
|
| 2670 |
+
...e
|
| 2671 |
+
}, e.view && (Qe(Ze, "ViewSystem.view has been renamed to ViewSystem.canvas"), e.canvas = e.view), this.screen = new w(0, 0, e.width, e.height), this.canvas = e.canvas || z.get().createCanvas(), this.antialias = !!e.antialias, this.texture = ye(this.canvas, e), this.renderTarget = new G({
|
| 2672 |
+
colorTextures: [this.texture],
|
| 2673 |
+
depth: !!e.depth,
|
| 2674 |
+
isRoot: !0
|
| 2675 |
+
}), this.texture.source.transparent = e.backgroundAlpha < 1, this.resolution = e.resolution;
|
| 2676 |
+
}
|
| 2677 |
+
/**
|
| 2678 |
+
* Resizes the screen and canvas to the specified dimensions.
|
| 2679 |
+
* @param desiredScreenWidth - The new width of the screen.
|
| 2680 |
+
* @param desiredScreenHeight - The new height of the screen.
|
| 2681 |
+
* @param resolution
|
| 2682 |
+
*/
|
| 2683 |
+
resize(e, t, r) {
|
| 2684 |
+
this.texture.source.resize(e, t, r), this.screen.width = this.texture.frame.width, this.screen.height = this.texture.frame.height;
|
| 2685 |
+
}
|
| 2686 |
+
/**
|
| 2687 |
+
* Destroys this System and optionally removes the canvas from the dom.
|
| 2688 |
+
* @param {options | false} options - The options for destroying the view, or "false".
|
| 2689 |
+
* @example
|
| 2690 |
+
* viewSystem.destroy();
|
| 2691 |
+
* viewSystem.destroy(true);
|
| 2692 |
+
* viewSystem.destroy({ removeView: true });
|
| 2693 |
+
*/
|
| 2694 |
+
destroy(e = !1) {
|
| 2695 |
+
(typeof e == "boolean" ? e : !!(e != null && e.removeView)) && this.canvas.parentNode && this.canvas.parentNode.removeChild(this.canvas), this.texture.destroy();
|
| 2696 |
+
}
|
| 2697 |
+
};
|
| 2698 |
+
Y.extension = {
|
| 2699 |
+
type: [
|
| 2700 |
+
u.WebGLSystem,
|
| 2701 |
+
u.WebGPUSystem,
|
| 2702 |
+
u.CanvasSystem
|
| 2703 |
+
],
|
| 2704 |
+
name: "view",
|
| 2705 |
+
priority: 0
|
| 2706 |
+
};
|
| 2707 |
+
Y.defaultOptions = {
|
| 2708 |
+
/**
|
| 2709 |
+
* {@link WebGLOptions.width}
|
| 2710 |
+
* @default 800
|
| 2711 |
+
*/
|
| 2712 |
+
width: 800,
|
| 2713 |
+
/**
|
| 2714 |
+
* {@link WebGLOptions.height}
|
| 2715 |
+
* @default 600
|
| 2716 |
+
*/
|
| 2717 |
+
height: 600,
|
| 2718 |
+
/**
|
| 2719 |
+
* {@link WebGLOptions.autoDensity}
|
| 2720 |
+
* @default false
|
| 2721 |
+
*/
|
| 2722 |
+
autoDensity: !1,
|
| 2723 |
+
/**
|
| 2724 |
+
* {@link WebGLOptions.antialias}
|
| 2725 |
+
* @default false
|
| 2726 |
+
*/
|
| 2727 |
+
antialias: !1
|
| 2728 |
+
};
|
| 2729 |
+
let Rt = Y;
|
| 2730 |
+
const zt = [
|
| 2731 |
+
gt,
|
| 2732 |
+
Ee,
|
| 2733 |
+
$,
|
| 2734 |
+
Rt,
|
| 2735 |
+
Re,
|
| 2736 |
+
Pt,
|
| 2737 |
+
Ge,
|
| 2738 |
+
xt,
|
| 2739 |
+
et,
|
| 2740 |
+
wt,
|
| 2741 |
+
De
|
| 2742 |
+
], Wt = [
|
| 2743 |
+
Ae,
|
| 2744 |
+
xe,
|
| 2745 |
+
Be,
|
| 2746 |
+
Se,
|
| 2747 |
+
_e,
|
| 2748 |
+
Te,
|
| 2749 |
+
be,
|
| 2750 |
+
Me
|
| 2751 |
+
];
|
| 2752 |
+
export {
|
| 2753 |
+
Ht as B,
|
| 2754 |
+
_ as G,
|
| 2755 |
+
Lt as R,
|
| 2756 |
+
zt as S,
|
| 2757 |
+
Dt as U,
|
| 2758 |
+
Wt as a,
|
| 2759 |
+
ut as b,
|
| 2760 |
+
Ot as c,
|
| 2761 |
+
C as d,
|
| 2762 |
+
Et as e,
|
| 2763 |
+
Gt as f,
|
| 2764 |
+
It as t,
|
| 2765 |
+
Ft as u
|
| 2766 |
+
};
|
src/backend/gradio_polygonannotator/templates/component/WebGLRenderer-CcnJ7_Ew.js
ADDED
|
@@ -0,0 +1,2643 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { E as d, B, w as m, D as S, J as K, t as Be, q as U, s as b, a5 as Ae, j as $, a6 as Ne, S as p, O as H, i as A, h as N, k as F, M as z, a7 as Y, a8 as ye, a9 as Ce, aa as q, ab as Ie, A as De, R as Ge, e as T } from "./Index-CzQ497_5.js";
|
| 2 |
+
import { S as O, b as Z } from "./colorToUniform-zJcCVLeu.js";
|
| 3 |
+
import { e as Ue, G as Fe, c as Oe, b as Pe, U as Me, R as Le, B as J, d as y, f as He, S as we, a as Ve } from "./SharedSystems-Cd96rNl9.js";
|
| 4 |
+
class Q {
|
| 5 |
+
constructor() {
|
| 6 |
+
this._tempState = O.for2d(), this._didUploadHash = {};
|
| 7 |
+
}
|
| 8 |
+
init(e) {
|
| 9 |
+
e.renderer.runners.contextChange.add(this);
|
| 10 |
+
}
|
| 11 |
+
contextChange() {
|
| 12 |
+
this._didUploadHash = {};
|
| 13 |
+
}
|
| 14 |
+
start(e, r, s) {
|
| 15 |
+
const n = e.renderer, i = this._didUploadHash[s.uid];
|
| 16 |
+
n.shader.bind(s, i), i || (this._didUploadHash[s.uid] = !0), n.shader.updateUniformGroup(n.globalUniforms.uniformGroup), n.geometry.bind(r, s.glProgram);
|
| 17 |
+
}
|
| 18 |
+
execute(e, r) {
|
| 19 |
+
const s = e.renderer;
|
| 20 |
+
this._tempState.blendMode = r.blendMode, s.state.set(this._tempState);
|
| 21 |
+
const n = r.textures.textures;
|
| 22 |
+
for (let i = 0; i < r.textures.count; i++)
|
| 23 |
+
s.texture.bind(n[i], i);
|
| 24 |
+
s.geometry.draw(r.topology, r.size, r.start);
|
| 25 |
+
}
|
| 26 |
+
}
|
| 27 |
+
Q.extension = {
|
| 28 |
+
type: [
|
| 29 |
+
d.WebGLPipesAdaptor
|
| 30 |
+
],
|
| 31 |
+
name: "batch"
|
| 32 |
+
};
|
| 33 |
+
var x = /* @__PURE__ */ ((t) => (t[t.ELEMENT_ARRAY_BUFFER = 34963] = "ELEMENT_ARRAY_BUFFER", t[t.ARRAY_BUFFER = 34962] = "ARRAY_BUFFER", t[t.UNIFORM_BUFFER = 35345] = "UNIFORM_BUFFER", t))(x || {});
|
| 34 |
+
class ke {
|
| 35 |
+
constructor(e, r) {
|
| 36 |
+
this._lastBindBaseLocation = -1, this._lastBindCallId = -1, this.buffer = e || null, this.updateID = -1, this.byteLength = -1, this.type = r;
|
| 37 |
+
}
|
| 38 |
+
}
|
| 39 |
+
class ee {
|
| 40 |
+
/**
|
| 41 |
+
* @param {Renderer} renderer - The renderer this System works for.
|
| 42 |
+
*/
|
| 43 |
+
constructor(e) {
|
| 44 |
+
this._gpuBuffers = /* @__PURE__ */ Object.create(null), this._boundBufferBases = /* @__PURE__ */ Object.create(null), this._minBaseLocation = 0, this._nextBindBaseIndex = this._minBaseLocation, this._bindCallId = 0, this._renderer = e, this._renderer.renderableGC.addManagedHash(this, "_gpuBuffers");
|
| 45 |
+
}
|
| 46 |
+
/** @ignore */
|
| 47 |
+
destroy() {
|
| 48 |
+
this._renderer = null, this._gl = null, this._gpuBuffers = null, this._boundBufferBases = null;
|
| 49 |
+
}
|
| 50 |
+
/** Sets up the renderer context and necessary buffers. */
|
| 51 |
+
contextChange() {
|
| 52 |
+
this._gl = this._renderer.gl, this._gpuBuffers = /* @__PURE__ */ Object.create(null), this._maxBindings = this._renderer.limits.maxUniformBindings;
|
| 53 |
+
}
|
| 54 |
+
getGlBuffer(e) {
|
| 55 |
+
return this._gpuBuffers[e.uid] || this.createGLBuffer(e);
|
| 56 |
+
}
|
| 57 |
+
/**
|
| 58 |
+
* This binds specified buffer. On first run, it will create the webGL buffers for the context too
|
| 59 |
+
* @param buffer - the buffer to bind to the renderer
|
| 60 |
+
*/
|
| 61 |
+
bind(e) {
|
| 62 |
+
const { _gl: r } = this, s = this.getGlBuffer(e);
|
| 63 |
+
r.bindBuffer(s.type, s.buffer);
|
| 64 |
+
}
|
| 65 |
+
/**
|
| 66 |
+
* Binds an uniform buffer to at the given index.
|
| 67 |
+
*
|
| 68 |
+
* A cache is used so a buffer will not be bound again if already bound.
|
| 69 |
+
* @param glBuffer - the buffer to bind
|
| 70 |
+
* @param index - the base index to bind it to.
|
| 71 |
+
*/
|
| 72 |
+
bindBufferBase(e, r) {
|
| 73 |
+
const { _gl: s } = this;
|
| 74 |
+
this._boundBufferBases[r] !== e && (this._boundBufferBases[r] = e, e._lastBindBaseLocation = r, s.bindBufferBase(s.UNIFORM_BUFFER, r, e.buffer));
|
| 75 |
+
}
|
| 76 |
+
nextBindBase(e) {
|
| 77 |
+
this._bindCallId++, this._minBaseLocation = 0, e && (this._boundBufferBases[0] = null, this._minBaseLocation = 1, this._nextBindBaseIndex < 1 && (this._nextBindBaseIndex = 1));
|
| 78 |
+
}
|
| 79 |
+
freeLocationForBufferBase(e) {
|
| 80 |
+
let r = this.getLastBindBaseLocation(e);
|
| 81 |
+
if (r >= this._minBaseLocation)
|
| 82 |
+
return e._lastBindCallId = this._bindCallId, r;
|
| 83 |
+
let s = 0, n = this._nextBindBaseIndex;
|
| 84 |
+
for (; s < 2; ) {
|
| 85 |
+
n >= this._maxBindings && (n = this._minBaseLocation, s++);
|
| 86 |
+
const i = this._boundBufferBases[n];
|
| 87 |
+
if (i && i._lastBindCallId === this._bindCallId) {
|
| 88 |
+
n++;
|
| 89 |
+
continue;
|
| 90 |
+
}
|
| 91 |
+
break;
|
| 92 |
+
}
|
| 93 |
+
return r = n, this._nextBindBaseIndex = n + 1, s >= 2 ? -1 : (e._lastBindCallId = this._bindCallId, this._boundBufferBases[r] = null, r);
|
| 94 |
+
}
|
| 95 |
+
getLastBindBaseLocation(e) {
|
| 96 |
+
const r = e._lastBindBaseLocation;
|
| 97 |
+
return this._boundBufferBases[r] === e ? r : -1;
|
| 98 |
+
}
|
| 99 |
+
/**
|
| 100 |
+
* Binds a buffer whilst also binding its range.
|
| 101 |
+
* This will make the buffer start from the offset supplied rather than 0 when it is read.
|
| 102 |
+
* @param glBuffer - the buffer to bind
|
| 103 |
+
* @param index - the base index to bind at, defaults to 0
|
| 104 |
+
* @param offset - the offset to bind at (this is blocks of 256). 0 = 0, 1 = 256, 2 = 512 etc
|
| 105 |
+
* @param size - the size to bind at (this is blocks of 256).
|
| 106 |
+
*/
|
| 107 |
+
bindBufferRange(e, r, s, n) {
|
| 108 |
+
const { _gl: i } = this;
|
| 109 |
+
s || (s = 0), r || (r = 0), this._boundBufferBases[r] = null, i.bindBufferRange(i.UNIFORM_BUFFER, r || 0, e.buffer, s * 256, n || 256);
|
| 110 |
+
}
|
| 111 |
+
/**
|
| 112 |
+
* Will ensure the data in the buffer is uploaded to the GPU.
|
| 113 |
+
* @param {Buffer} buffer - the buffer to update
|
| 114 |
+
*/
|
| 115 |
+
updateBuffer(e) {
|
| 116 |
+
const { _gl: r } = this, s = this.getGlBuffer(e);
|
| 117 |
+
if (e._updateID === s.updateID)
|
| 118 |
+
return s;
|
| 119 |
+
s.updateID = e._updateID, r.bindBuffer(s.type, s.buffer);
|
| 120 |
+
const n = e.data, i = e.descriptor.usage & B.STATIC ? r.STATIC_DRAW : r.DYNAMIC_DRAW;
|
| 121 |
+
return n ? s.byteLength >= n.byteLength ? r.bufferSubData(s.type, 0, n, 0, e._updateSize / n.BYTES_PER_ELEMENT) : (s.byteLength = n.byteLength, r.bufferData(s.type, n, i)) : (s.byteLength = e.descriptor.size, r.bufferData(s.type, s.byteLength, i)), s;
|
| 122 |
+
}
|
| 123 |
+
/** dispose all WebGL resources of all managed buffers */
|
| 124 |
+
destroyAll() {
|
| 125 |
+
const e = this._gl;
|
| 126 |
+
for (const r in this._gpuBuffers)
|
| 127 |
+
e.deleteBuffer(this._gpuBuffers[r].buffer);
|
| 128 |
+
this._gpuBuffers = /* @__PURE__ */ Object.create(null);
|
| 129 |
+
}
|
| 130 |
+
/**
|
| 131 |
+
* Disposes buffer
|
| 132 |
+
* @param {Buffer} buffer - buffer with data
|
| 133 |
+
* @param {boolean} [contextLost=false] - If context was lost, we suppress deleteVertexArray
|
| 134 |
+
*/
|
| 135 |
+
onBufferDestroy(e, r) {
|
| 136 |
+
const s = this._gpuBuffers[e.uid], n = this._gl;
|
| 137 |
+
r || n.deleteBuffer(s.buffer), this._gpuBuffers[e.uid] = null;
|
| 138 |
+
}
|
| 139 |
+
/**
|
| 140 |
+
* creates and attaches a GLBuffer object tied to the current context.
|
| 141 |
+
* @param buffer
|
| 142 |
+
* @protected
|
| 143 |
+
*/
|
| 144 |
+
createGLBuffer(e) {
|
| 145 |
+
const { _gl: r } = this;
|
| 146 |
+
let s = x.ARRAY_BUFFER;
|
| 147 |
+
e.descriptor.usage & B.INDEX ? s = x.ELEMENT_ARRAY_BUFFER : e.descriptor.usage & B.UNIFORM && (s = x.UNIFORM_BUFFER);
|
| 148 |
+
const n = new ke(r.createBuffer(), s);
|
| 149 |
+
return this._gpuBuffers[e.uid] = n, e.on("destroy", this.onBufferDestroy, this), n;
|
| 150 |
+
}
|
| 151 |
+
resetState() {
|
| 152 |
+
this._boundBufferBases = /* @__PURE__ */ Object.create(null);
|
| 153 |
+
}
|
| 154 |
+
}
|
| 155 |
+
ee.extension = {
|
| 156 |
+
type: [
|
| 157 |
+
d.WebGLSystem
|
| 158 |
+
],
|
| 159 |
+
name: "buffer"
|
| 160 |
+
};
|
| 161 |
+
const P = class te {
|
| 162 |
+
/** @param renderer - The renderer this System works for. */
|
| 163 |
+
constructor(e) {
|
| 164 |
+
this.supports = {
|
| 165 |
+
/** Support for 32-bit indices buffer. */
|
| 166 |
+
uint32Indices: !0,
|
| 167 |
+
/** Support for UniformBufferObjects */
|
| 168 |
+
uniformBufferObject: !0,
|
| 169 |
+
/** Support for VertexArrayObjects */
|
| 170 |
+
vertexArrayObject: !0,
|
| 171 |
+
/** Support for SRGB texture format */
|
| 172 |
+
srgbTextures: !0,
|
| 173 |
+
/** Support for wrapping modes if a texture is non-power of two */
|
| 174 |
+
nonPowOf2wrapping: !0,
|
| 175 |
+
/** Support for MSAA (antialiasing of dynamic textures) */
|
| 176 |
+
msaa: !0,
|
| 177 |
+
/** Support for mipmaps if a texture is non-power of two */
|
| 178 |
+
nonPowOf2mipmaps: !0
|
| 179 |
+
}, this._renderer = e, this.extensions = /* @__PURE__ */ Object.create(null), this.handleContextLost = this.handleContextLost.bind(this), this.handleContextRestored = this.handleContextRestored.bind(this);
|
| 180 |
+
}
|
| 181 |
+
/**
|
| 182 |
+
* `true` if the context is lost
|
| 183 |
+
* @readonly
|
| 184 |
+
*/
|
| 185 |
+
get isLost() {
|
| 186 |
+
return !this.gl || this.gl.isContextLost();
|
| 187 |
+
}
|
| 188 |
+
/**
|
| 189 |
+
* Handles the context change event.
|
| 190 |
+
* @param {WebGLRenderingContext} gl - New WebGL context.
|
| 191 |
+
*/
|
| 192 |
+
contextChange(e) {
|
| 193 |
+
this.gl = e, this._renderer.gl = e;
|
| 194 |
+
}
|
| 195 |
+
init(e) {
|
| 196 |
+
e = { ...te.defaultOptions, ...e };
|
| 197 |
+
let r = this.multiView = e.multiView;
|
| 198 |
+
if (e.context && r && (m("Renderer created with both a context and multiview enabled. Disabling multiView as both cannot work together."), r = !1), r ? this.canvas = S.get().createCanvas(this._renderer.canvas.width, this._renderer.canvas.height) : this.canvas = this._renderer.view.canvas, e.context)
|
| 199 |
+
this.initFromContext(e.context);
|
| 200 |
+
else {
|
| 201 |
+
const s = this._renderer.background.alpha < 1, n = e.premultipliedAlpha ?? !0, i = e.antialias && !this._renderer.backBuffer.useBackBuffer;
|
| 202 |
+
this.createContext(e.preferWebGLVersion, {
|
| 203 |
+
alpha: s,
|
| 204 |
+
premultipliedAlpha: n,
|
| 205 |
+
antialias: i,
|
| 206 |
+
stencil: !0,
|
| 207 |
+
preserveDrawingBuffer: e.preserveDrawingBuffer,
|
| 208 |
+
powerPreference: e.powerPreference ?? "default"
|
| 209 |
+
});
|
| 210 |
+
}
|
| 211 |
+
}
|
| 212 |
+
ensureCanvasSize(e) {
|
| 213 |
+
if (!this.multiView) {
|
| 214 |
+
e !== this.canvas && m("multiView is disabled, but targetCanvas is not the main canvas");
|
| 215 |
+
return;
|
| 216 |
+
}
|
| 217 |
+
const { canvas: r } = this;
|
| 218 |
+
(r.width < e.width || r.height < e.height) && (r.width = Math.max(e.width, e.width), r.height = Math.max(e.height, e.height));
|
| 219 |
+
}
|
| 220 |
+
/**
|
| 221 |
+
* Initializes the context.
|
| 222 |
+
* @protected
|
| 223 |
+
* @param {WebGLRenderingContext} gl - WebGL context
|
| 224 |
+
*/
|
| 225 |
+
initFromContext(e) {
|
| 226 |
+
this.gl = e, this.webGLVersion = e instanceof S.get().getWebGLRenderingContext() ? 1 : 2, this.getExtensions(), this.validateContext(e), this._renderer.runners.contextChange.emit(e);
|
| 227 |
+
const r = this._renderer.view.canvas;
|
| 228 |
+
r.addEventListener("webglcontextlost", this.handleContextLost, !1), r.addEventListener("webglcontextrestored", this.handleContextRestored, !1);
|
| 229 |
+
}
|
| 230 |
+
/**
|
| 231 |
+
* Initialize from context options
|
| 232 |
+
* @protected
|
| 233 |
+
* @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/getContext
|
| 234 |
+
* @param preferWebGLVersion
|
| 235 |
+
* @param {object} options - context attributes
|
| 236 |
+
*/
|
| 237 |
+
createContext(e, r) {
|
| 238 |
+
let s;
|
| 239 |
+
const n = this.canvas;
|
| 240 |
+
if (e === 2 && (s = n.getContext("webgl2", r)), !s && (s = n.getContext("webgl", r), !s))
|
| 241 |
+
throw new Error("This browser does not support WebGL. Try using the canvas renderer");
|
| 242 |
+
this.gl = s, this.initFromContext(this.gl);
|
| 243 |
+
}
|
| 244 |
+
/** Auto-populate the {@link GlContextSystem.extensions extensions}. */
|
| 245 |
+
getExtensions() {
|
| 246 |
+
const { gl: e } = this, r = {
|
| 247 |
+
anisotropicFiltering: e.getExtension("EXT_texture_filter_anisotropic"),
|
| 248 |
+
floatTextureLinear: e.getExtension("OES_texture_float_linear"),
|
| 249 |
+
s3tc: e.getExtension("WEBGL_compressed_texture_s3tc"),
|
| 250 |
+
s3tc_sRGB: e.getExtension("WEBGL_compressed_texture_s3tc_srgb"),
|
| 251 |
+
// eslint-disable-line camelcase
|
| 252 |
+
etc: e.getExtension("WEBGL_compressed_texture_etc"),
|
| 253 |
+
etc1: e.getExtension("WEBGL_compressed_texture_etc1"),
|
| 254 |
+
pvrtc: e.getExtension("WEBGL_compressed_texture_pvrtc") || e.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc"),
|
| 255 |
+
atc: e.getExtension("WEBGL_compressed_texture_atc"),
|
| 256 |
+
astc: e.getExtension("WEBGL_compressed_texture_astc"),
|
| 257 |
+
bptc: e.getExtension("EXT_texture_compression_bptc"),
|
| 258 |
+
rgtc: e.getExtension("EXT_texture_compression_rgtc"),
|
| 259 |
+
loseContext: e.getExtension("WEBGL_lose_context")
|
| 260 |
+
};
|
| 261 |
+
if (this.webGLVersion === 1)
|
| 262 |
+
this.extensions = {
|
| 263 |
+
...r,
|
| 264 |
+
drawBuffers: e.getExtension("WEBGL_draw_buffers"),
|
| 265 |
+
depthTexture: e.getExtension("WEBGL_depth_texture"),
|
| 266 |
+
vertexArrayObject: e.getExtension("OES_vertex_array_object") || e.getExtension("MOZ_OES_vertex_array_object") || e.getExtension("WEBKIT_OES_vertex_array_object"),
|
| 267 |
+
uint32ElementIndex: e.getExtension("OES_element_index_uint"),
|
| 268 |
+
// Floats and half-floats
|
| 269 |
+
floatTexture: e.getExtension("OES_texture_float"),
|
| 270 |
+
floatTextureLinear: e.getExtension("OES_texture_float_linear"),
|
| 271 |
+
textureHalfFloat: e.getExtension("OES_texture_half_float"),
|
| 272 |
+
textureHalfFloatLinear: e.getExtension("OES_texture_half_float_linear"),
|
| 273 |
+
vertexAttribDivisorANGLE: e.getExtension("ANGLE_instanced_arrays"),
|
| 274 |
+
srgb: e.getExtension("EXT_sRGB")
|
| 275 |
+
};
|
| 276 |
+
else {
|
| 277 |
+
this.extensions = {
|
| 278 |
+
...r,
|
| 279 |
+
colorBufferFloat: e.getExtension("EXT_color_buffer_float")
|
| 280 |
+
};
|
| 281 |
+
const s = e.getExtension("WEBGL_provoking_vertex");
|
| 282 |
+
s && s.provokingVertexWEBGL(s.FIRST_VERTEX_CONVENTION_WEBGL);
|
| 283 |
+
}
|
| 284 |
+
}
|
| 285 |
+
/**
|
| 286 |
+
* Handles a lost webgl context
|
| 287 |
+
* @param {WebGLContextEvent} event - The context lost event.
|
| 288 |
+
*/
|
| 289 |
+
handleContextLost(e) {
|
| 290 |
+
e.preventDefault(), this._contextLossForced && (this._contextLossForced = !1, setTimeout(() => {
|
| 291 |
+
var r;
|
| 292 |
+
this.gl.isContextLost() && ((r = this.extensions.loseContext) == null || r.restoreContext());
|
| 293 |
+
}, 0));
|
| 294 |
+
}
|
| 295 |
+
/** Handles a restored webgl context. */
|
| 296 |
+
handleContextRestored() {
|
| 297 |
+
this.getExtensions(), this._renderer.runners.contextChange.emit(this.gl);
|
| 298 |
+
}
|
| 299 |
+
destroy() {
|
| 300 |
+
var r;
|
| 301 |
+
const e = this._renderer.view.canvas;
|
| 302 |
+
this._renderer = null, e.removeEventListener("webglcontextlost", this.handleContextLost), e.removeEventListener("webglcontextrestored", this.handleContextRestored), this.gl.useProgram(null), (r = this.extensions.loseContext) == null || r.loseContext();
|
| 303 |
+
}
|
| 304 |
+
/**
|
| 305 |
+
* this function can be called to force a webGL context loss
|
| 306 |
+
* this will release all resources on the GPU.
|
| 307 |
+
* Useful if you need to put Pixi to sleep, and save some GPU memory
|
| 308 |
+
*
|
| 309 |
+
* As soon as render is called - all resources will be created again.
|
| 310 |
+
*/
|
| 311 |
+
forceContextLoss() {
|
| 312 |
+
var e;
|
| 313 |
+
(e = this.extensions.loseContext) == null || e.loseContext(), this._contextLossForced = !0;
|
| 314 |
+
}
|
| 315 |
+
/**
|
| 316 |
+
* Validate context.
|
| 317 |
+
* @param {WebGLRenderingContext} gl - Render context.
|
| 318 |
+
*/
|
| 319 |
+
validateContext(e) {
|
| 320 |
+
const r = e.getContextAttributes();
|
| 321 |
+
r && !r.stencil && m("Provided WebGL context does not have a stencil buffer, masks may not render correctly");
|
| 322 |
+
const s = this.supports, n = this.webGLVersion === 2, i = this.extensions;
|
| 323 |
+
s.uint32Indices = n || !!i.uint32ElementIndex, s.uniformBufferObject = n, s.vertexArrayObject = n || !!i.vertexArrayObject, s.srgbTextures = n || !!i.srgb, s.nonPowOf2wrapping = n, s.nonPowOf2mipmaps = n, s.msaa = n, s.uint32Indices || m("Provided WebGL context does not support 32 index buffer, large scenes may not render correctly");
|
| 324 |
+
}
|
| 325 |
+
};
|
| 326 |
+
P.extension = {
|
| 327 |
+
type: [
|
| 328 |
+
d.WebGLSystem
|
| 329 |
+
],
|
| 330 |
+
name: "context"
|
| 331 |
+
};
|
| 332 |
+
P.defaultOptions = {
|
| 333 |
+
/**
|
| 334 |
+
* {@link WebGLOptions.context}
|
| 335 |
+
* @default null
|
| 336 |
+
*/
|
| 337 |
+
context: null,
|
| 338 |
+
/**
|
| 339 |
+
* {@link WebGLOptions.premultipliedAlpha}
|
| 340 |
+
* @default true
|
| 341 |
+
*/
|
| 342 |
+
premultipliedAlpha: !0,
|
| 343 |
+
/**
|
| 344 |
+
* {@link WebGLOptions.preserveDrawingBuffer}
|
| 345 |
+
* @default false
|
| 346 |
+
*/
|
| 347 |
+
preserveDrawingBuffer: !1,
|
| 348 |
+
/**
|
| 349 |
+
* {@link WebGLOptions.powerPreference}
|
| 350 |
+
* @default default
|
| 351 |
+
*/
|
| 352 |
+
powerPreference: void 0,
|
| 353 |
+
/**
|
| 354 |
+
* {@link WebGLOptions.webGLVersion}
|
| 355 |
+
* @default 2
|
| 356 |
+
*/
|
| 357 |
+
preferWebGLVersion: 2,
|
| 358 |
+
/**
|
| 359 |
+
* {@link WebGLOptions.multiView}
|
| 360 |
+
* @default false
|
| 361 |
+
*/
|
| 362 |
+
multiView: !1
|
| 363 |
+
};
|
| 364 |
+
let Xe = P;
|
| 365 |
+
var D = /* @__PURE__ */ ((t) => (t[t.RGBA = 6408] = "RGBA", t[t.RGB = 6407] = "RGB", t[t.RG = 33319] = "RG", t[t.RED = 6403] = "RED", t[t.RGBA_INTEGER = 36249] = "RGBA_INTEGER", t[t.RGB_INTEGER = 36248] = "RGB_INTEGER", t[t.RG_INTEGER = 33320] = "RG_INTEGER", t[t.RED_INTEGER = 36244] = "RED_INTEGER", t[t.ALPHA = 6406] = "ALPHA", t[t.LUMINANCE = 6409] = "LUMINANCE", t[t.LUMINANCE_ALPHA = 6410] = "LUMINANCE_ALPHA", t[t.DEPTH_COMPONENT = 6402] = "DEPTH_COMPONENT", t[t.DEPTH_STENCIL = 34041] = "DEPTH_STENCIL", t))(D || {}), re = /* @__PURE__ */ ((t) => (t[t.TEXTURE_2D = 3553] = "TEXTURE_2D", t[t.TEXTURE_CUBE_MAP = 34067] = "TEXTURE_CUBE_MAP", t[t.TEXTURE_2D_ARRAY = 35866] = "TEXTURE_2D_ARRAY", t[t.TEXTURE_CUBE_MAP_POSITIVE_X = 34069] = "TEXTURE_CUBE_MAP_POSITIVE_X", t[t.TEXTURE_CUBE_MAP_NEGATIVE_X = 34070] = "TEXTURE_CUBE_MAP_NEGATIVE_X", t[t.TEXTURE_CUBE_MAP_POSITIVE_Y = 34071] = "TEXTURE_CUBE_MAP_POSITIVE_Y", t[t.TEXTURE_CUBE_MAP_NEGATIVE_Y = 34072] = "TEXTURE_CUBE_MAP_NEGATIVE_Y", t[t.TEXTURE_CUBE_MAP_POSITIVE_Z = 34073] = "TEXTURE_CUBE_MAP_POSITIVE_Z", t[t.TEXTURE_CUBE_MAP_NEGATIVE_Z = 34074] = "TEXTURE_CUBE_MAP_NEGATIVE_Z", t))(re || {}), h = /* @__PURE__ */ ((t) => (t[t.UNSIGNED_BYTE = 5121] = "UNSIGNED_BYTE", t[t.UNSIGNED_SHORT = 5123] = "UNSIGNED_SHORT", t[t.UNSIGNED_SHORT_5_6_5 = 33635] = "UNSIGNED_SHORT_5_6_5", t[t.UNSIGNED_SHORT_4_4_4_4 = 32819] = "UNSIGNED_SHORT_4_4_4_4", t[t.UNSIGNED_SHORT_5_5_5_1 = 32820] = "UNSIGNED_SHORT_5_5_5_1", t[t.UNSIGNED_INT = 5125] = "UNSIGNED_INT", t[t.UNSIGNED_INT_10F_11F_11F_REV = 35899] = "UNSIGNED_INT_10F_11F_11F_REV", t[t.UNSIGNED_INT_2_10_10_10_REV = 33640] = "UNSIGNED_INT_2_10_10_10_REV", t[t.UNSIGNED_INT_24_8 = 34042] = "UNSIGNED_INT_24_8", t[t.UNSIGNED_INT_5_9_9_9_REV = 35902] = "UNSIGNED_INT_5_9_9_9_REV", t[t.BYTE = 5120] = "BYTE", t[t.SHORT = 5122] = "SHORT", t[t.INT = 5124] = "INT", t[t.FLOAT = 5126] = "FLOAT", t[t.FLOAT_32_UNSIGNED_INT_24_8_REV = 36269] = "FLOAT_32_UNSIGNED_INT_24_8_REV", t[t.HALF_FLOAT = 36193] = "HALF_FLOAT", t))(h || {});
|
| 366 |
+
const w = {
|
| 367 |
+
uint8x2: h.UNSIGNED_BYTE,
|
| 368 |
+
uint8x4: h.UNSIGNED_BYTE,
|
| 369 |
+
sint8x2: h.BYTE,
|
| 370 |
+
sint8x4: h.BYTE,
|
| 371 |
+
unorm8x2: h.UNSIGNED_BYTE,
|
| 372 |
+
unorm8x4: h.UNSIGNED_BYTE,
|
| 373 |
+
snorm8x2: h.BYTE,
|
| 374 |
+
snorm8x4: h.BYTE,
|
| 375 |
+
uint16x2: h.UNSIGNED_SHORT,
|
| 376 |
+
uint16x4: h.UNSIGNED_SHORT,
|
| 377 |
+
sint16x2: h.SHORT,
|
| 378 |
+
sint16x4: h.SHORT,
|
| 379 |
+
unorm16x2: h.UNSIGNED_SHORT,
|
| 380 |
+
unorm16x4: h.UNSIGNED_SHORT,
|
| 381 |
+
snorm16x2: h.SHORT,
|
| 382 |
+
snorm16x4: h.SHORT,
|
| 383 |
+
float16x2: h.HALF_FLOAT,
|
| 384 |
+
float16x4: h.HALF_FLOAT,
|
| 385 |
+
float32: h.FLOAT,
|
| 386 |
+
float32x2: h.FLOAT,
|
| 387 |
+
float32x3: h.FLOAT,
|
| 388 |
+
float32x4: h.FLOAT,
|
| 389 |
+
uint32: h.UNSIGNED_INT,
|
| 390 |
+
uint32x2: h.UNSIGNED_INT,
|
| 391 |
+
uint32x3: h.UNSIGNED_INT,
|
| 392 |
+
uint32x4: h.UNSIGNED_INT,
|
| 393 |
+
sint32: h.INT,
|
| 394 |
+
sint32x2: h.INT,
|
| 395 |
+
sint32x3: h.INT,
|
| 396 |
+
sint32x4: h.INT
|
| 397 |
+
};
|
| 398 |
+
function We(t) {
|
| 399 |
+
return w[t] ?? w.float32;
|
| 400 |
+
}
|
| 401 |
+
const je = {
|
| 402 |
+
"point-list": 0,
|
| 403 |
+
"line-list": 1,
|
| 404 |
+
"line-strip": 3,
|
| 405 |
+
"triangle-list": 4,
|
| 406 |
+
"triangle-strip": 5
|
| 407 |
+
};
|
| 408 |
+
class se {
|
| 409 |
+
/** @param renderer - The renderer this System works for. */
|
| 410 |
+
constructor(e) {
|
| 411 |
+
this._geometryVaoHash = /* @__PURE__ */ Object.create(null), this._renderer = e, this._activeGeometry = null, this._activeVao = null, this.hasVao = !0, this.hasInstance = !0, this._renderer.renderableGC.addManagedHash(this, "_geometryVaoHash");
|
| 412 |
+
}
|
| 413 |
+
/** Sets up the renderer context and necessary buffers. */
|
| 414 |
+
contextChange() {
|
| 415 |
+
const e = this.gl = this._renderer.gl;
|
| 416 |
+
if (!this._renderer.context.supports.vertexArrayObject)
|
| 417 |
+
throw new Error("[PixiJS] Vertex Array Objects are not supported on this device");
|
| 418 |
+
const r = this._renderer.context.extensions.vertexArrayObject;
|
| 419 |
+
r && (e.createVertexArray = () => r.createVertexArrayOES(), e.bindVertexArray = (n) => r.bindVertexArrayOES(n), e.deleteVertexArray = (n) => r.deleteVertexArrayOES(n));
|
| 420 |
+
const s = this._renderer.context.extensions.vertexAttribDivisorANGLE;
|
| 421 |
+
s && (e.drawArraysInstanced = (n, i, a, o) => {
|
| 422 |
+
s.drawArraysInstancedANGLE(n, i, a, o);
|
| 423 |
+
}, e.drawElementsInstanced = (n, i, a, o, c) => {
|
| 424 |
+
s.drawElementsInstancedANGLE(n, i, a, o, c);
|
| 425 |
+
}, e.vertexAttribDivisor = (n, i) => s.vertexAttribDivisorANGLE(n, i)), this._activeGeometry = null, this._activeVao = null, this._geometryVaoHash = /* @__PURE__ */ Object.create(null);
|
| 426 |
+
}
|
| 427 |
+
/**
|
| 428 |
+
* Binds geometry so that is can be drawn. Creating a Vao if required
|
| 429 |
+
* @param geometry - Instance of geometry to bind.
|
| 430 |
+
* @param program - Instance of program to use vao for.
|
| 431 |
+
*/
|
| 432 |
+
bind(e, r) {
|
| 433 |
+
const s = this.gl;
|
| 434 |
+
this._activeGeometry = e;
|
| 435 |
+
const n = this.getVao(e, r);
|
| 436 |
+
this._activeVao !== n && (this._activeVao = n, s.bindVertexArray(n)), this.updateBuffers();
|
| 437 |
+
}
|
| 438 |
+
/** Reset and unbind any active VAO and geometry. */
|
| 439 |
+
resetState() {
|
| 440 |
+
this.unbind();
|
| 441 |
+
}
|
| 442 |
+
/** Update buffers of the currently bound geometry. */
|
| 443 |
+
updateBuffers() {
|
| 444 |
+
const e = this._activeGeometry, r = this._renderer.buffer;
|
| 445 |
+
for (let s = 0; s < e.buffers.length; s++) {
|
| 446 |
+
const n = e.buffers[s];
|
| 447 |
+
r.updateBuffer(n);
|
| 448 |
+
}
|
| 449 |
+
}
|
| 450 |
+
/**
|
| 451 |
+
* Check compatibility between a geometry and a program
|
| 452 |
+
* @param geometry - Geometry instance.
|
| 453 |
+
* @param program - Program instance.
|
| 454 |
+
*/
|
| 455 |
+
checkCompatibility(e, r) {
|
| 456 |
+
const s = e.attributes, n = r._attributeData;
|
| 457 |
+
for (const i in n)
|
| 458 |
+
if (!s[i])
|
| 459 |
+
throw new Error(`shader and geometry incompatible, geometry missing the "${i}" attribute`);
|
| 460 |
+
}
|
| 461 |
+
/**
|
| 462 |
+
* Takes a geometry and program and generates a unique signature for them.
|
| 463 |
+
* @param geometry - To get signature from.
|
| 464 |
+
* @param program - To test geometry against.
|
| 465 |
+
* @returns - Unique signature of the geometry and program
|
| 466 |
+
*/
|
| 467 |
+
getSignature(e, r) {
|
| 468 |
+
const s = e.attributes, n = r._attributeData, i = ["g", e.uid];
|
| 469 |
+
for (const a in s)
|
| 470 |
+
n[a] && i.push(a, n[a].location);
|
| 471 |
+
return i.join("-");
|
| 472 |
+
}
|
| 473 |
+
getVao(e, r) {
|
| 474 |
+
var s;
|
| 475 |
+
return ((s = this._geometryVaoHash[e.uid]) == null ? void 0 : s[r._key]) || this.initGeometryVao(e, r);
|
| 476 |
+
}
|
| 477 |
+
/**
|
| 478 |
+
* Creates or gets Vao with the same structure as the geometry and stores it on the geometry.
|
| 479 |
+
* If vao is created, it is bound automatically. We use a shader to infer what and how to set up the
|
| 480 |
+
* attribute locations.
|
| 481 |
+
* @param geometry - Instance of geometry to to generate Vao for.
|
| 482 |
+
* @param program
|
| 483 |
+
* @param _incRefCount - Increment refCount of all geometry buffers.
|
| 484 |
+
*/
|
| 485 |
+
initGeometryVao(e, r, s = !0) {
|
| 486 |
+
const n = this._renderer.gl, i = this._renderer.buffer;
|
| 487 |
+
this._renderer.shader._getProgramData(r), this.checkCompatibility(e, r);
|
| 488 |
+
const a = this.getSignature(e, r);
|
| 489 |
+
this._geometryVaoHash[e.uid] || (this._geometryVaoHash[e.uid] = /* @__PURE__ */ Object.create(null), e.on("destroy", this.onGeometryDestroy, this));
|
| 490 |
+
const o = this._geometryVaoHash[e.uid];
|
| 491 |
+
let c = o[a];
|
| 492 |
+
if (c)
|
| 493 |
+
return o[r._key] = c, c;
|
| 494 |
+
Ue(e, r._attributeData);
|
| 495 |
+
const u = e.buffers;
|
| 496 |
+
c = n.createVertexArray(), n.bindVertexArray(c);
|
| 497 |
+
for (let _ = 0; _ < u.length; _++) {
|
| 498 |
+
const f = u[_];
|
| 499 |
+
i.bind(f);
|
| 500 |
+
}
|
| 501 |
+
return this.activateVao(e, r), o[r._key] = c, o[a] = c, n.bindVertexArray(null), c;
|
| 502 |
+
}
|
| 503 |
+
/**
|
| 504 |
+
* Disposes geometry.
|
| 505 |
+
* @param geometry - Geometry with buffers. Only VAO will be disposed
|
| 506 |
+
* @param [contextLost=false] - If context was lost, we suppress deleteVertexArray
|
| 507 |
+
*/
|
| 508 |
+
onGeometryDestroy(e, r) {
|
| 509 |
+
const s = this._geometryVaoHash[e.uid], n = this.gl;
|
| 510 |
+
if (s) {
|
| 511 |
+
if (r)
|
| 512 |
+
for (const i in s)
|
| 513 |
+
this._activeVao !== s[i] && this.unbind(), n.deleteVertexArray(s[i]);
|
| 514 |
+
this._geometryVaoHash[e.uid] = null;
|
| 515 |
+
}
|
| 516 |
+
}
|
| 517 |
+
/**
|
| 518 |
+
* Dispose all WebGL resources of all managed geometries.
|
| 519 |
+
* @param [contextLost=false] - If context was lost, we suppress `gl.delete` calls
|
| 520 |
+
*/
|
| 521 |
+
destroyAll(e = !1) {
|
| 522 |
+
const r = this.gl;
|
| 523 |
+
for (const s in this._geometryVaoHash) {
|
| 524 |
+
if (e)
|
| 525 |
+
for (const n in this._geometryVaoHash[s]) {
|
| 526 |
+
const i = this._geometryVaoHash[s];
|
| 527 |
+
this._activeVao !== i && this.unbind(), r.deleteVertexArray(i[n]);
|
| 528 |
+
}
|
| 529 |
+
this._geometryVaoHash[s] = null;
|
| 530 |
+
}
|
| 531 |
+
}
|
| 532 |
+
/**
|
| 533 |
+
* Activate vertex array object.
|
| 534 |
+
* @param geometry - Geometry instance.
|
| 535 |
+
* @param program - Shader program instance.
|
| 536 |
+
*/
|
| 537 |
+
activateVao(e, r) {
|
| 538 |
+
var o;
|
| 539 |
+
const s = this._renderer.gl, n = this._renderer.buffer, i = e.attributes;
|
| 540 |
+
e.indexBuffer && n.bind(e.indexBuffer);
|
| 541 |
+
let a = null;
|
| 542 |
+
for (const c in i) {
|
| 543 |
+
const u = i[c], _ = u.buffer, f = n.getGlBuffer(_), l = r._attributeData[c];
|
| 544 |
+
if (l) {
|
| 545 |
+
a !== f && (n.bind(_), a = f);
|
| 546 |
+
const E = l.location;
|
| 547 |
+
s.enableVertexAttribArray(E);
|
| 548 |
+
const v = K(u.format), L = We(u.format);
|
| 549 |
+
if (((o = l.format) == null ? void 0 : o.substring(1, 4)) === "int" ? s.vertexAttribIPointer(
|
| 550 |
+
E,
|
| 551 |
+
v.size,
|
| 552 |
+
L,
|
| 553 |
+
u.stride,
|
| 554 |
+
u.offset
|
| 555 |
+
) : s.vertexAttribPointer(
|
| 556 |
+
E,
|
| 557 |
+
v.size,
|
| 558 |
+
L,
|
| 559 |
+
v.normalised,
|
| 560 |
+
u.stride,
|
| 561 |
+
u.offset
|
| 562 |
+
), u.instance)
|
| 563 |
+
if (this.hasInstance) {
|
| 564 |
+
const ve = u.divisor ?? 1;
|
| 565 |
+
s.vertexAttribDivisor(E, ve);
|
| 566 |
+
} else
|
| 567 |
+
throw new Error("geometry error, GPU Instancing is not supported on this device");
|
| 568 |
+
}
|
| 569 |
+
}
|
| 570 |
+
}
|
| 571 |
+
/**
|
| 572 |
+
* Draws the currently bound geometry.
|
| 573 |
+
* @param topology - The type primitive to render.
|
| 574 |
+
* @param size - The number of elements to be rendered. If not specified, all vertices after the
|
| 575 |
+
* starting vertex will be drawn.
|
| 576 |
+
* @param start - The starting vertex in the geometry to start drawing from. If not specified,
|
| 577 |
+
* drawing will start from the first vertex.
|
| 578 |
+
* @param instanceCount - The number of instances of the set of elements to execute. If not specified,
|
| 579 |
+
* all instances will be drawn.
|
| 580 |
+
* @returns This instance of the geometry system.
|
| 581 |
+
*/
|
| 582 |
+
draw(e, r, s, n) {
|
| 583 |
+
const { gl: i } = this._renderer, a = this._activeGeometry, o = je[e || a.topology];
|
| 584 |
+
if (n ?? (n = a.instanceCount), a.indexBuffer) {
|
| 585 |
+
const c = a.indexBuffer.data.BYTES_PER_ELEMENT, u = c === 2 ? i.UNSIGNED_SHORT : i.UNSIGNED_INT;
|
| 586 |
+
n > 1 ? i.drawElementsInstanced(o, r || a.indexBuffer.data.length, u, (s || 0) * c, n) : i.drawElements(o, r || a.indexBuffer.data.length, u, (s || 0) * c);
|
| 587 |
+
} else n > 1 ? i.drawArraysInstanced(o, s || 0, r || a.getSize(), n) : i.drawArrays(o, s || 0, r || a.getSize());
|
| 588 |
+
return this;
|
| 589 |
+
}
|
| 590 |
+
/** Unbind/reset everything. */
|
| 591 |
+
unbind() {
|
| 592 |
+
this.gl.bindVertexArray(null), this._activeVao = null, this._activeGeometry = null;
|
| 593 |
+
}
|
| 594 |
+
destroy() {
|
| 595 |
+
this._renderer = null, this.gl = null, this._activeVao = null, this._activeGeometry = null, this._geometryVaoHash = null;
|
| 596 |
+
}
|
| 597 |
+
}
|
| 598 |
+
se.extension = {
|
| 599 |
+
type: [
|
| 600 |
+
d.WebGLSystem
|
| 601 |
+
],
|
| 602 |
+
name: "geometry"
|
| 603 |
+
};
|
| 604 |
+
const Ke = new Ae({
|
| 605 |
+
attributes: {
|
| 606 |
+
aPosition: [
|
| 607 |
+
-1,
|
| 608 |
+
-1,
|
| 609 |
+
// Bottom left corner
|
| 610 |
+
3,
|
| 611 |
+
-1,
|
| 612 |
+
// Bottom right corner, extending beyond right edge
|
| 613 |
+
-1,
|
| 614 |
+
3
|
| 615 |
+
// Top left corner, extending beyond top edge
|
| 616 |
+
]
|
| 617 |
+
}
|
| 618 |
+
}), M = class ne {
|
| 619 |
+
constructor(e) {
|
| 620 |
+
this.useBackBuffer = !1, this._useBackBufferThisRender = !1, this._renderer = e;
|
| 621 |
+
}
|
| 622 |
+
init(e = {}) {
|
| 623 |
+
const { useBackBuffer: r, antialias: s } = { ...ne.defaultOptions, ...e };
|
| 624 |
+
this.useBackBuffer = r, this._antialias = s, this._renderer.context.supports.msaa || (m("antialiasing, is not supported on when using the back buffer"), this._antialias = !1), this._state = O.for2d();
|
| 625 |
+
const n = new Be({
|
| 626 |
+
vertex: `
|
| 627 |
+
attribute vec2 aPosition;
|
| 628 |
+
out vec2 vUv;
|
| 629 |
+
|
| 630 |
+
void main() {
|
| 631 |
+
gl_Position = vec4(aPosition, 0.0, 1.0);
|
| 632 |
+
|
| 633 |
+
vUv = (aPosition + 1.0) / 2.0;
|
| 634 |
+
|
| 635 |
+
// flip dem UVs
|
| 636 |
+
vUv.y = 1.0 - vUv.y;
|
| 637 |
+
}`,
|
| 638 |
+
fragment: `
|
| 639 |
+
in vec2 vUv;
|
| 640 |
+
out vec4 finalColor;
|
| 641 |
+
|
| 642 |
+
uniform sampler2D uTexture;
|
| 643 |
+
|
| 644 |
+
void main() {
|
| 645 |
+
finalColor = texture(uTexture, vUv);
|
| 646 |
+
}`,
|
| 647 |
+
name: "big-triangle"
|
| 648 |
+
});
|
| 649 |
+
this._bigTriangleShader = new U({
|
| 650 |
+
glProgram: n,
|
| 651 |
+
resources: {
|
| 652 |
+
uTexture: b.WHITE.source
|
| 653 |
+
}
|
| 654 |
+
});
|
| 655 |
+
}
|
| 656 |
+
/**
|
| 657 |
+
* This is called before the RenderTargetSystem is started. This is where
|
| 658 |
+
* we replace the target with the back buffer if required.
|
| 659 |
+
* @param options - The options for this render.
|
| 660 |
+
*/
|
| 661 |
+
renderStart(e) {
|
| 662 |
+
const r = this._renderer.renderTarget.getRenderTarget(e.target);
|
| 663 |
+
if (this._useBackBufferThisRender = this.useBackBuffer && !!r.isRoot, this._useBackBufferThisRender) {
|
| 664 |
+
const s = this._renderer.renderTarget.getRenderTarget(e.target);
|
| 665 |
+
this._targetTexture = s.colorTexture, e.target = this._getBackBufferTexture(s.colorTexture);
|
| 666 |
+
}
|
| 667 |
+
}
|
| 668 |
+
renderEnd() {
|
| 669 |
+
this._presentBackBuffer();
|
| 670 |
+
}
|
| 671 |
+
_presentBackBuffer() {
|
| 672 |
+
const e = this._renderer;
|
| 673 |
+
e.renderTarget.finishRenderPass(), this._useBackBufferThisRender && (e.renderTarget.bind(this._targetTexture, !1), this._bigTriangleShader.resources.uTexture = this._backBufferTexture.source, e.encoder.draw({
|
| 674 |
+
geometry: Ke,
|
| 675 |
+
shader: this._bigTriangleShader,
|
| 676 |
+
state: this._state
|
| 677 |
+
}));
|
| 678 |
+
}
|
| 679 |
+
_getBackBufferTexture(e) {
|
| 680 |
+
return this._backBufferTexture = this._backBufferTexture || new b({
|
| 681 |
+
source: new $({
|
| 682 |
+
width: e.width,
|
| 683 |
+
height: e.height,
|
| 684 |
+
resolution: e._resolution,
|
| 685 |
+
antialias: this._antialias
|
| 686 |
+
})
|
| 687 |
+
}), this._backBufferTexture.source.resize(
|
| 688 |
+
e.width,
|
| 689 |
+
e.height,
|
| 690 |
+
e._resolution
|
| 691 |
+
), this._backBufferTexture;
|
| 692 |
+
}
|
| 693 |
+
/** destroys the back buffer */
|
| 694 |
+
destroy() {
|
| 695 |
+
this._backBufferTexture && (this._backBufferTexture.destroy(), this._backBufferTexture = null);
|
| 696 |
+
}
|
| 697 |
+
};
|
| 698 |
+
M.extension = {
|
| 699 |
+
type: [
|
| 700 |
+
d.WebGLSystem
|
| 701 |
+
],
|
| 702 |
+
name: "backBuffer",
|
| 703 |
+
priority: 1
|
| 704 |
+
};
|
| 705 |
+
M.defaultOptions = {
|
| 706 |
+
/** if true will use the back buffer where required */
|
| 707 |
+
useBackBuffer: !1
|
| 708 |
+
};
|
| 709 |
+
let $e = M;
|
| 710 |
+
class ie {
|
| 711 |
+
constructor(e) {
|
| 712 |
+
this._colorMaskCache = 15, this._renderer = e;
|
| 713 |
+
}
|
| 714 |
+
setMask(e) {
|
| 715 |
+
this._colorMaskCache !== e && (this._colorMaskCache = e, this._renderer.gl.colorMask(
|
| 716 |
+
!!(e & 8),
|
| 717 |
+
!!(e & 4),
|
| 718 |
+
!!(e & 2),
|
| 719 |
+
!!(e & 1)
|
| 720 |
+
));
|
| 721 |
+
}
|
| 722 |
+
}
|
| 723 |
+
ie.extension = {
|
| 724 |
+
type: [
|
| 725 |
+
d.WebGLSystem
|
| 726 |
+
],
|
| 727 |
+
name: "colorMask"
|
| 728 |
+
};
|
| 729 |
+
class ae {
|
| 730 |
+
constructor(e) {
|
| 731 |
+
this.commandFinished = Promise.resolve(), this._renderer = e;
|
| 732 |
+
}
|
| 733 |
+
setGeometry(e, r) {
|
| 734 |
+
this._renderer.geometry.bind(e, r.glProgram);
|
| 735 |
+
}
|
| 736 |
+
finishRenderPass() {
|
| 737 |
+
}
|
| 738 |
+
draw(e) {
|
| 739 |
+
const r = this._renderer, { geometry: s, shader: n, state: i, skipSync: a, topology: o, size: c, start: u, instanceCount: _ } = e;
|
| 740 |
+
r.shader.bind(n, a), r.geometry.bind(s, r.shader._activeProgram), i && r.state.set(i), r.geometry.draw(o, c, u, _ ?? s.instanceCount);
|
| 741 |
+
}
|
| 742 |
+
destroy() {
|
| 743 |
+
this._renderer = null;
|
| 744 |
+
}
|
| 745 |
+
}
|
| 746 |
+
ae.extension = {
|
| 747 |
+
type: [
|
| 748 |
+
d.WebGLSystem
|
| 749 |
+
],
|
| 750 |
+
name: "encoder"
|
| 751 |
+
};
|
| 752 |
+
class oe {
|
| 753 |
+
constructor(e) {
|
| 754 |
+
this._renderer = e;
|
| 755 |
+
}
|
| 756 |
+
contextChange() {
|
| 757 |
+
const e = this._renderer.gl;
|
| 758 |
+
this.maxTextures = e.getParameter(e.MAX_TEXTURE_IMAGE_UNITS), this.maxBatchableTextures = Ne(this.maxTextures, e);
|
| 759 |
+
const r = this._renderer.context.webGLVersion === 2;
|
| 760 |
+
this.maxUniformBindings = r ? e.getParameter(e.MAX_UNIFORM_BUFFER_BINDINGS) : 0;
|
| 761 |
+
}
|
| 762 |
+
destroy() {
|
| 763 |
+
}
|
| 764 |
+
}
|
| 765 |
+
oe.extension = {
|
| 766 |
+
type: [
|
| 767 |
+
d.WebGLSystem
|
| 768 |
+
],
|
| 769 |
+
name: "limits"
|
| 770 |
+
};
|
| 771 |
+
class ze {
|
| 772 |
+
constructor() {
|
| 773 |
+
this.width = -1, this.height = -1, this.msaa = !1, this.msaaRenderBuffer = [];
|
| 774 |
+
}
|
| 775 |
+
}
|
| 776 |
+
class ce {
|
| 777 |
+
constructor(e) {
|
| 778 |
+
this._stencilCache = {
|
| 779 |
+
enabled: !1,
|
| 780 |
+
stencilReference: 0,
|
| 781 |
+
stencilMode: p.NONE
|
| 782 |
+
}, this._renderTargetStencilState = /* @__PURE__ */ Object.create(null), e.renderTarget.onRenderTargetChange.add(this);
|
| 783 |
+
}
|
| 784 |
+
contextChange(e) {
|
| 785 |
+
this._gl = e, this._comparisonFuncMapping = {
|
| 786 |
+
always: e.ALWAYS,
|
| 787 |
+
never: e.NEVER,
|
| 788 |
+
equal: e.EQUAL,
|
| 789 |
+
"not-equal": e.NOTEQUAL,
|
| 790 |
+
less: e.LESS,
|
| 791 |
+
"less-equal": e.LEQUAL,
|
| 792 |
+
greater: e.GREATER,
|
| 793 |
+
"greater-equal": e.GEQUAL
|
| 794 |
+
}, this._stencilOpsMapping = {
|
| 795 |
+
keep: e.KEEP,
|
| 796 |
+
zero: e.ZERO,
|
| 797 |
+
replace: e.REPLACE,
|
| 798 |
+
invert: e.INVERT,
|
| 799 |
+
"increment-clamp": e.INCR,
|
| 800 |
+
"decrement-clamp": e.DECR,
|
| 801 |
+
"increment-wrap": e.INCR_WRAP,
|
| 802 |
+
"decrement-wrap": e.DECR_WRAP
|
| 803 |
+
}, this.resetState();
|
| 804 |
+
}
|
| 805 |
+
onRenderTargetChange(e) {
|
| 806 |
+
if (this._activeRenderTarget === e)
|
| 807 |
+
return;
|
| 808 |
+
this._activeRenderTarget = e;
|
| 809 |
+
let r = this._renderTargetStencilState[e.uid];
|
| 810 |
+
r || (r = this._renderTargetStencilState[e.uid] = {
|
| 811 |
+
stencilMode: p.DISABLED,
|
| 812 |
+
stencilReference: 0
|
| 813 |
+
}), this.setStencilMode(r.stencilMode, r.stencilReference);
|
| 814 |
+
}
|
| 815 |
+
resetState() {
|
| 816 |
+
this._stencilCache.enabled = !1, this._stencilCache.stencilMode = p.NONE, this._stencilCache.stencilReference = 0;
|
| 817 |
+
}
|
| 818 |
+
setStencilMode(e, r) {
|
| 819 |
+
const s = this._renderTargetStencilState[this._activeRenderTarget.uid], n = this._gl, i = Fe[e], a = this._stencilCache;
|
| 820 |
+
if (s.stencilMode = e, s.stencilReference = r, e === p.DISABLED) {
|
| 821 |
+
this._stencilCache.enabled && (this._stencilCache.enabled = !1, n.disable(n.STENCIL_TEST));
|
| 822 |
+
return;
|
| 823 |
+
}
|
| 824 |
+
this._stencilCache.enabled || (this._stencilCache.enabled = !0, n.enable(n.STENCIL_TEST)), (e !== a.stencilMode || a.stencilReference !== r) && (a.stencilMode = e, a.stencilReference = r, n.stencilFunc(this._comparisonFuncMapping[i.stencilBack.compare], r, 255), n.stencilOp(n.KEEP, n.KEEP, this._stencilOpsMapping[i.stencilBack.passOp]));
|
| 825 |
+
}
|
| 826 |
+
}
|
| 827 |
+
ce.extension = {
|
| 828 |
+
type: [
|
| 829 |
+
d.WebGLSystem
|
| 830 |
+
],
|
| 831 |
+
name: "stencil"
|
| 832 |
+
};
|
| 833 |
+
const ue = {
|
| 834 |
+
f32: 4,
|
| 835 |
+
i32: 4,
|
| 836 |
+
"vec2<f32>": 8,
|
| 837 |
+
"vec3<f32>": 12,
|
| 838 |
+
"vec4<f32>": 16,
|
| 839 |
+
"vec2<i32>": 8,
|
| 840 |
+
"vec3<i32>": 12,
|
| 841 |
+
"vec4<i32>": 16,
|
| 842 |
+
"mat2x2<f32>": 16 * 2,
|
| 843 |
+
"mat3x3<f32>": 16 * 3,
|
| 844 |
+
"mat4x4<f32>": 16 * 4
|
| 845 |
+
// TODO - not essential for now but support these in the future
|
| 846 |
+
// int: 4,
|
| 847 |
+
// ivec2: 8,
|
| 848 |
+
// ivec3: 12,
|
| 849 |
+
// ivec4: 16,
|
| 850 |
+
// uint: 4,
|
| 851 |
+
// uvec2: 8,
|
| 852 |
+
// uvec3: 12,
|
| 853 |
+
// uvec4: 16,
|
| 854 |
+
// bool: 4,
|
| 855 |
+
// bvec2: 8,
|
| 856 |
+
// bvec3: 12,
|
| 857 |
+
// bvec4: 16,
|
| 858 |
+
// mat2: 16 * 2,
|
| 859 |
+
// mat3: 16 * 3,
|
| 860 |
+
// mat4: 16 * 4,
|
| 861 |
+
};
|
| 862 |
+
function Ye(t) {
|
| 863 |
+
const e = t.map((i) => ({
|
| 864 |
+
data: i,
|
| 865 |
+
offset: 0,
|
| 866 |
+
size: 0
|
| 867 |
+
})), r = 16;
|
| 868 |
+
let s = 0, n = 0;
|
| 869 |
+
for (let i = 0; i < e.length; i++) {
|
| 870 |
+
const a = e[i];
|
| 871 |
+
if (s = ue[a.data.type], !s)
|
| 872 |
+
throw new Error(`Unknown type ${a.data.type}`);
|
| 873 |
+
a.data.size > 1 && (s = Math.max(s, r) * a.data.size);
|
| 874 |
+
const o = s === 12 ? 16 : s;
|
| 875 |
+
a.size = s;
|
| 876 |
+
const c = n % r;
|
| 877 |
+
c > 0 && r - c < o ? n += (r - c) % 16 : n += (s - c % s) % s, a.offset = n, n += s;
|
| 878 |
+
}
|
| 879 |
+
return n = Math.ceil(n / 16) * 16, { uboElements: e, size: n };
|
| 880 |
+
}
|
| 881 |
+
function qe(t, e) {
|
| 882 |
+
const r = Math.max(ue[t.data.type] / 16, 1), s = t.data.value.length / t.data.size, n = (4 - s % 4) % 4, i = t.data.type.indexOf("i32") >= 0 ? "dataInt32" : "data";
|
| 883 |
+
return `
|
| 884 |
+
v = uv.${t.data.name};
|
| 885 |
+
offset += ${e};
|
| 886 |
+
|
| 887 |
+
arrayOffset = offset;
|
| 888 |
+
|
| 889 |
+
t = 0;
|
| 890 |
+
|
| 891 |
+
for(var i=0; i < ${t.data.size * r}; i++)
|
| 892 |
+
{
|
| 893 |
+
for(var j = 0; j < ${s}; j++)
|
| 894 |
+
{
|
| 895 |
+
${i}[arrayOffset++] = v[t++];
|
| 896 |
+
}
|
| 897 |
+
${n !== 0 ? `arrayOffset += ${n};` : ""}
|
| 898 |
+
}
|
| 899 |
+
`;
|
| 900 |
+
}
|
| 901 |
+
function Ze(t) {
|
| 902 |
+
return Oe(
|
| 903 |
+
t,
|
| 904 |
+
"uboStd40",
|
| 905 |
+
qe,
|
| 906 |
+
Pe
|
| 907 |
+
);
|
| 908 |
+
}
|
| 909 |
+
class _e extends Me {
|
| 910 |
+
constructor() {
|
| 911 |
+
super({
|
| 912 |
+
createUboElements: Ye,
|
| 913 |
+
generateUboSync: Ze
|
| 914 |
+
});
|
| 915 |
+
}
|
| 916 |
+
}
|
| 917 |
+
_e.extension = {
|
| 918 |
+
type: [d.WebGLSystem],
|
| 919 |
+
name: "ubo"
|
| 920 |
+
};
|
| 921 |
+
class Je {
|
| 922 |
+
constructor() {
|
| 923 |
+
this._clearColorCache = [0, 0, 0, 0], this._viewPortCache = new H();
|
| 924 |
+
}
|
| 925 |
+
init(e, r) {
|
| 926 |
+
this._renderer = e, this._renderTargetSystem = r, e.runners.contextChange.add(this);
|
| 927 |
+
}
|
| 928 |
+
contextChange() {
|
| 929 |
+
this._clearColorCache = [0, 0, 0, 0], this._viewPortCache = new H();
|
| 930 |
+
}
|
| 931 |
+
copyToTexture(e, r, s, n, i) {
|
| 932 |
+
const a = this._renderTargetSystem, o = this._renderer, c = a.getGpuRenderTarget(e), u = o.gl;
|
| 933 |
+
return this.finishRenderPass(e), u.bindFramebuffer(u.FRAMEBUFFER, c.resolveTargetFramebuffer), o.texture.bind(r, 0), u.copyTexSubImage2D(
|
| 934 |
+
u.TEXTURE_2D,
|
| 935 |
+
0,
|
| 936 |
+
i.x,
|
| 937 |
+
i.y,
|
| 938 |
+
s.x,
|
| 939 |
+
s.y,
|
| 940 |
+
n.width,
|
| 941 |
+
n.height
|
| 942 |
+
), r;
|
| 943 |
+
}
|
| 944 |
+
startRenderPass(e, r = !0, s, n) {
|
| 945 |
+
const i = this._renderTargetSystem, a = e.colorTexture, o = i.getGpuRenderTarget(e);
|
| 946 |
+
let c = n.y;
|
| 947 |
+
e.isRoot && (c = a.pixelHeight - n.height), e.colorTextures.forEach((f) => {
|
| 948 |
+
this._renderer.texture.unbind(f);
|
| 949 |
+
});
|
| 950 |
+
const u = this._renderer.gl;
|
| 951 |
+
u.bindFramebuffer(u.FRAMEBUFFER, o.framebuffer);
|
| 952 |
+
const _ = this._viewPortCache;
|
| 953 |
+
(_.x !== n.x || _.y !== c || _.width !== n.width || _.height !== n.height) && (_.x = n.x, _.y = c, _.width = n.width, _.height = n.height, u.viewport(
|
| 954 |
+
n.x,
|
| 955 |
+
c,
|
| 956 |
+
n.width,
|
| 957 |
+
n.height
|
| 958 |
+
)), !o.depthStencilRenderBuffer && (e.stencil || e.depth) && this._initStencil(o), this.clear(e, r, s);
|
| 959 |
+
}
|
| 960 |
+
finishRenderPass(e) {
|
| 961 |
+
const s = this._renderTargetSystem.getGpuRenderTarget(e);
|
| 962 |
+
if (!s.msaa)
|
| 963 |
+
return;
|
| 964 |
+
const n = this._renderer.gl;
|
| 965 |
+
n.bindFramebuffer(n.FRAMEBUFFER, s.resolveTargetFramebuffer), n.bindFramebuffer(n.READ_FRAMEBUFFER, s.framebuffer), n.blitFramebuffer(
|
| 966 |
+
0,
|
| 967 |
+
0,
|
| 968 |
+
s.width,
|
| 969 |
+
s.height,
|
| 970 |
+
0,
|
| 971 |
+
0,
|
| 972 |
+
s.width,
|
| 973 |
+
s.height,
|
| 974 |
+
n.COLOR_BUFFER_BIT,
|
| 975 |
+
n.NEAREST
|
| 976 |
+
), n.bindFramebuffer(n.FRAMEBUFFER, s.framebuffer);
|
| 977 |
+
}
|
| 978 |
+
initGpuRenderTarget(e) {
|
| 979 |
+
const s = this._renderer.gl, n = new ze();
|
| 980 |
+
return e.colorTexture instanceof A ? (this._renderer.context.ensureCanvasSize(e.colorTexture.resource), n.framebuffer = null, n) : (this._initColor(e, n), s.bindFramebuffer(s.FRAMEBUFFER, null), n);
|
| 981 |
+
}
|
| 982 |
+
destroyGpuRenderTarget(e) {
|
| 983 |
+
const r = this._renderer.gl;
|
| 984 |
+
e.framebuffer && (r.deleteFramebuffer(e.framebuffer), e.framebuffer = null), e.resolveTargetFramebuffer && (r.deleteFramebuffer(e.resolveTargetFramebuffer), e.resolveTargetFramebuffer = null), e.depthStencilRenderBuffer && (r.deleteRenderbuffer(e.depthStencilRenderBuffer), e.depthStencilRenderBuffer = null), e.msaaRenderBuffer.forEach((s) => {
|
| 985 |
+
r.deleteRenderbuffer(s);
|
| 986 |
+
}), e.msaaRenderBuffer = null;
|
| 987 |
+
}
|
| 988 |
+
clear(e, r, s) {
|
| 989 |
+
if (!r)
|
| 990 |
+
return;
|
| 991 |
+
const n = this._renderTargetSystem;
|
| 992 |
+
typeof r == "boolean" && (r = r ? N.ALL : N.NONE);
|
| 993 |
+
const i = this._renderer.gl;
|
| 994 |
+
if (r & N.COLOR) {
|
| 995 |
+
s ?? (s = n.defaultClearColor);
|
| 996 |
+
const a = this._clearColorCache, o = s;
|
| 997 |
+
(a[0] !== o[0] || a[1] !== o[1] || a[2] !== o[2] || a[3] !== o[3]) && (a[0] = o[0], a[1] = o[1], a[2] = o[2], a[3] = o[3], i.clearColor(o[0], o[1], o[2], o[3]));
|
| 998 |
+
}
|
| 999 |
+
i.clear(r);
|
| 1000 |
+
}
|
| 1001 |
+
resizeGpuRenderTarget(e) {
|
| 1002 |
+
if (e.isRoot)
|
| 1003 |
+
return;
|
| 1004 |
+
const s = this._renderTargetSystem.getGpuRenderTarget(e);
|
| 1005 |
+
this._resizeColor(e, s), (e.stencil || e.depth) && this._resizeStencil(s);
|
| 1006 |
+
}
|
| 1007 |
+
_initColor(e, r) {
|
| 1008 |
+
const s = this._renderer, n = s.gl, i = n.createFramebuffer();
|
| 1009 |
+
if (r.resolveTargetFramebuffer = i, n.bindFramebuffer(n.FRAMEBUFFER, i), r.width = e.colorTexture.source.pixelWidth, r.height = e.colorTexture.source.pixelHeight, e.colorTextures.forEach((a, o) => {
|
| 1010 |
+
const c = a.source;
|
| 1011 |
+
c.antialias && (s.context.supports.msaa ? r.msaa = !0 : m("[RenderTexture] Antialiasing on textures is not supported in WebGL1")), s.texture.bindSource(c, 0);
|
| 1012 |
+
const _ = s.texture.getGlSource(c).texture;
|
| 1013 |
+
n.framebufferTexture2D(
|
| 1014 |
+
n.FRAMEBUFFER,
|
| 1015 |
+
n.COLOR_ATTACHMENT0 + o,
|
| 1016 |
+
3553,
|
| 1017 |
+
// texture.target,
|
| 1018 |
+
_,
|
| 1019 |
+
0
|
| 1020 |
+
);
|
| 1021 |
+
}), r.msaa) {
|
| 1022 |
+
const a = n.createFramebuffer();
|
| 1023 |
+
r.framebuffer = a, n.bindFramebuffer(n.FRAMEBUFFER, a), e.colorTextures.forEach((o, c) => {
|
| 1024 |
+
const u = n.createRenderbuffer();
|
| 1025 |
+
r.msaaRenderBuffer[c] = u;
|
| 1026 |
+
});
|
| 1027 |
+
} else
|
| 1028 |
+
r.framebuffer = i;
|
| 1029 |
+
this._resizeColor(e, r);
|
| 1030 |
+
}
|
| 1031 |
+
_resizeColor(e, r) {
|
| 1032 |
+
const s = e.colorTexture.source;
|
| 1033 |
+
if (r.width = s.pixelWidth, r.height = s.pixelHeight, e.colorTextures.forEach((n, i) => {
|
| 1034 |
+
i !== 0 && n.source.resize(s.width, s.height, s._resolution);
|
| 1035 |
+
}), r.msaa) {
|
| 1036 |
+
const n = this._renderer, i = n.gl, a = r.framebuffer;
|
| 1037 |
+
i.bindFramebuffer(i.FRAMEBUFFER, a), e.colorTextures.forEach((o, c) => {
|
| 1038 |
+
const u = o.source;
|
| 1039 |
+
n.texture.bindSource(u, 0);
|
| 1040 |
+
const f = n.texture.getGlSource(u).internalFormat, l = r.msaaRenderBuffer[c];
|
| 1041 |
+
i.bindRenderbuffer(
|
| 1042 |
+
i.RENDERBUFFER,
|
| 1043 |
+
l
|
| 1044 |
+
), i.renderbufferStorageMultisample(
|
| 1045 |
+
i.RENDERBUFFER,
|
| 1046 |
+
4,
|
| 1047 |
+
f,
|
| 1048 |
+
u.pixelWidth,
|
| 1049 |
+
u.pixelHeight
|
| 1050 |
+
), i.framebufferRenderbuffer(
|
| 1051 |
+
i.FRAMEBUFFER,
|
| 1052 |
+
i.COLOR_ATTACHMENT0 + c,
|
| 1053 |
+
i.RENDERBUFFER,
|
| 1054 |
+
l
|
| 1055 |
+
);
|
| 1056 |
+
});
|
| 1057 |
+
}
|
| 1058 |
+
}
|
| 1059 |
+
_initStencil(e) {
|
| 1060 |
+
if (e.framebuffer === null)
|
| 1061 |
+
return;
|
| 1062 |
+
const r = this._renderer.gl, s = r.createRenderbuffer();
|
| 1063 |
+
e.depthStencilRenderBuffer = s, r.bindRenderbuffer(
|
| 1064 |
+
r.RENDERBUFFER,
|
| 1065 |
+
s
|
| 1066 |
+
), r.framebufferRenderbuffer(
|
| 1067 |
+
r.FRAMEBUFFER,
|
| 1068 |
+
r.DEPTH_STENCIL_ATTACHMENT,
|
| 1069 |
+
r.RENDERBUFFER,
|
| 1070 |
+
s
|
| 1071 |
+
), this._resizeStencil(e);
|
| 1072 |
+
}
|
| 1073 |
+
_resizeStencil(e) {
|
| 1074 |
+
const r = this._renderer.gl;
|
| 1075 |
+
r.bindRenderbuffer(
|
| 1076 |
+
r.RENDERBUFFER,
|
| 1077 |
+
e.depthStencilRenderBuffer
|
| 1078 |
+
), e.msaa ? r.renderbufferStorageMultisample(
|
| 1079 |
+
r.RENDERBUFFER,
|
| 1080 |
+
4,
|
| 1081 |
+
r.DEPTH24_STENCIL8,
|
| 1082 |
+
e.width,
|
| 1083 |
+
e.height
|
| 1084 |
+
) : r.renderbufferStorage(
|
| 1085 |
+
r.RENDERBUFFER,
|
| 1086 |
+
this._renderer.context.webGLVersion === 2 ? r.DEPTH24_STENCIL8 : r.DEPTH_STENCIL,
|
| 1087 |
+
e.width,
|
| 1088 |
+
e.height
|
| 1089 |
+
);
|
| 1090 |
+
}
|
| 1091 |
+
prerender(e) {
|
| 1092 |
+
const r = e.colorTexture.resource;
|
| 1093 |
+
this._renderer.context.multiView && A.test(r) && this._renderer.context.ensureCanvasSize(r);
|
| 1094 |
+
}
|
| 1095 |
+
postrender(e) {
|
| 1096 |
+
if (this._renderer.context.multiView && A.test(e.colorTexture.resource)) {
|
| 1097 |
+
const r = this._renderer.context.canvas, s = e.colorTexture;
|
| 1098 |
+
s.context2D.drawImage(
|
| 1099 |
+
r,
|
| 1100 |
+
0,
|
| 1101 |
+
s.pixelHeight - r.height
|
| 1102 |
+
);
|
| 1103 |
+
}
|
| 1104 |
+
}
|
| 1105 |
+
}
|
| 1106 |
+
class he extends Le {
|
| 1107 |
+
constructor(e) {
|
| 1108 |
+
super(e), this.adaptor = new Je(), this.adaptor.init(e, this);
|
| 1109 |
+
}
|
| 1110 |
+
}
|
| 1111 |
+
he.extension = {
|
| 1112 |
+
type: [d.WebGLSystem],
|
| 1113 |
+
name: "renderTarget"
|
| 1114 |
+
};
|
| 1115 |
+
function Qe(t, e) {
|
| 1116 |
+
const r = [], s = [`
|
| 1117 |
+
var g = s.groups;
|
| 1118 |
+
var sS = r.shader;
|
| 1119 |
+
var p = s.glProgram;
|
| 1120 |
+
var ugS = r.uniformGroup;
|
| 1121 |
+
var resources;
|
| 1122 |
+
`];
|
| 1123 |
+
let n = !1, i = 0;
|
| 1124 |
+
const a = e._getProgramData(t.glProgram);
|
| 1125 |
+
for (const c in t.groups) {
|
| 1126 |
+
const u = t.groups[c];
|
| 1127 |
+
r.push(`
|
| 1128 |
+
resources = g[${c}].resources;
|
| 1129 |
+
`);
|
| 1130 |
+
for (const _ in u.resources) {
|
| 1131 |
+
const f = u.resources[_];
|
| 1132 |
+
if (f instanceof F)
|
| 1133 |
+
if (f.ubo) {
|
| 1134 |
+
const l = t._uniformBindMap[c][Number(_)];
|
| 1135 |
+
r.push(`
|
| 1136 |
+
sS.bindUniformBlock(
|
| 1137 |
+
resources[${_}],
|
| 1138 |
+
'${l}',
|
| 1139 |
+
${t.glProgram._uniformBlockData[l].index}
|
| 1140 |
+
);
|
| 1141 |
+
`);
|
| 1142 |
+
} else
|
| 1143 |
+
r.push(`
|
| 1144 |
+
ugS.updateUniformGroup(resources[${_}], p, sD);
|
| 1145 |
+
`);
|
| 1146 |
+
else if (f instanceof J) {
|
| 1147 |
+
const l = t._uniformBindMap[c][Number(_)];
|
| 1148 |
+
r.push(`
|
| 1149 |
+
sS.bindUniformBlock(
|
| 1150 |
+
resources[${_}],
|
| 1151 |
+
'${l}',
|
| 1152 |
+
${t.glProgram._uniformBlockData[l].index}
|
| 1153 |
+
);
|
| 1154 |
+
`);
|
| 1155 |
+
} else if (f instanceof $) {
|
| 1156 |
+
const l = t._uniformBindMap[c][_], E = a.uniformData[l];
|
| 1157 |
+
E && (n || (n = !0, s.push(`
|
| 1158 |
+
var tS = r.texture;
|
| 1159 |
+
`)), e._gl.uniform1i(E.location, i), r.push(`
|
| 1160 |
+
tS.bind(resources[${_}], ${i});
|
| 1161 |
+
`), i++);
|
| 1162 |
+
}
|
| 1163 |
+
}
|
| 1164 |
+
}
|
| 1165 |
+
const o = [...s, ...r].join(`
|
| 1166 |
+
`);
|
| 1167 |
+
return new Function("r", "s", "sD", o);
|
| 1168 |
+
}
|
| 1169 |
+
class et {
|
| 1170 |
+
/**
|
| 1171 |
+
* Makes a new Pixi program.
|
| 1172 |
+
* @param program - webgl program
|
| 1173 |
+
* @param uniformData - uniforms
|
| 1174 |
+
*/
|
| 1175 |
+
constructor(e, r) {
|
| 1176 |
+
this.program = e, this.uniformData = r, this.uniformGroups = {}, this.uniformDirtyGroups = {}, this.uniformBlockBindings = {};
|
| 1177 |
+
}
|
| 1178 |
+
/** Destroys this program. */
|
| 1179 |
+
destroy() {
|
| 1180 |
+
this.uniformData = null, this.uniformGroups = null, this.uniformDirtyGroups = null, this.uniformBlockBindings = null, this.program = null;
|
| 1181 |
+
}
|
| 1182 |
+
}
|
| 1183 |
+
function V(t, e, r) {
|
| 1184 |
+
const s = t.createShader(e);
|
| 1185 |
+
return t.shaderSource(s, r), t.compileShader(s), s;
|
| 1186 |
+
}
|
| 1187 |
+
function C(t) {
|
| 1188 |
+
const e = new Array(t);
|
| 1189 |
+
for (let r = 0; r < e.length; r++)
|
| 1190 |
+
e[r] = !1;
|
| 1191 |
+
return e;
|
| 1192 |
+
}
|
| 1193 |
+
function fe(t, e) {
|
| 1194 |
+
switch (t) {
|
| 1195 |
+
case "float":
|
| 1196 |
+
return 0;
|
| 1197 |
+
case "vec2":
|
| 1198 |
+
return new Float32Array(2 * e);
|
| 1199 |
+
case "vec3":
|
| 1200 |
+
return new Float32Array(3 * e);
|
| 1201 |
+
case "vec4":
|
| 1202 |
+
return new Float32Array(4 * e);
|
| 1203 |
+
case "int":
|
| 1204 |
+
case "uint":
|
| 1205 |
+
case "sampler2D":
|
| 1206 |
+
case "sampler2DArray":
|
| 1207 |
+
return 0;
|
| 1208 |
+
case "ivec2":
|
| 1209 |
+
return new Int32Array(2 * e);
|
| 1210 |
+
case "ivec3":
|
| 1211 |
+
return new Int32Array(3 * e);
|
| 1212 |
+
case "ivec4":
|
| 1213 |
+
return new Int32Array(4 * e);
|
| 1214 |
+
case "uvec2":
|
| 1215 |
+
return new Uint32Array(2 * e);
|
| 1216 |
+
case "uvec3":
|
| 1217 |
+
return new Uint32Array(3 * e);
|
| 1218 |
+
case "uvec4":
|
| 1219 |
+
return new Uint32Array(4 * e);
|
| 1220 |
+
case "bool":
|
| 1221 |
+
return !1;
|
| 1222 |
+
case "bvec2":
|
| 1223 |
+
return C(2 * e);
|
| 1224 |
+
case "bvec3":
|
| 1225 |
+
return C(3 * e);
|
| 1226 |
+
case "bvec4":
|
| 1227 |
+
return C(4 * e);
|
| 1228 |
+
case "mat2":
|
| 1229 |
+
return new Float32Array([
|
| 1230 |
+
1,
|
| 1231 |
+
0,
|
| 1232 |
+
0,
|
| 1233 |
+
1
|
| 1234 |
+
]);
|
| 1235 |
+
case "mat3":
|
| 1236 |
+
return new Float32Array([
|
| 1237 |
+
1,
|
| 1238 |
+
0,
|
| 1239 |
+
0,
|
| 1240 |
+
0,
|
| 1241 |
+
1,
|
| 1242 |
+
0,
|
| 1243 |
+
0,
|
| 1244 |
+
0,
|
| 1245 |
+
1
|
| 1246 |
+
]);
|
| 1247 |
+
case "mat4":
|
| 1248 |
+
return new Float32Array([
|
| 1249 |
+
1,
|
| 1250 |
+
0,
|
| 1251 |
+
0,
|
| 1252 |
+
0,
|
| 1253 |
+
0,
|
| 1254 |
+
1,
|
| 1255 |
+
0,
|
| 1256 |
+
0,
|
| 1257 |
+
0,
|
| 1258 |
+
0,
|
| 1259 |
+
1,
|
| 1260 |
+
0,
|
| 1261 |
+
0,
|
| 1262 |
+
0,
|
| 1263 |
+
0,
|
| 1264 |
+
1
|
| 1265 |
+
]);
|
| 1266 |
+
}
|
| 1267 |
+
return null;
|
| 1268 |
+
}
|
| 1269 |
+
let g = null;
|
| 1270 |
+
const k = {
|
| 1271 |
+
FLOAT: "float",
|
| 1272 |
+
FLOAT_VEC2: "vec2",
|
| 1273 |
+
FLOAT_VEC3: "vec3",
|
| 1274 |
+
FLOAT_VEC4: "vec4",
|
| 1275 |
+
INT: "int",
|
| 1276 |
+
INT_VEC2: "ivec2",
|
| 1277 |
+
INT_VEC3: "ivec3",
|
| 1278 |
+
INT_VEC4: "ivec4",
|
| 1279 |
+
UNSIGNED_INT: "uint",
|
| 1280 |
+
UNSIGNED_INT_VEC2: "uvec2",
|
| 1281 |
+
UNSIGNED_INT_VEC3: "uvec3",
|
| 1282 |
+
UNSIGNED_INT_VEC4: "uvec4",
|
| 1283 |
+
BOOL: "bool",
|
| 1284 |
+
BOOL_VEC2: "bvec2",
|
| 1285 |
+
BOOL_VEC3: "bvec3",
|
| 1286 |
+
BOOL_VEC4: "bvec4",
|
| 1287 |
+
FLOAT_MAT2: "mat2",
|
| 1288 |
+
FLOAT_MAT3: "mat3",
|
| 1289 |
+
FLOAT_MAT4: "mat4",
|
| 1290 |
+
SAMPLER_2D: "sampler2D",
|
| 1291 |
+
INT_SAMPLER_2D: "sampler2D",
|
| 1292 |
+
UNSIGNED_INT_SAMPLER_2D: "sampler2D",
|
| 1293 |
+
SAMPLER_CUBE: "samplerCube",
|
| 1294 |
+
INT_SAMPLER_CUBE: "samplerCube",
|
| 1295 |
+
UNSIGNED_INT_SAMPLER_CUBE: "samplerCube",
|
| 1296 |
+
SAMPLER_2D_ARRAY: "sampler2DArray",
|
| 1297 |
+
INT_SAMPLER_2D_ARRAY: "sampler2DArray",
|
| 1298 |
+
UNSIGNED_INT_SAMPLER_2D_ARRAY: "sampler2DArray"
|
| 1299 |
+
}, tt = {
|
| 1300 |
+
float: "float32",
|
| 1301 |
+
vec2: "float32x2",
|
| 1302 |
+
vec3: "float32x3",
|
| 1303 |
+
vec4: "float32x4",
|
| 1304 |
+
int: "sint32",
|
| 1305 |
+
ivec2: "sint32x2",
|
| 1306 |
+
ivec3: "sint32x3",
|
| 1307 |
+
ivec4: "sint32x4",
|
| 1308 |
+
uint: "uint32",
|
| 1309 |
+
uvec2: "uint32x2",
|
| 1310 |
+
uvec3: "uint32x3",
|
| 1311 |
+
uvec4: "uint32x4",
|
| 1312 |
+
bool: "uint32",
|
| 1313 |
+
bvec2: "uint32x2",
|
| 1314 |
+
bvec3: "uint32x3",
|
| 1315 |
+
bvec4: "uint32x4"
|
| 1316 |
+
};
|
| 1317 |
+
function le(t, e) {
|
| 1318 |
+
if (!g) {
|
| 1319 |
+
const r = Object.keys(k);
|
| 1320 |
+
g = {};
|
| 1321 |
+
for (let s = 0; s < r.length; ++s) {
|
| 1322 |
+
const n = r[s];
|
| 1323 |
+
g[t[n]] = k[n];
|
| 1324 |
+
}
|
| 1325 |
+
}
|
| 1326 |
+
return g[e];
|
| 1327 |
+
}
|
| 1328 |
+
function rt(t, e) {
|
| 1329 |
+
const r = le(t, e);
|
| 1330 |
+
return tt[r] || "float32";
|
| 1331 |
+
}
|
| 1332 |
+
function st(t, e, r = !1) {
|
| 1333 |
+
const s = {}, n = e.getProgramParameter(t, e.ACTIVE_ATTRIBUTES);
|
| 1334 |
+
for (let a = 0; a < n; a++) {
|
| 1335 |
+
const o = e.getActiveAttrib(t, a);
|
| 1336 |
+
if (o.name.startsWith("gl_"))
|
| 1337 |
+
continue;
|
| 1338 |
+
const c = rt(e, o.type);
|
| 1339 |
+
s[o.name] = {
|
| 1340 |
+
location: 0,
|
| 1341 |
+
// set further down..
|
| 1342 |
+
format: c,
|
| 1343 |
+
stride: K(c).stride,
|
| 1344 |
+
offset: 0,
|
| 1345 |
+
instance: !1,
|
| 1346 |
+
start: 0
|
| 1347 |
+
};
|
| 1348 |
+
}
|
| 1349 |
+
const i = Object.keys(s);
|
| 1350 |
+
if (r) {
|
| 1351 |
+
i.sort((a, o) => a > o ? 1 : -1);
|
| 1352 |
+
for (let a = 0; a < i.length; a++)
|
| 1353 |
+
s[i[a]].location = a, e.bindAttribLocation(t, a, i[a]);
|
| 1354 |
+
e.linkProgram(t);
|
| 1355 |
+
} else
|
| 1356 |
+
for (let a = 0; a < i.length; a++)
|
| 1357 |
+
s[i[a]].location = e.getAttribLocation(t, i[a]);
|
| 1358 |
+
return s;
|
| 1359 |
+
}
|
| 1360 |
+
function nt(t, e) {
|
| 1361 |
+
if (!e.ACTIVE_UNIFORM_BLOCKS)
|
| 1362 |
+
return {};
|
| 1363 |
+
const r = {}, s = e.getProgramParameter(t, e.ACTIVE_UNIFORM_BLOCKS);
|
| 1364 |
+
for (let n = 0; n < s; n++) {
|
| 1365 |
+
const i = e.getActiveUniformBlockName(t, n), a = e.getUniformBlockIndex(t, i), o = e.getActiveUniformBlockParameter(t, n, e.UNIFORM_BLOCK_DATA_SIZE);
|
| 1366 |
+
r[i] = {
|
| 1367 |
+
name: i,
|
| 1368 |
+
index: a,
|
| 1369 |
+
size: o
|
| 1370 |
+
};
|
| 1371 |
+
}
|
| 1372 |
+
return r;
|
| 1373 |
+
}
|
| 1374 |
+
function it(t, e) {
|
| 1375 |
+
const r = {}, s = e.getProgramParameter(t, e.ACTIVE_UNIFORMS);
|
| 1376 |
+
for (let n = 0; n < s; n++) {
|
| 1377 |
+
const i = e.getActiveUniform(t, n), a = i.name.replace(/\[.*?\]$/, ""), o = !!i.name.match(/\[.*?\]$/), c = le(e, i.type);
|
| 1378 |
+
r[a] = {
|
| 1379 |
+
name: a,
|
| 1380 |
+
index: n,
|
| 1381 |
+
type: c,
|
| 1382 |
+
size: i.size,
|
| 1383 |
+
isArray: o,
|
| 1384 |
+
value: fe(c, i.size)
|
| 1385 |
+
};
|
| 1386 |
+
}
|
| 1387 |
+
return r;
|
| 1388 |
+
}
|
| 1389 |
+
function X(t, e) {
|
| 1390 |
+
const r = t.getShaderSource(e).split(`
|
| 1391 |
+
`).map((u, _) => `${_}: ${u}`), s = t.getShaderInfoLog(e), n = s.split(`
|
| 1392 |
+
`), i = {}, a = n.map((u) => parseFloat(u.replace(/^ERROR\: 0\:([\d]+)\:.*$/, "$1"))).filter((u) => u && !i[u] ? (i[u] = !0, !0) : !1), o = [""];
|
| 1393 |
+
a.forEach((u) => {
|
| 1394 |
+
r[u - 1] = `%c${r[u - 1]}%c`, o.push("background: #FF0000; color:#FFFFFF; font-size: 10px", "font-size: 10px");
|
| 1395 |
+
});
|
| 1396 |
+
const c = r.join(`
|
| 1397 |
+
`);
|
| 1398 |
+
o[0] = c, console.error(s), console.groupCollapsed("click to view full shader code"), console.warn(...o), console.groupEnd();
|
| 1399 |
+
}
|
| 1400 |
+
function at(t, e, r, s) {
|
| 1401 |
+
t.getProgramParameter(e, t.LINK_STATUS) || (t.getShaderParameter(r, t.COMPILE_STATUS) || X(t, r), t.getShaderParameter(s, t.COMPILE_STATUS) || X(t, s), console.error("PixiJS Error: Could not initialize shader."), t.getProgramInfoLog(e) !== "" && console.warn("PixiJS Warning: gl.getProgramInfoLog()", t.getProgramInfoLog(e)));
|
| 1402 |
+
}
|
| 1403 |
+
function ot(t, e) {
|
| 1404 |
+
const r = V(t, t.VERTEX_SHADER, e.vertex), s = V(t, t.FRAGMENT_SHADER, e.fragment), n = t.createProgram();
|
| 1405 |
+
t.attachShader(n, r), t.attachShader(n, s);
|
| 1406 |
+
const i = e.transformFeedbackVaryings;
|
| 1407 |
+
i && (typeof t.transformFeedbackVaryings != "function" ? m("TransformFeedback is not supported but TransformFeedbackVaryings are given.") : t.transformFeedbackVaryings(
|
| 1408 |
+
n,
|
| 1409 |
+
i.names,
|
| 1410 |
+
i.bufferMode === "separate" ? t.SEPARATE_ATTRIBS : t.INTERLEAVED_ATTRIBS
|
| 1411 |
+
)), t.linkProgram(n), t.getProgramParameter(n, t.LINK_STATUS) || at(t, n, r, s), e._attributeData = st(
|
| 1412 |
+
n,
|
| 1413 |
+
t,
|
| 1414 |
+
!/^[ \t]*#[ \t]*version[ \t]+300[ \t]+es[ \t]*$/m.test(e.vertex)
|
| 1415 |
+
), e._uniformData = it(n, t), e._uniformBlockData = nt(n, t), t.deleteShader(r), t.deleteShader(s);
|
| 1416 |
+
const a = {};
|
| 1417 |
+
for (const c in e._uniformData) {
|
| 1418 |
+
const u = e._uniformData[c];
|
| 1419 |
+
a[c] = {
|
| 1420 |
+
location: t.getUniformLocation(n, c),
|
| 1421 |
+
value: fe(u.type, u.size)
|
| 1422 |
+
};
|
| 1423 |
+
}
|
| 1424 |
+
return new et(n, a);
|
| 1425 |
+
}
|
| 1426 |
+
const R = {
|
| 1427 |
+
textureCount: 0,
|
| 1428 |
+
blockIndex: 0
|
| 1429 |
+
};
|
| 1430 |
+
class de {
|
| 1431 |
+
constructor(e) {
|
| 1432 |
+
this._activeProgram = null, this._programDataHash = /* @__PURE__ */ Object.create(null), this._shaderSyncFunctions = /* @__PURE__ */ Object.create(null), this._renderer = e, this._renderer.renderableGC.addManagedHash(this, "_programDataHash");
|
| 1433 |
+
}
|
| 1434 |
+
contextChange(e) {
|
| 1435 |
+
this._gl = e, this._programDataHash = /* @__PURE__ */ Object.create(null), this._shaderSyncFunctions = /* @__PURE__ */ Object.create(null), this._activeProgram = null;
|
| 1436 |
+
}
|
| 1437 |
+
/**
|
| 1438 |
+
* Changes the current shader to the one given in parameter.
|
| 1439 |
+
* @param shader - the new shader
|
| 1440 |
+
* @param skipSync - false if the shader should automatically sync its uniforms.
|
| 1441 |
+
* @returns the glProgram that belongs to the shader.
|
| 1442 |
+
*/
|
| 1443 |
+
bind(e, r) {
|
| 1444 |
+
if (this._setProgram(e.glProgram), r)
|
| 1445 |
+
return;
|
| 1446 |
+
R.textureCount = 0, R.blockIndex = 0;
|
| 1447 |
+
let s = this._shaderSyncFunctions[e.glProgram._key];
|
| 1448 |
+
s || (s = this._shaderSyncFunctions[e.glProgram._key] = this._generateShaderSync(e, this)), this._renderer.buffer.nextBindBase(!!e.glProgram.transformFeedbackVaryings), s(this._renderer, e, R);
|
| 1449 |
+
}
|
| 1450 |
+
/**
|
| 1451 |
+
* Updates the uniform group.
|
| 1452 |
+
* @param uniformGroup - the uniform group to update
|
| 1453 |
+
*/
|
| 1454 |
+
updateUniformGroup(e) {
|
| 1455 |
+
this._renderer.uniformGroup.updateUniformGroup(e, this._activeProgram, R);
|
| 1456 |
+
}
|
| 1457 |
+
/**
|
| 1458 |
+
* Binds a uniform block to the shader.
|
| 1459 |
+
* @param uniformGroup - the uniform group to bind
|
| 1460 |
+
* @param name - the name of the uniform block
|
| 1461 |
+
* @param index - the index of the uniform block
|
| 1462 |
+
*/
|
| 1463 |
+
bindUniformBlock(e, r, s = 0) {
|
| 1464 |
+
const n = this._renderer.buffer, i = this._getProgramData(this._activeProgram), a = e._bufferResource;
|
| 1465 |
+
a || this._renderer.ubo.updateUniformGroup(e);
|
| 1466 |
+
const o = e.buffer, c = n.updateBuffer(o), u = n.freeLocationForBufferBase(c);
|
| 1467 |
+
if (a) {
|
| 1468 |
+
const { offset: f, size: l } = e;
|
| 1469 |
+
f === 0 && l === o.data.byteLength ? n.bindBufferBase(c, u) : n.bindBufferRange(c, u, f);
|
| 1470 |
+
} else n.getLastBindBaseLocation(c) !== u && n.bindBufferBase(c, u);
|
| 1471 |
+
const _ = this._activeProgram._uniformBlockData[r].index;
|
| 1472 |
+
i.uniformBlockBindings[s] !== u && (i.uniformBlockBindings[s] = u, this._renderer.gl.uniformBlockBinding(i.program, _, u));
|
| 1473 |
+
}
|
| 1474 |
+
_setProgram(e) {
|
| 1475 |
+
if (this._activeProgram === e)
|
| 1476 |
+
return;
|
| 1477 |
+
this._activeProgram = e;
|
| 1478 |
+
const r = this._getProgramData(e);
|
| 1479 |
+
this._gl.useProgram(r.program);
|
| 1480 |
+
}
|
| 1481 |
+
/**
|
| 1482 |
+
* @param program - the program to get the data for
|
| 1483 |
+
* @internal
|
| 1484 |
+
*/
|
| 1485 |
+
_getProgramData(e) {
|
| 1486 |
+
return this._programDataHash[e._key] || this._createProgramData(e);
|
| 1487 |
+
}
|
| 1488 |
+
_createProgramData(e) {
|
| 1489 |
+
const r = e._key;
|
| 1490 |
+
return this._programDataHash[r] = ot(this._gl, e), this._programDataHash[r];
|
| 1491 |
+
}
|
| 1492 |
+
destroy() {
|
| 1493 |
+
for (const e of Object.keys(this._programDataHash))
|
| 1494 |
+
this._programDataHash[e].destroy(), this._programDataHash[e] = null;
|
| 1495 |
+
this._programDataHash = null, this._shaderSyncFunctions = null, this._activeProgram = null, this._renderer = null, this._gl = null;
|
| 1496 |
+
}
|
| 1497 |
+
/**
|
| 1498 |
+
* Creates a function that can be executed that will sync the shader as efficiently as possible.
|
| 1499 |
+
* Overridden by the unsafe eval package if you don't want eval used in your project.
|
| 1500 |
+
* @param shader - the shader to generate the sync function for
|
| 1501 |
+
* @param shaderSystem - the shader system to use
|
| 1502 |
+
* @returns - the generated sync function
|
| 1503 |
+
* @ignore
|
| 1504 |
+
*/
|
| 1505 |
+
_generateShaderSync(e, r) {
|
| 1506 |
+
return Qe(e, r);
|
| 1507 |
+
}
|
| 1508 |
+
resetState() {
|
| 1509 |
+
this._activeProgram = null;
|
| 1510 |
+
}
|
| 1511 |
+
}
|
| 1512 |
+
de.extension = {
|
| 1513 |
+
type: [
|
| 1514 |
+
d.WebGLSystem
|
| 1515 |
+
],
|
| 1516 |
+
name: "shader"
|
| 1517 |
+
};
|
| 1518 |
+
const ct = {
|
| 1519 |
+
f32: `if (cv !== v) {
|
| 1520 |
+
cu.value = v;
|
| 1521 |
+
gl.uniform1f(location, v);
|
| 1522 |
+
}`,
|
| 1523 |
+
"vec2<f32>": `if (cv[0] !== v[0] || cv[1] !== v[1]) {
|
| 1524 |
+
cv[0] = v[0];
|
| 1525 |
+
cv[1] = v[1];
|
| 1526 |
+
gl.uniform2f(location, v[0], v[1]);
|
| 1527 |
+
}`,
|
| 1528 |
+
"vec3<f32>": `if (cv[0] !== v[0] || cv[1] !== v[1] || cv[2] !== v[2]) {
|
| 1529 |
+
cv[0] = v[0];
|
| 1530 |
+
cv[1] = v[1];
|
| 1531 |
+
cv[2] = v[2];
|
| 1532 |
+
gl.uniform3f(location, v[0], v[1], v[2]);
|
| 1533 |
+
}`,
|
| 1534 |
+
"vec4<f32>": `if (cv[0] !== v[0] || cv[1] !== v[1] || cv[2] !== v[2] || cv[3] !== v[3]) {
|
| 1535 |
+
cv[0] = v[0];
|
| 1536 |
+
cv[1] = v[1];
|
| 1537 |
+
cv[2] = v[2];
|
| 1538 |
+
cv[3] = v[3];
|
| 1539 |
+
gl.uniform4f(location, v[0], v[1], v[2], v[3]);
|
| 1540 |
+
}`,
|
| 1541 |
+
i32: `if (cv !== v) {
|
| 1542 |
+
cu.value = v;
|
| 1543 |
+
gl.uniform1i(location, v);
|
| 1544 |
+
}`,
|
| 1545 |
+
"vec2<i32>": `if (cv[0] !== v[0] || cv[1] !== v[1]) {
|
| 1546 |
+
cv[0] = v[0];
|
| 1547 |
+
cv[1] = v[1];
|
| 1548 |
+
gl.uniform2i(location, v[0], v[1]);
|
| 1549 |
+
}`,
|
| 1550 |
+
"vec3<i32>": `if (cv[0] !== v[0] || cv[1] !== v[1] || cv[2] !== v[2]) {
|
| 1551 |
+
cv[0] = v[0];
|
| 1552 |
+
cv[1] = v[1];
|
| 1553 |
+
cv[2] = v[2];
|
| 1554 |
+
gl.uniform3i(location, v[0], v[1], v[2]);
|
| 1555 |
+
}`,
|
| 1556 |
+
"vec4<i32>": `if (cv[0] !== v[0] || cv[1] !== v[1] || cv[2] !== v[2] || cv[3] !== v[3]) {
|
| 1557 |
+
cv[0] = v[0];
|
| 1558 |
+
cv[1] = v[1];
|
| 1559 |
+
cv[2] = v[2];
|
| 1560 |
+
cv[3] = v[3];
|
| 1561 |
+
gl.uniform4i(location, v[0], v[1], v[2], v[3]);
|
| 1562 |
+
}`,
|
| 1563 |
+
u32: `if (cv !== v) {
|
| 1564 |
+
cu.value = v;
|
| 1565 |
+
gl.uniform1ui(location, v);
|
| 1566 |
+
}`,
|
| 1567 |
+
"vec2<u32>": `if (cv[0] !== v[0] || cv[1] !== v[1]) {
|
| 1568 |
+
cv[0] = v[0];
|
| 1569 |
+
cv[1] = v[1];
|
| 1570 |
+
gl.uniform2ui(location, v[0], v[1]);
|
| 1571 |
+
}`,
|
| 1572 |
+
"vec3<u32>": `if (cv[0] !== v[0] || cv[1] !== v[1] || cv[2] !== v[2]) {
|
| 1573 |
+
cv[0] = v[0];
|
| 1574 |
+
cv[1] = v[1];
|
| 1575 |
+
cv[2] = v[2];
|
| 1576 |
+
gl.uniform3ui(location, v[0], v[1], v[2]);
|
| 1577 |
+
}`,
|
| 1578 |
+
"vec4<u32>": `if (cv[0] !== v[0] || cv[1] !== v[1] || cv[2] !== v[2] || cv[3] !== v[3]) {
|
| 1579 |
+
cv[0] = v[0];
|
| 1580 |
+
cv[1] = v[1];
|
| 1581 |
+
cv[2] = v[2];
|
| 1582 |
+
cv[3] = v[3];
|
| 1583 |
+
gl.uniform4ui(location, v[0], v[1], v[2], v[3]);
|
| 1584 |
+
}`,
|
| 1585 |
+
bool: `if (cv !== v) {
|
| 1586 |
+
cu.value = v;
|
| 1587 |
+
gl.uniform1i(location, v);
|
| 1588 |
+
}`,
|
| 1589 |
+
"vec2<bool>": `if (cv[0] !== v[0] || cv[1] !== v[1]) {
|
| 1590 |
+
cv[0] = v[0];
|
| 1591 |
+
cv[1] = v[1];
|
| 1592 |
+
gl.uniform2i(location, v[0], v[1]);
|
| 1593 |
+
}`,
|
| 1594 |
+
"vec3<bool>": `if (cv[0] !== v[0] || cv[1] !== v[1] || cv[2] !== v[2]) {
|
| 1595 |
+
cv[0] = v[0];
|
| 1596 |
+
cv[1] = v[1];
|
| 1597 |
+
cv[2] = v[2];
|
| 1598 |
+
gl.uniform3i(location, v[0], v[1], v[2]);
|
| 1599 |
+
}`,
|
| 1600 |
+
"vec4<bool>": `if (cv[0] !== v[0] || cv[1] !== v[1] || cv[2] !== v[2] || cv[3] !== v[3]) {
|
| 1601 |
+
cv[0] = v[0];
|
| 1602 |
+
cv[1] = v[1];
|
| 1603 |
+
cv[2] = v[2];
|
| 1604 |
+
cv[3] = v[3];
|
| 1605 |
+
gl.uniform4i(location, v[0], v[1], v[2], v[3]);
|
| 1606 |
+
}`,
|
| 1607 |
+
"mat2x2<f32>": "gl.uniformMatrix2fv(location, false, v);",
|
| 1608 |
+
"mat3x3<f32>": "gl.uniformMatrix3fv(location, false, v);",
|
| 1609 |
+
"mat4x4<f32>": "gl.uniformMatrix4fv(location, false, v);"
|
| 1610 |
+
}, ut = {
|
| 1611 |
+
f32: "gl.uniform1fv(location, v);",
|
| 1612 |
+
"vec2<f32>": "gl.uniform2fv(location, v);",
|
| 1613 |
+
"vec3<f32>": "gl.uniform3fv(location, v);",
|
| 1614 |
+
"vec4<f32>": "gl.uniform4fv(location, v);",
|
| 1615 |
+
"mat2x2<f32>": "gl.uniformMatrix2fv(location, false, v);",
|
| 1616 |
+
"mat3x3<f32>": "gl.uniformMatrix3fv(location, false, v);",
|
| 1617 |
+
"mat4x4<f32>": "gl.uniformMatrix4fv(location, false, v);",
|
| 1618 |
+
i32: "gl.uniform1iv(location, v);",
|
| 1619 |
+
"vec2<i32>": "gl.uniform2iv(location, v);",
|
| 1620 |
+
"vec3<i32>": "gl.uniform3iv(location, v);",
|
| 1621 |
+
"vec4<i32>": "gl.uniform4iv(location, v);",
|
| 1622 |
+
u32: "gl.uniform1iv(location, v);",
|
| 1623 |
+
"vec2<u32>": "gl.uniform2iv(location, v);",
|
| 1624 |
+
"vec3<u32>": "gl.uniform3iv(location, v);",
|
| 1625 |
+
"vec4<u32>": "gl.uniform4iv(location, v);",
|
| 1626 |
+
bool: "gl.uniform1iv(location, v);",
|
| 1627 |
+
"vec2<bool>": "gl.uniform2iv(location, v);",
|
| 1628 |
+
"vec3<bool>": "gl.uniform3iv(location, v);",
|
| 1629 |
+
"vec4<bool>": "gl.uniform4iv(location, v);"
|
| 1630 |
+
};
|
| 1631 |
+
function _t(t, e) {
|
| 1632 |
+
const r = [`
|
| 1633 |
+
var v = null;
|
| 1634 |
+
var cv = null;
|
| 1635 |
+
var cu = null;
|
| 1636 |
+
var t = 0;
|
| 1637 |
+
var gl = renderer.gl;
|
| 1638 |
+
var name = null;
|
| 1639 |
+
`];
|
| 1640 |
+
for (const s in t.uniforms) {
|
| 1641 |
+
if (!e[s]) {
|
| 1642 |
+
t.uniforms[s] instanceof F ? t.uniforms[s].ubo ? r.push(`
|
| 1643 |
+
renderer.shader.bindUniformBlock(uv.${s}, "${s}");
|
| 1644 |
+
`) : r.push(`
|
| 1645 |
+
renderer.shader.updateUniformGroup(uv.${s});
|
| 1646 |
+
`) : t.uniforms[s] instanceof J && r.push(`
|
| 1647 |
+
renderer.shader.bindBufferResource(uv.${s}, "${s}");
|
| 1648 |
+
`);
|
| 1649 |
+
continue;
|
| 1650 |
+
}
|
| 1651 |
+
const n = t.uniformStructures[s];
|
| 1652 |
+
let i = !1;
|
| 1653 |
+
for (let a = 0; a < y.length; a++) {
|
| 1654 |
+
const o = y[a];
|
| 1655 |
+
if (n.type === o.type && o.test(n)) {
|
| 1656 |
+
r.push(`name = "${s}";`, y[a].uniform), i = !0;
|
| 1657 |
+
break;
|
| 1658 |
+
}
|
| 1659 |
+
}
|
| 1660 |
+
if (!i) {
|
| 1661 |
+
const o = (n.size === 1 ? ct : ut)[n.type].replace("location", `ud["${s}"].location`);
|
| 1662 |
+
r.push(`
|
| 1663 |
+
cu = ud["${s}"];
|
| 1664 |
+
cv = cu.value;
|
| 1665 |
+
v = uv["${s}"];
|
| 1666 |
+
${o};`);
|
| 1667 |
+
}
|
| 1668 |
+
}
|
| 1669 |
+
return new Function("ud", "uv", "renderer", "syncData", r.join(`
|
| 1670 |
+
`));
|
| 1671 |
+
}
|
| 1672 |
+
class me {
|
| 1673 |
+
/** @param renderer - The renderer this System works for. */
|
| 1674 |
+
constructor(e) {
|
| 1675 |
+
this._cache = {}, this._uniformGroupSyncHash = {}, this._renderer = e, this.gl = null, this._cache = {};
|
| 1676 |
+
}
|
| 1677 |
+
contextChange(e) {
|
| 1678 |
+
this.gl = e;
|
| 1679 |
+
}
|
| 1680 |
+
/**
|
| 1681 |
+
* Uploads the uniforms values to the currently bound shader.
|
| 1682 |
+
* @param group - the uniforms values that be applied to the current shader
|
| 1683 |
+
* @param program
|
| 1684 |
+
* @param syncData
|
| 1685 |
+
* @param syncData.textureCount
|
| 1686 |
+
*/
|
| 1687 |
+
updateUniformGroup(e, r, s) {
|
| 1688 |
+
const n = this._renderer.shader._getProgramData(r);
|
| 1689 |
+
(!e.isStatic || e._dirtyId !== n.uniformDirtyGroups[e.uid]) && (n.uniformDirtyGroups[e.uid] = e._dirtyId, this._getUniformSyncFunction(e, r)(n.uniformData, e.uniforms, this._renderer, s));
|
| 1690 |
+
}
|
| 1691 |
+
/**
|
| 1692 |
+
* Overridable by the pixi.js/unsafe-eval package to use static syncUniforms instead.
|
| 1693 |
+
* @param group
|
| 1694 |
+
* @param program
|
| 1695 |
+
*/
|
| 1696 |
+
_getUniformSyncFunction(e, r) {
|
| 1697 |
+
var s;
|
| 1698 |
+
return ((s = this._uniformGroupSyncHash[e._signature]) == null ? void 0 : s[r._key]) || this._createUniformSyncFunction(e, r);
|
| 1699 |
+
}
|
| 1700 |
+
_createUniformSyncFunction(e, r) {
|
| 1701 |
+
const s = this._uniformGroupSyncHash[e._signature] || (this._uniformGroupSyncHash[e._signature] = {}), n = this._getSignature(e, r._uniformData, "u");
|
| 1702 |
+
return this._cache[n] || (this._cache[n] = this._generateUniformsSync(e, r._uniformData)), s[r._key] = this._cache[n], s[r._key];
|
| 1703 |
+
}
|
| 1704 |
+
_generateUniformsSync(e, r) {
|
| 1705 |
+
return _t(e, r);
|
| 1706 |
+
}
|
| 1707 |
+
/**
|
| 1708 |
+
* Takes a uniform group and data and generates a unique signature for them.
|
| 1709 |
+
* @param group - The uniform group to get signature of
|
| 1710 |
+
* @param group.uniforms
|
| 1711 |
+
* @param uniformData - Uniform information generated by the shader
|
| 1712 |
+
* @param preFix
|
| 1713 |
+
* @returns Unique signature of the uniform group
|
| 1714 |
+
*/
|
| 1715 |
+
_getSignature(e, r, s) {
|
| 1716 |
+
const n = e.uniforms, i = [`${s}-`];
|
| 1717 |
+
for (const a in n)
|
| 1718 |
+
i.push(a), r[a] && i.push(r[a].type);
|
| 1719 |
+
return i.join("-");
|
| 1720 |
+
}
|
| 1721 |
+
/** Destroys this System and removes all its textures. */
|
| 1722 |
+
destroy() {
|
| 1723 |
+
this._renderer = null, this._cache = null;
|
| 1724 |
+
}
|
| 1725 |
+
}
|
| 1726 |
+
me.extension = {
|
| 1727 |
+
type: [
|
| 1728 |
+
d.WebGLSystem
|
| 1729 |
+
],
|
| 1730 |
+
name: "uniformGroup"
|
| 1731 |
+
};
|
| 1732 |
+
function ht(t) {
|
| 1733 |
+
const e = {};
|
| 1734 |
+
if (e.normal = [t.ONE, t.ONE_MINUS_SRC_ALPHA], e.add = [t.ONE, t.ONE], e.multiply = [t.DST_COLOR, t.ONE_MINUS_SRC_ALPHA, t.ONE, t.ONE_MINUS_SRC_ALPHA], e.screen = [t.ONE, t.ONE_MINUS_SRC_COLOR, t.ONE, t.ONE_MINUS_SRC_ALPHA], e.none = [0, 0], e["normal-npm"] = [t.SRC_ALPHA, t.ONE_MINUS_SRC_ALPHA, t.ONE, t.ONE_MINUS_SRC_ALPHA], e["add-npm"] = [t.SRC_ALPHA, t.ONE, t.ONE, t.ONE], e["screen-npm"] = [t.SRC_ALPHA, t.ONE_MINUS_SRC_COLOR, t.ONE, t.ONE_MINUS_SRC_ALPHA], e.erase = [t.ZERO, t.ONE_MINUS_SRC_ALPHA], !(t instanceof S.get().getWebGLRenderingContext()))
|
| 1735 |
+
e.min = [t.ONE, t.ONE, t.ONE, t.ONE, t.MIN, t.MIN], e.max = [t.ONE, t.ONE, t.ONE, t.ONE, t.MAX, t.MAX];
|
| 1736 |
+
else {
|
| 1737 |
+
const s = t.getExtension("EXT_blend_minmax");
|
| 1738 |
+
s && (e.min = [t.ONE, t.ONE, t.ONE, t.ONE, s.MIN_EXT, s.MIN_EXT], e.max = [t.ONE, t.ONE, t.ONE, t.ONE, s.MAX_EXT, s.MAX_EXT]);
|
| 1739 |
+
}
|
| 1740 |
+
return e;
|
| 1741 |
+
}
|
| 1742 |
+
const ft = 0, lt = 1, dt = 2, mt = 3, Et = 4, bt = 5, Ee = class G {
|
| 1743 |
+
constructor(e) {
|
| 1744 |
+
this._invertFrontFace = !1, this.gl = null, this.stateId = 0, this.polygonOffset = 0, this.blendMode = "none", this._blendEq = !1, this.map = [], this.map[ft] = this.setBlend, this.map[lt] = this.setOffset, this.map[dt] = this.setCullFace, this.map[mt] = this.setDepthTest, this.map[Et] = this.setFrontFace, this.map[bt] = this.setDepthMask, this.checks = [], this.defaultState = O.for2d(), e.renderTarget.onRenderTargetChange.add(this);
|
| 1745 |
+
}
|
| 1746 |
+
onRenderTargetChange(e) {
|
| 1747 |
+
this._invertFrontFace = !e.isRoot, this._cullFace ? this.setFrontFace(this._frontFace) : this._frontFaceDirty = !0;
|
| 1748 |
+
}
|
| 1749 |
+
contextChange(e) {
|
| 1750 |
+
this.gl = e, this.blendModesMap = ht(e), this.resetState();
|
| 1751 |
+
}
|
| 1752 |
+
/**
|
| 1753 |
+
* Sets the current state
|
| 1754 |
+
* @param {*} state - The state to set.
|
| 1755 |
+
*/
|
| 1756 |
+
set(e) {
|
| 1757 |
+
if (e || (e = this.defaultState), this.stateId !== e.data) {
|
| 1758 |
+
let r = this.stateId ^ e.data, s = 0;
|
| 1759 |
+
for (; r; )
|
| 1760 |
+
r & 1 && this.map[s].call(this, !!(e.data & 1 << s)), r >>= 1, s++;
|
| 1761 |
+
this.stateId = e.data;
|
| 1762 |
+
}
|
| 1763 |
+
for (let r = 0; r < this.checks.length; r++)
|
| 1764 |
+
this.checks[r](this, e);
|
| 1765 |
+
}
|
| 1766 |
+
/**
|
| 1767 |
+
* Sets the state, when previous state is unknown.
|
| 1768 |
+
* @param {*} state - The state to set
|
| 1769 |
+
*/
|
| 1770 |
+
forceState(e) {
|
| 1771 |
+
e || (e = this.defaultState);
|
| 1772 |
+
for (let r = 0; r < this.map.length; r++)
|
| 1773 |
+
this.map[r].call(this, !!(e.data & 1 << r));
|
| 1774 |
+
for (let r = 0; r < this.checks.length; r++)
|
| 1775 |
+
this.checks[r](this, e);
|
| 1776 |
+
this.stateId = e.data;
|
| 1777 |
+
}
|
| 1778 |
+
/**
|
| 1779 |
+
* Sets whether to enable or disable blending.
|
| 1780 |
+
* @param value - Turn on or off WebGl blending.
|
| 1781 |
+
*/
|
| 1782 |
+
setBlend(e) {
|
| 1783 |
+
this._updateCheck(G._checkBlendMode, e), this.gl[e ? "enable" : "disable"](this.gl.BLEND);
|
| 1784 |
+
}
|
| 1785 |
+
/**
|
| 1786 |
+
* Sets whether to enable or disable polygon offset fill.
|
| 1787 |
+
* @param value - Turn on or off webgl polygon offset testing.
|
| 1788 |
+
*/
|
| 1789 |
+
setOffset(e) {
|
| 1790 |
+
this._updateCheck(G._checkPolygonOffset, e), this.gl[e ? "enable" : "disable"](this.gl.POLYGON_OFFSET_FILL);
|
| 1791 |
+
}
|
| 1792 |
+
/**
|
| 1793 |
+
* Sets whether to enable or disable depth test.
|
| 1794 |
+
* @param value - Turn on or off webgl depth testing.
|
| 1795 |
+
*/
|
| 1796 |
+
setDepthTest(e) {
|
| 1797 |
+
this.gl[e ? "enable" : "disable"](this.gl.DEPTH_TEST);
|
| 1798 |
+
}
|
| 1799 |
+
/**
|
| 1800 |
+
* Sets whether to enable or disable depth mask.
|
| 1801 |
+
* @param value - Turn on or off webgl depth mask.
|
| 1802 |
+
*/
|
| 1803 |
+
setDepthMask(e) {
|
| 1804 |
+
this.gl.depthMask(e);
|
| 1805 |
+
}
|
| 1806 |
+
/**
|
| 1807 |
+
* Sets whether to enable or disable cull face.
|
| 1808 |
+
* @param {boolean} value - Turn on or off webgl cull face.
|
| 1809 |
+
*/
|
| 1810 |
+
setCullFace(e) {
|
| 1811 |
+
this._cullFace = e, this.gl[e ? "enable" : "disable"](this.gl.CULL_FACE), this._cullFace && this._frontFaceDirty && this.setFrontFace(this._frontFace);
|
| 1812 |
+
}
|
| 1813 |
+
/**
|
| 1814 |
+
* Sets the gl front face.
|
| 1815 |
+
* @param {boolean} value - true is clockwise and false is counter-clockwise
|
| 1816 |
+
*/
|
| 1817 |
+
setFrontFace(e) {
|
| 1818 |
+
this._frontFace = e, this._frontFaceDirty = !1;
|
| 1819 |
+
const r = this._invertFrontFace ? !e : e;
|
| 1820 |
+
this._glFrontFace !== r && (this._glFrontFace = r, this.gl.frontFace(this.gl[r ? "CW" : "CCW"]));
|
| 1821 |
+
}
|
| 1822 |
+
/**
|
| 1823 |
+
* Sets the blend mode.
|
| 1824 |
+
* @param {number} value - The blend mode to set to.
|
| 1825 |
+
*/
|
| 1826 |
+
setBlendMode(e) {
|
| 1827 |
+
if (this.blendModesMap[e] || (e = "normal"), e === this.blendMode)
|
| 1828 |
+
return;
|
| 1829 |
+
this.blendMode = e;
|
| 1830 |
+
const r = this.blendModesMap[e], s = this.gl;
|
| 1831 |
+
r.length === 2 ? s.blendFunc(r[0], r[1]) : s.blendFuncSeparate(r[0], r[1], r[2], r[3]), r.length === 6 ? (this._blendEq = !0, s.blendEquationSeparate(r[4], r[5])) : this._blendEq && (this._blendEq = !1, s.blendEquationSeparate(s.FUNC_ADD, s.FUNC_ADD));
|
| 1832 |
+
}
|
| 1833 |
+
/**
|
| 1834 |
+
* Sets the polygon offset.
|
| 1835 |
+
* @param {number} value - the polygon offset
|
| 1836 |
+
* @param {number} scale - the polygon offset scale
|
| 1837 |
+
*/
|
| 1838 |
+
setPolygonOffset(e, r) {
|
| 1839 |
+
this.gl.polygonOffset(e, r);
|
| 1840 |
+
}
|
| 1841 |
+
/** Resets all the logic and disables the VAOs. */
|
| 1842 |
+
resetState() {
|
| 1843 |
+
this._glFrontFace = !1, this._frontFace = !1, this._cullFace = !1, this._frontFaceDirty = !1, this._invertFrontFace = !1, this.gl.frontFace(this.gl.CCW), this.gl.pixelStorei(this.gl.UNPACK_FLIP_Y_WEBGL, !1), this.forceState(this.defaultState), this._blendEq = !0, this.blendMode = "", this.setBlendMode("normal");
|
| 1844 |
+
}
|
| 1845 |
+
/**
|
| 1846 |
+
* Checks to see which updates should be checked based on which settings have been activated.
|
| 1847 |
+
*
|
| 1848 |
+
* For example, if blend is enabled then we should check the blend modes each time the state is changed
|
| 1849 |
+
* or if polygon fill is activated then we need to check if the polygon offset changes.
|
| 1850 |
+
* The idea is that we only check what we have too.
|
| 1851 |
+
* @param func - the checking function to add or remove
|
| 1852 |
+
* @param value - should the check function be added or removed.
|
| 1853 |
+
*/
|
| 1854 |
+
_updateCheck(e, r) {
|
| 1855 |
+
const s = this.checks.indexOf(e);
|
| 1856 |
+
r && s === -1 ? this.checks.push(e) : !r && s !== -1 && this.checks.splice(s, 1);
|
| 1857 |
+
}
|
| 1858 |
+
/**
|
| 1859 |
+
* A private little wrapper function that we call to check the blend mode.
|
| 1860 |
+
* @param system - the System to perform the state check on
|
| 1861 |
+
* @param state - the state that the blendMode will pulled from
|
| 1862 |
+
*/
|
| 1863 |
+
static _checkBlendMode(e, r) {
|
| 1864 |
+
e.setBlendMode(r.blendMode);
|
| 1865 |
+
}
|
| 1866 |
+
/**
|
| 1867 |
+
* A private little wrapper function that we call to check the polygon offset.
|
| 1868 |
+
* @param system - the System to perform the state check on
|
| 1869 |
+
* @param state - the state that the blendMode will pulled from
|
| 1870 |
+
*/
|
| 1871 |
+
static _checkPolygonOffset(e, r) {
|
| 1872 |
+
e.setPolygonOffset(1, r.polygonOffset);
|
| 1873 |
+
}
|
| 1874 |
+
/** @ignore */
|
| 1875 |
+
destroy() {
|
| 1876 |
+
this.gl = null, this.checks.length = 0;
|
| 1877 |
+
}
|
| 1878 |
+
};
|
| 1879 |
+
Ee.extension = {
|
| 1880 |
+
type: [
|
| 1881 |
+
d.WebGLSystem
|
| 1882 |
+
],
|
| 1883 |
+
name: "state"
|
| 1884 |
+
};
|
| 1885 |
+
let St = Ee;
|
| 1886 |
+
class pt {
|
| 1887 |
+
constructor(e) {
|
| 1888 |
+
this.target = re.TEXTURE_2D, this.texture = e, this.width = -1, this.height = -1, this.type = h.UNSIGNED_BYTE, this.internalFormat = D.RGBA, this.format = D.RGBA, this.samplerType = 0;
|
| 1889 |
+
}
|
| 1890 |
+
}
|
| 1891 |
+
const gt = {
|
| 1892 |
+
id: "buffer",
|
| 1893 |
+
upload(t, e, r) {
|
| 1894 |
+
e.width === t.width || e.height === t.height ? r.texSubImage2D(
|
| 1895 |
+
r.TEXTURE_2D,
|
| 1896 |
+
0,
|
| 1897 |
+
0,
|
| 1898 |
+
0,
|
| 1899 |
+
t.width,
|
| 1900 |
+
t.height,
|
| 1901 |
+
e.format,
|
| 1902 |
+
e.type,
|
| 1903 |
+
t.resource
|
| 1904 |
+
) : r.texImage2D(
|
| 1905 |
+
e.target,
|
| 1906 |
+
0,
|
| 1907 |
+
e.internalFormat,
|
| 1908 |
+
t.width,
|
| 1909 |
+
t.height,
|
| 1910 |
+
0,
|
| 1911 |
+
e.format,
|
| 1912 |
+
e.type,
|
| 1913 |
+
t.resource
|
| 1914 |
+
), e.width = t.width, e.height = t.height;
|
| 1915 |
+
}
|
| 1916 |
+
}, Rt = {
|
| 1917 |
+
"bc1-rgba-unorm": !0,
|
| 1918 |
+
"bc1-rgba-unorm-srgb": !0,
|
| 1919 |
+
"bc2-rgba-unorm": !0,
|
| 1920 |
+
"bc2-rgba-unorm-srgb": !0,
|
| 1921 |
+
"bc3-rgba-unorm": !0,
|
| 1922 |
+
"bc3-rgba-unorm-srgb": !0,
|
| 1923 |
+
"bc4-r-unorm": !0,
|
| 1924 |
+
"bc4-r-snorm": !0,
|
| 1925 |
+
"bc5-rg-unorm": !0,
|
| 1926 |
+
"bc5-rg-snorm": !0,
|
| 1927 |
+
"bc6h-rgb-ufloat": !0,
|
| 1928 |
+
"bc6h-rgb-float": !0,
|
| 1929 |
+
"bc7-rgba-unorm": !0,
|
| 1930 |
+
"bc7-rgba-unorm-srgb": !0,
|
| 1931 |
+
// ETC2 compressed formats usable if "texture-compression-etc2" is both
|
| 1932 |
+
// supported by the device/user agent and enabled in requestDevice.
|
| 1933 |
+
"etc2-rgb8unorm": !0,
|
| 1934 |
+
"etc2-rgb8unorm-srgb": !0,
|
| 1935 |
+
"etc2-rgb8a1unorm": !0,
|
| 1936 |
+
"etc2-rgb8a1unorm-srgb": !0,
|
| 1937 |
+
"etc2-rgba8unorm": !0,
|
| 1938 |
+
"etc2-rgba8unorm-srgb": !0,
|
| 1939 |
+
"eac-r11unorm": !0,
|
| 1940 |
+
"eac-r11snorm": !0,
|
| 1941 |
+
"eac-rg11unorm": !0,
|
| 1942 |
+
"eac-rg11snorm": !0,
|
| 1943 |
+
// ASTC compressed formats usable if "texture-compression-astc" is both
|
| 1944 |
+
// supported by the device/user agent and enabled in requestDevice.
|
| 1945 |
+
"astc-4x4-unorm": !0,
|
| 1946 |
+
"astc-4x4-unorm-srgb": !0,
|
| 1947 |
+
"astc-5x4-unorm": !0,
|
| 1948 |
+
"astc-5x4-unorm-srgb": !0,
|
| 1949 |
+
"astc-5x5-unorm": !0,
|
| 1950 |
+
"astc-5x5-unorm-srgb": !0,
|
| 1951 |
+
"astc-6x5-unorm": !0,
|
| 1952 |
+
"astc-6x5-unorm-srgb": !0,
|
| 1953 |
+
"astc-6x6-unorm": !0,
|
| 1954 |
+
"astc-6x6-unorm-srgb": !0,
|
| 1955 |
+
"astc-8x5-unorm": !0,
|
| 1956 |
+
"astc-8x5-unorm-srgb": !0,
|
| 1957 |
+
"astc-8x6-unorm": !0,
|
| 1958 |
+
"astc-8x6-unorm-srgb": !0,
|
| 1959 |
+
"astc-8x8-unorm": !0,
|
| 1960 |
+
"astc-8x8-unorm-srgb": !0,
|
| 1961 |
+
"astc-10x5-unorm": !0,
|
| 1962 |
+
"astc-10x5-unorm-srgb": !0,
|
| 1963 |
+
"astc-10x6-unorm": !0,
|
| 1964 |
+
"astc-10x6-unorm-srgb": !0,
|
| 1965 |
+
"astc-10x8-unorm": !0,
|
| 1966 |
+
"astc-10x8-unorm-srgb": !0,
|
| 1967 |
+
"astc-10x10-unorm": !0,
|
| 1968 |
+
"astc-10x10-unorm-srgb": !0,
|
| 1969 |
+
"astc-12x10-unorm": !0,
|
| 1970 |
+
"astc-12x10-unorm-srgb": !0,
|
| 1971 |
+
"astc-12x12-unorm": !0,
|
| 1972 |
+
"astc-12x12-unorm-srgb": !0
|
| 1973 |
+
}, xt = {
|
| 1974 |
+
id: "compressed",
|
| 1975 |
+
upload(t, e, r) {
|
| 1976 |
+
r.pixelStorei(r.UNPACK_ALIGNMENT, 4);
|
| 1977 |
+
let s = t.pixelWidth, n = t.pixelHeight;
|
| 1978 |
+
const i = !!Rt[t.format];
|
| 1979 |
+
for (let a = 0; a < t.resource.length; a++) {
|
| 1980 |
+
const o = t.resource[a];
|
| 1981 |
+
i ? r.compressedTexImage2D(
|
| 1982 |
+
r.TEXTURE_2D,
|
| 1983 |
+
a,
|
| 1984 |
+
e.internalFormat,
|
| 1985 |
+
s,
|
| 1986 |
+
n,
|
| 1987 |
+
0,
|
| 1988 |
+
o
|
| 1989 |
+
) : r.texImage2D(
|
| 1990 |
+
r.TEXTURE_2D,
|
| 1991 |
+
a,
|
| 1992 |
+
e.internalFormat,
|
| 1993 |
+
s,
|
| 1994 |
+
n,
|
| 1995 |
+
0,
|
| 1996 |
+
e.format,
|
| 1997 |
+
e.type,
|
| 1998 |
+
o
|
| 1999 |
+
), s = Math.max(s >> 1, 1), n = Math.max(n >> 1, 1);
|
| 2000 |
+
}
|
| 2001 |
+
}
|
| 2002 |
+
}, be = {
|
| 2003 |
+
id: "image",
|
| 2004 |
+
upload(t, e, r, s) {
|
| 2005 |
+
const n = e.width, i = e.height, a = t.pixelWidth, o = t.pixelHeight, c = t.resourceWidth, u = t.resourceHeight;
|
| 2006 |
+
c < a || u < o ? ((n !== a || i !== o) && r.texImage2D(
|
| 2007 |
+
e.target,
|
| 2008 |
+
0,
|
| 2009 |
+
e.internalFormat,
|
| 2010 |
+
a,
|
| 2011 |
+
o,
|
| 2012 |
+
0,
|
| 2013 |
+
e.format,
|
| 2014 |
+
e.type,
|
| 2015 |
+
null
|
| 2016 |
+
), s === 2 ? r.texSubImage2D(
|
| 2017 |
+
r.TEXTURE_2D,
|
| 2018 |
+
0,
|
| 2019 |
+
0,
|
| 2020 |
+
0,
|
| 2021 |
+
c,
|
| 2022 |
+
u,
|
| 2023 |
+
e.format,
|
| 2024 |
+
e.type,
|
| 2025 |
+
t.resource
|
| 2026 |
+
) : r.texSubImage2D(
|
| 2027 |
+
r.TEXTURE_2D,
|
| 2028 |
+
0,
|
| 2029 |
+
0,
|
| 2030 |
+
0,
|
| 2031 |
+
e.format,
|
| 2032 |
+
e.type,
|
| 2033 |
+
t.resource
|
| 2034 |
+
)) : n === a && i === o ? r.texSubImage2D(
|
| 2035 |
+
r.TEXTURE_2D,
|
| 2036 |
+
0,
|
| 2037 |
+
0,
|
| 2038 |
+
0,
|
| 2039 |
+
e.format,
|
| 2040 |
+
e.type,
|
| 2041 |
+
t.resource
|
| 2042 |
+
) : s === 2 ? r.texImage2D(
|
| 2043 |
+
e.target,
|
| 2044 |
+
0,
|
| 2045 |
+
e.internalFormat,
|
| 2046 |
+
a,
|
| 2047 |
+
o,
|
| 2048 |
+
0,
|
| 2049 |
+
e.format,
|
| 2050 |
+
e.type,
|
| 2051 |
+
t.resource
|
| 2052 |
+
) : r.texImage2D(
|
| 2053 |
+
e.target,
|
| 2054 |
+
0,
|
| 2055 |
+
e.internalFormat,
|
| 2056 |
+
e.format,
|
| 2057 |
+
e.type,
|
| 2058 |
+
t.resource
|
| 2059 |
+
), e.width = a, e.height = o;
|
| 2060 |
+
}
|
| 2061 |
+
}, Tt = {
|
| 2062 |
+
id: "video",
|
| 2063 |
+
upload(t, e, r, s) {
|
| 2064 |
+
if (!t.isValid) {
|
| 2065 |
+
r.texImage2D(
|
| 2066 |
+
e.target,
|
| 2067 |
+
0,
|
| 2068 |
+
e.internalFormat,
|
| 2069 |
+
1,
|
| 2070 |
+
1,
|
| 2071 |
+
0,
|
| 2072 |
+
e.format,
|
| 2073 |
+
e.type,
|
| 2074 |
+
null
|
| 2075 |
+
);
|
| 2076 |
+
return;
|
| 2077 |
+
}
|
| 2078 |
+
be.upload(t, e, r, s);
|
| 2079 |
+
}
|
| 2080 |
+
}, W = {
|
| 2081 |
+
linear: 9729,
|
| 2082 |
+
nearest: 9728
|
| 2083 |
+
}, vt = {
|
| 2084 |
+
linear: {
|
| 2085 |
+
linear: 9987,
|
| 2086 |
+
nearest: 9985
|
| 2087 |
+
},
|
| 2088 |
+
nearest: {
|
| 2089 |
+
linear: 9986,
|
| 2090 |
+
nearest: 9984
|
| 2091 |
+
}
|
| 2092 |
+
}, I = {
|
| 2093 |
+
"clamp-to-edge": 33071,
|
| 2094 |
+
repeat: 10497,
|
| 2095 |
+
"mirror-repeat": 33648
|
| 2096 |
+
}, Bt = {
|
| 2097 |
+
never: 512,
|
| 2098 |
+
less: 513,
|
| 2099 |
+
equal: 514,
|
| 2100 |
+
"less-equal": 515,
|
| 2101 |
+
greater: 516,
|
| 2102 |
+
"not-equal": 517,
|
| 2103 |
+
"greater-equal": 518,
|
| 2104 |
+
always: 519
|
| 2105 |
+
};
|
| 2106 |
+
function j(t, e, r, s, n, i, a, o) {
|
| 2107 |
+
const c = i;
|
| 2108 |
+
if (!o || t.addressModeU !== "repeat" || t.addressModeV !== "repeat" || t.addressModeW !== "repeat") {
|
| 2109 |
+
const u = I[a ? "clamp-to-edge" : t.addressModeU], _ = I[a ? "clamp-to-edge" : t.addressModeV], f = I[a ? "clamp-to-edge" : t.addressModeW];
|
| 2110 |
+
e[n](c, e.TEXTURE_WRAP_S, u), e[n](c, e.TEXTURE_WRAP_T, _), e.TEXTURE_WRAP_R && e[n](c, e.TEXTURE_WRAP_R, f);
|
| 2111 |
+
}
|
| 2112 |
+
if ((!o || t.magFilter !== "linear") && e[n](c, e.TEXTURE_MAG_FILTER, W[t.magFilter]), r) {
|
| 2113 |
+
if (!o || t.mipmapFilter !== "linear") {
|
| 2114 |
+
const u = vt[t.minFilter][t.mipmapFilter];
|
| 2115 |
+
e[n](c, e.TEXTURE_MIN_FILTER, u);
|
| 2116 |
+
}
|
| 2117 |
+
} else
|
| 2118 |
+
e[n](c, e.TEXTURE_MIN_FILTER, W[t.minFilter]);
|
| 2119 |
+
if (s && t.maxAnisotropy > 1) {
|
| 2120 |
+
const u = Math.min(t.maxAnisotropy, e.getParameter(s.MAX_TEXTURE_MAX_ANISOTROPY_EXT));
|
| 2121 |
+
e[n](c, s.TEXTURE_MAX_ANISOTROPY_EXT, u);
|
| 2122 |
+
}
|
| 2123 |
+
t.compare && e[n](c, e.TEXTURE_COMPARE_FUNC, Bt[t.compare]);
|
| 2124 |
+
}
|
| 2125 |
+
function At(t) {
|
| 2126 |
+
return {
|
| 2127 |
+
// 8-bit formats
|
| 2128 |
+
r8unorm: t.RED,
|
| 2129 |
+
r8snorm: t.RED,
|
| 2130 |
+
r8uint: t.RED,
|
| 2131 |
+
r8sint: t.RED,
|
| 2132 |
+
// 16-bit formats
|
| 2133 |
+
r16uint: t.RED,
|
| 2134 |
+
r16sint: t.RED,
|
| 2135 |
+
r16float: t.RED,
|
| 2136 |
+
rg8unorm: t.RG,
|
| 2137 |
+
rg8snorm: t.RG,
|
| 2138 |
+
rg8uint: t.RG,
|
| 2139 |
+
rg8sint: t.RG,
|
| 2140 |
+
// 32-bit formats
|
| 2141 |
+
r32uint: t.RED,
|
| 2142 |
+
r32sint: t.RED,
|
| 2143 |
+
r32float: t.RED,
|
| 2144 |
+
rg16uint: t.RG,
|
| 2145 |
+
rg16sint: t.RG,
|
| 2146 |
+
rg16float: t.RG,
|
| 2147 |
+
rgba8unorm: t.RGBA,
|
| 2148 |
+
"rgba8unorm-srgb": t.RGBA,
|
| 2149 |
+
// Packed 32-bit formats
|
| 2150 |
+
rgba8snorm: t.RGBA,
|
| 2151 |
+
rgba8uint: t.RGBA,
|
| 2152 |
+
rgba8sint: t.RGBA,
|
| 2153 |
+
bgra8unorm: t.RGBA,
|
| 2154 |
+
"bgra8unorm-srgb": t.RGBA,
|
| 2155 |
+
rgb9e5ufloat: t.RGB,
|
| 2156 |
+
rgb10a2unorm: t.RGBA,
|
| 2157 |
+
rg11b10ufloat: t.RGB,
|
| 2158 |
+
// 64-bit formats
|
| 2159 |
+
rg32uint: t.RG,
|
| 2160 |
+
rg32sint: t.RG,
|
| 2161 |
+
rg32float: t.RG,
|
| 2162 |
+
rgba16uint: t.RGBA,
|
| 2163 |
+
rgba16sint: t.RGBA,
|
| 2164 |
+
rgba16float: t.RGBA,
|
| 2165 |
+
// 128-bit formats
|
| 2166 |
+
rgba32uint: t.RGBA,
|
| 2167 |
+
rgba32sint: t.RGBA,
|
| 2168 |
+
rgba32float: t.RGBA,
|
| 2169 |
+
// Depth/stencil formats
|
| 2170 |
+
stencil8: t.STENCIL_INDEX8,
|
| 2171 |
+
depth16unorm: t.DEPTH_COMPONENT,
|
| 2172 |
+
depth24plus: t.DEPTH_COMPONENT,
|
| 2173 |
+
"depth24plus-stencil8": t.DEPTH_STENCIL,
|
| 2174 |
+
depth32float: t.DEPTH_COMPONENT,
|
| 2175 |
+
"depth32float-stencil8": t.DEPTH_STENCIL
|
| 2176 |
+
};
|
| 2177 |
+
}
|
| 2178 |
+
function Nt(t, e) {
|
| 2179 |
+
let r = {}, s = t.RGBA;
|
| 2180 |
+
return t instanceof S.get().getWebGLRenderingContext() ? e.srgb && (r = {
|
| 2181 |
+
"rgba8unorm-srgb": e.srgb.SRGB8_ALPHA8_EXT,
|
| 2182 |
+
"bgra8unorm-srgb": e.srgb.SRGB8_ALPHA8_EXT
|
| 2183 |
+
}) : (r = {
|
| 2184 |
+
"rgba8unorm-srgb": t.SRGB8_ALPHA8,
|
| 2185 |
+
"bgra8unorm-srgb": t.SRGB8_ALPHA8
|
| 2186 |
+
}, s = t.RGBA8), {
|
| 2187 |
+
// 8-bit formats
|
| 2188 |
+
r8unorm: t.R8,
|
| 2189 |
+
r8snorm: t.R8_SNORM,
|
| 2190 |
+
r8uint: t.R8UI,
|
| 2191 |
+
r8sint: t.R8I,
|
| 2192 |
+
// 16-bit formats
|
| 2193 |
+
r16uint: t.R16UI,
|
| 2194 |
+
r16sint: t.R16I,
|
| 2195 |
+
r16float: t.R16F,
|
| 2196 |
+
rg8unorm: t.RG8,
|
| 2197 |
+
rg8snorm: t.RG8_SNORM,
|
| 2198 |
+
rg8uint: t.RG8UI,
|
| 2199 |
+
rg8sint: t.RG8I,
|
| 2200 |
+
// 32-bit formats
|
| 2201 |
+
r32uint: t.R32UI,
|
| 2202 |
+
r32sint: t.R32I,
|
| 2203 |
+
r32float: t.R32F,
|
| 2204 |
+
rg16uint: t.RG16UI,
|
| 2205 |
+
rg16sint: t.RG16I,
|
| 2206 |
+
rg16float: t.RG16F,
|
| 2207 |
+
rgba8unorm: t.RGBA,
|
| 2208 |
+
...r,
|
| 2209 |
+
// Packed 32-bit formats
|
| 2210 |
+
rgba8snorm: t.RGBA8_SNORM,
|
| 2211 |
+
rgba8uint: t.RGBA8UI,
|
| 2212 |
+
rgba8sint: t.RGBA8I,
|
| 2213 |
+
bgra8unorm: s,
|
| 2214 |
+
rgb9e5ufloat: t.RGB9_E5,
|
| 2215 |
+
rgb10a2unorm: t.RGB10_A2,
|
| 2216 |
+
rg11b10ufloat: t.R11F_G11F_B10F,
|
| 2217 |
+
// 64-bit formats
|
| 2218 |
+
rg32uint: t.RG32UI,
|
| 2219 |
+
rg32sint: t.RG32I,
|
| 2220 |
+
rg32float: t.RG32F,
|
| 2221 |
+
rgba16uint: t.RGBA16UI,
|
| 2222 |
+
rgba16sint: t.RGBA16I,
|
| 2223 |
+
rgba16float: t.RGBA16F,
|
| 2224 |
+
// 128-bit formats
|
| 2225 |
+
rgba32uint: t.RGBA32UI,
|
| 2226 |
+
rgba32sint: t.RGBA32I,
|
| 2227 |
+
rgba32float: t.RGBA32F,
|
| 2228 |
+
// Depth/stencil formats
|
| 2229 |
+
stencil8: t.STENCIL_INDEX8,
|
| 2230 |
+
depth16unorm: t.DEPTH_COMPONENT16,
|
| 2231 |
+
depth24plus: t.DEPTH_COMPONENT24,
|
| 2232 |
+
"depth24plus-stencil8": t.DEPTH24_STENCIL8,
|
| 2233 |
+
depth32float: t.DEPTH_COMPONENT32F,
|
| 2234 |
+
"depth32float-stencil8": t.DEPTH32F_STENCIL8,
|
| 2235 |
+
// Compressed formats
|
| 2236 |
+
...e.s3tc ? {
|
| 2237 |
+
"bc1-rgba-unorm": e.s3tc.COMPRESSED_RGBA_S3TC_DXT1_EXT,
|
| 2238 |
+
"bc2-rgba-unorm": e.s3tc.COMPRESSED_RGBA_S3TC_DXT3_EXT,
|
| 2239 |
+
"bc3-rgba-unorm": e.s3tc.COMPRESSED_RGBA_S3TC_DXT5_EXT
|
| 2240 |
+
} : {},
|
| 2241 |
+
...e.s3tc_sRGB ? {
|
| 2242 |
+
"bc1-rgba-unorm-srgb": e.s3tc_sRGB.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,
|
| 2243 |
+
"bc2-rgba-unorm-srgb": e.s3tc_sRGB.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT,
|
| 2244 |
+
"bc3-rgba-unorm-srgb": e.s3tc_sRGB.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT
|
| 2245 |
+
} : {},
|
| 2246 |
+
...e.rgtc ? {
|
| 2247 |
+
"bc4-r-unorm": e.rgtc.COMPRESSED_RED_RGTC1_EXT,
|
| 2248 |
+
"bc4-r-snorm": e.rgtc.COMPRESSED_SIGNED_RED_RGTC1_EXT,
|
| 2249 |
+
"bc5-rg-unorm": e.rgtc.COMPRESSED_RED_GREEN_RGTC2_EXT,
|
| 2250 |
+
"bc5-rg-snorm": e.rgtc.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT
|
| 2251 |
+
} : {},
|
| 2252 |
+
...e.bptc ? {
|
| 2253 |
+
"bc6h-rgb-float": e.bptc.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT,
|
| 2254 |
+
"bc6h-rgb-ufloat": e.bptc.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT,
|
| 2255 |
+
"bc7-rgba-unorm": e.bptc.COMPRESSED_RGBA_BPTC_UNORM_EXT,
|
| 2256 |
+
"bc7-rgba-unorm-srgb": e.bptc.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT
|
| 2257 |
+
} : {},
|
| 2258 |
+
...e.etc ? {
|
| 2259 |
+
"etc2-rgb8unorm": e.etc.COMPRESSED_RGB8_ETC2,
|
| 2260 |
+
"etc2-rgb8unorm-srgb": e.etc.COMPRESSED_SRGB8_ETC2,
|
| 2261 |
+
"etc2-rgb8a1unorm": e.etc.COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,
|
| 2262 |
+
"etc2-rgb8a1unorm-srgb": e.etc.COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2,
|
| 2263 |
+
"etc2-rgba8unorm": e.etc.COMPRESSED_RGBA8_ETC2_EAC,
|
| 2264 |
+
"etc2-rgba8unorm-srgb": e.etc.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,
|
| 2265 |
+
"eac-r11unorm": e.etc.COMPRESSED_R11_EAC,
|
| 2266 |
+
// 'eac-r11snorm'
|
| 2267 |
+
"eac-rg11unorm": e.etc.COMPRESSED_SIGNED_RG11_EAC
|
| 2268 |
+
// 'eac-rg11snorm'
|
| 2269 |
+
} : {},
|
| 2270 |
+
...e.astc ? {
|
| 2271 |
+
"astc-4x4-unorm": e.astc.COMPRESSED_RGBA_ASTC_4x4_KHR,
|
| 2272 |
+
"astc-4x4-unorm-srgb": e.astc.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR,
|
| 2273 |
+
"astc-5x4-unorm": e.astc.COMPRESSED_RGBA_ASTC_5x4_KHR,
|
| 2274 |
+
"astc-5x4-unorm-srgb": e.astc.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR,
|
| 2275 |
+
"astc-5x5-unorm": e.astc.COMPRESSED_RGBA_ASTC_5x5_KHR,
|
| 2276 |
+
"astc-5x5-unorm-srgb": e.astc.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR,
|
| 2277 |
+
"astc-6x5-unorm": e.astc.COMPRESSED_RGBA_ASTC_6x5_KHR,
|
| 2278 |
+
"astc-6x5-unorm-srgb": e.astc.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR,
|
| 2279 |
+
"astc-6x6-unorm": e.astc.COMPRESSED_RGBA_ASTC_6x6_KHR,
|
| 2280 |
+
"astc-6x6-unorm-srgb": e.astc.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR,
|
| 2281 |
+
"astc-8x5-unorm": e.astc.COMPRESSED_RGBA_ASTC_8x5_KHR,
|
| 2282 |
+
"astc-8x5-unorm-srgb": e.astc.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR,
|
| 2283 |
+
"astc-8x6-unorm": e.astc.COMPRESSED_RGBA_ASTC_8x6_KHR,
|
| 2284 |
+
"astc-8x6-unorm-srgb": e.astc.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR,
|
| 2285 |
+
"astc-8x8-unorm": e.astc.COMPRESSED_RGBA_ASTC_8x8_KHR,
|
| 2286 |
+
"astc-8x8-unorm-srgb": e.astc.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR,
|
| 2287 |
+
"astc-10x5-unorm": e.astc.COMPRESSED_RGBA_ASTC_10x5_KHR,
|
| 2288 |
+
"astc-10x5-unorm-srgb": e.astc.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR,
|
| 2289 |
+
"astc-10x6-unorm": e.astc.COMPRESSED_RGBA_ASTC_10x6_KHR,
|
| 2290 |
+
"astc-10x6-unorm-srgb": e.astc.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR,
|
| 2291 |
+
"astc-10x8-unorm": e.astc.COMPRESSED_RGBA_ASTC_10x8_KHR,
|
| 2292 |
+
"astc-10x8-unorm-srgb": e.astc.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR,
|
| 2293 |
+
"astc-10x10-unorm": e.astc.COMPRESSED_RGBA_ASTC_10x10_KHR,
|
| 2294 |
+
"astc-10x10-unorm-srgb": e.astc.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR,
|
| 2295 |
+
"astc-12x10-unorm": e.astc.COMPRESSED_RGBA_ASTC_12x10_KHR,
|
| 2296 |
+
"astc-12x10-unorm-srgb": e.astc.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR,
|
| 2297 |
+
"astc-12x12-unorm": e.astc.COMPRESSED_RGBA_ASTC_12x12_KHR,
|
| 2298 |
+
"astc-12x12-unorm-srgb": e.astc.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR
|
| 2299 |
+
} : {}
|
| 2300 |
+
};
|
| 2301 |
+
}
|
| 2302 |
+
function yt(t) {
|
| 2303 |
+
return {
|
| 2304 |
+
// 8-bit formats
|
| 2305 |
+
r8unorm: t.UNSIGNED_BYTE,
|
| 2306 |
+
r8snorm: t.BYTE,
|
| 2307 |
+
r8uint: t.UNSIGNED_BYTE,
|
| 2308 |
+
r8sint: t.BYTE,
|
| 2309 |
+
// 16-bit formats
|
| 2310 |
+
r16uint: t.UNSIGNED_SHORT,
|
| 2311 |
+
r16sint: t.SHORT,
|
| 2312 |
+
r16float: t.HALF_FLOAT,
|
| 2313 |
+
rg8unorm: t.UNSIGNED_BYTE,
|
| 2314 |
+
rg8snorm: t.BYTE,
|
| 2315 |
+
rg8uint: t.UNSIGNED_BYTE,
|
| 2316 |
+
rg8sint: t.BYTE,
|
| 2317 |
+
// 32-bit formats
|
| 2318 |
+
r32uint: t.UNSIGNED_INT,
|
| 2319 |
+
r32sint: t.INT,
|
| 2320 |
+
r32float: t.FLOAT,
|
| 2321 |
+
rg16uint: t.UNSIGNED_SHORT,
|
| 2322 |
+
rg16sint: t.SHORT,
|
| 2323 |
+
rg16float: t.HALF_FLOAT,
|
| 2324 |
+
rgba8unorm: t.UNSIGNED_BYTE,
|
| 2325 |
+
"rgba8unorm-srgb": t.UNSIGNED_BYTE,
|
| 2326 |
+
// Packed 32-bit formats
|
| 2327 |
+
rgba8snorm: t.BYTE,
|
| 2328 |
+
rgba8uint: t.UNSIGNED_BYTE,
|
| 2329 |
+
rgba8sint: t.BYTE,
|
| 2330 |
+
bgra8unorm: t.UNSIGNED_BYTE,
|
| 2331 |
+
"bgra8unorm-srgb": t.UNSIGNED_BYTE,
|
| 2332 |
+
rgb9e5ufloat: t.UNSIGNED_INT_5_9_9_9_REV,
|
| 2333 |
+
rgb10a2unorm: t.UNSIGNED_INT_2_10_10_10_REV,
|
| 2334 |
+
rg11b10ufloat: t.UNSIGNED_INT_10F_11F_11F_REV,
|
| 2335 |
+
// 64-bit formats
|
| 2336 |
+
rg32uint: t.UNSIGNED_INT,
|
| 2337 |
+
rg32sint: t.INT,
|
| 2338 |
+
rg32float: t.FLOAT,
|
| 2339 |
+
rgba16uint: t.UNSIGNED_SHORT,
|
| 2340 |
+
rgba16sint: t.SHORT,
|
| 2341 |
+
rgba16float: t.HALF_FLOAT,
|
| 2342 |
+
// 128-bit formats
|
| 2343 |
+
rgba32uint: t.UNSIGNED_INT,
|
| 2344 |
+
rgba32sint: t.INT,
|
| 2345 |
+
rgba32float: t.FLOAT,
|
| 2346 |
+
// Depth/stencil formats
|
| 2347 |
+
stencil8: t.UNSIGNED_BYTE,
|
| 2348 |
+
depth16unorm: t.UNSIGNED_SHORT,
|
| 2349 |
+
depth24plus: t.UNSIGNED_INT,
|
| 2350 |
+
"depth24plus-stencil8": t.UNSIGNED_INT_24_8,
|
| 2351 |
+
depth32float: t.FLOAT,
|
| 2352 |
+
"depth32float-stencil8": t.FLOAT_32_UNSIGNED_INT_24_8_REV
|
| 2353 |
+
};
|
| 2354 |
+
}
|
| 2355 |
+
const Ct = 4;
|
| 2356 |
+
class Se {
|
| 2357 |
+
constructor(e) {
|
| 2358 |
+
this.managedTextures = [], this._glTextures = /* @__PURE__ */ Object.create(null), this._glSamplers = /* @__PURE__ */ Object.create(null), this._boundTextures = [], this._activeTextureLocation = -1, this._boundSamplers = /* @__PURE__ */ Object.create(null), this._uploads = {
|
| 2359 |
+
image: be,
|
| 2360 |
+
buffer: gt,
|
| 2361 |
+
video: Tt,
|
| 2362 |
+
compressed: xt
|
| 2363 |
+
}, this._premultiplyAlpha = !1, this._useSeparateSamplers = !1, this._renderer = e, this._renderer.renderableGC.addManagedHash(this, "_glTextures"), this._renderer.renderableGC.addManagedHash(this, "_glSamplers");
|
| 2364 |
+
}
|
| 2365 |
+
contextChange(e) {
|
| 2366 |
+
this._gl = e, this._mapFormatToInternalFormat || (this._mapFormatToInternalFormat = Nt(e, this._renderer.context.extensions), this._mapFormatToType = yt(e), this._mapFormatToFormat = At(e)), this._glTextures = /* @__PURE__ */ Object.create(null), this._glSamplers = /* @__PURE__ */ Object.create(null), this._boundSamplers = /* @__PURE__ */ Object.create(null), this._premultiplyAlpha = !1;
|
| 2367 |
+
for (let r = 0; r < 16; r++)
|
| 2368 |
+
this.bind(b.EMPTY, r);
|
| 2369 |
+
}
|
| 2370 |
+
/**
|
| 2371 |
+
* Initializes a texture source, if it has already been initialized nothing will happen.
|
| 2372 |
+
* @param source - The texture source to initialize.
|
| 2373 |
+
* @returns The initialized texture source.
|
| 2374 |
+
*/
|
| 2375 |
+
initSource(e) {
|
| 2376 |
+
this.bind(e);
|
| 2377 |
+
}
|
| 2378 |
+
bind(e, r = 0) {
|
| 2379 |
+
const s = e.source;
|
| 2380 |
+
e ? (this.bindSource(s, r), this._useSeparateSamplers && this._bindSampler(s.style, r)) : (this.bindSource(null, r), this._useSeparateSamplers && this._bindSampler(null, r));
|
| 2381 |
+
}
|
| 2382 |
+
bindSource(e, r = 0) {
|
| 2383 |
+
const s = this._gl;
|
| 2384 |
+
if (e._touched = this._renderer.textureGC.count, this._boundTextures[r] !== e) {
|
| 2385 |
+
this._boundTextures[r] = e, this._activateLocation(r), e || (e = b.EMPTY.source);
|
| 2386 |
+
const n = this.getGlSource(e);
|
| 2387 |
+
s.bindTexture(n.target, n.texture);
|
| 2388 |
+
}
|
| 2389 |
+
}
|
| 2390 |
+
_bindSampler(e, r = 0) {
|
| 2391 |
+
const s = this._gl;
|
| 2392 |
+
if (!e) {
|
| 2393 |
+
this._boundSamplers[r] = null, s.bindSampler(r, null);
|
| 2394 |
+
return;
|
| 2395 |
+
}
|
| 2396 |
+
const n = this._getGlSampler(e);
|
| 2397 |
+
this._boundSamplers[r] !== n && (this._boundSamplers[r] = n, s.bindSampler(r, n));
|
| 2398 |
+
}
|
| 2399 |
+
unbind(e) {
|
| 2400 |
+
const r = e.source, s = this._boundTextures, n = this._gl;
|
| 2401 |
+
for (let i = 0; i < s.length; i++)
|
| 2402 |
+
if (s[i] === r) {
|
| 2403 |
+
this._activateLocation(i);
|
| 2404 |
+
const a = this.getGlSource(r);
|
| 2405 |
+
n.bindTexture(a.target, null), s[i] = null;
|
| 2406 |
+
}
|
| 2407 |
+
}
|
| 2408 |
+
_activateLocation(e) {
|
| 2409 |
+
this._activeTextureLocation !== e && (this._activeTextureLocation = e, this._gl.activeTexture(this._gl.TEXTURE0 + e));
|
| 2410 |
+
}
|
| 2411 |
+
_initSource(e) {
|
| 2412 |
+
const r = this._gl, s = new pt(r.createTexture());
|
| 2413 |
+
if (s.type = this._mapFormatToType[e.format], s.internalFormat = this._mapFormatToInternalFormat[e.format], s.format = this._mapFormatToFormat[e.format], e.autoGenerateMipmaps && (this._renderer.context.supports.nonPowOf2mipmaps || e.isPowerOfTwo)) {
|
| 2414 |
+
const n = Math.max(e.width, e.height);
|
| 2415 |
+
e.mipLevelCount = Math.floor(Math.log2(n)) + 1;
|
| 2416 |
+
}
|
| 2417 |
+
return this._glTextures[e.uid] = s, this.managedTextures.includes(e) || (e.on("update", this.onSourceUpdate, this), e.on("resize", this.onSourceUpdate, this), e.on("styleChange", this.onStyleChange, this), e.on("destroy", this.onSourceDestroy, this), e.on("unload", this.onSourceUnload, this), e.on("updateMipmaps", this.onUpdateMipmaps, this), this.managedTextures.push(e)), this.onSourceUpdate(e), this.updateStyle(e, !1), s;
|
| 2418 |
+
}
|
| 2419 |
+
onStyleChange(e) {
|
| 2420 |
+
this.updateStyle(e, !1);
|
| 2421 |
+
}
|
| 2422 |
+
updateStyle(e, r) {
|
| 2423 |
+
const s = this._gl, n = this.getGlSource(e);
|
| 2424 |
+
s.bindTexture(s.TEXTURE_2D, n.texture), this._boundTextures[this._activeTextureLocation] = e, j(
|
| 2425 |
+
e.style,
|
| 2426 |
+
s,
|
| 2427 |
+
e.mipLevelCount > 1,
|
| 2428 |
+
this._renderer.context.extensions.anisotropicFiltering,
|
| 2429 |
+
"texParameteri",
|
| 2430 |
+
s.TEXTURE_2D,
|
| 2431 |
+
// will force a clamp to edge if the texture is not a power of two
|
| 2432 |
+
!this._renderer.context.supports.nonPowOf2wrapping && !e.isPowerOfTwo,
|
| 2433 |
+
r
|
| 2434 |
+
);
|
| 2435 |
+
}
|
| 2436 |
+
onSourceUnload(e) {
|
| 2437 |
+
const r = this._glTextures[e.uid];
|
| 2438 |
+
r && (this.unbind(e), this._glTextures[e.uid] = null, this._gl.deleteTexture(r.texture));
|
| 2439 |
+
}
|
| 2440 |
+
onSourceUpdate(e) {
|
| 2441 |
+
const r = this._gl, s = this.getGlSource(e);
|
| 2442 |
+
r.bindTexture(r.TEXTURE_2D, s.texture), this._boundTextures[this._activeTextureLocation] = e;
|
| 2443 |
+
const n = e.alphaMode === "premultiply-alpha-on-upload";
|
| 2444 |
+
this._premultiplyAlpha !== n && (this._premultiplyAlpha = n, r.pixelStorei(r.UNPACK_PREMULTIPLY_ALPHA_WEBGL, n)), this._uploads[e.uploadMethodId] ? this._uploads[e.uploadMethodId].upload(e, s, r, this._renderer.context.webGLVersion) : r.texImage2D(r.TEXTURE_2D, 0, r.RGBA, e.pixelWidth, e.pixelHeight, 0, r.RGBA, r.UNSIGNED_BYTE, null), e.autoGenerateMipmaps && e.mipLevelCount > 1 && this.onUpdateMipmaps(e, !1);
|
| 2445 |
+
}
|
| 2446 |
+
onUpdateMipmaps(e, r = !0) {
|
| 2447 |
+
r && this.bindSource(e, 0);
|
| 2448 |
+
const s = this.getGlSource(e);
|
| 2449 |
+
this._gl.generateMipmap(s.target);
|
| 2450 |
+
}
|
| 2451 |
+
onSourceDestroy(e) {
|
| 2452 |
+
e.off("destroy", this.onSourceDestroy, this), e.off("update", this.onSourceUpdate, this), e.off("resize", this.onSourceUpdate, this), e.off("unload", this.onSourceUnload, this), e.off("styleChange", this.onStyleChange, this), e.off("updateMipmaps", this.onUpdateMipmaps, this), this.managedTextures.splice(this.managedTextures.indexOf(e), 1), this.onSourceUnload(e);
|
| 2453 |
+
}
|
| 2454 |
+
_initSampler(e) {
|
| 2455 |
+
const r = this._gl, s = this._gl.createSampler();
|
| 2456 |
+
return this._glSamplers[e._resourceId] = s, j(
|
| 2457 |
+
e,
|
| 2458 |
+
r,
|
| 2459 |
+
this._boundTextures[this._activeTextureLocation].mipLevelCount > 1,
|
| 2460 |
+
this._renderer.context.extensions.anisotropicFiltering,
|
| 2461 |
+
"samplerParameteri",
|
| 2462 |
+
s,
|
| 2463 |
+
!1,
|
| 2464 |
+
!0
|
| 2465 |
+
), this._glSamplers[e._resourceId];
|
| 2466 |
+
}
|
| 2467 |
+
_getGlSampler(e) {
|
| 2468 |
+
return this._glSamplers[e._resourceId] || this._initSampler(e);
|
| 2469 |
+
}
|
| 2470 |
+
getGlSource(e) {
|
| 2471 |
+
return this._glTextures[e.uid] || this._initSource(e);
|
| 2472 |
+
}
|
| 2473 |
+
generateCanvas(e) {
|
| 2474 |
+
const { pixels: r, width: s, height: n } = this.getPixels(e), i = S.get().createCanvas();
|
| 2475 |
+
i.width = s, i.height = n;
|
| 2476 |
+
const a = i.getContext("2d");
|
| 2477 |
+
if (a) {
|
| 2478 |
+
const o = a.createImageData(s, n);
|
| 2479 |
+
o.data.set(r), a.putImageData(o, 0, 0);
|
| 2480 |
+
}
|
| 2481 |
+
return i;
|
| 2482 |
+
}
|
| 2483 |
+
getPixels(e) {
|
| 2484 |
+
const r = e.source.resolution, s = e.frame, n = Math.max(Math.round(s.width * r), 1), i = Math.max(Math.round(s.height * r), 1), a = new Uint8Array(Ct * n * i), o = this._renderer, c = o.renderTarget.getRenderTarget(e), u = o.renderTarget.getGpuRenderTarget(c), _ = o.gl;
|
| 2485 |
+
return _.bindFramebuffer(_.FRAMEBUFFER, u.resolveTargetFramebuffer), _.readPixels(
|
| 2486 |
+
Math.round(s.x * r),
|
| 2487 |
+
Math.round(s.y * r),
|
| 2488 |
+
n,
|
| 2489 |
+
i,
|
| 2490 |
+
_.RGBA,
|
| 2491 |
+
_.UNSIGNED_BYTE,
|
| 2492 |
+
a
|
| 2493 |
+
), { pixels: new Uint8ClampedArray(a.buffer), width: n, height: i };
|
| 2494 |
+
}
|
| 2495 |
+
destroy() {
|
| 2496 |
+
this.managedTextures.slice().forEach((e) => this.onSourceDestroy(e)), this.managedTextures = null, this._glTextures = null, this._glSamplers = null, this._boundTextures = null, this._boundSamplers = null, this._mapFormatToInternalFormat = null, this._mapFormatToType = null, this._mapFormatToFormat = null, this._uploads = null, this._renderer = null;
|
| 2497 |
+
}
|
| 2498 |
+
resetState() {
|
| 2499 |
+
this._activeTextureLocation = -1, this._boundTextures.fill(b.EMPTY.source), this._boundSamplers = /* @__PURE__ */ Object.create(null);
|
| 2500 |
+
const e = this._gl;
|
| 2501 |
+
this._premultiplyAlpha = !1, e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL, this._premultiplyAlpha);
|
| 2502 |
+
}
|
| 2503 |
+
}
|
| 2504 |
+
Se.extension = {
|
| 2505 |
+
type: [
|
| 2506 |
+
d.WebGLSystem
|
| 2507 |
+
],
|
| 2508 |
+
name: "texture"
|
| 2509 |
+
};
|
| 2510 |
+
class pe {
|
| 2511 |
+
contextChange(e) {
|
| 2512 |
+
const r = new F({
|
| 2513 |
+
uColor: { value: new Float32Array([1, 1, 1, 1]), type: "vec4<f32>" },
|
| 2514 |
+
uTransformMatrix: { value: new z(), type: "mat3x3<f32>" },
|
| 2515 |
+
uRound: { value: 0, type: "f32" }
|
| 2516 |
+
}), s = e.limits.maxBatchableTextures, n = Y({
|
| 2517 |
+
name: "graphics",
|
| 2518 |
+
bits: [
|
| 2519 |
+
ye,
|
| 2520 |
+
Ce(s),
|
| 2521 |
+
Z,
|
| 2522 |
+
q
|
| 2523 |
+
]
|
| 2524 |
+
});
|
| 2525 |
+
this.shader = new U({
|
| 2526 |
+
glProgram: n,
|
| 2527 |
+
resources: {
|
| 2528 |
+
localUniforms: r,
|
| 2529 |
+
batchSamplers: Ie(s)
|
| 2530 |
+
}
|
| 2531 |
+
});
|
| 2532 |
+
}
|
| 2533 |
+
execute(e, r) {
|
| 2534 |
+
const s = r.context, n = s.customShader || this.shader, i = e.renderer, a = i.graphicsContext, {
|
| 2535 |
+
batcher: o,
|
| 2536 |
+
instructions: c
|
| 2537 |
+
} = a.getContextRenderData(s);
|
| 2538 |
+
n.groups[0] = i.globalUniforms.bindGroup, i.state.set(e.state), i.shader.bind(n), i.geometry.bind(o.geometry, n.glProgram);
|
| 2539 |
+
const u = c.instructions;
|
| 2540 |
+
for (let _ = 0; _ < c.instructionSize; _++) {
|
| 2541 |
+
const f = u[_];
|
| 2542 |
+
if (f.size) {
|
| 2543 |
+
for (let l = 0; l < f.textures.count; l++)
|
| 2544 |
+
i.texture.bind(f.textures.textures[l], l);
|
| 2545 |
+
i.geometry.draw(f.topology, f.size, f.start);
|
| 2546 |
+
}
|
| 2547 |
+
}
|
| 2548 |
+
}
|
| 2549 |
+
destroy() {
|
| 2550 |
+
this.shader.destroy(!0), this.shader = null;
|
| 2551 |
+
}
|
| 2552 |
+
}
|
| 2553 |
+
pe.extension = {
|
| 2554 |
+
type: [
|
| 2555 |
+
d.WebGLPipesAdaptor
|
| 2556 |
+
],
|
| 2557 |
+
name: "graphics"
|
| 2558 |
+
};
|
| 2559 |
+
class ge {
|
| 2560 |
+
init() {
|
| 2561 |
+
const e = Y({
|
| 2562 |
+
name: "mesh",
|
| 2563 |
+
bits: [
|
| 2564 |
+
Z,
|
| 2565 |
+
He,
|
| 2566 |
+
q
|
| 2567 |
+
]
|
| 2568 |
+
});
|
| 2569 |
+
this._shader = new U({
|
| 2570 |
+
glProgram: e,
|
| 2571 |
+
resources: {
|
| 2572 |
+
uTexture: b.EMPTY.source,
|
| 2573 |
+
textureUniforms: {
|
| 2574 |
+
uTextureMatrix: { type: "mat3x3<f32>", value: new z() }
|
| 2575 |
+
}
|
| 2576 |
+
}
|
| 2577 |
+
});
|
| 2578 |
+
}
|
| 2579 |
+
execute(e, r) {
|
| 2580 |
+
const s = e.renderer;
|
| 2581 |
+
let n = r._shader;
|
| 2582 |
+
if (n) {
|
| 2583 |
+
if (!n.glProgram) {
|
| 2584 |
+
m("Mesh shader has no glProgram", r.shader);
|
| 2585 |
+
return;
|
| 2586 |
+
}
|
| 2587 |
+
} else {
|
| 2588 |
+
n = this._shader;
|
| 2589 |
+
const i = r.texture, a = i.source;
|
| 2590 |
+
n.resources.uTexture = a, n.resources.uSampler = a.style, n.resources.textureUniforms.uniforms.uTextureMatrix = i.textureMatrix.mapCoord;
|
| 2591 |
+
}
|
| 2592 |
+
n.groups[100] = s.globalUniforms.bindGroup, n.groups[101] = e.localUniformsBindGroup, s.encoder.draw({
|
| 2593 |
+
geometry: r._geometry,
|
| 2594 |
+
shader: n,
|
| 2595 |
+
state: r.state
|
| 2596 |
+
});
|
| 2597 |
+
}
|
| 2598 |
+
destroy() {
|
| 2599 |
+
this._shader.destroy(!0), this._shader = null;
|
| 2600 |
+
}
|
| 2601 |
+
}
|
| 2602 |
+
ge.extension = {
|
| 2603 |
+
type: [
|
| 2604 |
+
d.WebGLPipesAdaptor
|
| 2605 |
+
],
|
| 2606 |
+
name: "mesh"
|
| 2607 |
+
};
|
| 2608 |
+
const It = [
|
| 2609 |
+
...we,
|
| 2610 |
+
_e,
|
| 2611 |
+
$e,
|
| 2612 |
+
Xe,
|
| 2613 |
+
oe,
|
| 2614 |
+
ee,
|
| 2615 |
+
Se,
|
| 2616 |
+
he,
|
| 2617 |
+
se,
|
| 2618 |
+
me,
|
| 2619 |
+
de,
|
| 2620 |
+
ae,
|
| 2621 |
+
St,
|
| 2622 |
+
ce,
|
| 2623 |
+
ie
|
| 2624 |
+
], Dt = [...Ve], Gt = [Q, ge, pe], Re = [], xe = [], Te = [];
|
| 2625 |
+
T.handleByNamedList(d.WebGLSystem, Re);
|
| 2626 |
+
T.handleByNamedList(d.WebGLPipes, xe);
|
| 2627 |
+
T.handleByNamedList(d.WebGLPipesAdaptor, Te);
|
| 2628 |
+
T.add(...It, ...Dt, ...Gt);
|
| 2629 |
+
class Pt extends De {
|
| 2630 |
+
constructor() {
|
| 2631 |
+
const e = {
|
| 2632 |
+
name: "webgl",
|
| 2633 |
+
type: Ge.WEBGL,
|
| 2634 |
+
systems: Re,
|
| 2635 |
+
renderPipes: xe,
|
| 2636 |
+
renderPipeAdaptors: Te
|
| 2637 |
+
};
|
| 2638 |
+
super(e);
|
| 2639 |
+
}
|
| 2640 |
+
}
|
| 2641 |
+
export {
|
| 2642 |
+
Pt as WebGLRenderer
|
| 2643 |
+
};
|
src/backend/gradio_polygonannotator/templates/component/WebGPURenderer-CLzW5yah.js
ADDED
|
@@ -0,0 +1,1655 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { g as E, E as p, f as ae, D as B, S as C, B as T, b as ue, c as L, d as M, w as v, h as y, i as ce, j as de, k as A, l as w, M as k, m as D, n as he, o as pe, p as H, q as z, s as R, A as le, R as fe, e as S } from "./Index-CzQ497_5.js";
|
| 2 |
+
import { S as F, l as ge, a as me } from "./colorToUniform-zJcCVLeu.js";
|
| 3 |
+
import { c as _e, u as be, U as ye, B as xe, G as Ge, e as Be, R as Se, t as Pe, S as Te, a as Ce } from "./SharedSystems-Cd96rNl9.js";
|
| 4 |
+
const x = F.for2d();
|
| 5 |
+
class O {
|
| 6 |
+
start(e, t, r) {
|
| 7 |
+
const s = e.renderer, i = s.encoder, n = r.gpuProgram;
|
| 8 |
+
this._shader = r, this._geometry = t, i.setGeometry(t, n), x.blendMode = "normal", s.pipeline.getPipeline(
|
| 9 |
+
t,
|
| 10 |
+
n,
|
| 11 |
+
x
|
| 12 |
+
);
|
| 13 |
+
const o = s.globalUniforms.bindGroup;
|
| 14 |
+
i.resetBindGroup(1), i.setBindGroup(0, o, n);
|
| 15 |
+
}
|
| 16 |
+
execute(e, t) {
|
| 17 |
+
const r = this._shader.gpuProgram, s = e.renderer, i = s.encoder;
|
| 18 |
+
if (!t.bindGroup) {
|
| 19 |
+
const u = t.textures;
|
| 20 |
+
t.bindGroup = E(
|
| 21 |
+
u.textures,
|
| 22 |
+
u.count,
|
| 23 |
+
s.limits.maxBatchableTextures
|
| 24 |
+
);
|
| 25 |
+
}
|
| 26 |
+
x.blendMode = t.blendMode;
|
| 27 |
+
const n = s.bindGroup.getBindGroup(
|
| 28 |
+
t.bindGroup,
|
| 29 |
+
r,
|
| 30 |
+
1
|
| 31 |
+
), o = s.pipeline.getPipeline(
|
| 32 |
+
this._geometry,
|
| 33 |
+
r,
|
| 34 |
+
x,
|
| 35 |
+
t.topology
|
| 36 |
+
);
|
| 37 |
+
t.bindGroup._touch(s.textureGC.count), i.setPipeline(o), i.renderPassEncoder.setBindGroup(1, n), i.renderPassEncoder.drawIndexed(t.size, 1, t.start);
|
| 38 |
+
}
|
| 39 |
+
}
|
| 40 |
+
O.extension = {
|
| 41 |
+
type: [
|
| 42 |
+
p.WebGPUPipesAdaptor
|
| 43 |
+
],
|
| 44 |
+
name: "batch"
|
| 45 |
+
};
|
| 46 |
+
class I {
|
| 47 |
+
constructor(e) {
|
| 48 |
+
this._hash = /* @__PURE__ */ Object.create(null), this._renderer = e, this._renderer.renderableGC.addManagedHash(this, "_hash");
|
| 49 |
+
}
|
| 50 |
+
contextChange(e) {
|
| 51 |
+
this._gpu = e;
|
| 52 |
+
}
|
| 53 |
+
getBindGroup(e, t, r) {
|
| 54 |
+
return e._updateKey(), this._hash[e._key] || this._createBindGroup(e, t, r);
|
| 55 |
+
}
|
| 56 |
+
_createBindGroup(e, t, r) {
|
| 57 |
+
const s = this._gpu.device, i = t.layout[r], n = [], o = this._renderer;
|
| 58 |
+
for (const l in i) {
|
| 59 |
+
const h = e.resources[l] ?? e.resources[i[l]];
|
| 60 |
+
let f;
|
| 61 |
+
if (h._resourceType === "uniformGroup") {
|
| 62 |
+
const d = h;
|
| 63 |
+
o.ubo.updateUniformGroup(d);
|
| 64 |
+
const _ = d.buffer;
|
| 65 |
+
f = {
|
| 66 |
+
buffer: o.buffer.getGPUBuffer(_),
|
| 67 |
+
offset: 0,
|
| 68 |
+
size: _.descriptor.size
|
| 69 |
+
};
|
| 70 |
+
} else if (h._resourceType === "buffer") {
|
| 71 |
+
const d = h;
|
| 72 |
+
f = {
|
| 73 |
+
buffer: o.buffer.getGPUBuffer(d),
|
| 74 |
+
offset: 0,
|
| 75 |
+
size: d.descriptor.size
|
| 76 |
+
};
|
| 77 |
+
} else if (h._resourceType === "bufferResource") {
|
| 78 |
+
const d = h;
|
| 79 |
+
f = {
|
| 80 |
+
buffer: o.buffer.getGPUBuffer(d.buffer),
|
| 81 |
+
offset: d.offset,
|
| 82 |
+
size: d.size
|
| 83 |
+
};
|
| 84 |
+
} else if (h._resourceType === "textureSampler") {
|
| 85 |
+
const d = h;
|
| 86 |
+
f = o.texture.getGpuSampler(d);
|
| 87 |
+
} else if (h._resourceType === "textureSource") {
|
| 88 |
+
const d = h;
|
| 89 |
+
f = o.texture.getGpuSource(d).createView({});
|
| 90 |
+
}
|
| 91 |
+
n.push({
|
| 92 |
+
binding: i[l],
|
| 93 |
+
resource: f
|
| 94 |
+
});
|
| 95 |
+
}
|
| 96 |
+
const u = o.shader.getProgramData(t).bindGroups[r], c = s.createBindGroup({
|
| 97 |
+
layout: u,
|
| 98 |
+
entries: n
|
| 99 |
+
});
|
| 100 |
+
return this._hash[e._key] = c, c;
|
| 101 |
+
}
|
| 102 |
+
destroy() {
|
| 103 |
+
for (const e of Object.keys(this._hash))
|
| 104 |
+
this._hash[e] = null;
|
| 105 |
+
this._hash = null, this._renderer = null;
|
| 106 |
+
}
|
| 107 |
+
}
|
| 108 |
+
I.extension = {
|
| 109 |
+
type: [
|
| 110 |
+
p.WebGPUSystem
|
| 111 |
+
],
|
| 112 |
+
name: "bindGroup"
|
| 113 |
+
};
|
| 114 |
+
class W {
|
| 115 |
+
constructor(e) {
|
| 116 |
+
this._gpuBuffers = /* @__PURE__ */ Object.create(null), this._managedBuffers = [], e.renderableGC.addManagedHash(this, "_gpuBuffers");
|
| 117 |
+
}
|
| 118 |
+
contextChange(e) {
|
| 119 |
+
this._gpu = e;
|
| 120 |
+
}
|
| 121 |
+
getGPUBuffer(e) {
|
| 122 |
+
return this._gpuBuffers[e.uid] || this.createGPUBuffer(e);
|
| 123 |
+
}
|
| 124 |
+
updateBuffer(e) {
|
| 125 |
+
const t = this._gpuBuffers[e.uid] || this.createGPUBuffer(e), r = e.data;
|
| 126 |
+
return e._updateID && r && (e._updateID = 0, this._gpu.device.queue.writeBuffer(
|
| 127 |
+
t,
|
| 128 |
+
0,
|
| 129 |
+
r.buffer,
|
| 130 |
+
0,
|
| 131 |
+
// round to the nearest 4 bytes
|
| 132 |
+
(e._updateSize || r.byteLength) + 3 & -4
|
| 133 |
+
)), t;
|
| 134 |
+
}
|
| 135 |
+
/** dispose all WebGL resources of all managed buffers */
|
| 136 |
+
destroyAll() {
|
| 137 |
+
for (const e in this._gpuBuffers)
|
| 138 |
+
this._gpuBuffers[e].destroy();
|
| 139 |
+
this._gpuBuffers = {};
|
| 140 |
+
}
|
| 141 |
+
createGPUBuffer(e) {
|
| 142 |
+
this._gpuBuffers[e.uid] || (e.on("update", this.updateBuffer, this), e.on("change", this.onBufferChange, this), e.on("destroy", this.onBufferDestroy, this), this._managedBuffers.push(e));
|
| 143 |
+
const t = this._gpu.device.createBuffer(e.descriptor);
|
| 144 |
+
return e._updateID = 0, e.data && (ae(e.data.buffer, t.getMappedRange()), t.unmap()), this._gpuBuffers[e.uid] = t, t;
|
| 145 |
+
}
|
| 146 |
+
onBufferChange(e) {
|
| 147 |
+
this._gpuBuffers[e.uid].destroy(), e._updateID = 0, this._gpuBuffers[e.uid] = this.createGPUBuffer(e);
|
| 148 |
+
}
|
| 149 |
+
/**
|
| 150 |
+
* Disposes buffer
|
| 151 |
+
* @param buffer - buffer with data
|
| 152 |
+
*/
|
| 153 |
+
onBufferDestroy(e) {
|
| 154 |
+
this._managedBuffers.splice(this._managedBuffers.indexOf(e), 1), this._destroyBuffer(e);
|
| 155 |
+
}
|
| 156 |
+
destroy() {
|
| 157 |
+
this._managedBuffers.forEach((e) => this._destroyBuffer(e)), this._managedBuffers = null, this._gpuBuffers = null;
|
| 158 |
+
}
|
| 159 |
+
_destroyBuffer(e) {
|
| 160 |
+
this._gpuBuffers[e.uid].destroy(), e.off("update", this.updateBuffer, this), e.off("change", this.onBufferChange, this), e.off("destroy", this.onBufferDestroy, this), this._gpuBuffers[e.uid] = null;
|
| 161 |
+
}
|
| 162 |
+
}
|
| 163 |
+
W.extension = {
|
| 164 |
+
type: [
|
| 165 |
+
p.WebGPUSystem
|
| 166 |
+
],
|
| 167 |
+
name: "buffer"
|
| 168 |
+
};
|
| 169 |
+
class ve {
|
| 170 |
+
constructor({ minUniformOffsetAlignment: e }) {
|
| 171 |
+
this._minUniformOffsetAlignment = 256, this.byteIndex = 0, this._minUniformOffsetAlignment = e, this.data = new Float32Array(65535);
|
| 172 |
+
}
|
| 173 |
+
clear() {
|
| 174 |
+
this.byteIndex = 0;
|
| 175 |
+
}
|
| 176 |
+
addEmptyGroup(e) {
|
| 177 |
+
if (e > this._minUniformOffsetAlignment / 4)
|
| 178 |
+
throw new Error(`UniformBufferBatch: array is too large: ${e * 4}`);
|
| 179 |
+
const t = this.byteIndex;
|
| 180 |
+
let r = t + e * 4;
|
| 181 |
+
if (r = Math.ceil(r / this._minUniformOffsetAlignment) * this._minUniformOffsetAlignment, r > this.data.length * 4)
|
| 182 |
+
throw new Error("UniformBufferBatch: ubo batch got too big");
|
| 183 |
+
return this.byteIndex = r, t;
|
| 184 |
+
}
|
| 185 |
+
addGroup(e) {
|
| 186 |
+
const t = this.addEmptyGroup(e.length);
|
| 187 |
+
for (let r = 0; r < e.length; r++)
|
| 188 |
+
this.data[t / 4 + r] = e[r];
|
| 189 |
+
return t;
|
| 190 |
+
}
|
| 191 |
+
destroy() {
|
| 192 |
+
this.data = null;
|
| 193 |
+
}
|
| 194 |
+
}
|
| 195 |
+
class V {
|
| 196 |
+
constructor(e) {
|
| 197 |
+
this._colorMaskCache = 15, this._renderer = e;
|
| 198 |
+
}
|
| 199 |
+
setMask(e) {
|
| 200 |
+
this._colorMaskCache !== e && (this._colorMaskCache = e, this._renderer.pipeline.setColorMask(e));
|
| 201 |
+
}
|
| 202 |
+
destroy() {
|
| 203 |
+
this._renderer = null, this._colorMaskCache = null;
|
| 204 |
+
}
|
| 205 |
+
}
|
| 206 |
+
V.extension = {
|
| 207 |
+
type: [
|
| 208 |
+
p.WebGPUSystem
|
| 209 |
+
],
|
| 210 |
+
name: "colorMask"
|
| 211 |
+
};
|
| 212 |
+
class U {
|
| 213 |
+
/**
|
| 214 |
+
* @param {WebGPURenderer} renderer - The renderer this System works for.
|
| 215 |
+
*/
|
| 216 |
+
constructor(e) {
|
| 217 |
+
this._renderer = e;
|
| 218 |
+
}
|
| 219 |
+
async init(e) {
|
| 220 |
+
return this._initPromise ? this._initPromise : (this._initPromise = (e.gpu ? Promise.resolve(e.gpu) : this._createDeviceAndAdaptor(e)).then((t) => {
|
| 221 |
+
this.gpu = t, this._renderer.runners.contextChange.emit(this.gpu);
|
| 222 |
+
}), this._initPromise);
|
| 223 |
+
}
|
| 224 |
+
/**
|
| 225 |
+
* Handle the context change event
|
| 226 |
+
* @param gpu
|
| 227 |
+
*/
|
| 228 |
+
contextChange(e) {
|
| 229 |
+
this._renderer.gpu = e;
|
| 230 |
+
}
|
| 231 |
+
/**
|
| 232 |
+
* Helper class to create a WebGL Context
|
| 233 |
+
* @param {object} options - An options object that gets passed in to the canvas element containing the
|
| 234 |
+
* context attributes
|
| 235 |
+
* @see https://developer.mozilla.org/en/docs/Web/API/HTMLCanvasElement/getContext
|
| 236 |
+
* @returns {WebGLRenderingContext} the WebGL context
|
| 237 |
+
*/
|
| 238 |
+
async _createDeviceAndAdaptor(e) {
|
| 239 |
+
const t = await B.get().getNavigator().gpu.requestAdapter({
|
| 240 |
+
powerPreference: e.powerPreference,
|
| 241 |
+
forceFallbackAdapter: e.forceFallbackAdapter
|
| 242 |
+
}), r = [
|
| 243 |
+
"texture-compression-bc",
|
| 244 |
+
"texture-compression-astc",
|
| 245 |
+
"texture-compression-etc2"
|
| 246 |
+
].filter((i) => t.features.has(i)), s = await t.requestDevice({
|
| 247 |
+
requiredFeatures: r
|
| 248 |
+
});
|
| 249 |
+
return { adapter: t, device: s };
|
| 250 |
+
}
|
| 251 |
+
destroy() {
|
| 252 |
+
this.gpu = null, this._renderer = null;
|
| 253 |
+
}
|
| 254 |
+
}
|
| 255 |
+
U.extension = {
|
| 256 |
+
type: [
|
| 257 |
+
p.WebGPUSystem
|
| 258 |
+
],
|
| 259 |
+
name: "device"
|
| 260 |
+
};
|
| 261 |
+
U.defaultOptions = {
|
| 262 |
+
/**
|
| 263 |
+
* {@link WebGPUOptions.powerPreference}
|
| 264 |
+
* @default default
|
| 265 |
+
*/
|
| 266 |
+
powerPreference: void 0,
|
| 267 |
+
/**
|
| 268 |
+
* Force the use of the fallback adapter
|
| 269 |
+
* @default false
|
| 270 |
+
*/
|
| 271 |
+
forceFallbackAdapter: !1
|
| 272 |
+
};
|
| 273 |
+
class N {
|
| 274 |
+
constructor(e) {
|
| 275 |
+
this._boundBindGroup = /* @__PURE__ */ Object.create(null), this._boundVertexBuffer = /* @__PURE__ */ Object.create(null), this._renderer = e;
|
| 276 |
+
}
|
| 277 |
+
renderStart() {
|
| 278 |
+
this.commandFinished = new Promise((e) => {
|
| 279 |
+
this._resolveCommandFinished = e;
|
| 280 |
+
}), this.commandEncoder = this._renderer.gpu.device.createCommandEncoder();
|
| 281 |
+
}
|
| 282 |
+
beginRenderPass(e) {
|
| 283 |
+
this.endRenderPass(), this._clearCache(), this.renderPassEncoder = this.commandEncoder.beginRenderPass(e.descriptor);
|
| 284 |
+
}
|
| 285 |
+
endRenderPass() {
|
| 286 |
+
this.renderPassEncoder && this.renderPassEncoder.end(), this.renderPassEncoder = null;
|
| 287 |
+
}
|
| 288 |
+
setViewport(e) {
|
| 289 |
+
this.renderPassEncoder.setViewport(e.x, e.y, e.width, e.height, 0, 1);
|
| 290 |
+
}
|
| 291 |
+
setPipelineFromGeometryProgramAndState(e, t, r, s) {
|
| 292 |
+
const i = this._renderer.pipeline.getPipeline(e, t, r, s);
|
| 293 |
+
this.setPipeline(i);
|
| 294 |
+
}
|
| 295 |
+
setPipeline(e) {
|
| 296 |
+
this._boundPipeline !== e && (this._boundPipeline = e, this.renderPassEncoder.setPipeline(e));
|
| 297 |
+
}
|
| 298 |
+
_setVertexBuffer(e, t) {
|
| 299 |
+
this._boundVertexBuffer[e] !== t && (this._boundVertexBuffer[e] = t, this.renderPassEncoder.setVertexBuffer(e, this._renderer.buffer.updateBuffer(t)));
|
| 300 |
+
}
|
| 301 |
+
_setIndexBuffer(e) {
|
| 302 |
+
if (this._boundIndexBuffer === e)
|
| 303 |
+
return;
|
| 304 |
+
this._boundIndexBuffer = e;
|
| 305 |
+
const t = e.data.BYTES_PER_ELEMENT === 2 ? "uint16" : "uint32";
|
| 306 |
+
this.renderPassEncoder.setIndexBuffer(this._renderer.buffer.updateBuffer(e), t);
|
| 307 |
+
}
|
| 308 |
+
resetBindGroup(e) {
|
| 309 |
+
this._boundBindGroup[e] = null;
|
| 310 |
+
}
|
| 311 |
+
setBindGroup(e, t, r) {
|
| 312 |
+
if (this._boundBindGroup[e] === t)
|
| 313 |
+
return;
|
| 314 |
+
this._boundBindGroup[e] = t, t._touch(this._renderer.textureGC.count);
|
| 315 |
+
const s = this._renderer.bindGroup.getBindGroup(t, r, e);
|
| 316 |
+
this.renderPassEncoder.setBindGroup(e, s);
|
| 317 |
+
}
|
| 318 |
+
setGeometry(e, t) {
|
| 319 |
+
const r = this._renderer.pipeline.getBufferNamesToBind(e, t);
|
| 320 |
+
for (const s in r)
|
| 321 |
+
this._setVertexBuffer(parseInt(s, 10), e.attributes[r[s]].buffer);
|
| 322 |
+
e.indexBuffer && this._setIndexBuffer(e.indexBuffer);
|
| 323 |
+
}
|
| 324 |
+
_setShaderBindGroups(e, t) {
|
| 325 |
+
for (const r in e.groups) {
|
| 326 |
+
const s = e.groups[r];
|
| 327 |
+
t || this._syncBindGroup(s), this.setBindGroup(r, s, e.gpuProgram);
|
| 328 |
+
}
|
| 329 |
+
}
|
| 330 |
+
_syncBindGroup(e) {
|
| 331 |
+
for (const t in e.resources) {
|
| 332 |
+
const r = e.resources[t];
|
| 333 |
+
r.isUniformGroup && this._renderer.ubo.updateUniformGroup(r);
|
| 334 |
+
}
|
| 335 |
+
}
|
| 336 |
+
draw(e) {
|
| 337 |
+
const { geometry: t, shader: r, state: s, topology: i, size: n, start: o, instanceCount: u, skipSync: c } = e;
|
| 338 |
+
this.setPipelineFromGeometryProgramAndState(t, r.gpuProgram, s, i), this.setGeometry(t, r.gpuProgram), this._setShaderBindGroups(r, c), t.indexBuffer ? this.renderPassEncoder.drawIndexed(
|
| 339 |
+
n || t.indexBuffer.data.length,
|
| 340 |
+
u ?? t.instanceCount,
|
| 341 |
+
o || 0
|
| 342 |
+
) : this.renderPassEncoder.draw(n || t.getSize(), u ?? t.instanceCount, o || 0);
|
| 343 |
+
}
|
| 344 |
+
finishRenderPass() {
|
| 345 |
+
this.renderPassEncoder && (this.renderPassEncoder.end(), this.renderPassEncoder = null);
|
| 346 |
+
}
|
| 347 |
+
postrender() {
|
| 348 |
+
this.finishRenderPass(), this._gpu.device.queue.submit([this.commandEncoder.finish()]), this._resolveCommandFinished(), this.commandEncoder = null;
|
| 349 |
+
}
|
| 350 |
+
// restores a render pass if finishRenderPass was called
|
| 351 |
+
// not optimised as really used for debugging!
|
| 352 |
+
// used when we want to stop drawing and log a texture..
|
| 353 |
+
restoreRenderPass() {
|
| 354 |
+
const e = this._renderer.renderTarget.adaptor.getDescriptor(
|
| 355 |
+
this._renderer.renderTarget.renderTarget,
|
| 356 |
+
!1,
|
| 357 |
+
[0, 0, 0, 1]
|
| 358 |
+
);
|
| 359 |
+
this.renderPassEncoder = this.commandEncoder.beginRenderPass(e);
|
| 360 |
+
const t = this._boundPipeline, r = { ...this._boundVertexBuffer }, s = this._boundIndexBuffer, i = { ...this._boundBindGroup };
|
| 361 |
+
this._clearCache();
|
| 362 |
+
const n = this._renderer.renderTarget.viewport;
|
| 363 |
+
this.renderPassEncoder.setViewport(n.x, n.y, n.width, n.height, 0, 1), this.setPipeline(t);
|
| 364 |
+
for (const o in r)
|
| 365 |
+
this._setVertexBuffer(o, r[o]);
|
| 366 |
+
for (const o in i)
|
| 367 |
+
this.setBindGroup(o, i[o], null);
|
| 368 |
+
this._setIndexBuffer(s);
|
| 369 |
+
}
|
| 370 |
+
_clearCache() {
|
| 371 |
+
for (let e = 0; e < 16; e++)
|
| 372 |
+
this._boundBindGroup[e] = null, this._boundVertexBuffer[e] = null;
|
| 373 |
+
this._boundIndexBuffer = null, this._boundPipeline = null;
|
| 374 |
+
}
|
| 375 |
+
destroy() {
|
| 376 |
+
this._renderer = null, this._gpu = null, this._boundBindGroup = null, this._boundVertexBuffer = null, this._boundIndexBuffer = null, this._boundPipeline = null;
|
| 377 |
+
}
|
| 378 |
+
contextChange(e) {
|
| 379 |
+
this._gpu = e;
|
| 380 |
+
}
|
| 381 |
+
}
|
| 382 |
+
N.extension = {
|
| 383 |
+
type: [p.WebGPUSystem],
|
| 384 |
+
name: "encoder",
|
| 385 |
+
priority: 1
|
| 386 |
+
};
|
| 387 |
+
class j {
|
| 388 |
+
constructor(e) {
|
| 389 |
+
this._renderer = e;
|
| 390 |
+
}
|
| 391 |
+
contextChange() {
|
| 392 |
+
this.maxTextures = this._renderer.device.gpu.device.limits.maxSampledTexturesPerShaderStage, this.maxBatchableTextures = this.maxTextures;
|
| 393 |
+
}
|
| 394 |
+
destroy() {
|
| 395 |
+
}
|
| 396 |
+
}
|
| 397 |
+
j.extension = {
|
| 398 |
+
type: [
|
| 399 |
+
p.WebGPUSystem
|
| 400 |
+
],
|
| 401 |
+
name: "limits"
|
| 402 |
+
};
|
| 403 |
+
class K {
|
| 404 |
+
constructor(e) {
|
| 405 |
+
this._renderTargetStencilState = /* @__PURE__ */ Object.create(null), this._renderer = e, e.renderTarget.onRenderTargetChange.add(this);
|
| 406 |
+
}
|
| 407 |
+
onRenderTargetChange(e) {
|
| 408 |
+
let t = this._renderTargetStencilState[e.uid];
|
| 409 |
+
t || (t = this._renderTargetStencilState[e.uid] = {
|
| 410 |
+
stencilMode: C.DISABLED,
|
| 411 |
+
stencilReference: 0
|
| 412 |
+
}), this._activeRenderTarget = e, this.setStencilMode(t.stencilMode, t.stencilReference);
|
| 413 |
+
}
|
| 414 |
+
setStencilMode(e, t) {
|
| 415 |
+
const r = this._renderTargetStencilState[this._activeRenderTarget.uid];
|
| 416 |
+
r.stencilMode = e, r.stencilReference = t;
|
| 417 |
+
const s = this._renderer;
|
| 418 |
+
s.pipeline.setStencilMode(e), s.encoder.renderPassEncoder.setStencilReference(t);
|
| 419 |
+
}
|
| 420 |
+
destroy() {
|
| 421 |
+
this._renderer.renderTarget.onRenderTargetChange.remove(this), this._renderer = null, this._activeRenderTarget = null, this._renderTargetStencilState = null;
|
| 422 |
+
}
|
| 423 |
+
}
|
| 424 |
+
K.extension = {
|
| 425 |
+
type: [
|
| 426 |
+
p.WebGPUSystem
|
| 427 |
+
],
|
| 428 |
+
name: "stencil"
|
| 429 |
+
};
|
| 430 |
+
const G = {
|
| 431 |
+
i32: { align: 4, size: 4 },
|
| 432 |
+
u32: { align: 4, size: 4 },
|
| 433 |
+
f32: { align: 4, size: 4 },
|
| 434 |
+
f16: { align: 2, size: 2 },
|
| 435 |
+
"vec2<i32>": { align: 8, size: 8 },
|
| 436 |
+
"vec2<u32>": { align: 8, size: 8 },
|
| 437 |
+
"vec2<f32>": { align: 8, size: 8 },
|
| 438 |
+
"vec2<f16>": { align: 4, size: 4 },
|
| 439 |
+
"vec3<i32>": { align: 16, size: 12 },
|
| 440 |
+
"vec3<u32>": { align: 16, size: 12 },
|
| 441 |
+
"vec3<f32>": { align: 16, size: 12 },
|
| 442 |
+
"vec3<f16>": { align: 8, size: 6 },
|
| 443 |
+
"vec4<i32>": { align: 16, size: 16 },
|
| 444 |
+
"vec4<u32>": { align: 16, size: 16 },
|
| 445 |
+
"vec4<f32>": { align: 16, size: 16 },
|
| 446 |
+
"vec4<f16>": { align: 8, size: 8 },
|
| 447 |
+
"mat2x2<f32>": { align: 8, size: 16 },
|
| 448 |
+
"mat2x2<f16>": { align: 4, size: 8 },
|
| 449 |
+
"mat3x2<f32>": { align: 8, size: 24 },
|
| 450 |
+
"mat3x2<f16>": { align: 4, size: 12 },
|
| 451 |
+
"mat4x2<f32>": { align: 8, size: 32 },
|
| 452 |
+
"mat4x2<f16>": { align: 4, size: 16 },
|
| 453 |
+
"mat2x3<f32>": { align: 16, size: 32 },
|
| 454 |
+
"mat2x3<f16>": { align: 8, size: 16 },
|
| 455 |
+
"mat3x3<f32>": { align: 16, size: 48 },
|
| 456 |
+
"mat3x3<f16>": { align: 8, size: 24 },
|
| 457 |
+
"mat4x3<f32>": { align: 16, size: 64 },
|
| 458 |
+
"mat4x3<f16>": { align: 8, size: 32 },
|
| 459 |
+
"mat2x4<f32>": { align: 16, size: 32 },
|
| 460 |
+
"mat2x4<f16>": { align: 8, size: 16 },
|
| 461 |
+
"mat3x4<f32>": { align: 16, size: 48 },
|
| 462 |
+
"mat3x4<f16>": { align: 8, size: 24 },
|
| 463 |
+
"mat4x4<f32>": { align: 16, size: 64 },
|
| 464 |
+
"mat4x4<f16>": { align: 8, size: 32 }
|
| 465 |
+
};
|
| 466 |
+
function Ue(a) {
|
| 467 |
+
const e = a.map((r) => ({
|
| 468 |
+
data: r,
|
| 469 |
+
offset: 0,
|
| 470 |
+
size: 0
|
| 471 |
+
}));
|
| 472 |
+
let t = 0;
|
| 473 |
+
for (let r = 0; r < e.length; r++) {
|
| 474 |
+
const s = e[r];
|
| 475 |
+
let i = G[s.data.type].size;
|
| 476 |
+
const n = G[s.data.type].align;
|
| 477 |
+
if (!G[s.data.type])
|
| 478 |
+
throw new Error(`[Pixi.js] WebGPU UniformBuffer: Unknown type ${s.data.type}`);
|
| 479 |
+
s.data.size > 1 && (i = Math.max(i, n) * s.data.size), t = Math.ceil(t / n) * n, s.size = i, s.offset = t, t += i;
|
| 480 |
+
}
|
| 481 |
+
return t = Math.ceil(t / 16) * 16, { uboElements: e, size: t };
|
| 482 |
+
}
|
| 483 |
+
function Me(a, e) {
|
| 484 |
+
const { size: t, align: r } = G[a.data.type], s = (r - t) / 4, i = a.data.type.indexOf("i32") >= 0 ? "dataInt32" : "data";
|
| 485 |
+
return `
|
| 486 |
+
v = uv.${a.data.name};
|
| 487 |
+
${e !== 0 ? `offset += ${e};` : ""}
|
| 488 |
+
|
| 489 |
+
arrayOffset = offset;
|
| 490 |
+
|
| 491 |
+
t = 0;
|
| 492 |
+
|
| 493 |
+
for(var i=0; i < ${a.data.size * (t / 4)}; i++)
|
| 494 |
+
{
|
| 495 |
+
for(var j = 0; j < ${t / 4}; j++)
|
| 496 |
+
{
|
| 497 |
+
${i}[arrayOffset++] = v[t++];
|
| 498 |
+
}
|
| 499 |
+
${s !== 0 ? `arrayOffset += ${s};` : ""}
|
| 500 |
+
}
|
| 501 |
+
`;
|
| 502 |
+
}
|
| 503 |
+
function we(a) {
|
| 504 |
+
return _e(
|
| 505 |
+
a,
|
| 506 |
+
"uboWgsl",
|
| 507 |
+
Me,
|
| 508 |
+
be
|
| 509 |
+
);
|
| 510 |
+
}
|
| 511 |
+
class q extends ye {
|
| 512 |
+
constructor() {
|
| 513 |
+
super({
|
| 514 |
+
createUboElements: Ue,
|
| 515 |
+
generateUboSync: we
|
| 516 |
+
});
|
| 517 |
+
}
|
| 518 |
+
}
|
| 519 |
+
q.extension = {
|
| 520 |
+
type: [p.WebGPUSystem],
|
| 521 |
+
name: "ubo"
|
| 522 |
+
};
|
| 523 |
+
const b = 128;
|
| 524 |
+
class Y {
|
| 525 |
+
constructor(e) {
|
| 526 |
+
this._bindGroupHash = /* @__PURE__ */ Object.create(null), this._buffers = [], this._bindGroups = [], this._bufferResources = [], this._renderer = e, this._renderer.renderableGC.addManagedHash(this, "_bindGroupHash"), this._batchBuffer = new ve({ minUniformOffsetAlignment: b });
|
| 527 |
+
const t = 256 / b;
|
| 528 |
+
for (let r = 0; r < t; r++) {
|
| 529 |
+
let s = T.UNIFORM | T.COPY_DST;
|
| 530 |
+
r === 0 && (s |= T.COPY_SRC), this._buffers.push(new ue({
|
| 531 |
+
data: this._batchBuffer.data,
|
| 532 |
+
usage: s
|
| 533 |
+
}));
|
| 534 |
+
}
|
| 535 |
+
}
|
| 536 |
+
renderEnd() {
|
| 537 |
+
this._uploadBindGroups(), this._resetBindGroups();
|
| 538 |
+
}
|
| 539 |
+
_resetBindGroups() {
|
| 540 |
+
for (const e in this._bindGroupHash)
|
| 541 |
+
this._bindGroupHash[e] = null;
|
| 542 |
+
this._batchBuffer.clear();
|
| 543 |
+
}
|
| 544 |
+
// just works for single bind groups for now
|
| 545 |
+
getUniformBindGroup(e, t) {
|
| 546 |
+
if (!t && this._bindGroupHash[e.uid])
|
| 547 |
+
return this._bindGroupHash[e.uid];
|
| 548 |
+
this._renderer.ubo.ensureUniformGroup(e);
|
| 549 |
+
const r = e.buffer.data, s = this._batchBuffer.addEmptyGroup(r.length);
|
| 550 |
+
return this._renderer.ubo.syncUniformGroup(e, this._batchBuffer.data, s / 4), this._bindGroupHash[e.uid] = this._getBindGroup(s / b), this._bindGroupHash[e.uid];
|
| 551 |
+
}
|
| 552 |
+
getUboResource(e) {
|
| 553 |
+
this._renderer.ubo.updateUniformGroup(e);
|
| 554 |
+
const t = e.buffer.data, r = this._batchBuffer.addGroup(t);
|
| 555 |
+
return this._getBufferResource(r / b);
|
| 556 |
+
}
|
| 557 |
+
getArrayBindGroup(e) {
|
| 558 |
+
const t = this._batchBuffer.addGroup(e);
|
| 559 |
+
return this._getBindGroup(t / b);
|
| 560 |
+
}
|
| 561 |
+
getArrayBufferResource(e) {
|
| 562 |
+
const r = this._batchBuffer.addGroup(e) / b;
|
| 563 |
+
return this._getBufferResource(r);
|
| 564 |
+
}
|
| 565 |
+
_getBufferResource(e) {
|
| 566 |
+
if (!this._bufferResources[e]) {
|
| 567 |
+
const t = this._buffers[e % 2];
|
| 568 |
+
this._bufferResources[e] = new xe({
|
| 569 |
+
buffer: t,
|
| 570 |
+
offset: (e / 2 | 0) * 256,
|
| 571 |
+
size: b
|
| 572 |
+
});
|
| 573 |
+
}
|
| 574 |
+
return this._bufferResources[e];
|
| 575 |
+
}
|
| 576 |
+
_getBindGroup(e) {
|
| 577 |
+
if (!this._bindGroups[e]) {
|
| 578 |
+
const t = new L({
|
| 579 |
+
0: this._getBufferResource(e)
|
| 580 |
+
});
|
| 581 |
+
this._bindGroups[e] = t;
|
| 582 |
+
}
|
| 583 |
+
return this._bindGroups[e];
|
| 584 |
+
}
|
| 585 |
+
_uploadBindGroups() {
|
| 586 |
+
const e = this._renderer.buffer, t = this._buffers[0];
|
| 587 |
+
t.update(this._batchBuffer.byteIndex), e.updateBuffer(t);
|
| 588 |
+
const r = this._renderer.gpu.device.createCommandEncoder();
|
| 589 |
+
for (let s = 1; s < this._buffers.length; s++) {
|
| 590 |
+
const i = this._buffers[s];
|
| 591 |
+
r.copyBufferToBuffer(
|
| 592 |
+
e.getGPUBuffer(t),
|
| 593 |
+
b,
|
| 594 |
+
e.getGPUBuffer(i),
|
| 595 |
+
0,
|
| 596 |
+
this._batchBuffer.byteIndex
|
| 597 |
+
);
|
| 598 |
+
}
|
| 599 |
+
this._renderer.gpu.device.queue.submit([r.finish()]);
|
| 600 |
+
}
|
| 601 |
+
destroy() {
|
| 602 |
+
var e;
|
| 603 |
+
for (let t = 0; t < this._bindGroups.length; t++)
|
| 604 |
+
(e = this._bindGroups[t]) == null || e.destroy();
|
| 605 |
+
this._bindGroups = null, this._bindGroupHash = null;
|
| 606 |
+
for (let t = 0; t < this._buffers.length; t++)
|
| 607 |
+
this._buffers[t].destroy();
|
| 608 |
+
this._buffers = null;
|
| 609 |
+
for (let t = 0; t < this._bufferResources.length; t++)
|
| 610 |
+
this._bufferResources[t].destroy();
|
| 611 |
+
this._bufferResources = null, this._batchBuffer.destroy(), this._bindGroupHash = null, this._renderer = null;
|
| 612 |
+
}
|
| 613 |
+
}
|
| 614 |
+
Y.extension = {
|
| 615 |
+
type: [
|
| 616 |
+
p.WebGPUPipes
|
| 617 |
+
],
|
| 618 |
+
name: "uniformBatch"
|
| 619 |
+
};
|
| 620 |
+
const Re = {
|
| 621 |
+
"point-list": 0,
|
| 622 |
+
"line-list": 1,
|
| 623 |
+
"line-strip": 2,
|
| 624 |
+
"triangle-list": 3,
|
| 625 |
+
"triangle-strip": 4
|
| 626 |
+
};
|
| 627 |
+
function Ee(a, e, t, r, s) {
|
| 628 |
+
return a << 24 | e << 16 | t << 10 | r << 5 | s;
|
| 629 |
+
}
|
| 630 |
+
function Le(a, e, t, r) {
|
| 631 |
+
return t << 6 | a << 3 | r << 1 | e;
|
| 632 |
+
}
|
| 633 |
+
class $ {
|
| 634 |
+
constructor(e) {
|
| 635 |
+
this._moduleCache = /* @__PURE__ */ Object.create(null), this._bufferLayoutsCache = /* @__PURE__ */ Object.create(null), this._bindingNamesCache = /* @__PURE__ */ Object.create(null), this._pipeCache = /* @__PURE__ */ Object.create(null), this._pipeStateCaches = /* @__PURE__ */ Object.create(null), this._colorMask = 15, this._multisampleCount = 1, this._renderer = e;
|
| 636 |
+
}
|
| 637 |
+
contextChange(e) {
|
| 638 |
+
this._gpu = e, this.setStencilMode(C.DISABLED), this._updatePipeHash();
|
| 639 |
+
}
|
| 640 |
+
setMultisampleCount(e) {
|
| 641 |
+
this._multisampleCount !== e && (this._multisampleCount = e, this._updatePipeHash());
|
| 642 |
+
}
|
| 643 |
+
setRenderTarget(e) {
|
| 644 |
+
this._multisampleCount = e.msaaSamples, this._depthStencilAttachment = e.descriptor.depthStencilAttachment ? 1 : 0, this._updatePipeHash();
|
| 645 |
+
}
|
| 646 |
+
setColorMask(e) {
|
| 647 |
+
this._colorMask !== e && (this._colorMask = e, this._updatePipeHash());
|
| 648 |
+
}
|
| 649 |
+
setStencilMode(e) {
|
| 650 |
+
this._stencilMode !== e && (this._stencilMode = e, this._stencilState = Ge[e], this._updatePipeHash());
|
| 651 |
+
}
|
| 652 |
+
setPipeline(e, t, r, s) {
|
| 653 |
+
const i = this.getPipeline(e, t, r);
|
| 654 |
+
s.setPipeline(i);
|
| 655 |
+
}
|
| 656 |
+
getPipeline(e, t, r, s) {
|
| 657 |
+
e._layoutKey || (Be(e, t.attributeData), this._generateBufferKey(e)), s || (s = e.topology);
|
| 658 |
+
const i = Ee(
|
| 659 |
+
e._layoutKey,
|
| 660 |
+
t._layoutKey,
|
| 661 |
+
r.data,
|
| 662 |
+
r._blendModeId,
|
| 663 |
+
Re[s]
|
| 664 |
+
);
|
| 665 |
+
return this._pipeCache[i] ? this._pipeCache[i] : (this._pipeCache[i] = this._createPipeline(e, t, r, s), this._pipeCache[i]);
|
| 666 |
+
}
|
| 667 |
+
_createPipeline(e, t, r, s) {
|
| 668 |
+
const i = this._gpu.device, n = this._createVertexBufferLayouts(e, t), o = this._renderer.state.getColorTargets(r);
|
| 669 |
+
o[0].writeMask = this._stencilMode === C.RENDERING_MASK_ADD ? 0 : this._colorMask;
|
| 670 |
+
const u = this._renderer.shader.getProgramData(t).pipeline, c = {
|
| 671 |
+
// TODO later check if its helpful to create..
|
| 672 |
+
// layout,
|
| 673 |
+
vertex: {
|
| 674 |
+
module: this._getModule(t.vertex.source),
|
| 675 |
+
entryPoint: t.vertex.entryPoint,
|
| 676 |
+
// geometry..
|
| 677 |
+
buffers: n
|
| 678 |
+
},
|
| 679 |
+
fragment: {
|
| 680 |
+
module: this._getModule(t.fragment.source),
|
| 681 |
+
entryPoint: t.fragment.entryPoint,
|
| 682 |
+
targets: o
|
| 683 |
+
},
|
| 684 |
+
primitive: {
|
| 685 |
+
topology: s,
|
| 686 |
+
cullMode: r.cullMode
|
| 687 |
+
},
|
| 688 |
+
layout: u,
|
| 689 |
+
multisample: {
|
| 690 |
+
count: this._multisampleCount
|
| 691 |
+
},
|
| 692 |
+
// depthStencil,
|
| 693 |
+
label: "PIXI Pipeline"
|
| 694 |
+
};
|
| 695 |
+
return this._depthStencilAttachment && (c.depthStencil = {
|
| 696 |
+
...this._stencilState,
|
| 697 |
+
format: "depth24plus-stencil8",
|
| 698 |
+
depthWriteEnabled: r.depthTest,
|
| 699 |
+
depthCompare: r.depthTest ? "less" : "always"
|
| 700 |
+
}), i.createRenderPipeline(c);
|
| 701 |
+
}
|
| 702 |
+
_getModule(e) {
|
| 703 |
+
return this._moduleCache[e] || this._createModule(e);
|
| 704 |
+
}
|
| 705 |
+
_createModule(e) {
|
| 706 |
+
const t = this._gpu.device;
|
| 707 |
+
return this._moduleCache[e] = t.createShaderModule({
|
| 708 |
+
code: e
|
| 709 |
+
}), this._moduleCache[e];
|
| 710 |
+
}
|
| 711 |
+
_generateBufferKey(e) {
|
| 712 |
+
const t = [];
|
| 713 |
+
let r = 0;
|
| 714 |
+
const s = Object.keys(e.attributes).sort();
|
| 715 |
+
for (let n = 0; n < s.length; n++) {
|
| 716 |
+
const o = e.attributes[s[n]];
|
| 717 |
+
t[r++] = o.offset, t[r++] = o.format, t[r++] = o.stride, t[r++] = o.instance;
|
| 718 |
+
}
|
| 719 |
+
const i = t.join("|");
|
| 720 |
+
return e._layoutKey = M(i, "geometry"), e._layoutKey;
|
| 721 |
+
}
|
| 722 |
+
_generateAttributeLocationsKey(e) {
|
| 723 |
+
const t = [];
|
| 724 |
+
let r = 0;
|
| 725 |
+
const s = Object.keys(e.attributeData).sort();
|
| 726 |
+
for (let n = 0; n < s.length; n++) {
|
| 727 |
+
const o = e.attributeData[s[n]];
|
| 728 |
+
t[r++] = o.location;
|
| 729 |
+
}
|
| 730 |
+
const i = t.join("|");
|
| 731 |
+
return e._attributeLocationsKey = M(i, "programAttributes"), e._attributeLocationsKey;
|
| 732 |
+
}
|
| 733 |
+
/**
|
| 734 |
+
* Returns a hash of buffer names mapped to bind locations.
|
| 735 |
+
* This is used to bind the correct buffer to the correct location in the shader.
|
| 736 |
+
* @param geometry - The geometry where to get the buffer names
|
| 737 |
+
* @param program - The program where to get the buffer names
|
| 738 |
+
* @returns An object of buffer names mapped to the bind location.
|
| 739 |
+
*/
|
| 740 |
+
getBufferNamesToBind(e, t) {
|
| 741 |
+
const r = e._layoutKey << 16 | t._attributeLocationsKey;
|
| 742 |
+
if (this._bindingNamesCache[r])
|
| 743 |
+
return this._bindingNamesCache[r];
|
| 744 |
+
const s = this._createVertexBufferLayouts(e, t), i = /* @__PURE__ */ Object.create(null), n = t.attributeData;
|
| 745 |
+
for (let o = 0; o < s.length; o++) {
|
| 746 |
+
const c = Object.values(s[o].attributes)[0].shaderLocation;
|
| 747 |
+
for (const l in n)
|
| 748 |
+
if (n[l].location === c) {
|
| 749 |
+
i[o] = l;
|
| 750 |
+
break;
|
| 751 |
+
}
|
| 752 |
+
}
|
| 753 |
+
return this._bindingNamesCache[r] = i, i;
|
| 754 |
+
}
|
| 755 |
+
_createVertexBufferLayouts(e, t) {
|
| 756 |
+
t._attributeLocationsKey || this._generateAttributeLocationsKey(t);
|
| 757 |
+
const r = e._layoutKey << 16 | t._attributeLocationsKey;
|
| 758 |
+
if (this._bufferLayoutsCache[r])
|
| 759 |
+
return this._bufferLayoutsCache[r];
|
| 760 |
+
const s = [];
|
| 761 |
+
return e.buffers.forEach((i) => {
|
| 762 |
+
const n = {
|
| 763 |
+
arrayStride: 0,
|
| 764 |
+
stepMode: "vertex",
|
| 765 |
+
attributes: []
|
| 766 |
+
}, o = n.attributes;
|
| 767 |
+
for (const u in t.attributeData) {
|
| 768 |
+
const c = e.attributes[u];
|
| 769 |
+
(c.divisor ?? 1) !== 1 && v(`Attribute ${u} has an invalid divisor value of '${c.divisor}'. WebGPU only supports a divisor value of 1`), c.buffer === i && (n.arrayStride = c.stride, n.stepMode = c.instance ? "instance" : "vertex", o.push({
|
| 770 |
+
shaderLocation: t.attributeData[u].location,
|
| 771 |
+
offset: c.offset,
|
| 772 |
+
format: c.format
|
| 773 |
+
}));
|
| 774 |
+
}
|
| 775 |
+
o.length && s.push(n);
|
| 776 |
+
}), this._bufferLayoutsCache[r] = s, s;
|
| 777 |
+
}
|
| 778 |
+
_updatePipeHash() {
|
| 779 |
+
const e = Le(
|
| 780 |
+
this._stencilMode,
|
| 781 |
+
this._multisampleCount,
|
| 782 |
+
this._colorMask,
|
| 783 |
+
this._depthStencilAttachment
|
| 784 |
+
);
|
| 785 |
+
this._pipeStateCaches[e] || (this._pipeStateCaches[e] = /* @__PURE__ */ Object.create(null)), this._pipeCache = this._pipeStateCaches[e];
|
| 786 |
+
}
|
| 787 |
+
destroy() {
|
| 788 |
+
this._renderer = null, this._bufferLayoutsCache = null;
|
| 789 |
+
}
|
| 790 |
+
}
|
| 791 |
+
$.extension = {
|
| 792 |
+
type: [p.WebGPUSystem],
|
| 793 |
+
name: "pipeline"
|
| 794 |
+
};
|
| 795 |
+
class Ae {
|
| 796 |
+
constructor() {
|
| 797 |
+
this.contexts = [], this.msaaTextures = [], this.msaaSamples = 1;
|
| 798 |
+
}
|
| 799 |
+
}
|
| 800 |
+
class ke {
|
| 801 |
+
init(e, t) {
|
| 802 |
+
this._renderer = e, this._renderTargetSystem = t;
|
| 803 |
+
}
|
| 804 |
+
copyToTexture(e, t, r, s, i) {
|
| 805 |
+
const n = this._renderer, o = this._getGpuColorTexture(
|
| 806 |
+
e
|
| 807 |
+
), u = n.texture.getGpuSource(
|
| 808 |
+
t.source
|
| 809 |
+
);
|
| 810 |
+
return n.encoder.commandEncoder.copyTextureToTexture(
|
| 811 |
+
{
|
| 812 |
+
texture: o,
|
| 813 |
+
origin: r
|
| 814 |
+
},
|
| 815 |
+
{
|
| 816 |
+
texture: u,
|
| 817 |
+
origin: i
|
| 818 |
+
},
|
| 819 |
+
s
|
| 820 |
+
), t;
|
| 821 |
+
}
|
| 822 |
+
startRenderPass(e, t = !0, r, s) {
|
| 823 |
+
const n = this._renderTargetSystem.getGpuRenderTarget(e), o = this.getDescriptor(e, t, r);
|
| 824 |
+
n.descriptor = o, this._renderer.pipeline.setRenderTarget(n), this._renderer.encoder.beginRenderPass(n), this._renderer.encoder.setViewport(s);
|
| 825 |
+
}
|
| 826 |
+
finishRenderPass() {
|
| 827 |
+
this._renderer.encoder.endRenderPass();
|
| 828 |
+
}
|
| 829 |
+
/**
|
| 830 |
+
* returns the gpu texture for the first color texture in the render target
|
| 831 |
+
* mainly used by the filter manager to get copy the texture for blending
|
| 832 |
+
* @param renderTarget
|
| 833 |
+
* @returns a gpu texture
|
| 834 |
+
*/
|
| 835 |
+
_getGpuColorTexture(e) {
|
| 836 |
+
const t = this._renderTargetSystem.getGpuRenderTarget(e);
|
| 837 |
+
return t.contexts[0] ? t.contexts[0].getCurrentTexture() : this._renderer.texture.getGpuSource(
|
| 838 |
+
e.colorTextures[0].source
|
| 839 |
+
);
|
| 840 |
+
}
|
| 841 |
+
getDescriptor(e, t, r) {
|
| 842 |
+
typeof t == "boolean" && (t = t ? y.ALL : y.NONE);
|
| 843 |
+
const s = this._renderTargetSystem, i = s.getGpuRenderTarget(e), n = e.colorTextures.map(
|
| 844 |
+
(c, l) => {
|
| 845 |
+
const h = i.contexts[l];
|
| 846 |
+
let f, d;
|
| 847 |
+
h ? f = h.getCurrentTexture().createView() : f = this._renderer.texture.getGpuSource(c).createView({
|
| 848 |
+
mipLevelCount: 1
|
| 849 |
+
}), i.msaaTextures[l] && (d = f, f = this._renderer.texture.getTextureView(
|
| 850 |
+
i.msaaTextures[l]
|
| 851 |
+
));
|
| 852 |
+
const _ = t & y.COLOR ? "clear" : "load";
|
| 853 |
+
return r ?? (r = s.defaultClearColor), {
|
| 854 |
+
view: f,
|
| 855 |
+
resolveTarget: d,
|
| 856 |
+
clearValue: r,
|
| 857 |
+
storeOp: "store",
|
| 858 |
+
loadOp: _
|
| 859 |
+
};
|
| 860 |
+
}
|
| 861 |
+
);
|
| 862 |
+
let o;
|
| 863 |
+
if ((e.stencil || e.depth) && !e.depthStencilTexture && (e.ensureDepthStencilTexture(), e.depthStencilTexture.source.sampleCount = i.msaa ? 4 : 1), e.depthStencilTexture) {
|
| 864 |
+
const c = t & y.STENCIL ? "clear" : "load", l = t & y.DEPTH ? "clear" : "load";
|
| 865 |
+
o = {
|
| 866 |
+
view: this._renderer.texture.getGpuSource(e.depthStencilTexture.source).createView(),
|
| 867 |
+
stencilStoreOp: "store",
|
| 868 |
+
stencilLoadOp: c,
|
| 869 |
+
depthClearValue: 1,
|
| 870 |
+
depthLoadOp: l,
|
| 871 |
+
depthStoreOp: "store"
|
| 872 |
+
};
|
| 873 |
+
}
|
| 874 |
+
return {
|
| 875 |
+
colorAttachments: n,
|
| 876 |
+
depthStencilAttachment: o
|
| 877 |
+
};
|
| 878 |
+
}
|
| 879 |
+
clear(e, t = !0, r, s) {
|
| 880 |
+
if (!t)
|
| 881 |
+
return;
|
| 882 |
+
const { gpu: i, encoder: n } = this._renderer, o = i.device;
|
| 883 |
+
if (n.commandEncoder === null) {
|
| 884 |
+
const c = o.createCommandEncoder(), l = this.getDescriptor(e, t, r), h = c.beginRenderPass(l);
|
| 885 |
+
h.setViewport(s.x, s.y, s.width, s.height, 0, 1), h.end();
|
| 886 |
+
const f = c.finish();
|
| 887 |
+
o.queue.submit([f]);
|
| 888 |
+
} else
|
| 889 |
+
this.startRenderPass(e, t, r, s);
|
| 890 |
+
}
|
| 891 |
+
initGpuRenderTarget(e) {
|
| 892 |
+
e.isRoot = !0;
|
| 893 |
+
const t = new Ae();
|
| 894 |
+
return e.colorTextures.forEach((r, s) => {
|
| 895 |
+
if (r instanceof ce) {
|
| 896 |
+
const i = r.resource.getContext(
|
| 897 |
+
"webgpu"
|
| 898 |
+
), n = r.transparent ? "premultiplied" : "opaque";
|
| 899 |
+
try {
|
| 900 |
+
i.configure({
|
| 901 |
+
device: this._renderer.gpu.device,
|
| 902 |
+
usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC,
|
| 903 |
+
format: "bgra8unorm",
|
| 904 |
+
alphaMode: n
|
| 905 |
+
});
|
| 906 |
+
} catch (o) {
|
| 907 |
+
console.error(o);
|
| 908 |
+
}
|
| 909 |
+
t.contexts[s] = i;
|
| 910 |
+
}
|
| 911 |
+
if (t.msaa = r.source.antialias, r.source.antialias) {
|
| 912 |
+
const i = new de({
|
| 913 |
+
width: 0,
|
| 914 |
+
height: 0,
|
| 915 |
+
sampleCount: 4
|
| 916 |
+
});
|
| 917 |
+
t.msaaTextures[s] = i;
|
| 918 |
+
}
|
| 919 |
+
}), t.msaa && (t.msaaSamples = 4, e.depthStencilTexture && (e.depthStencilTexture.source.sampleCount = 4)), t;
|
| 920 |
+
}
|
| 921 |
+
destroyGpuRenderTarget(e) {
|
| 922 |
+
e.contexts.forEach((t) => {
|
| 923 |
+
t.unconfigure();
|
| 924 |
+
}), e.msaaTextures.forEach((t) => {
|
| 925 |
+
t.destroy();
|
| 926 |
+
}), e.msaaTextures.length = 0, e.contexts.length = 0;
|
| 927 |
+
}
|
| 928 |
+
ensureDepthStencilTexture(e) {
|
| 929 |
+
const t = this._renderTargetSystem.getGpuRenderTarget(e);
|
| 930 |
+
e.depthStencilTexture && t.msaa && (e.depthStencilTexture.source.sampleCount = 4);
|
| 931 |
+
}
|
| 932 |
+
resizeGpuRenderTarget(e) {
|
| 933 |
+
const t = this._renderTargetSystem.getGpuRenderTarget(e);
|
| 934 |
+
t.width = e.width, t.height = e.height, t.msaa && e.colorTextures.forEach((r, s) => {
|
| 935 |
+
const i = t.msaaTextures[s];
|
| 936 |
+
i == null || i.resize(
|
| 937 |
+
r.source.width,
|
| 938 |
+
r.source.height,
|
| 939 |
+
r.source._resolution
|
| 940 |
+
);
|
| 941 |
+
});
|
| 942 |
+
}
|
| 943 |
+
}
|
| 944 |
+
class X extends Se {
|
| 945 |
+
constructor(e) {
|
| 946 |
+
super(e), this.adaptor = new ke(), this.adaptor.init(e, this);
|
| 947 |
+
}
|
| 948 |
+
}
|
| 949 |
+
X.extension = {
|
| 950 |
+
type: [p.WebGPUSystem],
|
| 951 |
+
name: "renderTarget"
|
| 952 |
+
};
|
| 953 |
+
class Z {
|
| 954 |
+
constructor() {
|
| 955 |
+
this._gpuProgramData = /* @__PURE__ */ Object.create(null);
|
| 956 |
+
}
|
| 957 |
+
contextChange(e) {
|
| 958 |
+
this._gpu = e;
|
| 959 |
+
}
|
| 960 |
+
getProgramData(e) {
|
| 961 |
+
return this._gpuProgramData[e._layoutKey] || this._createGPUProgramData(e);
|
| 962 |
+
}
|
| 963 |
+
_createGPUProgramData(e) {
|
| 964 |
+
const t = this._gpu.device, r = e.gpuLayout.map((i) => t.createBindGroupLayout({ entries: i })), s = { bindGroupLayouts: r };
|
| 965 |
+
return this._gpuProgramData[e._layoutKey] = {
|
| 966 |
+
bindGroups: r,
|
| 967 |
+
pipeline: t.createPipelineLayout(s)
|
| 968 |
+
}, this._gpuProgramData[e._layoutKey];
|
| 969 |
+
}
|
| 970 |
+
destroy() {
|
| 971 |
+
this._gpu = null, this._gpuProgramData = null;
|
| 972 |
+
}
|
| 973 |
+
}
|
| 974 |
+
Z.extension = {
|
| 975 |
+
type: [
|
| 976 |
+
p.WebGPUSystem
|
| 977 |
+
],
|
| 978 |
+
name: "shader"
|
| 979 |
+
};
|
| 980 |
+
const g = {};
|
| 981 |
+
g.normal = {
|
| 982 |
+
alpha: {
|
| 983 |
+
srcFactor: "one",
|
| 984 |
+
dstFactor: "one-minus-src-alpha",
|
| 985 |
+
operation: "add"
|
| 986 |
+
},
|
| 987 |
+
color: {
|
| 988 |
+
srcFactor: "one",
|
| 989 |
+
dstFactor: "one-minus-src-alpha",
|
| 990 |
+
operation: "add"
|
| 991 |
+
}
|
| 992 |
+
};
|
| 993 |
+
g.add = {
|
| 994 |
+
alpha: {
|
| 995 |
+
srcFactor: "src-alpha",
|
| 996 |
+
dstFactor: "one-minus-src-alpha",
|
| 997 |
+
operation: "add"
|
| 998 |
+
},
|
| 999 |
+
color: {
|
| 1000 |
+
srcFactor: "one",
|
| 1001 |
+
dstFactor: "one",
|
| 1002 |
+
operation: "add"
|
| 1003 |
+
}
|
| 1004 |
+
};
|
| 1005 |
+
g.multiply = {
|
| 1006 |
+
alpha: {
|
| 1007 |
+
srcFactor: "one",
|
| 1008 |
+
dstFactor: "one-minus-src-alpha",
|
| 1009 |
+
operation: "add"
|
| 1010 |
+
},
|
| 1011 |
+
color: {
|
| 1012 |
+
srcFactor: "dst",
|
| 1013 |
+
dstFactor: "one-minus-src-alpha",
|
| 1014 |
+
operation: "add"
|
| 1015 |
+
}
|
| 1016 |
+
};
|
| 1017 |
+
g.screen = {
|
| 1018 |
+
alpha: {
|
| 1019 |
+
srcFactor: "one",
|
| 1020 |
+
dstFactor: "one-minus-src-alpha",
|
| 1021 |
+
operation: "add"
|
| 1022 |
+
},
|
| 1023 |
+
color: {
|
| 1024 |
+
srcFactor: "one",
|
| 1025 |
+
dstFactor: "one-minus-src",
|
| 1026 |
+
operation: "add"
|
| 1027 |
+
}
|
| 1028 |
+
};
|
| 1029 |
+
g.overlay = {
|
| 1030 |
+
alpha: {
|
| 1031 |
+
srcFactor: "one",
|
| 1032 |
+
dstFactor: "one-minus-src-alpha",
|
| 1033 |
+
operation: "add"
|
| 1034 |
+
},
|
| 1035 |
+
color: {
|
| 1036 |
+
srcFactor: "one",
|
| 1037 |
+
dstFactor: "one-minus-src",
|
| 1038 |
+
operation: "add"
|
| 1039 |
+
}
|
| 1040 |
+
};
|
| 1041 |
+
g.none = {
|
| 1042 |
+
alpha: {
|
| 1043 |
+
srcFactor: "one",
|
| 1044 |
+
dstFactor: "one-minus-src-alpha",
|
| 1045 |
+
operation: "add"
|
| 1046 |
+
},
|
| 1047 |
+
color: {
|
| 1048 |
+
srcFactor: "zero",
|
| 1049 |
+
dstFactor: "zero",
|
| 1050 |
+
operation: "add"
|
| 1051 |
+
}
|
| 1052 |
+
};
|
| 1053 |
+
g["normal-npm"] = {
|
| 1054 |
+
alpha: {
|
| 1055 |
+
srcFactor: "one",
|
| 1056 |
+
dstFactor: "one-minus-src-alpha",
|
| 1057 |
+
operation: "add"
|
| 1058 |
+
},
|
| 1059 |
+
color: {
|
| 1060 |
+
srcFactor: "src-alpha",
|
| 1061 |
+
dstFactor: "one-minus-src-alpha",
|
| 1062 |
+
operation: "add"
|
| 1063 |
+
}
|
| 1064 |
+
};
|
| 1065 |
+
g["add-npm"] = {
|
| 1066 |
+
alpha: {
|
| 1067 |
+
srcFactor: "one",
|
| 1068 |
+
dstFactor: "one",
|
| 1069 |
+
operation: "add"
|
| 1070 |
+
},
|
| 1071 |
+
color: {
|
| 1072 |
+
srcFactor: "src-alpha",
|
| 1073 |
+
dstFactor: "one",
|
| 1074 |
+
operation: "add"
|
| 1075 |
+
}
|
| 1076 |
+
};
|
| 1077 |
+
g["screen-npm"] = {
|
| 1078 |
+
alpha: {
|
| 1079 |
+
srcFactor: "one",
|
| 1080 |
+
dstFactor: "one-minus-src-alpha",
|
| 1081 |
+
operation: "add"
|
| 1082 |
+
},
|
| 1083 |
+
color: {
|
| 1084 |
+
srcFactor: "src-alpha",
|
| 1085 |
+
dstFactor: "one-minus-src",
|
| 1086 |
+
operation: "add"
|
| 1087 |
+
}
|
| 1088 |
+
};
|
| 1089 |
+
g.erase = {
|
| 1090 |
+
alpha: {
|
| 1091 |
+
srcFactor: "zero",
|
| 1092 |
+
dstFactor: "one-minus-src-alpha",
|
| 1093 |
+
operation: "add"
|
| 1094 |
+
},
|
| 1095 |
+
color: {
|
| 1096 |
+
srcFactor: "zero",
|
| 1097 |
+
dstFactor: "one-minus-src",
|
| 1098 |
+
operation: "add"
|
| 1099 |
+
}
|
| 1100 |
+
};
|
| 1101 |
+
g.min = {
|
| 1102 |
+
alpha: {
|
| 1103 |
+
srcFactor: "one",
|
| 1104 |
+
dstFactor: "one",
|
| 1105 |
+
operation: "min"
|
| 1106 |
+
},
|
| 1107 |
+
color: {
|
| 1108 |
+
srcFactor: "one",
|
| 1109 |
+
dstFactor: "one",
|
| 1110 |
+
operation: "min"
|
| 1111 |
+
}
|
| 1112 |
+
};
|
| 1113 |
+
g.max = {
|
| 1114 |
+
alpha: {
|
| 1115 |
+
srcFactor: "one",
|
| 1116 |
+
dstFactor: "one",
|
| 1117 |
+
operation: "max"
|
| 1118 |
+
},
|
| 1119 |
+
color: {
|
| 1120 |
+
srcFactor: "one",
|
| 1121 |
+
dstFactor: "one",
|
| 1122 |
+
operation: "max"
|
| 1123 |
+
}
|
| 1124 |
+
};
|
| 1125 |
+
class J {
|
| 1126 |
+
constructor() {
|
| 1127 |
+
this.defaultState = new F(), this.defaultState.blend = !0;
|
| 1128 |
+
}
|
| 1129 |
+
contextChange(e) {
|
| 1130 |
+
this.gpu = e;
|
| 1131 |
+
}
|
| 1132 |
+
/**
|
| 1133 |
+
* Gets the blend mode data for the current state
|
| 1134 |
+
* @param state - The state to get the blend mode from
|
| 1135 |
+
*/
|
| 1136 |
+
getColorTargets(e) {
|
| 1137 |
+
return [
|
| 1138 |
+
{
|
| 1139 |
+
format: "bgra8unorm",
|
| 1140 |
+
writeMask: 0,
|
| 1141 |
+
blend: g[e.blendMode] || g.normal
|
| 1142 |
+
}
|
| 1143 |
+
];
|
| 1144 |
+
}
|
| 1145 |
+
destroy() {
|
| 1146 |
+
this.gpu = null;
|
| 1147 |
+
}
|
| 1148 |
+
}
|
| 1149 |
+
J.extension = {
|
| 1150 |
+
type: [
|
| 1151 |
+
p.WebGPUSystem
|
| 1152 |
+
],
|
| 1153 |
+
name: "state"
|
| 1154 |
+
};
|
| 1155 |
+
const De = {
|
| 1156 |
+
type: "image",
|
| 1157 |
+
upload(a, e, t) {
|
| 1158 |
+
const r = a.resource, s = (a.pixelWidth | 0) * (a.pixelHeight | 0), i = r.byteLength / s;
|
| 1159 |
+
t.device.queue.writeTexture(
|
| 1160 |
+
{ texture: e },
|
| 1161 |
+
r,
|
| 1162 |
+
{
|
| 1163 |
+
offset: 0,
|
| 1164 |
+
rowsPerImage: a.pixelHeight,
|
| 1165 |
+
bytesPerRow: a.pixelHeight * i
|
| 1166 |
+
},
|
| 1167 |
+
{
|
| 1168 |
+
width: a.pixelWidth,
|
| 1169 |
+
height: a.pixelHeight,
|
| 1170 |
+
depthOrArrayLayers: 1
|
| 1171 |
+
}
|
| 1172 |
+
);
|
| 1173 |
+
}
|
| 1174 |
+
}, Q = {
|
| 1175 |
+
"bc1-rgba-unorm": { blockBytes: 8, blockWidth: 4, blockHeight: 4 },
|
| 1176 |
+
"bc2-rgba-unorm": { blockBytes: 16, blockWidth: 4, blockHeight: 4 },
|
| 1177 |
+
"bc3-rgba-unorm": { blockBytes: 16, blockWidth: 4, blockHeight: 4 },
|
| 1178 |
+
"bc7-rgba-unorm": { blockBytes: 16, blockWidth: 4, blockHeight: 4 },
|
| 1179 |
+
"etc1-rgb-unorm": { blockBytes: 8, blockWidth: 4, blockHeight: 4 },
|
| 1180 |
+
"etc2-rgba8unorm": { blockBytes: 16, blockWidth: 4, blockHeight: 4 },
|
| 1181 |
+
"astc-4x4-unorm": { blockBytes: 16, blockWidth: 4, blockHeight: 4 }
|
| 1182 |
+
}, He = { blockBytes: 4, blockWidth: 1, blockHeight: 1 }, ze = {
|
| 1183 |
+
type: "compressed",
|
| 1184 |
+
upload(a, e, t) {
|
| 1185 |
+
let r = a.pixelWidth, s = a.pixelHeight;
|
| 1186 |
+
const i = Q[a.format] || He;
|
| 1187 |
+
for (let n = 0; n < a.resource.length; n++) {
|
| 1188 |
+
const o = a.resource[n], u = Math.ceil(r / i.blockWidth) * i.blockBytes;
|
| 1189 |
+
t.device.queue.writeTexture(
|
| 1190 |
+
{
|
| 1191 |
+
texture: e,
|
| 1192 |
+
mipLevel: n
|
| 1193 |
+
},
|
| 1194 |
+
o,
|
| 1195 |
+
{
|
| 1196 |
+
offset: 0,
|
| 1197 |
+
bytesPerRow: u
|
| 1198 |
+
},
|
| 1199 |
+
{
|
| 1200 |
+
width: Math.ceil(r / i.blockWidth) * i.blockWidth,
|
| 1201 |
+
height: Math.ceil(s / i.blockHeight) * i.blockHeight,
|
| 1202 |
+
depthOrArrayLayers: 1
|
| 1203 |
+
}
|
| 1204 |
+
), r = Math.max(r >> 1, 1), s = Math.max(s >> 1, 1);
|
| 1205 |
+
}
|
| 1206 |
+
}
|
| 1207 |
+
}, ee = {
|
| 1208 |
+
type: "image",
|
| 1209 |
+
upload(a, e, t) {
|
| 1210 |
+
const r = a.resource;
|
| 1211 |
+
if (!r)
|
| 1212 |
+
return;
|
| 1213 |
+
if (globalThis.HTMLImageElement && r instanceof HTMLImageElement) {
|
| 1214 |
+
const o = B.get().createCanvas(r.width, r.height);
|
| 1215 |
+
o.getContext("2d").drawImage(r, 0, 0, r.width, r.height), a.resource = o, v("ImageSource: Image element passed, converting to canvas and replacing resource.");
|
| 1216 |
+
}
|
| 1217 |
+
const s = Math.min(e.width, a.resourceWidth || a.pixelWidth), i = Math.min(e.height, a.resourceHeight || a.pixelHeight), n = a.alphaMode === "premultiply-alpha-on-upload";
|
| 1218 |
+
t.device.queue.copyExternalImageToTexture(
|
| 1219 |
+
{ source: r },
|
| 1220 |
+
{ texture: e, premultipliedAlpha: n },
|
| 1221 |
+
{
|
| 1222 |
+
width: s,
|
| 1223 |
+
height: i
|
| 1224 |
+
}
|
| 1225 |
+
);
|
| 1226 |
+
}
|
| 1227 |
+
}, Fe = {
|
| 1228 |
+
type: "video",
|
| 1229 |
+
upload(a, e, t) {
|
| 1230 |
+
ee.upload(a, e, t);
|
| 1231 |
+
}
|
| 1232 |
+
};
|
| 1233 |
+
class Oe {
|
| 1234 |
+
constructor(e) {
|
| 1235 |
+
this.device = e, this.sampler = e.createSampler({ minFilter: "linear" }), this.pipelines = {};
|
| 1236 |
+
}
|
| 1237 |
+
_getMipmapPipeline(e) {
|
| 1238 |
+
let t = this.pipelines[e];
|
| 1239 |
+
return t || (this.mipmapShaderModule || (this.mipmapShaderModule = this.device.createShaderModule({
|
| 1240 |
+
code: (
|
| 1241 |
+
/* wgsl */
|
| 1242 |
+
`
|
| 1243 |
+
var<private> pos : array<vec2<f32>, 3> = array<vec2<f32>, 3>(
|
| 1244 |
+
vec2<f32>(-1.0, -1.0), vec2<f32>(-1.0, 3.0), vec2<f32>(3.0, -1.0));
|
| 1245 |
+
|
| 1246 |
+
struct VertexOutput {
|
| 1247 |
+
@builtin(position) position : vec4<f32>,
|
| 1248 |
+
@location(0) texCoord : vec2<f32>,
|
| 1249 |
+
};
|
| 1250 |
+
|
| 1251 |
+
@vertex
|
| 1252 |
+
fn vertexMain(@builtin(vertex_index) vertexIndex : u32) -> VertexOutput {
|
| 1253 |
+
var output : VertexOutput;
|
| 1254 |
+
output.texCoord = pos[vertexIndex] * vec2<f32>(0.5, -0.5) + vec2<f32>(0.5);
|
| 1255 |
+
output.position = vec4<f32>(pos[vertexIndex], 0.0, 1.0);
|
| 1256 |
+
return output;
|
| 1257 |
+
}
|
| 1258 |
+
|
| 1259 |
+
@group(0) @binding(0) var imgSampler : sampler;
|
| 1260 |
+
@group(0) @binding(1) var img : texture_2d<f32>;
|
| 1261 |
+
|
| 1262 |
+
@fragment
|
| 1263 |
+
fn fragmentMain(@location(0) texCoord : vec2<f32>) -> @location(0) vec4<f32> {
|
| 1264 |
+
return textureSample(img, imgSampler, texCoord);
|
| 1265 |
+
}
|
| 1266 |
+
`
|
| 1267 |
+
)
|
| 1268 |
+
})), t = this.device.createRenderPipeline({
|
| 1269 |
+
layout: "auto",
|
| 1270 |
+
vertex: {
|
| 1271 |
+
module: this.mipmapShaderModule,
|
| 1272 |
+
entryPoint: "vertexMain"
|
| 1273 |
+
},
|
| 1274 |
+
fragment: {
|
| 1275 |
+
module: this.mipmapShaderModule,
|
| 1276 |
+
entryPoint: "fragmentMain",
|
| 1277 |
+
targets: [{ format: e }]
|
| 1278 |
+
}
|
| 1279 |
+
}), this.pipelines[e] = t), t;
|
| 1280 |
+
}
|
| 1281 |
+
/**
|
| 1282 |
+
* Generates mipmaps for the given GPUTexture from the data in level 0.
|
| 1283 |
+
* @param {module:External.GPUTexture} texture - Texture to generate mipmaps for.
|
| 1284 |
+
* @returns {module:External.GPUTexture} - The originally passed texture
|
| 1285 |
+
*/
|
| 1286 |
+
generateMipmap(e) {
|
| 1287 |
+
const t = this._getMipmapPipeline(e.format);
|
| 1288 |
+
if (e.dimension === "3d" || e.dimension === "1d")
|
| 1289 |
+
throw new Error("Generating mipmaps for non-2d textures is currently unsupported!");
|
| 1290 |
+
let r = e;
|
| 1291 |
+
const s = e.depthOrArrayLayers || 1, i = e.usage & GPUTextureUsage.RENDER_ATTACHMENT;
|
| 1292 |
+
if (!i) {
|
| 1293 |
+
const u = {
|
| 1294 |
+
size: {
|
| 1295 |
+
width: Math.ceil(e.width / 2),
|
| 1296 |
+
height: Math.ceil(e.height / 2),
|
| 1297 |
+
depthOrArrayLayers: s
|
| 1298 |
+
},
|
| 1299 |
+
format: e.format,
|
| 1300 |
+
usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT,
|
| 1301 |
+
mipLevelCount: e.mipLevelCount - 1
|
| 1302 |
+
};
|
| 1303 |
+
r = this.device.createTexture(u);
|
| 1304 |
+
}
|
| 1305 |
+
const n = this.device.createCommandEncoder({}), o = t.getBindGroupLayout(0);
|
| 1306 |
+
for (let u = 0; u < s; ++u) {
|
| 1307 |
+
let c = e.createView({
|
| 1308 |
+
baseMipLevel: 0,
|
| 1309 |
+
mipLevelCount: 1,
|
| 1310 |
+
dimension: "2d",
|
| 1311 |
+
baseArrayLayer: u,
|
| 1312 |
+
arrayLayerCount: 1
|
| 1313 |
+
}), l = i ? 1 : 0;
|
| 1314 |
+
for (let h = 1; h < e.mipLevelCount; ++h) {
|
| 1315 |
+
const f = r.createView({
|
| 1316 |
+
baseMipLevel: l++,
|
| 1317 |
+
mipLevelCount: 1,
|
| 1318 |
+
dimension: "2d",
|
| 1319 |
+
baseArrayLayer: u,
|
| 1320 |
+
arrayLayerCount: 1
|
| 1321 |
+
}), d = n.beginRenderPass({
|
| 1322 |
+
colorAttachments: [{
|
| 1323 |
+
view: f,
|
| 1324 |
+
storeOp: "store",
|
| 1325 |
+
loadOp: "clear",
|
| 1326 |
+
clearValue: { r: 0, g: 0, b: 0, a: 0 }
|
| 1327 |
+
}]
|
| 1328 |
+
}), _ = this.device.createBindGroup({
|
| 1329 |
+
layout: o,
|
| 1330 |
+
entries: [{
|
| 1331 |
+
binding: 0,
|
| 1332 |
+
resource: this.sampler
|
| 1333 |
+
}, {
|
| 1334 |
+
binding: 1,
|
| 1335 |
+
resource: c
|
| 1336 |
+
}]
|
| 1337 |
+
});
|
| 1338 |
+
d.setPipeline(t), d.setBindGroup(0, _), d.draw(3, 1, 0, 0), d.end(), c = f;
|
| 1339 |
+
}
|
| 1340 |
+
}
|
| 1341 |
+
if (!i) {
|
| 1342 |
+
const u = {
|
| 1343 |
+
width: Math.ceil(e.width / 2),
|
| 1344 |
+
height: Math.ceil(e.height / 2),
|
| 1345 |
+
depthOrArrayLayers: s
|
| 1346 |
+
};
|
| 1347 |
+
for (let c = 1; c < e.mipLevelCount; ++c)
|
| 1348 |
+
n.copyTextureToTexture({
|
| 1349 |
+
texture: r,
|
| 1350 |
+
mipLevel: c - 1
|
| 1351 |
+
}, {
|
| 1352 |
+
texture: e,
|
| 1353 |
+
mipLevel: c
|
| 1354 |
+
}, u), u.width = Math.ceil(u.width / 2), u.height = Math.ceil(u.height / 2);
|
| 1355 |
+
}
|
| 1356 |
+
return this.device.queue.submit([n.finish()]), i || r.destroy(), e;
|
| 1357 |
+
}
|
| 1358 |
+
}
|
| 1359 |
+
class te {
|
| 1360 |
+
constructor(e) {
|
| 1361 |
+
this.managedTextures = [], this._gpuSources = /* @__PURE__ */ Object.create(null), this._gpuSamplers = /* @__PURE__ */ Object.create(null), this._bindGroupHash = /* @__PURE__ */ Object.create(null), this._textureViewHash = /* @__PURE__ */ Object.create(null), this._uploads = {
|
| 1362 |
+
image: ee,
|
| 1363 |
+
buffer: De,
|
| 1364 |
+
video: Fe,
|
| 1365 |
+
compressed: ze
|
| 1366 |
+
}, this._renderer = e, e.renderableGC.addManagedHash(this, "_gpuSources"), e.renderableGC.addManagedHash(this, "_gpuSamplers"), e.renderableGC.addManagedHash(this, "_bindGroupHash"), e.renderableGC.addManagedHash(this, "_textureViewHash");
|
| 1367 |
+
}
|
| 1368 |
+
contextChange(e) {
|
| 1369 |
+
this._gpu = e;
|
| 1370 |
+
}
|
| 1371 |
+
/**
|
| 1372 |
+
* Initializes a texture source, if it has already been initialized nothing will happen.
|
| 1373 |
+
* @param source - The texture source to initialize.
|
| 1374 |
+
* @returns The initialized texture source.
|
| 1375 |
+
*/
|
| 1376 |
+
initSource(e) {
|
| 1377 |
+
return this._gpuSources[e.uid] ? this._gpuSources[e.uid] : this._initSource(e);
|
| 1378 |
+
}
|
| 1379 |
+
_initSource(e) {
|
| 1380 |
+
if (e.autoGenerateMipmaps) {
|
| 1381 |
+
const u = Math.max(e.pixelWidth, e.pixelHeight);
|
| 1382 |
+
e.mipLevelCount = Math.floor(Math.log2(u)) + 1;
|
| 1383 |
+
}
|
| 1384 |
+
let t = GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST;
|
| 1385 |
+
e.uploadMethodId !== "compressed" && (t |= GPUTextureUsage.RENDER_ATTACHMENT, t |= GPUTextureUsage.COPY_SRC);
|
| 1386 |
+
const r = Q[e.format] || { blockWidth: 1, blockHeight: 1 }, s = Math.ceil(e.pixelWidth / r.blockWidth) * r.blockWidth, i = Math.ceil(e.pixelHeight / r.blockHeight) * r.blockHeight, n = {
|
| 1387 |
+
label: e.label,
|
| 1388 |
+
size: { width: s, height: i },
|
| 1389 |
+
format: e.format,
|
| 1390 |
+
sampleCount: e.sampleCount,
|
| 1391 |
+
mipLevelCount: e.mipLevelCount,
|
| 1392 |
+
dimension: e.dimension,
|
| 1393 |
+
usage: t
|
| 1394 |
+
}, o = this._gpuSources[e.uid] = this._gpu.device.createTexture(n);
|
| 1395 |
+
return this.managedTextures.includes(e) || (e.on("update", this.onSourceUpdate, this), e.on("resize", this.onSourceResize, this), e.on("destroy", this.onSourceDestroy, this), e.on("unload", this.onSourceUnload, this), e.on("updateMipmaps", this.onUpdateMipmaps, this), this.managedTextures.push(e)), this.onSourceUpdate(e), o;
|
| 1396 |
+
}
|
| 1397 |
+
onSourceUpdate(e) {
|
| 1398 |
+
const t = this.getGpuSource(e);
|
| 1399 |
+
t && (this._uploads[e.uploadMethodId] && this._uploads[e.uploadMethodId].upload(e, t, this._gpu), e.autoGenerateMipmaps && e.mipLevelCount > 1 && this.onUpdateMipmaps(e));
|
| 1400 |
+
}
|
| 1401 |
+
onSourceUnload(e) {
|
| 1402 |
+
const t = this._gpuSources[e.uid];
|
| 1403 |
+
t && (this._gpuSources[e.uid] = null, t.destroy());
|
| 1404 |
+
}
|
| 1405 |
+
onUpdateMipmaps(e) {
|
| 1406 |
+
this._mipmapGenerator || (this._mipmapGenerator = new Oe(this._gpu.device));
|
| 1407 |
+
const t = this.getGpuSource(e);
|
| 1408 |
+
this._mipmapGenerator.generateMipmap(t);
|
| 1409 |
+
}
|
| 1410 |
+
onSourceDestroy(e) {
|
| 1411 |
+
e.off("update", this.onSourceUpdate, this), e.off("unload", this.onSourceUnload, this), e.off("destroy", this.onSourceDestroy, this), e.off("resize", this.onSourceResize, this), e.off("updateMipmaps", this.onUpdateMipmaps, this), this.managedTextures.splice(this.managedTextures.indexOf(e), 1), this.onSourceUnload(e);
|
| 1412 |
+
}
|
| 1413 |
+
onSourceResize(e) {
|
| 1414 |
+
const t = this._gpuSources[e.uid];
|
| 1415 |
+
t ? (t.width !== e.pixelWidth || t.height !== e.pixelHeight) && (this._textureViewHash[e.uid] = null, this._bindGroupHash[e.uid] = null, this.onSourceUnload(e), this.initSource(e)) : this.initSource(e);
|
| 1416 |
+
}
|
| 1417 |
+
_initSampler(e) {
|
| 1418 |
+
return this._gpuSamplers[e._resourceId] = this._gpu.device.createSampler(e), this._gpuSamplers[e._resourceId];
|
| 1419 |
+
}
|
| 1420 |
+
getGpuSampler(e) {
|
| 1421 |
+
return this._gpuSamplers[e._resourceId] || this._initSampler(e);
|
| 1422 |
+
}
|
| 1423 |
+
getGpuSource(e) {
|
| 1424 |
+
return this._gpuSources[e.uid] || this.initSource(e);
|
| 1425 |
+
}
|
| 1426 |
+
/**
|
| 1427 |
+
* this returns s bind group for a specific texture, the bind group contains
|
| 1428 |
+
* - the texture source
|
| 1429 |
+
* - the texture style
|
| 1430 |
+
* - the texture matrix
|
| 1431 |
+
* This is cached so the bind group should only be created once per texture
|
| 1432 |
+
* @param texture - the texture you want the bindgroup for
|
| 1433 |
+
* @returns the bind group for the texture
|
| 1434 |
+
*/
|
| 1435 |
+
getTextureBindGroup(e) {
|
| 1436 |
+
return this._bindGroupHash[e.uid] ?? this._createTextureBindGroup(e);
|
| 1437 |
+
}
|
| 1438 |
+
_createTextureBindGroup(e) {
|
| 1439 |
+
const t = e.source;
|
| 1440 |
+
return this._bindGroupHash[e.uid] = new L({
|
| 1441 |
+
0: t,
|
| 1442 |
+
1: t.style,
|
| 1443 |
+
2: new A({
|
| 1444 |
+
uTextureMatrix: { type: "mat3x3<f32>", value: e.textureMatrix.mapCoord }
|
| 1445 |
+
})
|
| 1446 |
+
}), this._bindGroupHash[e.uid];
|
| 1447 |
+
}
|
| 1448 |
+
getTextureView(e) {
|
| 1449 |
+
const t = e.source;
|
| 1450 |
+
return this._textureViewHash[t.uid] ?? this._createTextureView(t);
|
| 1451 |
+
}
|
| 1452 |
+
_createTextureView(e) {
|
| 1453 |
+
return this._textureViewHash[e.uid] = this.getGpuSource(e).createView(), this._textureViewHash[e.uid];
|
| 1454 |
+
}
|
| 1455 |
+
generateCanvas(e) {
|
| 1456 |
+
const t = this._renderer, r = t.gpu.device.createCommandEncoder(), s = B.get().createCanvas();
|
| 1457 |
+
s.width = e.source.pixelWidth, s.height = e.source.pixelHeight;
|
| 1458 |
+
const i = s.getContext("webgpu");
|
| 1459 |
+
return i.configure({
|
| 1460 |
+
device: t.gpu.device,
|
| 1461 |
+
usage: GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC,
|
| 1462 |
+
format: B.get().getNavigator().gpu.getPreferredCanvasFormat(),
|
| 1463 |
+
alphaMode: "premultiplied"
|
| 1464 |
+
}), r.copyTextureToTexture({
|
| 1465 |
+
texture: t.texture.getGpuSource(e.source),
|
| 1466 |
+
origin: {
|
| 1467 |
+
x: 0,
|
| 1468 |
+
y: 0
|
| 1469 |
+
}
|
| 1470 |
+
}, {
|
| 1471 |
+
texture: i.getCurrentTexture()
|
| 1472 |
+
}, {
|
| 1473 |
+
width: s.width,
|
| 1474 |
+
height: s.height
|
| 1475 |
+
}), t.gpu.device.queue.submit([r.finish()]), s;
|
| 1476 |
+
}
|
| 1477 |
+
getPixels(e) {
|
| 1478 |
+
const t = this.generateCanvas(e), r = w.getOptimalCanvasAndContext(t.width, t.height), s = r.context;
|
| 1479 |
+
s.drawImage(t, 0, 0);
|
| 1480 |
+
const { width: i, height: n } = t, o = s.getImageData(0, 0, i, n), u = new Uint8ClampedArray(o.data.buffer);
|
| 1481 |
+
return w.returnCanvasAndContext(r), { pixels: u, width: i, height: n };
|
| 1482 |
+
}
|
| 1483 |
+
destroy() {
|
| 1484 |
+
this.managedTextures.slice().forEach((e) => this.onSourceDestroy(e)), this.managedTextures = null;
|
| 1485 |
+
for (const e of Object.keys(this._bindGroupHash)) {
|
| 1486 |
+
const t = Number(e), r = this._bindGroupHash[t];
|
| 1487 |
+
r == null || r.destroy(), this._bindGroupHash[t] = null;
|
| 1488 |
+
}
|
| 1489 |
+
this._gpu = null, this._mipmapGenerator = null, this._gpuSources = null, this._bindGroupHash = null, this._textureViewHash = null, this._gpuSamplers = null;
|
| 1490 |
+
}
|
| 1491 |
+
}
|
| 1492 |
+
te.extension = {
|
| 1493 |
+
type: [
|
| 1494 |
+
p.WebGPUSystem
|
| 1495 |
+
],
|
| 1496 |
+
name: "texture"
|
| 1497 |
+
};
|
| 1498 |
+
class re {
|
| 1499 |
+
constructor() {
|
| 1500 |
+
this._maxTextures = 0;
|
| 1501 |
+
}
|
| 1502 |
+
contextChange(e) {
|
| 1503 |
+
const t = new A({
|
| 1504 |
+
uTransformMatrix: { value: new k(), type: "mat3x3<f32>" },
|
| 1505 |
+
uColor: { value: new Float32Array([1, 1, 1, 1]), type: "vec4<f32>" },
|
| 1506 |
+
uRound: { value: 0, type: "f32" }
|
| 1507 |
+
});
|
| 1508 |
+
this._maxTextures = e.limits.maxBatchableTextures;
|
| 1509 |
+
const r = D({
|
| 1510 |
+
name: "graphics",
|
| 1511 |
+
bits: [
|
| 1512 |
+
he,
|
| 1513 |
+
pe(this._maxTextures),
|
| 1514 |
+
ge,
|
| 1515 |
+
H
|
| 1516 |
+
]
|
| 1517 |
+
});
|
| 1518 |
+
this.shader = new z({
|
| 1519 |
+
gpuProgram: r,
|
| 1520 |
+
resources: {
|
| 1521 |
+
// added on the fly!
|
| 1522 |
+
localUniforms: t
|
| 1523 |
+
}
|
| 1524 |
+
});
|
| 1525 |
+
}
|
| 1526 |
+
execute(e, t) {
|
| 1527 |
+
const r = t.context, s = r.customShader || this.shader, i = e.renderer, n = i.graphicsContext, {
|
| 1528 |
+
batcher: o,
|
| 1529 |
+
instructions: u
|
| 1530 |
+
} = n.getContextRenderData(r), c = i.encoder;
|
| 1531 |
+
c.setGeometry(o.geometry, s.gpuProgram);
|
| 1532 |
+
const l = i.globalUniforms.bindGroup;
|
| 1533 |
+
c.setBindGroup(0, l, s.gpuProgram);
|
| 1534 |
+
const h = i.renderPipes.uniformBatch.getUniformBindGroup(s.resources.localUniforms, !0);
|
| 1535 |
+
c.setBindGroup(2, h, s.gpuProgram);
|
| 1536 |
+
const f = u.instructions;
|
| 1537 |
+
let d = null;
|
| 1538 |
+
for (let _ = 0; _ < u.instructionSize; _++) {
|
| 1539 |
+
const m = f[_];
|
| 1540 |
+
if (m.topology !== d && (d = m.topology, c.setPipelineFromGeometryProgramAndState(
|
| 1541 |
+
o.geometry,
|
| 1542 |
+
s.gpuProgram,
|
| 1543 |
+
e.state,
|
| 1544 |
+
m.topology
|
| 1545 |
+
)), s.groups[1] = m.bindGroup, !m.gpuBindGroup) {
|
| 1546 |
+
const P = m.textures;
|
| 1547 |
+
m.bindGroup = E(
|
| 1548 |
+
P.textures,
|
| 1549 |
+
P.count,
|
| 1550 |
+
this._maxTextures
|
| 1551 |
+
), m.gpuBindGroup = i.bindGroup.getBindGroup(
|
| 1552 |
+
m.bindGroup,
|
| 1553 |
+
s.gpuProgram,
|
| 1554 |
+
1
|
| 1555 |
+
);
|
| 1556 |
+
}
|
| 1557 |
+
c.setBindGroup(1, m.bindGroup, s.gpuProgram), c.renderPassEncoder.drawIndexed(m.size, 1, m.start);
|
| 1558 |
+
}
|
| 1559 |
+
}
|
| 1560 |
+
destroy() {
|
| 1561 |
+
this.shader.destroy(!0), this.shader = null;
|
| 1562 |
+
}
|
| 1563 |
+
}
|
| 1564 |
+
re.extension = {
|
| 1565 |
+
type: [
|
| 1566 |
+
p.WebGPUPipesAdaptor
|
| 1567 |
+
],
|
| 1568 |
+
name: "graphics"
|
| 1569 |
+
};
|
| 1570 |
+
class se {
|
| 1571 |
+
init() {
|
| 1572 |
+
const e = D({
|
| 1573 |
+
name: "mesh",
|
| 1574 |
+
bits: [
|
| 1575 |
+
me,
|
| 1576 |
+
Pe,
|
| 1577 |
+
H
|
| 1578 |
+
]
|
| 1579 |
+
});
|
| 1580 |
+
this._shader = new z({
|
| 1581 |
+
gpuProgram: e,
|
| 1582 |
+
resources: {
|
| 1583 |
+
uTexture: R.EMPTY._source,
|
| 1584 |
+
uSampler: R.EMPTY._source.style,
|
| 1585 |
+
textureUniforms: {
|
| 1586 |
+
uTextureMatrix: { type: "mat3x3<f32>", value: new k() }
|
| 1587 |
+
}
|
| 1588 |
+
}
|
| 1589 |
+
});
|
| 1590 |
+
}
|
| 1591 |
+
execute(e, t) {
|
| 1592 |
+
const r = e.renderer;
|
| 1593 |
+
let s = t._shader;
|
| 1594 |
+
if (!s)
|
| 1595 |
+
s = this._shader, s.groups[2] = r.texture.getTextureBindGroup(t.texture);
|
| 1596 |
+
else if (!s.gpuProgram) {
|
| 1597 |
+
v("Mesh shader has no gpuProgram", t.shader);
|
| 1598 |
+
return;
|
| 1599 |
+
}
|
| 1600 |
+
const i = s.gpuProgram;
|
| 1601 |
+
if (i.autoAssignGlobalUniforms && (s.groups[0] = r.globalUniforms.bindGroup), i.autoAssignLocalUniforms) {
|
| 1602 |
+
const n = e.localUniforms;
|
| 1603 |
+
s.groups[1] = r.renderPipes.uniformBatch.getUniformBindGroup(n, !0);
|
| 1604 |
+
}
|
| 1605 |
+
r.encoder.draw({
|
| 1606 |
+
geometry: t._geometry,
|
| 1607 |
+
shader: s,
|
| 1608 |
+
state: t.state
|
| 1609 |
+
});
|
| 1610 |
+
}
|
| 1611 |
+
destroy() {
|
| 1612 |
+
this._shader.destroy(!0), this._shader = null;
|
| 1613 |
+
}
|
| 1614 |
+
}
|
| 1615 |
+
se.extension = {
|
| 1616 |
+
type: [
|
| 1617 |
+
p.WebGPUPipesAdaptor
|
| 1618 |
+
],
|
| 1619 |
+
name: "mesh"
|
| 1620 |
+
};
|
| 1621 |
+
const Ie = [
|
| 1622 |
+
...Te,
|
| 1623 |
+
q,
|
| 1624 |
+
N,
|
| 1625 |
+
U,
|
| 1626 |
+
j,
|
| 1627 |
+
W,
|
| 1628 |
+
te,
|
| 1629 |
+
X,
|
| 1630 |
+
Z,
|
| 1631 |
+
J,
|
| 1632 |
+
$,
|
| 1633 |
+
V,
|
| 1634 |
+
K,
|
| 1635 |
+
I
|
| 1636 |
+
], We = [...Ce, Y], Ve = [O, se, re], ie = [], ne = [], oe = [];
|
| 1637 |
+
S.handleByNamedList(p.WebGPUSystem, ie);
|
| 1638 |
+
S.handleByNamedList(p.WebGPUPipes, ne);
|
| 1639 |
+
S.handleByNamedList(p.WebGPUPipesAdaptor, oe);
|
| 1640 |
+
S.add(...Ie, ...We, ...Ve);
|
| 1641 |
+
class qe extends le {
|
| 1642 |
+
constructor() {
|
| 1643 |
+
const e = {
|
| 1644 |
+
name: "webgpu",
|
| 1645 |
+
type: fe.WEBGPU,
|
| 1646 |
+
systems: ie,
|
| 1647 |
+
renderPipes: ne,
|
| 1648 |
+
renderPipeAdaptors: oe
|
| 1649 |
+
};
|
| 1650 |
+
super(e);
|
| 1651 |
+
}
|
| 1652 |
+
}
|
| 1653 |
+
export {
|
| 1654 |
+
qe as WebGPURenderer
|
| 1655 |
+
};
|
src/backend/gradio_polygonannotator/templates/component/browserAll-BoGsSDHg.js
ADDED
|
@@ -0,0 +1,1869 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import { T as A, U as Z, P as g, r as te, E as b, a as ie, w as y, e as w, C as V } from "./Index-CzQ497_5.js";
|
| 2 |
+
import "./webworkerAll-BMMxBtBd.js";
|
| 3 |
+
class q {
|
| 4 |
+
constructor(e) {
|
| 5 |
+
this._lastTransform = "", this._observer = null, this._tickerAttached = !1, this.updateTranslation = () => {
|
| 6 |
+
if (!this._canvas)
|
| 7 |
+
return;
|
| 8 |
+
const t = this._canvas.getBoundingClientRect(), i = this._canvas.width, n = this._canvas.height, s = t.width / i * this._renderer.resolution, o = t.height / n * this._renderer.resolution, r = t.left, l = t.top, d = `translate(${r}px, ${l}px) scale(${s}, ${o})`;
|
| 9 |
+
d !== this._lastTransform && (this._domElement.style.transform = d, this._lastTransform = d);
|
| 10 |
+
}, this._domElement = e.domElement, this._renderer = e.renderer, !(globalThis.OffscreenCanvas && this._renderer.canvas instanceof OffscreenCanvas) && (this._canvas = this._renderer.canvas, this._attachObserver());
|
| 11 |
+
}
|
| 12 |
+
/** The canvas element that this CanvasObserver is associated with. */
|
| 13 |
+
get canvas() {
|
| 14 |
+
return this._canvas;
|
| 15 |
+
}
|
| 16 |
+
/** Attaches the DOM element to the canvas parent if it is not already attached. */
|
| 17 |
+
ensureAttached() {
|
| 18 |
+
!this._domElement.parentNode && this._canvas.parentNode && (this._canvas.parentNode.appendChild(this._domElement), this.updateTranslation());
|
| 19 |
+
}
|
| 20 |
+
/** Sets up a ResizeObserver if available. This ensures that the DOM element is kept in sync with the canvas size . */
|
| 21 |
+
_attachObserver() {
|
| 22 |
+
"ResizeObserver" in globalThis ? (this._observer && (this._observer.disconnect(), this._observer = null), this._observer = new ResizeObserver((e) => {
|
| 23 |
+
for (const t of e) {
|
| 24 |
+
if (t.target !== this._canvas)
|
| 25 |
+
continue;
|
| 26 |
+
const i = this.canvas.width, n = this.canvas.height, s = t.contentRect.width / i * this._renderer.resolution, o = t.contentRect.height / n * this._renderer.resolution;
|
| 27 |
+
(this._lastScaleX !== s || this._lastScaleY !== o) && (this.updateTranslation(), this._lastScaleX = s, this._lastScaleY = o);
|
| 28 |
+
}
|
| 29 |
+
}), this._observer.observe(this._canvas)) : this._tickerAttached || A.shared.add(this.updateTranslation, this, Z.HIGH);
|
| 30 |
+
}
|
| 31 |
+
/** Destroys the CanvasObserver instance, cleaning up observers and Ticker. */
|
| 32 |
+
destroy() {
|
| 33 |
+
this._observer ? (this._observer.disconnect(), this._observer = null) : this._tickerAttached && A.shared.remove(this.updateTranslation), this._domElement = null, this._renderer = null, this._canvas = null, this._tickerAttached = !1, this._lastTransform = "", this._lastScaleX = null, this._lastScaleY = null;
|
| 34 |
+
}
|
| 35 |
+
}
|
| 36 |
+
class M {
|
| 37 |
+
/**
|
| 38 |
+
* @param manager - The event boundary which manages this event. Propagation can only occur
|
| 39 |
+
* within the boundary's jurisdiction.
|
| 40 |
+
*/
|
| 41 |
+
constructor(e) {
|
| 42 |
+
this.bubbles = !0, this.cancelBubble = !0, this.cancelable = !1, this.composed = !1, this.defaultPrevented = !1, this.eventPhase = M.prototype.NONE, this.propagationStopped = !1, this.propagationImmediatelyStopped = !1, this.layer = new g(), this.page = new g(), this.NONE = 0, this.CAPTURING_PHASE = 1, this.AT_TARGET = 2, this.BUBBLING_PHASE = 3, this.manager = e;
|
| 43 |
+
}
|
| 44 |
+
/** @readonly */
|
| 45 |
+
get layerX() {
|
| 46 |
+
return this.layer.x;
|
| 47 |
+
}
|
| 48 |
+
/** @readonly */
|
| 49 |
+
get layerY() {
|
| 50 |
+
return this.layer.y;
|
| 51 |
+
}
|
| 52 |
+
/** @readonly */
|
| 53 |
+
get pageX() {
|
| 54 |
+
return this.page.x;
|
| 55 |
+
}
|
| 56 |
+
/** @readonly */
|
| 57 |
+
get pageY() {
|
| 58 |
+
return this.page.y;
|
| 59 |
+
}
|
| 60 |
+
/**
|
| 61 |
+
* Fallback for the deprecated `InteractionEvent.data`.
|
| 62 |
+
* @deprecated since 7.0.0
|
| 63 |
+
*/
|
| 64 |
+
get data() {
|
| 65 |
+
return this;
|
| 66 |
+
}
|
| 67 |
+
/**
|
| 68 |
+
* The propagation path for this event. Alias for {@link EventBoundary.propagationPath}.
|
| 69 |
+
* @advanced
|
| 70 |
+
*/
|
| 71 |
+
composedPath() {
|
| 72 |
+
return this.manager && (!this.path || this.path[this.path.length - 1] !== this.target) && (this.path = this.target ? this.manager.propagationPath(this.target) : []), this.path;
|
| 73 |
+
}
|
| 74 |
+
/**
|
| 75 |
+
* Unimplemented method included for implementing the DOM interface `Event`. It will throw an `Error`.
|
| 76 |
+
* @deprecated
|
| 77 |
+
* @ignore
|
| 78 |
+
* @param _type
|
| 79 |
+
* @param _bubbles
|
| 80 |
+
* @param _cancelable
|
| 81 |
+
*/
|
| 82 |
+
initEvent(e, t, i) {
|
| 83 |
+
throw new Error("initEvent() is a legacy DOM API. It is not implemented in the Federated Events API.");
|
| 84 |
+
}
|
| 85 |
+
/**
|
| 86 |
+
* Unimplemented method included for implementing the DOM interface `UIEvent`. It will throw an `Error`.
|
| 87 |
+
* @ignore
|
| 88 |
+
* @deprecated
|
| 89 |
+
* @param _typeArg
|
| 90 |
+
* @param _bubblesArg
|
| 91 |
+
* @param _cancelableArg
|
| 92 |
+
* @param _viewArg
|
| 93 |
+
* @param _detailArg
|
| 94 |
+
*/
|
| 95 |
+
initUIEvent(e, t, i, n, s) {
|
| 96 |
+
throw new Error("initUIEvent() is a legacy DOM API. It is not implemented in the Federated Events API.");
|
| 97 |
+
}
|
| 98 |
+
/**
|
| 99 |
+
* Prevent default behavior of both PixiJS and the user agent.
|
| 100 |
+
* @example
|
| 101 |
+
* ```ts
|
| 102 |
+
* sprite.on('click', (event) => {
|
| 103 |
+
* // Prevent both browser's default click behavior
|
| 104 |
+
* // and PixiJS's default handling
|
| 105 |
+
* event.preventDefault();
|
| 106 |
+
*
|
| 107 |
+
* // Custom handling
|
| 108 |
+
* customClickHandler();
|
| 109 |
+
* });
|
| 110 |
+
* ```
|
| 111 |
+
* @remarks
|
| 112 |
+
* - Only works if the native event is cancelable
|
| 113 |
+
* - Does not stop event propagation
|
| 114 |
+
*/
|
| 115 |
+
preventDefault() {
|
| 116 |
+
this.nativeEvent instanceof Event && this.nativeEvent.cancelable && this.nativeEvent.preventDefault(), this.defaultPrevented = !0;
|
| 117 |
+
}
|
| 118 |
+
/**
|
| 119 |
+
* Stop this event from propagating to any additional listeners, including those
|
| 120 |
+
* on the current target and any following targets in the propagation path.
|
| 121 |
+
* @example
|
| 122 |
+
* ```ts
|
| 123 |
+
* container.on('pointerdown', (event) => {
|
| 124 |
+
* // Stop all further event handling
|
| 125 |
+
* event.stopImmediatePropagation();
|
| 126 |
+
*
|
| 127 |
+
* // These handlers won't be called:
|
| 128 |
+
* // - Other pointerdown listeners on this container
|
| 129 |
+
* // - Any pointerdown listeners on parent containers
|
| 130 |
+
* });
|
| 131 |
+
* ```
|
| 132 |
+
* @remarks
|
| 133 |
+
* - Immediately stops all event propagation
|
| 134 |
+
* - Prevents other listeners on same target from being called
|
| 135 |
+
* - More aggressive than stopPropagation()
|
| 136 |
+
*/
|
| 137 |
+
stopImmediatePropagation() {
|
| 138 |
+
this.propagationImmediatelyStopped = !0;
|
| 139 |
+
}
|
| 140 |
+
/**
|
| 141 |
+
* Stop this event from propagating to the next target in the propagation path.
|
| 142 |
+
* The rest of the listeners on the current target will still be notified.
|
| 143 |
+
* @example
|
| 144 |
+
* ```ts
|
| 145 |
+
* child.on('pointermove', (event) => {
|
| 146 |
+
* // Handle event on child
|
| 147 |
+
* updateChild();
|
| 148 |
+
*
|
| 149 |
+
* // Prevent parent handlers from being called
|
| 150 |
+
* event.stopPropagation();
|
| 151 |
+
* });
|
| 152 |
+
*
|
| 153 |
+
* // This won't be called if child handles the event
|
| 154 |
+
* parent.on('pointermove', (event) => {
|
| 155 |
+
* updateParent();
|
| 156 |
+
* });
|
| 157 |
+
* ```
|
| 158 |
+
* @remarks
|
| 159 |
+
* - Stops event bubbling to parent containers
|
| 160 |
+
* - Does not prevent other listeners on same target
|
| 161 |
+
* - Less aggressive than stopImmediatePropagation()
|
| 162 |
+
*/
|
| 163 |
+
stopPropagation() {
|
| 164 |
+
this.propagationStopped = !0;
|
| 165 |
+
}
|
| 166 |
+
}
|
| 167 |
+
var I = /iPhone/i, C = /iPod/i, L = /iPad/i, U = /\biOS-universal(?:.+)Mac\b/i, k = /\bAndroid(?:.+)Mobile\b/i, R = /Android/i, E = /(?:SD4930UR|\bSilk(?:.+)Mobile\b)/i, O = /Silk/i, m = /Windows Phone/i, X = /\bWindows(?:.+)ARM\b/i, Y = /BlackBerry/i, H = /BB10/i, F = /Opera Mini/i, N = /\b(CriOS|Chrome)(?:.+)Mobile/i, $ = /Mobile(?:.+)Firefox\b/i, K = function(a) {
|
| 168 |
+
return typeof a < "u" && a.platform === "MacIntel" && typeof a.maxTouchPoints == "number" && a.maxTouchPoints > 1 && typeof MSStream > "u";
|
| 169 |
+
};
|
| 170 |
+
function ne(a) {
|
| 171 |
+
return function(e) {
|
| 172 |
+
return e.test(a);
|
| 173 |
+
};
|
| 174 |
+
}
|
| 175 |
+
function G(a) {
|
| 176 |
+
var e = {
|
| 177 |
+
userAgent: "",
|
| 178 |
+
platform: "",
|
| 179 |
+
maxTouchPoints: 0
|
| 180 |
+
};
|
| 181 |
+
!a && typeof navigator < "u" ? e = {
|
| 182 |
+
userAgent: navigator.userAgent,
|
| 183 |
+
platform: navigator.platform,
|
| 184 |
+
maxTouchPoints: navigator.maxTouchPoints || 0
|
| 185 |
+
} : typeof a == "string" ? e.userAgent = a : a && a.userAgent && (e = {
|
| 186 |
+
userAgent: a.userAgent,
|
| 187 |
+
platform: a.platform,
|
| 188 |
+
maxTouchPoints: a.maxTouchPoints || 0
|
| 189 |
+
});
|
| 190 |
+
var t = e.userAgent, i = t.split("[FBAN");
|
| 191 |
+
typeof i[1] < "u" && (t = i[0]), i = t.split("Twitter"), typeof i[1] < "u" && (t = i[0]);
|
| 192 |
+
var n = ne(t), s = {
|
| 193 |
+
apple: {
|
| 194 |
+
phone: n(I) && !n(m),
|
| 195 |
+
ipod: n(C),
|
| 196 |
+
tablet: !n(I) && (n(L) || K(e)) && !n(m),
|
| 197 |
+
universal: n(U),
|
| 198 |
+
device: (n(I) || n(C) || n(L) || n(U) || K(e)) && !n(m)
|
| 199 |
+
},
|
| 200 |
+
amazon: {
|
| 201 |
+
phone: n(E),
|
| 202 |
+
tablet: !n(E) && n(O),
|
| 203 |
+
device: n(E) || n(O)
|
| 204 |
+
},
|
| 205 |
+
android: {
|
| 206 |
+
phone: !n(m) && n(E) || !n(m) && n(k),
|
| 207 |
+
tablet: !n(m) && !n(E) && !n(k) && (n(O) || n(R)),
|
| 208 |
+
device: !n(m) && (n(E) || n(O) || n(k) || n(R)) || n(/\bokhttp\b/i)
|
| 209 |
+
},
|
| 210 |
+
windows: {
|
| 211 |
+
phone: n(m),
|
| 212 |
+
tablet: n(X),
|
| 213 |
+
device: n(m) || n(X)
|
| 214 |
+
},
|
| 215 |
+
other: {
|
| 216 |
+
blackberry: n(Y),
|
| 217 |
+
blackberry10: n(H),
|
| 218 |
+
opera: n(F),
|
| 219 |
+
firefox: n($),
|
| 220 |
+
chrome: n(N),
|
| 221 |
+
device: n(Y) || n(H) || n(F) || n($) || n(N)
|
| 222 |
+
},
|
| 223 |
+
any: !1,
|
| 224 |
+
phone: !1,
|
| 225 |
+
tablet: !1
|
| 226 |
+
};
|
| 227 |
+
return s.any = s.apple.device || s.android.device || s.windows.device || s.other.device, s.phone = s.apple.phone || s.android.phone || s.windows.phone, s.tablet = s.apple.tablet || s.android.tablet || s.windows.tablet, s;
|
| 228 |
+
}
|
| 229 |
+
const se = G.default ?? G, oe = se(globalThis.navigator), re = 9, W = 100, ae = 0, he = 0, j = 2, z = 1, le = -1e3, ce = -1e3, de = 2, S = class J {
|
| 230 |
+
// eslint-disable-next-line jsdoc/require-param
|
| 231 |
+
/**
|
| 232 |
+
* @param {WebGLRenderer|WebGPURenderer} renderer - A reference to the current renderer
|
| 233 |
+
*/
|
| 234 |
+
constructor(e, t = oe) {
|
| 235 |
+
this._mobileInfo = t, this.debug = !1, this._activateOnTab = !0, this._deactivateOnMouseMove = !0, this._isActive = !1, this._isMobileAccessibility = !1, this._div = null, this._pool = [], this._renderId = 0, this._children = [], this._androidUpdateCount = 0, this._androidUpdateFrequency = 500, this._hookDiv = null, (t.tablet || t.phone) && this._createTouchHook(), this._renderer = e;
|
| 236 |
+
}
|
| 237 |
+
/**
|
| 238 |
+
* Value of `true` if accessibility is currently active and accessibility layers are showing.
|
| 239 |
+
* @type {boolean}
|
| 240 |
+
* @readonly
|
| 241 |
+
*/
|
| 242 |
+
get isActive() {
|
| 243 |
+
return this._isActive;
|
| 244 |
+
}
|
| 245 |
+
/**
|
| 246 |
+
* Value of `true` if accessibility is enabled for touch devices.
|
| 247 |
+
* @type {boolean}
|
| 248 |
+
* @readonly
|
| 249 |
+
*/
|
| 250 |
+
get isMobileAccessibility() {
|
| 251 |
+
return this._isMobileAccessibility;
|
| 252 |
+
}
|
| 253 |
+
/**
|
| 254 |
+
* The DOM element that will sit over the PixiJS element. This is where the div overlays will go.
|
| 255 |
+
* @readonly
|
| 256 |
+
*/
|
| 257 |
+
get hookDiv() {
|
| 258 |
+
return this._hookDiv;
|
| 259 |
+
}
|
| 260 |
+
/**
|
| 261 |
+
* Creates the touch hooks.
|
| 262 |
+
* @private
|
| 263 |
+
*/
|
| 264 |
+
_createTouchHook() {
|
| 265 |
+
const e = document.createElement("button");
|
| 266 |
+
e.style.width = `${z}px`, e.style.height = `${z}px`, e.style.position = "absolute", e.style.top = `${le}px`, e.style.left = `${ce}px`, e.style.zIndex = de.toString(), e.style.backgroundColor = "#FF0000", e.title = "select to enable accessibility for this content", e.addEventListener("focus", () => {
|
| 267 |
+
this._isMobileAccessibility = !0, this._activate(), this._destroyTouchHook();
|
| 268 |
+
}), document.body.appendChild(e), this._hookDiv = e;
|
| 269 |
+
}
|
| 270 |
+
/**
|
| 271 |
+
* Destroys the touch hooks.
|
| 272 |
+
* @private
|
| 273 |
+
*/
|
| 274 |
+
_destroyTouchHook() {
|
| 275 |
+
this._hookDiv && (document.body.removeChild(this._hookDiv), this._hookDiv = null);
|
| 276 |
+
}
|
| 277 |
+
/**
|
| 278 |
+
* Activating will cause the Accessibility layer to be shown.
|
| 279 |
+
* This is called when a user presses the tab key.
|
| 280 |
+
* @private
|
| 281 |
+
*/
|
| 282 |
+
_activate() {
|
| 283 |
+
if (this._isActive)
|
| 284 |
+
return;
|
| 285 |
+
this._isActive = !0, this._div || (this._div = document.createElement("div"), this._div.style.position = "absolute", this._div.style.top = `${ae}px`, this._div.style.left = `${he}px`, this._div.style.pointerEvents = "none", this._div.style.zIndex = j.toString(), this._canvasObserver = new q({
|
| 286 |
+
domElement: this._div,
|
| 287 |
+
renderer: this._renderer
|
| 288 |
+
})), this._activateOnTab && (this._onKeyDown = this._onKeyDown.bind(this), globalThis.addEventListener("keydown", this._onKeyDown, !1)), this._deactivateOnMouseMove && (this._onMouseMove = this._onMouseMove.bind(this), globalThis.document.addEventListener("mousemove", this._onMouseMove, !0));
|
| 289 |
+
const e = this._renderer.view.canvas;
|
| 290 |
+
if (e.parentNode)
|
| 291 |
+
this._canvasObserver.ensureAttached(), this._initAccessibilitySetup();
|
| 292 |
+
else {
|
| 293 |
+
const t = new MutationObserver(() => {
|
| 294 |
+
e.parentNode && (t.disconnect(), this._canvasObserver.ensureAttached(), this._initAccessibilitySetup());
|
| 295 |
+
});
|
| 296 |
+
t.observe(document.body, { childList: !0, subtree: !0 });
|
| 297 |
+
}
|
| 298 |
+
}
|
| 299 |
+
// New method to handle initialization after div is ready
|
| 300 |
+
_initAccessibilitySetup() {
|
| 301 |
+
this._renderer.runners.postrender.add(this), this._renderer.lastObjectRendered && this._updateAccessibleObjects(this._renderer.lastObjectRendered);
|
| 302 |
+
}
|
| 303 |
+
/**
|
| 304 |
+
* Deactivates the accessibility system. Removes listeners and accessibility elements.
|
| 305 |
+
* @private
|
| 306 |
+
*/
|
| 307 |
+
_deactivate() {
|
| 308 |
+
if (!(!this._isActive || this._isMobileAccessibility)) {
|
| 309 |
+
this._isActive = !1, globalThis.document.removeEventListener("mousemove", this._onMouseMove, !0), this._activateOnTab && globalThis.addEventListener("keydown", this._onKeyDown, !1), this._renderer.runners.postrender.remove(this);
|
| 310 |
+
for (const e of this._children)
|
| 311 |
+
e._accessibleDiv && e._accessibleDiv.parentNode && (e._accessibleDiv.parentNode.removeChild(e._accessibleDiv), e._accessibleDiv = null), e._accessibleActive = !1;
|
| 312 |
+
this._pool.forEach((e) => {
|
| 313 |
+
e.parentNode && e.parentNode.removeChild(e);
|
| 314 |
+
}), this._div && this._div.parentNode && this._div.parentNode.removeChild(this._div), this._pool = [], this._children = [];
|
| 315 |
+
}
|
| 316 |
+
}
|
| 317 |
+
/**
|
| 318 |
+
* This recursive function will run through the scene graph and add any new accessible objects to the DOM layer.
|
| 319 |
+
* @private
|
| 320 |
+
* @param {Container} container - The Container to check.
|
| 321 |
+
*/
|
| 322 |
+
_updateAccessibleObjects(e) {
|
| 323 |
+
if (!e.visible || !e.accessibleChildren)
|
| 324 |
+
return;
|
| 325 |
+
e.accessible && (e._accessibleActive || this._addChild(e), e._renderId = this._renderId);
|
| 326 |
+
const t = e.children;
|
| 327 |
+
if (t)
|
| 328 |
+
for (let i = 0; i < t.length; i++)
|
| 329 |
+
this._updateAccessibleObjects(t[i]);
|
| 330 |
+
}
|
| 331 |
+
/**
|
| 332 |
+
* Runner init called, view is available at this point.
|
| 333 |
+
* @ignore
|
| 334 |
+
*/
|
| 335 |
+
init(e) {
|
| 336 |
+
const i = {
|
| 337 |
+
accessibilityOptions: {
|
| 338 |
+
...J.defaultOptions,
|
| 339 |
+
...(e == null ? void 0 : e.accessibilityOptions) || {}
|
| 340 |
+
}
|
| 341 |
+
};
|
| 342 |
+
this.debug = i.accessibilityOptions.debug, this._activateOnTab = i.accessibilityOptions.activateOnTab, this._deactivateOnMouseMove = i.accessibilityOptions.deactivateOnMouseMove, i.accessibilityOptions.enabledByDefault ? this._activate() : this._activateOnTab && (this._onKeyDown = this._onKeyDown.bind(this), globalThis.addEventListener("keydown", this._onKeyDown, !1)), this._renderer.runners.postrender.remove(this);
|
| 343 |
+
}
|
| 344 |
+
/**
|
| 345 |
+
* Updates the accessibility layer during rendering.
|
| 346 |
+
* - Removes divs for containers no longer in the scene
|
| 347 |
+
* - Updates the position and dimensions of the root div
|
| 348 |
+
* - Updates positions of active accessibility divs
|
| 349 |
+
* Only fires while the accessibility system is active.
|
| 350 |
+
* @ignore
|
| 351 |
+
*/
|
| 352 |
+
postrender() {
|
| 353 |
+
const e = performance.now();
|
| 354 |
+
if (this._mobileInfo.android.device && e < this._androidUpdateCount || (this._androidUpdateCount = e + this._androidUpdateFrequency, !this._renderer.renderingToScreen || !this._renderer.view.canvas))
|
| 355 |
+
return;
|
| 356 |
+
const t = /* @__PURE__ */ new Set();
|
| 357 |
+
if (this._renderer.lastObjectRendered) {
|
| 358 |
+
this._updateAccessibleObjects(this._renderer.lastObjectRendered);
|
| 359 |
+
for (const i of this._children)
|
| 360 |
+
i._renderId === this._renderId && t.add(this._children.indexOf(i));
|
| 361 |
+
}
|
| 362 |
+
for (let i = this._children.length - 1; i >= 0; i--) {
|
| 363 |
+
const n = this._children[i];
|
| 364 |
+
t.has(i) || (n._accessibleDiv && n._accessibleDiv.parentNode && (n._accessibleDiv.parentNode.removeChild(n._accessibleDiv), this._pool.push(n._accessibleDiv), n._accessibleDiv = null), n._accessibleActive = !1, te(this._children, i, 1));
|
| 365 |
+
}
|
| 366 |
+
this._renderer.renderingToScreen && this._canvasObserver.ensureAttached();
|
| 367 |
+
for (let i = 0; i < this._children.length; i++) {
|
| 368 |
+
const n = this._children[i];
|
| 369 |
+
if (!n._accessibleActive || !n._accessibleDiv)
|
| 370 |
+
continue;
|
| 371 |
+
const s = n._accessibleDiv, o = n.hitArea || n.getBounds().rectangle;
|
| 372 |
+
if (n.hitArea) {
|
| 373 |
+
const r = n.worldTransform;
|
| 374 |
+
s.style.left = `${r.tx + o.x * r.a}px`, s.style.top = `${r.ty + o.y * r.d}px`, s.style.width = `${o.width * r.a}px`, s.style.height = `${o.height * r.d}px`;
|
| 375 |
+
} else
|
| 376 |
+
this._capHitArea(o), s.style.left = `${o.x}px`, s.style.top = `${o.y}px`, s.style.width = `${o.width}px`, s.style.height = `${o.height}px`;
|
| 377 |
+
}
|
| 378 |
+
this._renderId++;
|
| 379 |
+
}
|
| 380 |
+
/**
|
| 381 |
+
* private function that will visually add the information to the
|
| 382 |
+
* accessibility div
|
| 383 |
+
* @param {HTMLElement} div -
|
| 384 |
+
*/
|
| 385 |
+
_updateDebugHTML(e) {
|
| 386 |
+
e.innerHTML = `type: ${e.type}</br> title : ${e.title}</br> tabIndex: ${e.tabIndex}`;
|
| 387 |
+
}
|
| 388 |
+
/**
|
| 389 |
+
* Adjust the hit area based on the bounds of a display object
|
| 390 |
+
* @param {Rectangle} hitArea - Bounds of the child
|
| 391 |
+
*/
|
| 392 |
+
_capHitArea(e) {
|
| 393 |
+
e.x < 0 && (e.width += e.x, e.x = 0), e.y < 0 && (e.height += e.y, e.y = 0);
|
| 394 |
+
const { width: t, height: i } = this._renderer;
|
| 395 |
+
e.x + e.width > t && (e.width = t - e.x), e.y + e.height > i && (e.height = i - e.y);
|
| 396 |
+
}
|
| 397 |
+
/**
|
| 398 |
+
* Creates or reuses a div element for a Container and adds it to the accessibility layer.
|
| 399 |
+
* Sets up ARIA attributes, event listeners, and positioning based on the container's properties.
|
| 400 |
+
* @private
|
| 401 |
+
* @param {Container} container - The child to make accessible.
|
| 402 |
+
*/
|
| 403 |
+
_addChild(e) {
|
| 404 |
+
let t = this._pool.pop();
|
| 405 |
+
t || (e.accessibleType === "button" ? t = document.createElement("button") : (t = document.createElement(e.accessibleType), t.style.cssText = `
|
| 406 |
+
color: transparent;
|
| 407 |
+
pointer-events: none;
|
| 408 |
+
padding: 0;
|
| 409 |
+
margin: 0;
|
| 410 |
+
border: 0;
|
| 411 |
+
outline: 0;
|
| 412 |
+
background: transparent;
|
| 413 |
+
box-sizing: border-box;
|
| 414 |
+
user-select: none;
|
| 415 |
+
-webkit-user-select: none;
|
| 416 |
+
-moz-user-select: none;
|
| 417 |
+
-ms-user-select: none;
|
| 418 |
+
`, e.accessibleText && (t.innerText = e.accessibleText)), t.style.width = `${W}px`, t.style.height = `${W}px`, t.style.backgroundColor = this.debug ? "rgba(255,255,255,0.5)" : "transparent", t.style.position = "absolute", t.style.zIndex = j.toString(), t.style.borderStyle = "none", navigator.userAgent.toLowerCase().includes("chrome") ? t.setAttribute("aria-live", "off") : t.setAttribute("aria-live", "polite"), navigator.userAgent.match(/rv:.*Gecko\//) ? t.setAttribute("aria-relevant", "additions") : t.setAttribute("aria-relevant", "text"), t.addEventListener("click", this._onClick.bind(this)), t.addEventListener("focus", this._onFocus.bind(this)), t.addEventListener("focusout", this._onFocusOut.bind(this))), t.style.pointerEvents = e.accessiblePointerEvents, t.type = e.accessibleType, e.accessibleTitle && e.accessibleTitle !== null ? t.title = e.accessibleTitle : (!e.accessibleHint || e.accessibleHint === null) && (t.title = `container ${e.tabIndex}`), e.accessibleHint && e.accessibleHint !== null && t.setAttribute("aria-label", e.accessibleHint), e.interactive ? t.tabIndex = e.tabIndex : t.tabIndex = 0, this.debug && this._updateDebugHTML(t), e._accessibleActive = !0, e._accessibleDiv = t, t.container = e, this._children.push(e), this._div.appendChild(e._accessibleDiv);
|
| 419 |
+
}
|
| 420 |
+
/**
|
| 421 |
+
* Dispatch events with the EventSystem.
|
| 422 |
+
* @param e
|
| 423 |
+
* @param type
|
| 424 |
+
* @private
|
| 425 |
+
*/
|
| 426 |
+
_dispatchEvent(e, t) {
|
| 427 |
+
const { container: i } = e.target, n = this._renderer.events.rootBoundary, s = Object.assign(new M(n), { target: i });
|
| 428 |
+
n.rootTarget = this._renderer.lastObjectRendered, t.forEach((o) => n.dispatchEvent(s, o));
|
| 429 |
+
}
|
| 430 |
+
/**
|
| 431 |
+
* Maps the div button press to pixi's EventSystem (click)
|
| 432 |
+
* @private
|
| 433 |
+
* @param {MouseEvent} e - The click event.
|
| 434 |
+
*/
|
| 435 |
+
_onClick(e) {
|
| 436 |
+
this._dispatchEvent(e, ["click", "pointertap", "tap"]);
|
| 437 |
+
}
|
| 438 |
+
/**
|
| 439 |
+
* Maps the div focus events to pixi's EventSystem (mouseover)
|
| 440 |
+
* @private
|
| 441 |
+
* @param {FocusEvent} e - The focus event.
|
| 442 |
+
*/
|
| 443 |
+
_onFocus(e) {
|
| 444 |
+
e.target.getAttribute("aria-live") || e.target.setAttribute("aria-live", "assertive"), this._dispatchEvent(e, ["mouseover"]);
|
| 445 |
+
}
|
| 446 |
+
/**
|
| 447 |
+
* Maps the div focus events to pixi's EventSystem (mouseout)
|
| 448 |
+
* @private
|
| 449 |
+
* @param {FocusEvent} e - The focusout event.
|
| 450 |
+
*/
|
| 451 |
+
_onFocusOut(e) {
|
| 452 |
+
e.target.getAttribute("aria-live") || e.target.setAttribute("aria-live", "polite"), this._dispatchEvent(e, ["mouseout"]);
|
| 453 |
+
}
|
| 454 |
+
/**
|
| 455 |
+
* Is called when a key is pressed
|
| 456 |
+
* @private
|
| 457 |
+
* @param {KeyboardEvent} e - The keydown event.
|
| 458 |
+
*/
|
| 459 |
+
_onKeyDown(e) {
|
| 460 |
+
e.keyCode !== re || !this._activateOnTab || this._activate();
|
| 461 |
+
}
|
| 462 |
+
/**
|
| 463 |
+
* Is called when the mouse moves across the renderer element
|
| 464 |
+
* @private
|
| 465 |
+
* @param {MouseEvent} e - The mouse event.
|
| 466 |
+
*/
|
| 467 |
+
_onMouseMove(e) {
|
| 468 |
+
e.movementX === 0 && e.movementY === 0 || this._deactivate();
|
| 469 |
+
}
|
| 470 |
+
/**
|
| 471 |
+
* Destroys the accessibility system. Removes all elements and listeners.
|
| 472 |
+
* > [!IMPORTANT] This is typically called automatically when the {@link Application} is destroyed.
|
| 473 |
+
* > A typically user should not need to call this method directly.
|
| 474 |
+
*/
|
| 475 |
+
destroy() {
|
| 476 |
+
var e;
|
| 477 |
+
this._deactivate(), this._destroyTouchHook(), (e = this._canvasObserver) == null || e.destroy(), this._canvasObserver = null, this._div = null, this._pool = null, this._children = null, this._renderer = null, this._activateOnTab && globalThis.removeEventListener("keydown", this._onKeyDown);
|
| 478 |
+
}
|
| 479 |
+
/**
|
| 480 |
+
* Enables or disables the accessibility system.
|
| 481 |
+
* @param enabled - Whether to enable or disable accessibility.
|
| 482 |
+
* @example
|
| 483 |
+
* ```js
|
| 484 |
+
* app.renderer.accessibility.setAccessibilityEnabled(true); // Enable accessibility
|
| 485 |
+
* app.renderer.accessibility.setAccessibilityEnabled(false); // Disable accessibility
|
| 486 |
+
* ```
|
| 487 |
+
*/
|
| 488 |
+
setAccessibilityEnabled(e) {
|
| 489 |
+
e ? this._activate() : this._deactivate();
|
| 490 |
+
}
|
| 491 |
+
};
|
| 492 |
+
S.extension = {
|
| 493 |
+
type: [
|
| 494 |
+
b.WebGLSystem,
|
| 495 |
+
b.WebGPUSystem
|
| 496 |
+
],
|
| 497 |
+
name: "accessibility"
|
| 498 |
+
};
|
| 499 |
+
S.defaultOptions = {
|
| 500 |
+
/**
|
| 501 |
+
* Whether to enable accessibility features on initialization
|
| 502 |
+
* @default false
|
| 503 |
+
*/
|
| 504 |
+
enabledByDefault: !1,
|
| 505 |
+
/**
|
| 506 |
+
* Whether to visually show the accessibility divs for debugging
|
| 507 |
+
* @default false
|
| 508 |
+
*/
|
| 509 |
+
debug: !1,
|
| 510 |
+
/**
|
| 511 |
+
* Whether to activate accessibility when tab key is pressed
|
| 512 |
+
* @default true
|
| 513 |
+
*/
|
| 514 |
+
activateOnTab: !0,
|
| 515 |
+
/**
|
| 516 |
+
* Whether to deactivate accessibility when mouse moves
|
| 517 |
+
* @default true
|
| 518 |
+
*/
|
| 519 |
+
deactivateOnMouseMove: !0
|
| 520 |
+
};
|
| 521 |
+
let ue = S;
|
| 522 |
+
const pe = {
|
| 523 |
+
accessible: !1,
|
| 524 |
+
accessibleTitle: null,
|
| 525 |
+
accessibleHint: null,
|
| 526 |
+
tabIndex: 0,
|
| 527 |
+
accessibleType: "button",
|
| 528 |
+
accessibleText: null,
|
| 529 |
+
accessiblePointerEvents: "auto",
|
| 530 |
+
accessibleChildren: !0,
|
| 531 |
+
_accessibleActive: !1,
|
| 532 |
+
_accessibleDiv: null,
|
| 533 |
+
_renderId: -1
|
| 534 |
+
};
|
| 535 |
+
class Q {
|
| 536 |
+
/**
|
| 537 |
+
* Constructor for the DOMPipe class.
|
| 538 |
+
* @param renderer - The renderer instance that this DOMPipe will be associated with.
|
| 539 |
+
*/
|
| 540 |
+
constructor(e) {
|
| 541 |
+
this._attachedDomElements = [], this._renderer = e, this._renderer.runners.postrender.add(this), this._renderer.runners.init.add(this), this._domElement = document.createElement("div"), this._domElement.style.position = "absolute", this._domElement.style.top = "0", this._domElement.style.left = "0", this._domElement.style.pointerEvents = "none", this._domElement.style.zIndex = "1000";
|
| 542 |
+
}
|
| 543 |
+
/** Initializes the DOMPipe, setting up the main DOM element and adding it to the document body. */
|
| 544 |
+
init() {
|
| 545 |
+
this._canvasObserver = new q({
|
| 546 |
+
domElement: this._domElement,
|
| 547 |
+
renderer: this._renderer
|
| 548 |
+
});
|
| 549 |
+
}
|
| 550 |
+
/**
|
| 551 |
+
* Adds a renderable DOM container to the list of attached elements.
|
| 552 |
+
* @param domContainer - The DOM container to be added.
|
| 553 |
+
* @param _instructionSet - The instruction set (unused).
|
| 554 |
+
*/
|
| 555 |
+
addRenderable(e, t) {
|
| 556 |
+
this._attachedDomElements.includes(e) || this._attachedDomElements.push(e);
|
| 557 |
+
}
|
| 558 |
+
/**
|
| 559 |
+
* Updates a renderable DOM container.
|
| 560 |
+
* @param _domContainer - The DOM container to be updated (unused).
|
| 561 |
+
*/
|
| 562 |
+
updateRenderable(e) {
|
| 563 |
+
}
|
| 564 |
+
/**
|
| 565 |
+
* Validates a renderable DOM container.
|
| 566 |
+
* @param _domContainer - The DOM container to be validated (unused).
|
| 567 |
+
* @returns Always returns true as validation is not required.
|
| 568 |
+
*/
|
| 569 |
+
validateRenderable(e) {
|
| 570 |
+
return !0;
|
| 571 |
+
}
|
| 572 |
+
/** Handles the post-rendering process, ensuring DOM elements are correctly positioned and visible. */
|
| 573 |
+
postrender() {
|
| 574 |
+
const e = this._attachedDomElements;
|
| 575 |
+
if (e.length === 0) {
|
| 576 |
+
this._domElement.remove();
|
| 577 |
+
return;
|
| 578 |
+
}
|
| 579 |
+
this._canvasObserver.ensureAttached();
|
| 580 |
+
for (let t = 0; t < e.length; t++) {
|
| 581 |
+
const i = e[t], n = i.element;
|
| 582 |
+
if (!i.parent || i.globalDisplayStatus < 7)
|
| 583 |
+
n == null || n.remove(), e.splice(t, 1), t--;
|
| 584 |
+
else {
|
| 585 |
+
this._domElement.contains(n) || (n.style.position = "absolute", n.style.pointerEvents = "auto", this._domElement.appendChild(n));
|
| 586 |
+
const s = i.worldTransform, o = i._anchor, r = i.width * o.x, l = i.height * o.y;
|
| 587 |
+
n.style.transformOrigin = `${r}px ${l}px`, n.style.transform = `matrix(${s.a}, ${s.b}, ${s.c}, ${s.d}, ${s.tx - r}, ${s.ty - l})`, n.style.opacity = i.groupAlpha.toString();
|
| 588 |
+
}
|
| 589 |
+
}
|
| 590 |
+
}
|
| 591 |
+
/** Destroys the DOMPipe, removing all attached DOM elements and cleaning up resources. */
|
| 592 |
+
destroy() {
|
| 593 |
+
var e;
|
| 594 |
+
this._renderer.runners.postrender.remove(this);
|
| 595 |
+
for (let t = 0; t < this._attachedDomElements.length; t++)
|
| 596 |
+
(e = this._attachedDomElements[t].element) == null || e.remove();
|
| 597 |
+
this._attachedDomElements.length = 0, this._domElement.remove(), this._canvasObserver.destroy(), this._renderer = null;
|
| 598 |
+
}
|
| 599 |
+
}
|
| 600 |
+
Q.extension = {
|
| 601 |
+
type: [
|
| 602 |
+
b.WebGLPipes,
|
| 603 |
+
b.WebGPUPipes,
|
| 604 |
+
b.CanvasPipes
|
| 605 |
+
],
|
| 606 |
+
name: "dom"
|
| 607 |
+
};
|
| 608 |
+
class ve {
|
| 609 |
+
constructor() {
|
| 610 |
+
this.interactionFrequency = 10, this._deltaTime = 0, this._didMove = !1, this._tickerAdded = !1, this._pauseUpdate = !0;
|
| 611 |
+
}
|
| 612 |
+
/**
|
| 613 |
+
* Initializes the event ticker.
|
| 614 |
+
* @param events - The event system.
|
| 615 |
+
*/
|
| 616 |
+
init(e) {
|
| 617 |
+
this.removeTickerListener(), this.events = e, this.interactionFrequency = 10, this._deltaTime = 0, this._didMove = !1, this._tickerAdded = !1, this._pauseUpdate = !0;
|
| 618 |
+
}
|
| 619 |
+
/** Whether to pause the update checks or not. */
|
| 620 |
+
get pauseUpdate() {
|
| 621 |
+
return this._pauseUpdate;
|
| 622 |
+
}
|
| 623 |
+
set pauseUpdate(e) {
|
| 624 |
+
this._pauseUpdate = e;
|
| 625 |
+
}
|
| 626 |
+
/** Adds the ticker listener. */
|
| 627 |
+
addTickerListener() {
|
| 628 |
+
this._tickerAdded || !this.domElement || (A.system.add(this._tickerUpdate, this, Z.INTERACTION), this._tickerAdded = !0);
|
| 629 |
+
}
|
| 630 |
+
/** Removes the ticker listener. */
|
| 631 |
+
removeTickerListener() {
|
| 632 |
+
this._tickerAdded && (A.system.remove(this._tickerUpdate, this), this._tickerAdded = !1);
|
| 633 |
+
}
|
| 634 |
+
/** Sets flag to not fire extra events when the user has already moved there mouse */
|
| 635 |
+
pointerMoved() {
|
| 636 |
+
this._didMove = !0;
|
| 637 |
+
}
|
| 638 |
+
/** Updates the state of interactive objects. */
|
| 639 |
+
_update() {
|
| 640 |
+
if (!this.domElement || this._pauseUpdate)
|
| 641 |
+
return;
|
| 642 |
+
if (this._didMove) {
|
| 643 |
+
this._didMove = !1;
|
| 644 |
+
return;
|
| 645 |
+
}
|
| 646 |
+
const e = this.events._rootPointerEvent;
|
| 647 |
+
this.events.supportsTouchEvents && e.pointerType === "touch" || globalThis.document.dispatchEvent(this.events.supportsPointerEvents ? new PointerEvent("pointermove", {
|
| 648 |
+
clientX: e.clientX,
|
| 649 |
+
clientY: e.clientY,
|
| 650 |
+
pointerType: e.pointerType,
|
| 651 |
+
pointerId: e.pointerId
|
| 652 |
+
}) : new MouseEvent("mousemove", {
|
| 653 |
+
clientX: e.clientX,
|
| 654 |
+
clientY: e.clientY
|
| 655 |
+
}));
|
| 656 |
+
}
|
| 657 |
+
/**
|
| 658 |
+
* Updates the state of interactive objects if at least {@link interactionFrequency}
|
| 659 |
+
* milliseconds have passed since the last invocation.
|
| 660 |
+
*
|
| 661 |
+
* Invoked by a throttled ticker update from {@link Ticker.system}.
|
| 662 |
+
* @param ticker - The throttled ticker.
|
| 663 |
+
*/
|
| 664 |
+
_tickerUpdate(e) {
|
| 665 |
+
this._deltaTime += e.deltaTime, !(this._deltaTime < this.interactionFrequency) && (this._deltaTime = 0, this._update());
|
| 666 |
+
}
|
| 667 |
+
/** Destroys the event ticker. */
|
| 668 |
+
destroy() {
|
| 669 |
+
this.removeTickerListener(), this.events = null, this.domElement = null, this._deltaTime = 0, this._didMove = !1, this._tickerAdded = !1, this._pauseUpdate = !0;
|
| 670 |
+
}
|
| 671 |
+
}
|
| 672 |
+
const _ = new ve();
|
| 673 |
+
class D extends M {
|
| 674 |
+
constructor() {
|
| 675 |
+
super(...arguments), this.client = new g(), this.movement = new g(), this.offset = new g(), this.global = new g(), this.screen = new g();
|
| 676 |
+
}
|
| 677 |
+
/** @readonly */
|
| 678 |
+
get clientX() {
|
| 679 |
+
return this.client.x;
|
| 680 |
+
}
|
| 681 |
+
/** @readonly */
|
| 682 |
+
get clientY() {
|
| 683 |
+
return this.client.y;
|
| 684 |
+
}
|
| 685 |
+
/**
|
| 686 |
+
* Alias for {@link FederatedMouseEvent.clientX this.clientX}.
|
| 687 |
+
* @readonly
|
| 688 |
+
*/
|
| 689 |
+
get x() {
|
| 690 |
+
return this.clientX;
|
| 691 |
+
}
|
| 692 |
+
/**
|
| 693 |
+
* Alias for {@link FederatedMouseEvent.clientY this.clientY}.
|
| 694 |
+
* @readonly
|
| 695 |
+
*/
|
| 696 |
+
get y() {
|
| 697 |
+
return this.clientY;
|
| 698 |
+
}
|
| 699 |
+
/** @readonly */
|
| 700 |
+
get movementX() {
|
| 701 |
+
return this.movement.x;
|
| 702 |
+
}
|
| 703 |
+
/** @readonly */
|
| 704 |
+
get movementY() {
|
| 705 |
+
return this.movement.y;
|
| 706 |
+
}
|
| 707 |
+
/** @readonly */
|
| 708 |
+
get offsetX() {
|
| 709 |
+
return this.offset.x;
|
| 710 |
+
}
|
| 711 |
+
/** @readonly */
|
| 712 |
+
get offsetY() {
|
| 713 |
+
return this.offset.y;
|
| 714 |
+
}
|
| 715 |
+
/** @readonly */
|
| 716 |
+
get globalX() {
|
| 717 |
+
return this.global.x;
|
| 718 |
+
}
|
| 719 |
+
/** @readonly */
|
| 720 |
+
get globalY() {
|
| 721 |
+
return this.global.y;
|
| 722 |
+
}
|
| 723 |
+
/**
|
| 724 |
+
* The pointer coordinates in the renderer's screen. Alias for `screen.x`.
|
| 725 |
+
* @readonly
|
| 726 |
+
*/
|
| 727 |
+
get screenX() {
|
| 728 |
+
return this.screen.x;
|
| 729 |
+
}
|
| 730 |
+
/**
|
| 731 |
+
* The pointer coordinates in the renderer's screen. Alias for `screen.y`.
|
| 732 |
+
* @readonly
|
| 733 |
+
*/
|
| 734 |
+
get screenY() {
|
| 735 |
+
return this.screen.y;
|
| 736 |
+
}
|
| 737 |
+
/**
|
| 738 |
+
* Converts global coordinates into container-local coordinates.
|
| 739 |
+
*
|
| 740 |
+
* This method transforms coordinates from world space to a container's local space,
|
| 741 |
+
* useful for precise positioning and hit testing.
|
| 742 |
+
* @param container - The Container to get local coordinates for
|
| 743 |
+
* @param point - Optional Point object to store the result. If not provided, a new Point will be created
|
| 744 |
+
* @param globalPos - Optional custom global coordinates. If not provided, the event's global position is used
|
| 745 |
+
* @returns The local coordinates as a Point object
|
| 746 |
+
* @example
|
| 747 |
+
* ```ts
|
| 748 |
+
* // Basic usage - get local coordinates relative to a container
|
| 749 |
+
* sprite.on('pointermove', (event: FederatedMouseEvent) => {
|
| 750 |
+
* // Get position relative to the sprite
|
| 751 |
+
* const localPos = event.getLocalPosition(sprite);
|
| 752 |
+
* console.log('Local position:', localPos.x, localPos.y);
|
| 753 |
+
* });
|
| 754 |
+
* // Using custom global coordinates
|
| 755 |
+
* const customGlobal = new Point(100, 100);
|
| 756 |
+
* sprite.on('pointermove', (event: FederatedMouseEvent) => {
|
| 757 |
+
* // Transform custom coordinates
|
| 758 |
+
* const localPos = event.getLocalPosition(sprite, undefined, customGlobal);
|
| 759 |
+
* console.log('Custom local position:', localPos.x, localPos.y);
|
| 760 |
+
* });
|
| 761 |
+
* ```
|
| 762 |
+
* @see {@link Container.worldTransform} For the transformation matrix
|
| 763 |
+
* @see {@link Point} For the point class used to store coordinates
|
| 764 |
+
*/
|
| 765 |
+
getLocalPosition(e, t, i) {
|
| 766 |
+
return e.worldTransform.applyInverse(i || this.global, t);
|
| 767 |
+
}
|
| 768 |
+
/**
|
| 769 |
+
* Whether the modifier key was pressed when this event natively occurred.
|
| 770 |
+
* @param key - The modifier key.
|
| 771 |
+
*/
|
| 772 |
+
getModifierState(e) {
|
| 773 |
+
return "getModifierState" in this.nativeEvent && this.nativeEvent.getModifierState(e);
|
| 774 |
+
}
|
| 775 |
+
/**
|
| 776 |
+
* Not supported.
|
| 777 |
+
* @param _typeArg
|
| 778 |
+
* @param _canBubbleArg
|
| 779 |
+
* @param _cancelableArg
|
| 780 |
+
* @param _viewArg
|
| 781 |
+
* @param _detailArg
|
| 782 |
+
* @param _screenXArg
|
| 783 |
+
* @param _screenYArg
|
| 784 |
+
* @param _clientXArg
|
| 785 |
+
* @param _clientYArg
|
| 786 |
+
* @param _ctrlKeyArg
|
| 787 |
+
* @param _altKeyArg
|
| 788 |
+
* @param _shiftKeyArg
|
| 789 |
+
* @param _metaKeyArg
|
| 790 |
+
* @param _buttonArg
|
| 791 |
+
* @param _relatedTargetArg
|
| 792 |
+
* @deprecated since 7.0.0
|
| 793 |
+
* @ignore
|
| 794 |
+
*/
|
| 795 |
+
// eslint-disable-next-line max-params
|
| 796 |
+
initMouseEvent(e, t, i, n, s, o, r, l, d, p, u, h, v, c, Ee) {
|
| 797 |
+
throw new Error("Method not implemented.");
|
| 798 |
+
}
|
| 799 |
+
}
|
| 800 |
+
class f extends D {
|
| 801 |
+
constructor() {
|
| 802 |
+
super(...arguments), this.width = 0, this.height = 0, this.isPrimary = !1;
|
| 803 |
+
}
|
| 804 |
+
/**
|
| 805 |
+
* Only included for completeness for now
|
| 806 |
+
* @ignore
|
| 807 |
+
*/
|
| 808 |
+
getCoalescedEvents() {
|
| 809 |
+
return this.type === "pointermove" || this.type === "mousemove" || this.type === "touchmove" ? [this] : [];
|
| 810 |
+
}
|
| 811 |
+
/**
|
| 812 |
+
* Only included for completeness for now
|
| 813 |
+
* @ignore
|
| 814 |
+
*/
|
| 815 |
+
getPredictedEvents() {
|
| 816 |
+
throw new Error("getPredictedEvents is not supported!");
|
| 817 |
+
}
|
| 818 |
+
}
|
| 819 |
+
class T extends D {
|
| 820 |
+
constructor() {
|
| 821 |
+
super(...arguments), this.DOM_DELTA_PIXEL = 0, this.DOM_DELTA_LINE = 1, this.DOM_DELTA_PAGE = 2;
|
| 822 |
+
}
|
| 823 |
+
}
|
| 824 |
+
T.DOM_DELTA_PIXEL = 0;
|
| 825 |
+
T.DOM_DELTA_LINE = 1;
|
| 826 |
+
T.DOM_DELTA_PAGE = 2;
|
| 827 |
+
const fe = 2048, me = new g(), P = new g();
|
| 828 |
+
class _e {
|
| 829 |
+
/**
|
| 830 |
+
* @param rootTarget - The holder of the event boundary.
|
| 831 |
+
*/
|
| 832 |
+
constructor(e) {
|
| 833 |
+
this.dispatch = new ie(), this.moveOnAll = !1, this.enableGlobalMoveEvents = !0, this.mappingState = {
|
| 834 |
+
trackingData: {}
|
| 835 |
+
}, this.eventPool = /* @__PURE__ */ new Map(), this._allInteractiveElements = [], this._hitElements = [], this._isPointerMoveEvent = !1, this.rootTarget = e, this.hitPruneFn = this.hitPruneFn.bind(this), this.hitTestFn = this.hitTestFn.bind(this), this.mapPointerDown = this.mapPointerDown.bind(this), this.mapPointerMove = this.mapPointerMove.bind(this), this.mapPointerOut = this.mapPointerOut.bind(this), this.mapPointerOver = this.mapPointerOver.bind(this), this.mapPointerUp = this.mapPointerUp.bind(this), this.mapPointerUpOutside = this.mapPointerUpOutside.bind(this), this.mapWheel = this.mapWheel.bind(this), this.mappingTable = {}, this.addEventMapping("pointerdown", this.mapPointerDown), this.addEventMapping("pointermove", this.mapPointerMove), this.addEventMapping("pointerout", this.mapPointerOut), this.addEventMapping("pointerleave", this.mapPointerOut), this.addEventMapping("pointerover", this.mapPointerOver), this.addEventMapping("pointerup", this.mapPointerUp), this.addEventMapping("pointerupoutside", this.mapPointerUpOutside), this.addEventMapping("wheel", this.mapWheel);
|
| 836 |
+
}
|
| 837 |
+
/**
|
| 838 |
+
* Adds an event mapping for the event `type` handled by `fn`.
|
| 839 |
+
*
|
| 840 |
+
* Event mappings can be used to implement additional or custom events. They take an event
|
| 841 |
+
* coming from the upstream scene (or directly from the {@link EventSystem}) and dispatch new downstream events
|
| 842 |
+
* generally trickling down and bubbling up to {@link EventBoundary.rootTarget this.rootTarget}.
|
| 843 |
+
*
|
| 844 |
+
* To modify the semantics of existing events, the built-in mapping methods of EventBoundary should be overridden
|
| 845 |
+
* instead.
|
| 846 |
+
* @param type - The type of upstream event to map.
|
| 847 |
+
* @param fn - The mapping method. The context of this function must be bound manually, if desired.
|
| 848 |
+
*/
|
| 849 |
+
addEventMapping(e, t) {
|
| 850 |
+
this.mappingTable[e] || (this.mappingTable[e] = []), this.mappingTable[e].push({
|
| 851 |
+
fn: t,
|
| 852 |
+
priority: 0
|
| 853 |
+
}), this.mappingTable[e].sort((i, n) => i.priority - n.priority);
|
| 854 |
+
}
|
| 855 |
+
/**
|
| 856 |
+
* Dispatches the given event
|
| 857 |
+
* @param e - The event to dispatch.
|
| 858 |
+
* @param type - The type of event to dispatch. Defaults to `e.type`.
|
| 859 |
+
*/
|
| 860 |
+
dispatchEvent(e, t) {
|
| 861 |
+
e.propagationStopped = !1, e.propagationImmediatelyStopped = !1, this.propagate(e, t), this.dispatch.emit(t || e.type, e);
|
| 862 |
+
}
|
| 863 |
+
/**
|
| 864 |
+
* Maps the given upstream event through the event boundary and propagates it downstream.
|
| 865 |
+
* @param e - The event to map.
|
| 866 |
+
*/
|
| 867 |
+
mapEvent(e) {
|
| 868 |
+
if (!this.rootTarget)
|
| 869 |
+
return;
|
| 870 |
+
const t = this.mappingTable[e.type];
|
| 871 |
+
if (t)
|
| 872 |
+
for (let i = 0, n = t.length; i < n; i++)
|
| 873 |
+
t[i].fn(e);
|
| 874 |
+
else
|
| 875 |
+
y(`[EventBoundary]: Event mapping not defined for ${e.type}`);
|
| 876 |
+
}
|
| 877 |
+
/**
|
| 878 |
+
* Finds the Container that is the target of a event at the given coordinates.
|
| 879 |
+
*
|
| 880 |
+
* The passed (x,y) coordinates are in the world space above this event boundary.
|
| 881 |
+
* @param x - The x coordinate of the event.
|
| 882 |
+
* @param y - The y coordinate of the event.
|
| 883 |
+
*/
|
| 884 |
+
hitTest(e, t) {
|
| 885 |
+
_.pauseUpdate = !0;
|
| 886 |
+
const n = this._isPointerMoveEvent && this.enableGlobalMoveEvents ? "hitTestMoveRecursive" : "hitTestRecursive", s = this[n](
|
| 887 |
+
this.rootTarget,
|
| 888 |
+
this.rootTarget.eventMode,
|
| 889 |
+
me.set(e, t),
|
| 890 |
+
this.hitTestFn,
|
| 891 |
+
this.hitPruneFn
|
| 892 |
+
);
|
| 893 |
+
return s && s[0];
|
| 894 |
+
}
|
| 895 |
+
/**
|
| 896 |
+
* Propagate the passed event from from {@link EventBoundary.rootTarget this.rootTarget} to its
|
| 897 |
+
* target `e.target`.
|
| 898 |
+
* @param e - The event to propagate.
|
| 899 |
+
* @param type - The type of event to propagate. Defaults to `e.type`.
|
| 900 |
+
*/
|
| 901 |
+
propagate(e, t) {
|
| 902 |
+
if (!e.target)
|
| 903 |
+
return;
|
| 904 |
+
const i = e.composedPath();
|
| 905 |
+
e.eventPhase = e.CAPTURING_PHASE;
|
| 906 |
+
for (let n = 0, s = i.length - 1; n < s; n++)
|
| 907 |
+
if (e.currentTarget = i[n], this.notifyTarget(e, t), e.propagationStopped || e.propagationImmediatelyStopped)
|
| 908 |
+
return;
|
| 909 |
+
if (e.eventPhase = e.AT_TARGET, e.currentTarget = e.target, this.notifyTarget(e, t), !(e.propagationStopped || e.propagationImmediatelyStopped)) {
|
| 910 |
+
e.eventPhase = e.BUBBLING_PHASE;
|
| 911 |
+
for (let n = i.length - 2; n >= 0; n--)
|
| 912 |
+
if (e.currentTarget = i[n], this.notifyTarget(e, t), e.propagationStopped || e.propagationImmediatelyStopped)
|
| 913 |
+
return;
|
| 914 |
+
}
|
| 915 |
+
}
|
| 916 |
+
/**
|
| 917 |
+
* Emits the event `e` to all interactive containers. The event is propagated in the bubbling phase always.
|
| 918 |
+
*
|
| 919 |
+
* This is used in the `globalpointermove` event.
|
| 920 |
+
* @param e - The emitted event.
|
| 921 |
+
* @param type - The listeners to notify.
|
| 922 |
+
* @param targets - The targets to notify.
|
| 923 |
+
*/
|
| 924 |
+
all(e, t, i = this._allInteractiveElements) {
|
| 925 |
+
if (i.length === 0)
|
| 926 |
+
return;
|
| 927 |
+
e.eventPhase = e.BUBBLING_PHASE;
|
| 928 |
+
const n = Array.isArray(t) ? t : [t];
|
| 929 |
+
for (let s = i.length - 1; s >= 0; s--)
|
| 930 |
+
n.forEach((o) => {
|
| 931 |
+
e.currentTarget = i[s], this.notifyTarget(e, o);
|
| 932 |
+
});
|
| 933 |
+
}
|
| 934 |
+
/**
|
| 935 |
+
* Finds the propagation path from {@link EventBoundary.rootTarget rootTarget} to the passed
|
| 936 |
+
* `target`. The last element in the path is `target`.
|
| 937 |
+
* @param target - The target to find the propagation path to.
|
| 938 |
+
*/
|
| 939 |
+
propagationPath(e) {
|
| 940 |
+
const t = [e];
|
| 941 |
+
for (let i = 0; i < fe && e !== this.rootTarget && e.parent; i++) {
|
| 942 |
+
if (!e.parent)
|
| 943 |
+
throw new Error("Cannot find propagation path to disconnected target");
|
| 944 |
+
t.push(e.parent), e = e.parent;
|
| 945 |
+
}
|
| 946 |
+
return t.reverse(), t;
|
| 947 |
+
}
|
| 948 |
+
hitTestMoveRecursive(e, t, i, n, s, o = !1) {
|
| 949 |
+
let r = !1;
|
| 950 |
+
if (this._interactivePrune(e))
|
| 951 |
+
return null;
|
| 952 |
+
if ((e.eventMode === "dynamic" || t === "dynamic") && (_.pauseUpdate = !1), e.interactiveChildren && e.children) {
|
| 953 |
+
const p = e.children;
|
| 954 |
+
for (let u = p.length - 1; u >= 0; u--) {
|
| 955 |
+
const h = p[u], v = this.hitTestMoveRecursive(
|
| 956 |
+
h,
|
| 957 |
+
this._isInteractive(t) ? t : h.eventMode,
|
| 958 |
+
i,
|
| 959 |
+
n,
|
| 960 |
+
s,
|
| 961 |
+
o || s(e, i)
|
| 962 |
+
);
|
| 963 |
+
if (v) {
|
| 964 |
+
if (v.length > 0 && !v[v.length - 1].parent)
|
| 965 |
+
continue;
|
| 966 |
+
const c = e.isInteractive();
|
| 967 |
+
(v.length > 0 || c) && (c && this._allInteractiveElements.push(e), v.push(e)), this._hitElements.length === 0 && (this._hitElements = v), r = !0;
|
| 968 |
+
}
|
| 969 |
+
}
|
| 970 |
+
}
|
| 971 |
+
const l = this._isInteractive(t), d = e.isInteractive();
|
| 972 |
+
return d && d && this._allInteractiveElements.push(e), o || this._hitElements.length > 0 ? null : r ? this._hitElements : l && !s(e, i) && n(e, i) ? d ? [e] : [] : null;
|
| 973 |
+
}
|
| 974 |
+
/**
|
| 975 |
+
* Recursive implementation for {@link EventBoundary.hitTest hitTest}.
|
| 976 |
+
* @param currentTarget - The Container that is to be hit tested.
|
| 977 |
+
* @param eventMode - The event mode for the `currentTarget` or one of its parents.
|
| 978 |
+
* @param location - The location that is being tested for overlap.
|
| 979 |
+
* @param testFn - Callback that determines whether the target passes hit testing. This callback
|
| 980 |
+
* can assume that `pruneFn` failed to prune the container.
|
| 981 |
+
* @param pruneFn - Callback that determiness whether the target and all of its children
|
| 982 |
+
* cannot pass the hit test. It is used as a preliminary optimization to prune entire subtrees
|
| 983 |
+
* of the scene graph.
|
| 984 |
+
* @returns An array holding the hit testing target and all its ancestors in order. The first element
|
| 985 |
+
* is the target itself and the last is {@link EventBoundary.rootTarget rootTarget}. This is the opposite
|
| 986 |
+
* order w.r.t. the propagation path. If no hit testing target is found, null is returned.
|
| 987 |
+
*/
|
| 988 |
+
hitTestRecursive(e, t, i, n, s) {
|
| 989 |
+
if (this._interactivePrune(e) || s(e, i))
|
| 990 |
+
return null;
|
| 991 |
+
if ((e.eventMode === "dynamic" || t === "dynamic") && (_.pauseUpdate = !1), e.interactiveChildren && e.children) {
|
| 992 |
+
const l = e.children, d = i;
|
| 993 |
+
for (let p = l.length - 1; p >= 0; p--) {
|
| 994 |
+
const u = l[p], h = this.hitTestRecursive(
|
| 995 |
+
u,
|
| 996 |
+
this._isInteractive(t) ? t : u.eventMode,
|
| 997 |
+
d,
|
| 998 |
+
n,
|
| 999 |
+
s
|
| 1000 |
+
);
|
| 1001 |
+
if (h) {
|
| 1002 |
+
if (h.length > 0 && !h[h.length - 1].parent)
|
| 1003 |
+
continue;
|
| 1004 |
+
const v = e.isInteractive();
|
| 1005 |
+
return (h.length > 0 || v) && h.push(e), h;
|
| 1006 |
+
}
|
| 1007 |
+
}
|
| 1008 |
+
}
|
| 1009 |
+
const o = this._isInteractive(t), r = e.isInteractive();
|
| 1010 |
+
return o && n(e, i) ? r ? [e] : [] : null;
|
| 1011 |
+
}
|
| 1012 |
+
_isInteractive(e) {
|
| 1013 |
+
return e === "static" || e === "dynamic";
|
| 1014 |
+
}
|
| 1015 |
+
_interactivePrune(e) {
|
| 1016 |
+
return !e || !e.visible || !e.renderable || !e.measurable || e.eventMode === "none" || e.eventMode === "passive" && !e.interactiveChildren;
|
| 1017 |
+
}
|
| 1018 |
+
/**
|
| 1019 |
+
* Checks whether the container or any of its children cannot pass the hit test at all.
|
| 1020 |
+
*
|
| 1021 |
+
* {@link EventBoundary}'s implementation uses the {@link Container.hitArea hitArea}
|
| 1022 |
+
* and {@link Container._maskEffect} for pruning.
|
| 1023 |
+
* @param container - The container to prune.
|
| 1024 |
+
* @param location - The location to test for overlap.
|
| 1025 |
+
*/
|
| 1026 |
+
hitPruneFn(e, t) {
|
| 1027 |
+
if (e.hitArea && (e.worldTransform.applyInverse(t, P), !e.hitArea.contains(P.x, P.y)))
|
| 1028 |
+
return !0;
|
| 1029 |
+
if (e.effects && e.effects.length)
|
| 1030 |
+
for (let i = 0; i < e.effects.length; i++) {
|
| 1031 |
+
const n = e.effects[i];
|
| 1032 |
+
if (n.containsPoint && !n.containsPoint(t, this.hitTestFn))
|
| 1033 |
+
return !0;
|
| 1034 |
+
}
|
| 1035 |
+
return !1;
|
| 1036 |
+
}
|
| 1037 |
+
/**
|
| 1038 |
+
* Checks whether the container passes hit testing for the given location.
|
| 1039 |
+
* @param container - The container to test.
|
| 1040 |
+
* @param location - The location to test for overlap.
|
| 1041 |
+
* @returns - Whether `container` passes hit testing for `location`.
|
| 1042 |
+
*/
|
| 1043 |
+
hitTestFn(e, t) {
|
| 1044 |
+
return e.hitArea ? !0 : e != null && e.containsPoint ? (e.worldTransform.applyInverse(t, P), e.containsPoint(P)) : !1;
|
| 1045 |
+
}
|
| 1046 |
+
/**
|
| 1047 |
+
* Notify all the listeners to the event's `currentTarget`.
|
| 1048 |
+
*
|
| 1049 |
+
* If the `currentTarget` contains the property `on<type>`, then it is called here,
|
| 1050 |
+
* simulating the behavior from version 6.x and prior.
|
| 1051 |
+
* @param e - The event passed to the target.
|
| 1052 |
+
* @param type - The type of event to notify. Defaults to `e.type`.
|
| 1053 |
+
*/
|
| 1054 |
+
notifyTarget(e, t) {
|
| 1055 |
+
var s, o;
|
| 1056 |
+
if (!e.currentTarget.isInteractive())
|
| 1057 |
+
return;
|
| 1058 |
+
t ?? (t = e.type);
|
| 1059 |
+
const i = `on${t}`;
|
| 1060 |
+
(o = (s = e.currentTarget)[i]) == null || o.call(s, e);
|
| 1061 |
+
const n = e.eventPhase === e.CAPTURING_PHASE || e.eventPhase === e.AT_TARGET ? `${t}capture` : t;
|
| 1062 |
+
this._notifyListeners(e, n), e.eventPhase === e.AT_TARGET && this._notifyListeners(e, t);
|
| 1063 |
+
}
|
| 1064 |
+
/**
|
| 1065 |
+
* Maps the upstream `pointerdown` events to a downstream `pointerdown` event.
|
| 1066 |
+
*
|
| 1067 |
+
* `touchstart`, `rightdown`, `mousedown` events are also dispatched for specific pointer types.
|
| 1068 |
+
* @param from - The upstream `pointerdown` event.
|
| 1069 |
+
*/
|
| 1070 |
+
mapPointerDown(e) {
|
| 1071 |
+
if (!(e instanceof f)) {
|
| 1072 |
+
y("EventBoundary cannot map a non-pointer event as a pointer event");
|
| 1073 |
+
return;
|
| 1074 |
+
}
|
| 1075 |
+
const t = this.createPointerEvent(e);
|
| 1076 |
+
if (this.dispatchEvent(t, "pointerdown"), t.pointerType === "touch")
|
| 1077 |
+
this.dispatchEvent(t, "touchstart");
|
| 1078 |
+
else if (t.pointerType === "mouse" || t.pointerType === "pen") {
|
| 1079 |
+
const n = t.button === 2;
|
| 1080 |
+
this.dispatchEvent(t, n ? "rightdown" : "mousedown");
|
| 1081 |
+
}
|
| 1082 |
+
const i = this.trackingData(e.pointerId);
|
| 1083 |
+
i.pressTargetsByButton[e.button] = t.composedPath(), this.freeEvent(t);
|
| 1084 |
+
}
|
| 1085 |
+
/**
|
| 1086 |
+
* Maps the upstream `pointermove` to downstream `pointerout`, `pointerover`, and `pointermove` events, in that order.
|
| 1087 |
+
*
|
| 1088 |
+
* The tracking data for the specific pointer has an updated `overTarget`. `mouseout`, `mouseover`,
|
| 1089 |
+
* `mousemove`, and `touchmove` events are fired as well for specific pointer types.
|
| 1090 |
+
* @param from - The upstream `pointermove` event.
|
| 1091 |
+
*/
|
| 1092 |
+
mapPointerMove(e) {
|
| 1093 |
+
var l, d;
|
| 1094 |
+
if (!(e instanceof f)) {
|
| 1095 |
+
y("EventBoundary cannot map a non-pointer event as a pointer event");
|
| 1096 |
+
return;
|
| 1097 |
+
}
|
| 1098 |
+
this._allInteractiveElements.length = 0, this._hitElements.length = 0, this._isPointerMoveEvent = !0;
|
| 1099 |
+
const t = this.createPointerEvent(e);
|
| 1100 |
+
this._isPointerMoveEvent = !1;
|
| 1101 |
+
const i = t.pointerType === "mouse" || t.pointerType === "pen", n = this.trackingData(e.pointerId), s = this.findMountedTarget(n.overTargets);
|
| 1102 |
+
if (((l = n.overTargets) == null ? void 0 : l.length) > 0 && s !== t.target) {
|
| 1103 |
+
const p = e.type === "mousemove" ? "mouseout" : "pointerout", u = this.createPointerEvent(e, p, s);
|
| 1104 |
+
if (this.dispatchEvent(u, "pointerout"), i && this.dispatchEvent(u, "mouseout"), !t.composedPath().includes(s)) {
|
| 1105 |
+
const h = this.createPointerEvent(e, "pointerleave", s);
|
| 1106 |
+
for (h.eventPhase = h.AT_TARGET; h.target && !t.composedPath().includes(h.target); )
|
| 1107 |
+
h.currentTarget = h.target, this.notifyTarget(h), i && this.notifyTarget(h, "mouseleave"), h.target = h.target.parent;
|
| 1108 |
+
this.freeEvent(h);
|
| 1109 |
+
}
|
| 1110 |
+
this.freeEvent(u);
|
| 1111 |
+
}
|
| 1112 |
+
if (s !== t.target) {
|
| 1113 |
+
const p = e.type === "mousemove" ? "mouseover" : "pointerover", u = this.clonePointerEvent(t, p);
|
| 1114 |
+
this.dispatchEvent(u, "pointerover"), i && this.dispatchEvent(u, "mouseover");
|
| 1115 |
+
let h = s == null ? void 0 : s.parent;
|
| 1116 |
+
for (; h && h !== this.rootTarget.parent && h !== t.target; )
|
| 1117 |
+
h = h.parent;
|
| 1118 |
+
if (!h || h === this.rootTarget.parent) {
|
| 1119 |
+
const c = this.clonePointerEvent(t, "pointerenter");
|
| 1120 |
+
for (c.eventPhase = c.AT_TARGET; c.target && c.target !== s && c.target !== this.rootTarget.parent; )
|
| 1121 |
+
c.currentTarget = c.target, this.notifyTarget(c), i && this.notifyTarget(c, "mouseenter"), c.target = c.target.parent;
|
| 1122 |
+
this.freeEvent(c);
|
| 1123 |
+
}
|
| 1124 |
+
this.freeEvent(u);
|
| 1125 |
+
}
|
| 1126 |
+
const o = [], r = this.enableGlobalMoveEvents ?? !0;
|
| 1127 |
+
this.moveOnAll ? o.push("pointermove") : this.dispatchEvent(t, "pointermove"), r && o.push("globalpointermove"), t.pointerType === "touch" && (this.moveOnAll ? o.splice(1, 0, "touchmove") : this.dispatchEvent(t, "touchmove"), r && o.push("globaltouchmove")), i && (this.moveOnAll ? o.splice(1, 0, "mousemove") : this.dispatchEvent(t, "mousemove"), r && o.push("globalmousemove"), this.cursor = (d = t.target) == null ? void 0 : d.cursor), o.length > 0 && this.all(t, o), this._allInteractiveElements.length = 0, this._hitElements.length = 0, n.overTargets = t.composedPath(), this.freeEvent(t);
|
| 1128 |
+
}
|
| 1129 |
+
/**
|
| 1130 |
+
* Maps the upstream `pointerover` to downstream `pointerover` and `pointerenter` events, in that order.
|
| 1131 |
+
*
|
| 1132 |
+
* The tracking data for the specific pointer gets a new `overTarget`.
|
| 1133 |
+
* @param from - The upstream `pointerover` event.
|
| 1134 |
+
*/
|
| 1135 |
+
mapPointerOver(e) {
|
| 1136 |
+
var o;
|
| 1137 |
+
if (!(e instanceof f)) {
|
| 1138 |
+
y("EventBoundary cannot map a non-pointer event as a pointer event");
|
| 1139 |
+
return;
|
| 1140 |
+
}
|
| 1141 |
+
const t = this.trackingData(e.pointerId), i = this.createPointerEvent(e), n = i.pointerType === "mouse" || i.pointerType === "pen";
|
| 1142 |
+
this.dispatchEvent(i, "pointerover"), n && this.dispatchEvent(i, "mouseover"), i.pointerType === "mouse" && (this.cursor = (o = i.target) == null ? void 0 : o.cursor);
|
| 1143 |
+
const s = this.clonePointerEvent(i, "pointerenter");
|
| 1144 |
+
for (s.eventPhase = s.AT_TARGET; s.target && s.target !== this.rootTarget.parent; )
|
| 1145 |
+
s.currentTarget = s.target, this.notifyTarget(s), n && this.notifyTarget(s, "mouseenter"), s.target = s.target.parent;
|
| 1146 |
+
t.overTargets = i.composedPath(), this.freeEvent(i), this.freeEvent(s);
|
| 1147 |
+
}
|
| 1148 |
+
/**
|
| 1149 |
+
* Maps the upstream `pointerout` to downstream `pointerout`, `pointerleave` events, in that order.
|
| 1150 |
+
*
|
| 1151 |
+
* The tracking data for the specific pointer is cleared of a `overTarget`.
|
| 1152 |
+
* @param from - The upstream `pointerout` event.
|
| 1153 |
+
*/
|
| 1154 |
+
mapPointerOut(e) {
|
| 1155 |
+
if (!(e instanceof f)) {
|
| 1156 |
+
y("EventBoundary cannot map a non-pointer event as a pointer event");
|
| 1157 |
+
return;
|
| 1158 |
+
}
|
| 1159 |
+
const t = this.trackingData(e.pointerId);
|
| 1160 |
+
if (t.overTargets) {
|
| 1161 |
+
const i = e.pointerType === "mouse" || e.pointerType === "pen", n = this.findMountedTarget(t.overTargets), s = this.createPointerEvent(e, "pointerout", n);
|
| 1162 |
+
this.dispatchEvent(s), i && this.dispatchEvent(s, "mouseout");
|
| 1163 |
+
const o = this.createPointerEvent(e, "pointerleave", n);
|
| 1164 |
+
for (o.eventPhase = o.AT_TARGET; o.target && o.target !== this.rootTarget.parent; )
|
| 1165 |
+
o.currentTarget = o.target, this.notifyTarget(o), i && this.notifyTarget(o, "mouseleave"), o.target = o.target.parent;
|
| 1166 |
+
t.overTargets = null, this.freeEvent(s), this.freeEvent(o);
|
| 1167 |
+
}
|
| 1168 |
+
this.cursor = null;
|
| 1169 |
+
}
|
| 1170 |
+
/**
|
| 1171 |
+
* Maps the upstream `pointerup` event to downstream `pointerup`, `pointerupoutside`,
|
| 1172 |
+
* and `click`/`rightclick`/`pointertap` events, in that order.
|
| 1173 |
+
*
|
| 1174 |
+
* The `pointerupoutside` event bubbles from the original `pointerdown` target to the most specific
|
| 1175 |
+
* ancestor of the `pointerdown` and `pointerup` targets, which is also the `click` event's target. `touchend`,
|
| 1176 |
+
* `rightup`, `mouseup`, `touchendoutside`, `rightupoutside`, `mouseupoutside`, and `tap` are fired as well for
|
| 1177 |
+
* specific pointer types.
|
| 1178 |
+
* @param from - The upstream `pointerup` event.
|
| 1179 |
+
*/
|
| 1180 |
+
mapPointerUp(e) {
|
| 1181 |
+
if (!(e instanceof f)) {
|
| 1182 |
+
y("EventBoundary cannot map a non-pointer event as a pointer event");
|
| 1183 |
+
return;
|
| 1184 |
+
}
|
| 1185 |
+
const t = performance.now(), i = this.createPointerEvent(e);
|
| 1186 |
+
if (this.dispatchEvent(i, "pointerup"), i.pointerType === "touch")
|
| 1187 |
+
this.dispatchEvent(i, "touchend");
|
| 1188 |
+
else if (i.pointerType === "mouse" || i.pointerType === "pen") {
|
| 1189 |
+
const r = i.button === 2;
|
| 1190 |
+
this.dispatchEvent(i, r ? "rightup" : "mouseup");
|
| 1191 |
+
}
|
| 1192 |
+
const n = this.trackingData(e.pointerId), s = this.findMountedTarget(n.pressTargetsByButton[e.button]);
|
| 1193 |
+
let o = s;
|
| 1194 |
+
if (s && !i.composedPath().includes(s)) {
|
| 1195 |
+
let r = s;
|
| 1196 |
+
for (; r && !i.composedPath().includes(r); ) {
|
| 1197 |
+
if (i.currentTarget = r, this.notifyTarget(i, "pointerupoutside"), i.pointerType === "touch")
|
| 1198 |
+
this.notifyTarget(i, "touchendoutside");
|
| 1199 |
+
else if (i.pointerType === "mouse" || i.pointerType === "pen") {
|
| 1200 |
+
const l = i.button === 2;
|
| 1201 |
+
this.notifyTarget(i, l ? "rightupoutside" : "mouseupoutside");
|
| 1202 |
+
}
|
| 1203 |
+
r = r.parent;
|
| 1204 |
+
}
|
| 1205 |
+
delete n.pressTargetsByButton[e.button], o = r;
|
| 1206 |
+
}
|
| 1207 |
+
if (o) {
|
| 1208 |
+
const r = this.clonePointerEvent(i, "click");
|
| 1209 |
+
r.target = o, r.path = null, n.clicksByButton[e.button] || (n.clicksByButton[e.button] = {
|
| 1210 |
+
clickCount: 0,
|
| 1211 |
+
target: r.target,
|
| 1212 |
+
timeStamp: t
|
| 1213 |
+
});
|
| 1214 |
+
const l = n.clicksByButton[e.button];
|
| 1215 |
+
if (l.target === r.target && t - l.timeStamp < 200 ? ++l.clickCount : l.clickCount = 1, l.target = r.target, l.timeStamp = t, r.detail = l.clickCount, r.pointerType === "mouse") {
|
| 1216 |
+
const d = r.button === 2;
|
| 1217 |
+
this.dispatchEvent(r, d ? "rightclick" : "click");
|
| 1218 |
+
} else r.pointerType === "touch" && this.dispatchEvent(r, "tap");
|
| 1219 |
+
this.dispatchEvent(r, "pointertap"), this.freeEvent(r);
|
| 1220 |
+
}
|
| 1221 |
+
this.freeEvent(i);
|
| 1222 |
+
}
|
| 1223 |
+
/**
|
| 1224 |
+
* Maps the upstream `pointerupoutside` event to a downstream `pointerupoutside` event, bubbling from the original
|
| 1225 |
+
* `pointerdown` target to `rootTarget`.
|
| 1226 |
+
*
|
| 1227 |
+
* (The most specific ancestor of the `pointerdown` event and the `pointerup` event must the
|
| 1228 |
+
* `{@link EventBoundary}'s root because the `pointerup` event occurred outside of the boundary.)
|
| 1229 |
+
*
|
| 1230 |
+
* `touchendoutside`, `mouseupoutside`, and `rightupoutside` events are fired as well for specific pointer
|
| 1231 |
+
* types. The tracking data for the specific pointer is cleared of a `pressTarget`.
|
| 1232 |
+
* @param from - The upstream `pointerupoutside` event.
|
| 1233 |
+
*/
|
| 1234 |
+
mapPointerUpOutside(e) {
|
| 1235 |
+
if (!(e instanceof f)) {
|
| 1236 |
+
y("EventBoundary cannot map a non-pointer event as a pointer event");
|
| 1237 |
+
return;
|
| 1238 |
+
}
|
| 1239 |
+
const t = this.trackingData(e.pointerId), i = this.findMountedTarget(t.pressTargetsByButton[e.button]), n = this.createPointerEvent(e);
|
| 1240 |
+
if (i) {
|
| 1241 |
+
let s = i;
|
| 1242 |
+
for (; s; )
|
| 1243 |
+
n.currentTarget = s, this.notifyTarget(n, "pointerupoutside"), n.pointerType === "touch" ? this.notifyTarget(n, "touchendoutside") : (n.pointerType === "mouse" || n.pointerType === "pen") && this.notifyTarget(n, n.button === 2 ? "rightupoutside" : "mouseupoutside"), s = s.parent;
|
| 1244 |
+
delete t.pressTargetsByButton[e.button];
|
| 1245 |
+
}
|
| 1246 |
+
this.freeEvent(n);
|
| 1247 |
+
}
|
| 1248 |
+
/**
|
| 1249 |
+
* Maps the upstream `wheel` event to a downstream `wheel` event.
|
| 1250 |
+
* @param from - The upstream `wheel` event.
|
| 1251 |
+
*/
|
| 1252 |
+
mapWheel(e) {
|
| 1253 |
+
if (!(e instanceof T)) {
|
| 1254 |
+
y("EventBoundary cannot map a non-wheel event as a wheel event");
|
| 1255 |
+
return;
|
| 1256 |
+
}
|
| 1257 |
+
const t = this.createWheelEvent(e);
|
| 1258 |
+
this.dispatchEvent(t), this.freeEvent(t);
|
| 1259 |
+
}
|
| 1260 |
+
/**
|
| 1261 |
+
* Finds the most specific event-target in the given propagation path that is still mounted in the scene graph.
|
| 1262 |
+
*
|
| 1263 |
+
* This is used to find the correct `pointerup` and `pointerout` target in the case that the original `pointerdown`
|
| 1264 |
+
* or `pointerover` target was unmounted from the scene graph.
|
| 1265 |
+
* @param propagationPath - The propagation path was valid in the past.
|
| 1266 |
+
* @returns - The most specific event-target still mounted at the same location in the scene graph.
|
| 1267 |
+
*/
|
| 1268 |
+
findMountedTarget(e) {
|
| 1269 |
+
if (!e)
|
| 1270 |
+
return null;
|
| 1271 |
+
let t = e[0];
|
| 1272 |
+
for (let i = 1; i < e.length && e[i].parent === t; i++)
|
| 1273 |
+
t = e[i];
|
| 1274 |
+
return t;
|
| 1275 |
+
}
|
| 1276 |
+
/**
|
| 1277 |
+
* Creates an event whose `originalEvent` is `from`, with an optional `type` and `target` override.
|
| 1278 |
+
*
|
| 1279 |
+
* The event is allocated using {@link EventBoundary#allocateEvent this.allocateEvent}.
|
| 1280 |
+
* @param from - The `originalEvent` for the returned event.
|
| 1281 |
+
* @param [type=from.type] - The type of the returned event.
|
| 1282 |
+
* @param target - The target of the returned event.
|
| 1283 |
+
*/
|
| 1284 |
+
createPointerEvent(e, t, i) {
|
| 1285 |
+
const n = this.allocateEvent(f);
|
| 1286 |
+
return this.copyPointerData(e, n), this.copyMouseData(e, n), this.copyData(e, n), n.nativeEvent = e.nativeEvent, n.originalEvent = e, n.target = i ?? this.hitTest(n.global.x, n.global.y) ?? this._hitElements[0], typeof t == "string" && (n.type = t), n;
|
| 1287 |
+
}
|
| 1288 |
+
/**
|
| 1289 |
+
* Creates a wheel event whose `originalEvent` is `from`.
|
| 1290 |
+
*
|
| 1291 |
+
* The event is allocated using {@link EventBoundary#allocateEvent this.allocateEvent}.
|
| 1292 |
+
* @param from - The upstream wheel event.
|
| 1293 |
+
*/
|
| 1294 |
+
createWheelEvent(e) {
|
| 1295 |
+
const t = this.allocateEvent(T);
|
| 1296 |
+
return this.copyWheelData(e, t), this.copyMouseData(e, t), this.copyData(e, t), t.nativeEvent = e.nativeEvent, t.originalEvent = e, t.target = this.hitTest(t.global.x, t.global.y), t;
|
| 1297 |
+
}
|
| 1298 |
+
/**
|
| 1299 |
+
* Clones the event `from`, with an optional `type` override.
|
| 1300 |
+
*
|
| 1301 |
+
* The event is allocated using {@link EventBoundary#allocateEvent this.allocateEvent}.
|
| 1302 |
+
* @param from - The event to clone.
|
| 1303 |
+
* @param [type=from.type] - The type of the returned event.
|
| 1304 |
+
*/
|
| 1305 |
+
clonePointerEvent(e, t) {
|
| 1306 |
+
const i = this.allocateEvent(f);
|
| 1307 |
+
return i.nativeEvent = e.nativeEvent, i.originalEvent = e.originalEvent, this.copyPointerData(e, i), this.copyMouseData(e, i), this.copyData(e, i), i.target = e.target, i.path = e.composedPath().slice(), i.type = t ?? i.type, i;
|
| 1308 |
+
}
|
| 1309 |
+
/**
|
| 1310 |
+
* Copies wheel {@link FederatedWheelEvent} data from `from` into `to`.
|
| 1311 |
+
*
|
| 1312 |
+
* The following properties are copied:
|
| 1313 |
+
* + deltaMode
|
| 1314 |
+
* + deltaX
|
| 1315 |
+
* + deltaY
|
| 1316 |
+
* + deltaZ
|
| 1317 |
+
* @param from - The event to copy data from.
|
| 1318 |
+
* @param to - The event to copy data into.
|
| 1319 |
+
*/
|
| 1320 |
+
copyWheelData(e, t) {
|
| 1321 |
+
t.deltaMode = e.deltaMode, t.deltaX = e.deltaX, t.deltaY = e.deltaY, t.deltaZ = e.deltaZ;
|
| 1322 |
+
}
|
| 1323 |
+
/**
|
| 1324 |
+
* Copies pointer {@link FederatedPointerEvent} data from `from` into `to`.
|
| 1325 |
+
*
|
| 1326 |
+
* The following properties are copied:
|
| 1327 |
+
* + pointerId
|
| 1328 |
+
* + width
|
| 1329 |
+
* + height
|
| 1330 |
+
* + isPrimary
|
| 1331 |
+
* + pointerType
|
| 1332 |
+
* + pressure
|
| 1333 |
+
* + tangentialPressure
|
| 1334 |
+
* + tiltX
|
| 1335 |
+
* + tiltY
|
| 1336 |
+
* @param from - The event to copy data from.
|
| 1337 |
+
* @param to - The event to copy data into.
|
| 1338 |
+
*/
|
| 1339 |
+
copyPointerData(e, t) {
|
| 1340 |
+
e instanceof f && t instanceof f && (t.pointerId = e.pointerId, t.width = e.width, t.height = e.height, t.isPrimary = e.isPrimary, t.pointerType = e.pointerType, t.pressure = e.pressure, t.tangentialPressure = e.tangentialPressure, t.tiltX = e.tiltX, t.tiltY = e.tiltY, t.twist = e.twist);
|
| 1341 |
+
}
|
| 1342 |
+
/**
|
| 1343 |
+
* Copies mouse {@link FederatedMouseEvent} data from `from` to `to`.
|
| 1344 |
+
*
|
| 1345 |
+
* The following properties are copied:
|
| 1346 |
+
* + altKey
|
| 1347 |
+
* + button
|
| 1348 |
+
* + buttons
|
| 1349 |
+
* + clientX
|
| 1350 |
+
* + clientY
|
| 1351 |
+
* + metaKey
|
| 1352 |
+
* + movementX
|
| 1353 |
+
* + movementY
|
| 1354 |
+
* + pageX
|
| 1355 |
+
* + pageY
|
| 1356 |
+
* + x
|
| 1357 |
+
* + y
|
| 1358 |
+
* + screen
|
| 1359 |
+
* + shiftKey
|
| 1360 |
+
* + global
|
| 1361 |
+
* @param from - The event to copy data from.
|
| 1362 |
+
* @param to - The event to copy data into.
|
| 1363 |
+
*/
|
| 1364 |
+
copyMouseData(e, t) {
|
| 1365 |
+
e instanceof D && t instanceof D && (t.altKey = e.altKey, t.button = e.button, t.buttons = e.buttons, t.client.copyFrom(e.client), t.ctrlKey = e.ctrlKey, t.metaKey = e.metaKey, t.movement.copyFrom(e.movement), t.screen.copyFrom(e.screen), t.shiftKey = e.shiftKey, t.global.copyFrom(e.global));
|
| 1366 |
+
}
|
| 1367 |
+
/**
|
| 1368 |
+
* Copies base {@link FederatedEvent} data from `from` into `to`.
|
| 1369 |
+
*
|
| 1370 |
+
* The following properties are copied:
|
| 1371 |
+
* + isTrusted
|
| 1372 |
+
* + srcElement
|
| 1373 |
+
* + timeStamp
|
| 1374 |
+
* + type
|
| 1375 |
+
* @param from - The event to copy data from.
|
| 1376 |
+
* @param to - The event to copy data into.
|
| 1377 |
+
*/
|
| 1378 |
+
copyData(e, t) {
|
| 1379 |
+
t.isTrusted = e.isTrusted, t.srcElement = e.srcElement, t.timeStamp = performance.now(), t.type = e.type, t.detail = e.detail, t.view = e.view, t.which = e.which, t.layer.copyFrom(e.layer), t.page.copyFrom(e.page);
|
| 1380 |
+
}
|
| 1381 |
+
/**
|
| 1382 |
+
* @param id - The pointer ID.
|
| 1383 |
+
* @returns The tracking data stored for the given pointer. If no data exists, a blank
|
| 1384 |
+
* state will be created.
|
| 1385 |
+
*/
|
| 1386 |
+
trackingData(e) {
|
| 1387 |
+
return this.mappingState.trackingData[e] || (this.mappingState.trackingData[e] = {
|
| 1388 |
+
pressTargetsByButton: {},
|
| 1389 |
+
clicksByButton: {},
|
| 1390 |
+
overTarget: null
|
| 1391 |
+
}), this.mappingState.trackingData[e];
|
| 1392 |
+
}
|
| 1393 |
+
/**
|
| 1394 |
+
* Allocate a specific type of event from {@link EventBoundary#eventPool this.eventPool}.
|
| 1395 |
+
*
|
| 1396 |
+
* This allocation is constructor-agnostic, as long as it only takes one argument - this event
|
| 1397 |
+
* boundary.
|
| 1398 |
+
* @param constructor - The event's constructor.
|
| 1399 |
+
* @returns An event of the given type.
|
| 1400 |
+
*/
|
| 1401 |
+
allocateEvent(e) {
|
| 1402 |
+
this.eventPool.has(e) || this.eventPool.set(e, []);
|
| 1403 |
+
const t = this.eventPool.get(e).pop() || new e(this);
|
| 1404 |
+
return t.eventPhase = t.NONE, t.currentTarget = null, t.defaultPrevented = !1, t.path = null, t.target = null, t;
|
| 1405 |
+
}
|
| 1406 |
+
/**
|
| 1407 |
+
* Frees the event and puts it back into the event pool.
|
| 1408 |
+
*
|
| 1409 |
+
* It is illegal to reuse the event until it is allocated again, using `this.allocateEvent`.
|
| 1410 |
+
*
|
| 1411 |
+
* It is also advised that events not allocated from {@link EventBoundary#allocateEvent this.allocateEvent}
|
| 1412 |
+
* not be freed. This is because of the possibility that the same event is freed twice, which can cause
|
| 1413 |
+
* it to be allocated twice & result in overwriting.
|
| 1414 |
+
* @param event - The event to be freed.
|
| 1415 |
+
* @throws Error if the event is managed by another event boundary.
|
| 1416 |
+
*/
|
| 1417 |
+
freeEvent(e) {
|
| 1418 |
+
if (e.manager !== this)
|
| 1419 |
+
throw new Error("It is illegal to free an event not managed by this EventBoundary!");
|
| 1420 |
+
const t = e.constructor;
|
| 1421 |
+
this.eventPool.has(t) || this.eventPool.set(t, []), this.eventPool.get(t).push(e);
|
| 1422 |
+
}
|
| 1423 |
+
/**
|
| 1424 |
+
* Similar to {@link EventEmitter.emit}, except it stops if the `propagationImmediatelyStopped` flag
|
| 1425 |
+
* is set on the event.
|
| 1426 |
+
* @param e - The event to call each listener with.
|
| 1427 |
+
* @param type - The event key.
|
| 1428 |
+
*/
|
| 1429 |
+
_notifyListeners(e, t) {
|
| 1430 |
+
const i = e.currentTarget._events[t];
|
| 1431 |
+
if (i)
|
| 1432 |
+
if ("fn" in i)
|
| 1433 |
+
i.once && e.currentTarget.removeListener(t, i.fn, void 0, !0), i.fn.call(i.context, e);
|
| 1434 |
+
else
|
| 1435 |
+
for (let n = 0, s = i.length; n < s && !e.propagationImmediatelyStopped; n++)
|
| 1436 |
+
i[n].once && e.currentTarget.removeListener(t, i[n].fn, void 0, !0), i[n].fn.call(i[n].context, e);
|
| 1437 |
+
}
|
| 1438 |
+
}
|
| 1439 |
+
const ge = 1, ye = {
|
| 1440 |
+
touchstart: "pointerdown",
|
| 1441 |
+
touchend: "pointerup",
|
| 1442 |
+
touchendoutside: "pointerupoutside",
|
| 1443 |
+
touchmove: "pointermove",
|
| 1444 |
+
touchcancel: "pointercancel"
|
| 1445 |
+
}, B = class x {
|
| 1446 |
+
/**
|
| 1447 |
+
* @param {Renderer} renderer
|
| 1448 |
+
*/
|
| 1449 |
+
constructor(e) {
|
| 1450 |
+
this.supportsTouchEvents = "ontouchstart" in globalThis, this.supportsPointerEvents = !!globalThis.PointerEvent, this.domElement = null, this.resolution = 1, this.renderer = e, this.rootBoundary = new _e(null), _.init(this), this.autoPreventDefault = !0, this._eventsAdded = !1, this._rootPointerEvent = new f(null), this._rootWheelEvent = new T(null), this.cursorStyles = {
|
| 1451 |
+
default: "inherit",
|
| 1452 |
+
pointer: "pointer"
|
| 1453 |
+
}, this.features = new Proxy({ ...x.defaultEventFeatures }, {
|
| 1454 |
+
set: (t, i, n) => (i === "globalMove" && (this.rootBoundary.enableGlobalMoveEvents = n), t[i] = n, !0)
|
| 1455 |
+
}), this._onPointerDown = this._onPointerDown.bind(this), this._onPointerMove = this._onPointerMove.bind(this), this._onPointerUp = this._onPointerUp.bind(this), this._onPointerOverOut = this._onPointerOverOut.bind(this), this.onWheel = this.onWheel.bind(this);
|
| 1456 |
+
}
|
| 1457 |
+
/**
|
| 1458 |
+
* The default interaction mode for all display objects.
|
| 1459 |
+
* @see Container.eventMode
|
| 1460 |
+
* @type {EventMode}
|
| 1461 |
+
* @readonly
|
| 1462 |
+
* @since 7.2.0
|
| 1463 |
+
*/
|
| 1464 |
+
static get defaultEventMode() {
|
| 1465 |
+
return this._defaultEventMode;
|
| 1466 |
+
}
|
| 1467 |
+
/**
|
| 1468 |
+
* Runner init called, view is available at this point.
|
| 1469 |
+
* @ignore
|
| 1470 |
+
*/
|
| 1471 |
+
init(e) {
|
| 1472 |
+
const { canvas: t, resolution: i } = this.renderer;
|
| 1473 |
+
this.setTargetElement(t), this.resolution = i, x._defaultEventMode = e.eventMode ?? "passive", Object.assign(this.features, e.eventFeatures ?? {}), this.rootBoundary.enableGlobalMoveEvents = this.features.globalMove;
|
| 1474 |
+
}
|
| 1475 |
+
/**
|
| 1476 |
+
* Handle changing resolution.
|
| 1477 |
+
* @ignore
|
| 1478 |
+
*/
|
| 1479 |
+
resolutionChange(e) {
|
| 1480 |
+
this.resolution = e;
|
| 1481 |
+
}
|
| 1482 |
+
/** Destroys all event listeners and detaches the renderer. */
|
| 1483 |
+
destroy() {
|
| 1484 |
+
_.destroy(), this.setTargetElement(null), this.renderer = null, this._currentCursor = null;
|
| 1485 |
+
}
|
| 1486 |
+
/**
|
| 1487 |
+
* Sets the current cursor mode, handling any callbacks or CSS style changes.
|
| 1488 |
+
* The cursor can be a CSS cursor string, a custom callback function, or a key from the cursorStyles dictionary.
|
| 1489 |
+
* @param mode - Cursor mode to set. Can be:
|
| 1490 |
+
* - A CSS cursor string (e.g., 'pointer', 'grab')
|
| 1491 |
+
* - A key from the cursorStyles dictionary
|
| 1492 |
+
* - null/undefined to reset to default
|
| 1493 |
+
* @example
|
| 1494 |
+
* ```ts
|
| 1495 |
+
* // Using predefined cursor styles
|
| 1496 |
+
* app.renderer.events.setCursor('pointer'); // Set standard pointer cursor
|
| 1497 |
+
* app.renderer.events.setCursor('grab'); // Set grab cursor
|
| 1498 |
+
* app.renderer.events.setCursor(null); // Reset to default
|
| 1499 |
+
*
|
| 1500 |
+
* // Using custom cursor styles
|
| 1501 |
+
* app.renderer.events.cursorStyles.custom = 'url("cursor.png"), auto';
|
| 1502 |
+
* app.renderer.events.setCursor('custom'); // Apply custom cursor
|
| 1503 |
+
*
|
| 1504 |
+
* // Using callback-based cursor
|
| 1505 |
+
* app.renderer.events.cursorStyles.dynamic = (mode) => {
|
| 1506 |
+
* document.body.style.cursor = mode === 'hover' ? 'pointer' : 'default';
|
| 1507 |
+
* };
|
| 1508 |
+
* app.renderer.events.setCursor('dynamic'); // Trigger cursor callback
|
| 1509 |
+
* ```
|
| 1510 |
+
* @remarks
|
| 1511 |
+
* - Has no effect on OffscreenCanvas except for callback-based cursors
|
| 1512 |
+
* - Caches current cursor to avoid unnecessary DOM updates
|
| 1513 |
+
* - Supports CSS cursor values, style objects, and callback functions
|
| 1514 |
+
* @see {@link EventSystem.cursorStyles} For defining custom cursor styles
|
| 1515 |
+
* @see {@link https://developer.mozilla.org/en-US/docs/Web/CSS/cursor} MDN Cursor Reference
|
| 1516 |
+
*/
|
| 1517 |
+
setCursor(e) {
|
| 1518 |
+
e || (e = "default");
|
| 1519 |
+
let t = !0;
|
| 1520 |
+
if (globalThis.OffscreenCanvas && this.domElement instanceof OffscreenCanvas && (t = !1), this._currentCursor === e)
|
| 1521 |
+
return;
|
| 1522 |
+
this._currentCursor = e;
|
| 1523 |
+
const i = this.cursorStyles[e];
|
| 1524 |
+
if (i)
|
| 1525 |
+
switch (typeof i) {
|
| 1526 |
+
case "string":
|
| 1527 |
+
t && (this.domElement.style.cursor = i);
|
| 1528 |
+
break;
|
| 1529 |
+
case "function":
|
| 1530 |
+
i(e);
|
| 1531 |
+
break;
|
| 1532 |
+
case "object":
|
| 1533 |
+
t && Object.assign(this.domElement.style, i);
|
| 1534 |
+
break;
|
| 1535 |
+
}
|
| 1536 |
+
else t && typeof e == "string" && !Object.prototype.hasOwnProperty.call(this.cursorStyles, e) && (this.domElement.style.cursor = e);
|
| 1537 |
+
}
|
| 1538 |
+
/**
|
| 1539 |
+
* The global pointer event instance containing the most recent pointer state.
|
| 1540 |
+
* This is useful for accessing pointer information without listening to events.
|
| 1541 |
+
* @example
|
| 1542 |
+
* ```ts
|
| 1543 |
+
* // Access current pointer position at any time
|
| 1544 |
+
* const eventSystem = app.renderer.events;
|
| 1545 |
+
* const pointer = eventSystem.pointer;
|
| 1546 |
+
*
|
| 1547 |
+
* // Get global coordinates
|
| 1548 |
+
* console.log('Position:', pointer.global.x, pointer.global.y);
|
| 1549 |
+
*
|
| 1550 |
+
* // Check button state
|
| 1551 |
+
* console.log('Buttons pressed:', pointer.buttons);
|
| 1552 |
+
*
|
| 1553 |
+
* // Get pointer type and pressure
|
| 1554 |
+
* console.log('Type:', pointer.pointerType);
|
| 1555 |
+
* console.log('Pressure:', pointer.pressure);
|
| 1556 |
+
* ```
|
| 1557 |
+
* @readonly
|
| 1558 |
+
* @since 7.2.0
|
| 1559 |
+
* @see {@link FederatedPointerEvent} For all available pointer properties
|
| 1560 |
+
*/
|
| 1561 |
+
get pointer() {
|
| 1562 |
+
return this._rootPointerEvent;
|
| 1563 |
+
}
|
| 1564 |
+
/**
|
| 1565 |
+
* Event handler for pointer down events on {@link EventSystem#domElement this.domElement}.
|
| 1566 |
+
* @param nativeEvent - The native mouse/pointer/touch event.
|
| 1567 |
+
*/
|
| 1568 |
+
_onPointerDown(e) {
|
| 1569 |
+
if (!this.features.click)
|
| 1570 |
+
return;
|
| 1571 |
+
this.rootBoundary.rootTarget = this.renderer.lastObjectRendered;
|
| 1572 |
+
const t = this._normalizeToPointerData(e);
|
| 1573 |
+
this.autoPreventDefault && t[0].isNormalized && (e.cancelable || !("cancelable" in e)) && e.preventDefault();
|
| 1574 |
+
for (let i = 0, n = t.length; i < n; i++) {
|
| 1575 |
+
const s = t[i], o = this._bootstrapEvent(this._rootPointerEvent, s);
|
| 1576 |
+
this.rootBoundary.mapEvent(o);
|
| 1577 |
+
}
|
| 1578 |
+
this.setCursor(this.rootBoundary.cursor);
|
| 1579 |
+
}
|
| 1580 |
+
/**
|
| 1581 |
+
* Event handler for pointer move events on on {@link EventSystem#domElement this.domElement}.
|
| 1582 |
+
* @param nativeEvent - The native mouse/pointer/touch events.
|
| 1583 |
+
*/
|
| 1584 |
+
_onPointerMove(e) {
|
| 1585 |
+
if (!this.features.move)
|
| 1586 |
+
return;
|
| 1587 |
+
this.rootBoundary.rootTarget = this.renderer.lastObjectRendered, _.pointerMoved();
|
| 1588 |
+
const t = this._normalizeToPointerData(e);
|
| 1589 |
+
for (let i = 0, n = t.length; i < n; i++) {
|
| 1590 |
+
const s = this._bootstrapEvent(this._rootPointerEvent, t[i]);
|
| 1591 |
+
this.rootBoundary.mapEvent(s);
|
| 1592 |
+
}
|
| 1593 |
+
this.setCursor(this.rootBoundary.cursor);
|
| 1594 |
+
}
|
| 1595 |
+
/**
|
| 1596 |
+
* Event handler for pointer up events on {@link EventSystem#domElement this.domElement}.
|
| 1597 |
+
* @param nativeEvent - The native mouse/pointer/touch event.
|
| 1598 |
+
*/
|
| 1599 |
+
_onPointerUp(e) {
|
| 1600 |
+
if (!this.features.click)
|
| 1601 |
+
return;
|
| 1602 |
+
this.rootBoundary.rootTarget = this.renderer.lastObjectRendered;
|
| 1603 |
+
let t = e.target;
|
| 1604 |
+
e.composedPath && e.composedPath().length > 0 && (t = e.composedPath()[0]);
|
| 1605 |
+
const i = t !== this.domElement ? "outside" : "", n = this._normalizeToPointerData(e);
|
| 1606 |
+
for (let s = 0, o = n.length; s < o; s++) {
|
| 1607 |
+
const r = this._bootstrapEvent(this._rootPointerEvent, n[s]);
|
| 1608 |
+
r.type += i, this.rootBoundary.mapEvent(r);
|
| 1609 |
+
}
|
| 1610 |
+
this.setCursor(this.rootBoundary.cursor);
|
| 1611 |
+
}
|
| 1612 |
+
/**
|
| 1613 |
+
* Event handler for pointer over & out events on {@link EventSystem#domElement this.domElement}.
|
| 1614 |
+
* @param nativeEvent - The native mouse/pointer/touch event.
|
| 1615 |
+
*/
|
| 1616 |
+
_onPointerOverOut(e) {
|
| 1617 |
+
if (!this.features.click)
|
| 1618 |
+
return;
|
| 1619 |
+
this.rootBoundary.rootTarget = this.renderer.lastObjectRendered;
|
| 1620 |
+
const t = this._normalizeToPointerData(e);
|
| 1621 |
+
for (let i = 0, n = t.length; i < n; i++) {
|
| 1622 |
+
const s = this._bootstrapEvent(this._rootPointerEvent, t[i]);
|
| 1623 |
+
this.rootBoundary.mapEvent(s);
|
| 1624 |
+
}
|
| 1625 |
+
this.setCursor(this.rootBoundary.cursor);
|
| 1626 |
+
}
|
| 1627 |
+
/**
|
| 1628 |
+
* Passive handler for `wheel` events on {@link EventSystem.domElement this.domElement}.
|
| 1629 |
+
* @param nativeEvent - The native wheel event.
|
| 1630 |
+
*/
|
| 1631 |
+
onWheel(e) {
|
| 1632 |
+
if (!this.features.wheel)
|
| 1633 |
+
return;
|
| 1634 |
+
const t = this.normalizeWheelEvent(e);
|
| 1635 |
+
this.rootBoundary.rootTarget = this.renderer.lastObjectRendered, this.rootBoundary.mapEvent(t);
|
| 1636 |
+
}
|
| 1637 |
+
/**
|
| 1638 |
+
* Sets the {@link EventSystem#domElement domElement} and binds event listeners.
|
| 1639 |
+
* This method manages the DOM event bindings for the event system, allowing you to
|
| 1640 |
+
* change or remove the target element that receives input events.
|
| 1641 |
+
* > [!IMPORTANT] This will default to the canvas element of the renderer, so you
|
| 1642 |
+
* > should not need to call this unless you are using a custom element.
|
| 1643 |
+
* @param element - The new DOM element to bind events to, or null to remove all event bindings
|
| 1644 |
+
* @example
|
| 1645 |
+
* ```ts
|
| 1646 |
+
* // Set a new canvas element as the target
|
| 1647 |
+
* const canvas = document.createElement('canvas');
|
| 1648 |
+
* app.renderer.events.setTargetElement(canvas);
|
| 1649 |
+
*
|
| 1650 |
+
* // Remove all event bindings
|
| 1651 |
+
* app.renderer.events.setTargetElement(null);
|
| 1652 |
+
*
|
| 1653 |
+
* // Switch to a different canvas
|
| 1654 |
+
* const newCanvas = document.querySelector('#game-canvas');
|
| 1655 |
+
* app.renderer.events.setTargetElement(newCanvas);
|
| 1656 |
+
* ```
|
| 1657 |
+
* @remarks
|
| 1658 |
+
* - Automatically removes event listeners from previous element
|
| 1659 |
+
* - Required for the event system to function
|
| 1660 |
+
* - Safe to call multiple times
|
| 1661 |
+
* @see {@link EventSystem#domElement} The current DOM element
|
| 1662 |
+
* @see {@link EventsTicker} For the ticker system that tracks pointer movement
|
| 1663 |
+
*/
|
| 1664 |
+
setTargetElement(e) {
|
| 1665 |
+
this._removeEvents(), this.domElement = e, _.domElement = e, this._addEvents();
|
| 1666 |
+
}
|
| 1667 |
+
/** Register event listeners on {@link Renderer#domElement this.domElement}. */
|
| 1668 |
+
_addEvents() {
|
| 1669 |
+
if (this._eventsAdded || !this.domElement)
|
| 1670 |
+
return;
|
| 1671 |
+
_.addTickerListener();
|
| 1672 |
+
const e = this.domElement.style;
|
| 1673 |
+
e && (globalThis.navigator.msPointerEnabled ? (e.msContentZooming = "none", e.msTouchAction = "none") : this.supportsPointerEvents && (e.touchAction = "none")), this.supportsPointerEvents ? (globalThis.document.addEventListener("pointermove", this._onPointerMove, !0), this.domElement.addEventListener("pointerdown", this._onPointerDown, !0), this.domElement.addEventListener("pointerleave", this._onPointerOverOut, !0), this.domElement.addEventListener("pointerover", this._onPointerOverOut, !0), globalThis.addEventListener("pointerup", this._onPointerUp, !0)) : (globalThis.document.addEventListener("mousemove", this._onPointerMove, !0), this.domElement.addEventListener("mousedown", this._onPointerDown, !0), this.domElement.addEventListener("mouseout", this._onPointerOverOut, !0), this.domElement.addEventListener("mouseover", this._onPointerOverOut, !0), globalThis.addEventListener("mouseup", this._onPointerUp, !0), this.supportsTouchEvents && (this.domElement.addEventListener("touchstart", this._onPointerDown, !0), this.domElement.addEventListener("touchend", this._onPointerUp, !0), this.domElement.addEventListener("touchmove", this._onPointerMove, !0))), this.domElement.addEventListener("wheel", this.onWheel, {
|
| 1674 |
+
passive: !0,
|
| 1675 |
+
capture: !0
|
| 1676 |
+
}), this._eventsAdded = !0;
|
| 1677 |
+
}
|
| 1678 |
+
/** Unregister event listeners on {@link EventSystem#domElement this.domElement}. */
|
| 1679 |
+
_removeEvents() {
|
| 1680 |
+
if (!this._eventsAdded || !this.domElement)
|
| 1681 |
+
return;
|
| 1682 |
+
_.removeTickerListener();
|
| 1683 |
+
const e = this.domElement.style;
|
| 1684 |
+
e && (globalThis.navigator.msPointerEnabled ? (e.msContentZooming = "", e.msTouchAction = "") : this.supportsPointerEvents && (e.touchAction = "")), this.supportsPointerEvents ? (globalThis.document.removeEventListener("pointermove", this._onPointerMove, !0), this.domElement.removeEventListener("pointerdown", this._onPointerDown, !0), this.domElement.removeEventListener("pointerleave", this._onPointerOverOut, !0), this.domElement.removeEventListener("pointerover", this._onPointerOverOut, !0), globalThis.removeEventListener("pointerup", this._onPointerUp, !0)) : (globalThis.document.removeEventListener("mousemove", this._onPointerMove, !0), this.domElement.removeEventListener("mousedown", this._onPointerDown, !0), this.domElement.removeEventListener("mouseout", this._onPointerOverOut, !0), this.domElement.removeEventListener("mouseover", this._onPointerOverOut, !0), globalThis.removeEventListener("mouseup", this._onPointerUp, !0), this.supportsTouchEvents && (this.domElement.removeEventListener("touchstart", this._onPointerDown, !0), this.domElement.removeEventListener("touchend", this._onPointerUp, !0), this.domElement.removeEventListener("touchmove", this._onPointerMove, !0))), this.domElement.removeEventListener("wheel", this.onWheel, !0), this.domElement = null, this._eventsAdded = !1;
|
| 1685 |
+
}
|
| 1686 |
+
/**
|
| 1687 |
+
* Maps coordinates from DOM/screen space into PixiJS normalized coordinates.
|
| 1688 |
+
* This takes into account the current scale, position, and resolution of the DOM element.
|
| 1689 |
+
* @param point - The point to store the mapped coordinates in
|
| 1690 |
+
* @param x - The x coordinate in DOM/client space
|
| 1691 |
+
* @param y - The y coordinate in DOM/client space
|
| 1692 |
+
* @example
|
| 1693 |
+
* ```ts
|
| 1694 |
+
* // Map mouse coordinates to PixiJS space
|
| 1695 |
+
* const point = new Point();
|
| 1696 |
+
* app.renderer.events.mapPositionToPoint(
|
| 1697 |
+
* point,
|
| 1698 |
+
* event.clientX,
|
| 1699 |
+
* event.clientY
|
| 1700 |
+
* );
|
| 1701 |
+
* console.log('Mapped position:', point.x, point.y);
|
| 1702 |
+
*
|
| 1703 |
+
* // Using with pointer events
|
| 1704 |
+
* sprite.on('pointermove', (event) => {
|
| 1705 |
+
* // event.global already contains mapped coordinates
|
| 1706 |
+
* console.log('Global:', event.global.x, event.global.y);
|
| 1707 |
+
*
|
| 1708 |
+
* // Map to local coordinates
|
| 1709 |
+
* const local = event.getLocalPosition(sprite);
|
| 1710 |
+
* console.log('Local:', local.x, local.y);
|
| 1711 |
+
* });
|
| 1712 |
+
* ```
|
| 1713 |
+
* @remarks
|
| 1714 |
+
* - Accounts for element scaling and positioning
|
| 1715 |
+
* - Adjusts for device pixel ratio/resolution
|
| 1716 |
+
*/
|
| 1717 |
+
mapPositionToPoint(e, t, i) {
|
| 1718 |
+
const n = this.domElement.isConnected ? this.domElement.getBoundingClientRect() : {
|
| 1719 |
+
width: this.domElement.width,
|
| 1720 |
+
height: this.domElement.height,
|
| 1721 |
+
left: 0,
|
| 1722 |
+
top: 0
|
| 1723 |
+
}, s = 1 / this.resolution;
|
| 1724 |
+
e.x = (t - n.left) * (this.domElement.width / n.width) * s, e.y = (i - n.top) * (this.domElement.height / n.height) * s;
|
| 1725 |
+
}
|
| 1726 |
+
/**
|
| 1727 |
+
* Ensures that the original event object contains all data that a regular pointer event would have
|
| 1728 |
+
* @param event - The original event data from a touch or mouse event
|
| 1729 |
+
* @returns An array containing a single normalized pointer event, in the case of a pointer
|
| 1730 |
+
* or mouse event, or a multiple normalized pointer events if there are multiple changed touches
|
| 1731 |
+
*/
|
| 1732 |
+
_normalizeToPointerData(e) {
|
| 1733 |
+
const t = [];
|
| 1734 |
+
if (this.supportsTouchEvents && e instanceof TouchEvent)
|
| 1735 |
+
for (let i = 0, n = e.changedTouches.length; i < n; i++) {
|
| 1736 |
+
const s = e.changedTouches[i];
|
| 1737 |
+
typeof s.button > "u" && (s.button = 0), typeof s.buttons > "u" && (s.buttons = 1), typeof s.isPrimary > "u" && (s.isPrimary = e.touches.length === 1 && e.type === "touchstart"), typeof s.width > "u" && (s.width = s.radiusX || 1), typeof s.height > "u" && (s.height = s.radiusY || 1), typeof s.tiltX > "u" && (s.tiltX = 0), typeof s.tiltY > "u" && (s.tiltY = 0), typeof s.pointerType > "u" && (s.pointerType = "touch"), typeof s.pointerId > "u" && (s.pointerId = s.identifier || 0), typeof s.pressure > "u" && (s.pressure = s.force || 0.5), typeof s.twist > "u" && (s.twist = 0), typeof s.tangentialPressure > "u" && (s.tangentialPressure = 0), typeof s.layerX > "u" && (s.layerX = s.offsetX = s.clientX), typeof s.layerY > "u" && (s.layerY = s.offsetY = s.clientY), s.isNormalized = !0, s.type = e.type, t.push(s);
|
| 1738 |
+
}
|
| 1739 |
+
else if (!globalThis.MouseEvent || e instanceof MouseEvent && (!this.supportsPointerEvents || !(e instanceof globalThis.PointerEvent))) {
|
| 1740 |
+
const i = e;
|
| 1741 |
+
typeof i.isPrimary > "u" && (i.isPrimary = !0), typeof i.width > "u" && (i.width = 1), typeof i.height > "u" && (i.height = 1), typeof i.tiltX > "u" && (i.tiltX = 0), typeof i.tiltY > "u" && (i.tiltY = 0), typeof i.pointerType > "u" && (i.pointerType = "mouse"), typeof i.pointerId > "u" && (i.pointerId = ge), typeof i.pressure > "u" && (i.pressure = 0.5), typeof i.twist > "u" && (i.twist = 0), typeof i.tangentialPressure > "u" && (i.tangentialPressure = 0), i.isNormalized = !0, t.push(i);
|
| 1742 |
+
} else
|
| 1743 |
+
t.push(e);
|
| 1744 |
+
return t;
|
| 1745 |
+
}
|
| 1746 |
+
/**
|
| 1747 |
+
* Normalizes the native {@link https://w3c.github.io/uievents/#interface-wheelevent WheelEvent}.
|
| 1748 |
+
*
|
| 1749 |
+
* The returned {@link FederatedWheelEvent} is a shared instance. It will not persist across
|
| 1750 |
+
* multiple native wheel events.
|
| 1751 |
+
* @param nativeEvent - The native wheel event that occurred on the canvas.
|
| 1752 |
+
* @returns A federated wheel event.
|
| 1753 |
+
*/
|
| 1754 |
+
normalizeWheelEvent(e) {
|
| 1755 |
+
const t = this._rootWheelEvent;
|
| 1756 |
+
return this._transferMouseData(t, e), t.deltaX = e.deltaX, t.deltaY = e.deltaY, t.deltaZ = e.deltaZ, t.deltaMode = e.deltaMode, this.mapPositionToPoint(t.screen, e.clientX, e.clientY), t.global.copyFrom(t.screen), t.offset.copyFrom(t.screen), t.nativeEvent = e, t.type = e.type, t;
|
| 1757 |
+
}
|
| 1758 |
+
/**
|
| 1759 |
+
* Normalizes the `nativeEvent` into a federateed {@link FederatedPointerEvent}.
|
| 1760 |
+
* @param event
|
| 1761 |
+
* @param nativeEvent
|
| 1762 |
+
*/
|
| 1763 |
+
_bootstrapEvent(e, t) {
|
| 1764 |
+
return e.originalEvent = null, e.nativeEvent = t, e.pointerId = t.pointerId, e.width = t.width, e.height = t.height, e.isPrimary = t.isPrimary, e.pointerType = t.pointerType, e.pressure = t.pressure, e.tangentialPressure = t.tangentialPressure, e.tiltX = t.tiltX, e.tiltY = t.tiltY, e.twist = t.twist, this._transferMouseData(e, t), this.mapPositionToPoint(e.screen, t.clientX, t.clientY), e.global.copyFrom(e.screen), e.offset.copyFrom(e.screen), e.isTrusted = t.isTrusted, e.type === "pointerleave" && (e.type = "pointerout"), e.type.startsWith("mouse") && (e.type = e.type.replace("mouse", "pointer")), e.type.startsWith("touch") && (e.type = ye[e.type] || e.type), e;
|
| 1765 |
+
}
|
| 1766 |
+
/**
|
| 1767 |
+
* Transfers base & mouse event data from the `nativeEvent` to the federated event.
|
| 1768 |
+
* @param event
|
| 1769 |
+
* @param nativeEvent
|
| 1770 |
+
*/
|
| 1771 |
+
_transferMouseData(e, t) {
|
| 1772 |
+
e.isTrusted = t.isTrusted, e.srcElement = t.srcElement, e.timeStamp = performance.now(), e.type = t.type, e.altKey = t.altKey, e.button = t.button, e.buttons = t.buttons, e.client.x = t.clientX, e.client.y = t.clientY, e.ctrlKey = t.ctrlKey, e.metaKey = t.metaKey, e.movement.x = t.movementX, e.movement.y = t.movementY, e.page.x = t.pageX, e.page.y = t.pageY, e.relatedTarget = null, e.shiftKey = t.shiftKey;
|
| 1773 |
+
}
|
| 1774 |
+
};
|
| 1775 |
+
B.extension = {
|
| 1776 |
+
name: "events",
|
| 1777 |
+
type: [
|
| 1778 |
+
b.WebGLSystem,
|
| 1779 |
+
b.CanvasSystem,
|
| 1780 |
+
b.WebGPUSystem
|
| 1781 |
+
],
|
| 1782 |
+
priority: -1
|
| 1783 |
+
};
|
| 1784 |
+
B.defaultEventFeatures = {
|
| 1785 |
+
/** Enables pointer events associated with pointer movement. */
|
| 1786 |
+
move: !0,
|
| 1787 |
+
/** Enables global pointer move events. */
|
| 1788 |
+
globalMove: !0,
|
| 1789 |
+
/** Enables pointer events associated with clicking. */
|
| 1790 |
+
click: !0,
|
| 1791 |
+
/** Enables wheel events. */
|
| 1792 |
+
wheel: !0
|
| 1793 |
+
};
|
| 1794 |
+
let ee = B;
|
| 1795 |
+
const be = {
|
| 1796 |
+
onclick: null,
|
| 1797 |
+
onmousedown: null,
|
| 1798 |
+
onmouseenter: null,
|
| 1799 |
+
onmouseleave: null,
|
| 1800 |
+
onmousemove: null,
|
| 1801 |
+
onglobalmousemove: null,
|
| 1802 |
+
onmouseout: null,
|
| 1803 |
+
onmouseover: null,
|
| 1804 |
+
onmouseup: null,
|
| 1805 |
+
onmouseupoutside: null,
|
| 1806 |
+
onpointercancel: null,
|
| 1807 |
+
onpointerdown: null,
|
| 1808 |
+
onpointerenter: null,
|
| 1809 |
+
onpointerleave: null,
|
| 1810 |
+
onpointermove: null,
|
| 1811 |
+
onglobalpointermove: null,
|
| 1812 |
+
onpointerout: null,
|
| 1813 |
+
onpointerover: null,
|
| 1814 |
+
onpointertap: null,
|
| 1815 |
+
onpointerup: null,
|
| 1816 |
+
onpointerupoutside: null,
|
| 1817 |
+
onrightclick: null,
|
| 1818 |
+
onrightdown: null,
|
| 1819 |
+
onrightup: null,
|
| 1820 |
+
onrightupoutside: null,
|
| 1821 |
+
ontap: null,
|
| 1822 |
+
ontouchcancel: null,
|
| 1823 |
+
ontouchend: null,
|
| 1824 |
+
ontouchendoutside: null,
|
| 1825 |
+
ontouchmove: null,
|
| 1826 |
+
onglobaltouchmove: null,
|
| 1827 |
+
ontouchstart: null,
|
| 1828 |
+
onwheel: null,
|
| 1829 |
+
get interactive() {
|
| 1830 |
+
return this.eventMode === "dynamic" || this.eventMode === "static";
|
| 1831 |
+
},
|
| 1832 |
+
set interactive(a) {
|
| 1833 |
+
this.eventMode = a ? "static" : "passive";
|
| 1834 |
+
},
|
| 1835 |
+
_internalEventMode: void 0,
|
| 1836 |
+
get eventMode() {
|
| 1837 |
+
return this._internalEventMode ?? ee.defaultEventMode;
|
| 1838 |
+
},
|
| 1839 |
+
set eventMode(a) {
|
| 1840 |
+
this._internalEventMode = a;
|
| 1841 |
+
},
|
| 1842 |
+
isInteractive() {
|
| 1843 |
+
return this.eventMode === "static" || this.eventMode === "dynamic";
|
| 1844 |
+
},
|
| 1845 |
+
interactiveChildren: !0,
|
| 1846 |
+
hitArea: null,
|
| 1847 |
+
addEventListener(a, e, t) {
|
| 1848 |
+
const i = typeof t == "boolean" && t || typeof t == "object" && t.capture, n = typeof t == "object" ? t.signal : void 0, s = typeof t == "object" ? t.once === !0 : !1, o = typeof e == "function" ? void 0 : e;
|
| 1849 |
+
a = i ? `${a}capture` : a;
|
| 1850 |
+
const r = typeof e == "function" ? e : e.handleEvent, l = this;
|
| 1851 |
+
n && n.addEventListener("abort", () => {
|
| 1852 |
+
l.off(a, r, o);
|
| 1853 |
+
}), s ? l.once(a, r, o) : l.on(a, r, o);
|
| 1854 |
+
},
|
| 1855 |
+
removeEventListener(a, e, t) {
|
| 1856 |
+
const i = typeof t == "boolean" && t || typeof t == "object" && t.capture, n = typeof e == "function" ? void 0 : e;
|
| 1857 |
+
a = i ? `${a}capture` : a, e = typeof e == "function" ? e : e.handleEvent, this.off(a, e, n);
|
| 1858 |
+
},
|
| 1859 |
+
dispatchEvent(a) {
|
| 1860 |
+
if (!(a instanceof M))
|
| 1861 |
+
throw new Error("Container cannot propagate events outside of the Federated Events API");
|
| 1862 |
+
return a.defaultPrevented = !1, a.path = null, a.target = this, a.manager.dispatchEvent(a), !a.defaultPrevented;
|
| 1863 |
+
}
|
| 1864 |
+
};
|
| 1865 |
+
w.add(ue);
|
| 1866 |
+
w.mixin(V, pe);
|
| 1867 |
+
w.add(ee);
|
| 1868 |
+
w.mixin(V, be);
|
| 1869 |
+
w.add(Q);
|
src/backend/gradio_polygonannotator/templates/component/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
import { aq as f } from "./Index-
|
| 2 |
export {
|
| 3 |
f as default
|
| 4 |
};
|
|
|
|
| 1 |
+
import { aq as f } from "./Index-CzQ497_5.js";
|
| 2 |
export {
|
| 3 |
f as default
|
| 4 |
};
|
src/backend/gradio_polygonannotator/templates/component/webworkerAll-BMMxBtBd.js
ADDED
|
The diff for this file is too large to render.
See raw diff
|
|
|